The home side now require a world-record fourth innings for victory after Sri Lanka were dismissed for 365 in their second innings on Sunday.
Batting to save the game and protect a 1-0 series lead, New Zealand were nine without loss when bad light and a hint of rain sent the players off the field.
Silva put behind him the embarrassment of a double duck in the first Test to produce his maiden Test century following his 61 in the first innings here.
He was at the crease for five-and-a-half hours and hit 20 boundaries as Sri Lanka built a dominant total, until Daniel Vettori cleaned up the last three wickets in the space of four balls.
Vettori was New Zealand's chief destroyer, at one stage sitting on a hat trick when he dismissed Farveez Maharoof and Lasith Malinga in successive balls and finishing with seven for 130, his 13th five-for in Test cricket.
The 27-year-old Silva put his name in the record books by becoming the first player in Test history to score a century in his first game after a pair of ducks.
After a nervous start in his debut Test in Christchurch, Silva showed no sign of nerves here at the Basin Reserve as he anchored Sri Lanka's charge to level the series.
After rain wiped out the first 40 minutes of the third morning, Silva and Prasanna Jayawardene added 37 runs before the new ball came into play and Chris Martin took the only wicket of the morning.
After Jayawardene pulled a short-pitched Martin ball to the boundary, he was suckered into the same shot two deliveries later and spooned the ball straight to the substitute fielder at square-leg to be out for 37.
Vaas joined Silva to further frustrate the New Zealand bowlers as they added 88 for the seventh wicket before Vass edged Vettori to wicket-keeper Brendon McCullum to be out for 47.
Time is not an issue in a Test marked by a low-scoring first innings but the weather could be a factor, with more than two days remaining and showers in the forecast.
For New Zealand even to get close to their 504-run target, they will have to overtake the current best fourth-innings winning performance of the West Indies, who made 418 for seven to beat Australia three years ago.