@@ -1767,46 +1767,111 @@ public async Task GetBlockVerboseTests()
17671767 await node . StartAsync ( ) ;
17681768 var cli = node . CreateRPCClient ( ) ;
17691769
1770+ BitcoinAddress addr ;
1771+
17701772 // case 1: genesis block
1771- var verboseGenesis = await cli . GetBlockAsync ( Network . RegTest . GenesisHash , GetBlockVerbosity . WithFullTx ) ;
1772- Assert . True ( verboseGenesis . Block . ToBytes ( ) . SequenceEqual ( Network . RegTest . GetGenesis ( ) . ToBytes ( ) ) ) ;
1773- Assert . Equal ( 0 , verboseGenesis . Height ) ;
1774- var height = await cli . GetBlockCountAsync ( ) ;
1775- Assert . Equal ( height + 1 , verboseGenesis . Confirmations ) ;
1776- Assert . Equal ( 285 , verboseGenesis . StrippedSize ) ;
1777- Assert . Equal ( 285 , verboseGenesis . Size ) ;
1778- Assert . Equal ( 1140 , verboseGenesis . Weight ) ;
1779- Assert . Equal ( 0 , verboseGenesis . Height ) ;
1780- Assert . Equal ( "00000001" , verboseGenesis . VersionHex ) ;
1781- Assert . Equal ( 1 , verboseGenesis . Block . Header . Version ) ;
1782- Assert . Equal ( Network . RegTest . GenesisHash , verboseGenesis . Block . GetHash ( ) ) ;
1783- Assert . Equal ( uint256 . Parse ( "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b" ) , verboseGenesis . Block . Transactions . First ( ) . GetHash ( ) ) ;
1784- Assert . Single ( verboseGenesis . Block . Transactions ) ;
1785- Assert . Equal ( verboseGenesis . MedianTime , verboseGenesis . Block . Header . BlockTime ) ;
1786- Assert . Equal ( 2u , verboseGenesis . Block . Header . Nonce ) ;
1787- Assert . Equal ( new Target ( 0x207fffff ) , verboseGenesis . Block . Header . Bits ) ;
1788- Assert . Equal ( 4.656542373906925e-10 , verboseGenesis . Difficulty ) ;
1789- Assert . Equal ( uint256 . Parse ( "0000000000000000000000000000000000000000000000000000000000000002" ) , verboseGenesis . ChainWork ) ;
1790-
1791- // NextBlockHash must be included iff the block is not on the tip.
1792- Assert . Null ( verboseGenesis . NextBlockHash ) ;
1793- var addr = await cli . GetNewAddressAsync ( ) ;
1794- await cli . GenerateToAddressAsync ( 1 , addr ) ;
1795- verboseGenesis = await cli . GetBlockAsync ( Network . RegTest . GenesisHash , GetBlockVerbosity . WithOnlyTxId ) ;
1796- Assert . NotNull ( verboseGenesis . NextBlockHash ) ;
1797- Assert . Null ( verboseGenesis . Block ) ; // there will be no Block if we specify false to second argument.
1798- Assert . NotNull ( verboseGenesis . TxIds ) ; // But txids are still there.
1799- Assert . Single ( verboseGenesis . TxIds ) ;
1800-
1801- // case 2: next block.
1802- var secondBlockHash = await cli . GetBestBlockHashAsync ( ) ;
1803- var verboseBestBlock = await cli . GetBlockAsync ( secondBlockHash , GetBlockVerbosity . WithOnlyTxId ) ;
1804- Assert . Equal ( Network . RegTest . GenesisHash , verboseBestBlock . Header . HashPrevBlock ) ;
1805- Assert . Null ( verboseBestBlock . NextBlockHash ) ;
1806-
1807- await cli . GenerateToAddressAsync ( 1 , addr ) ;
1808- verboseBestBlock = await cli . GetBlockAsync ( secondBlockHash , GetBlockVerbosity . WithOnlyTxId ) ;
1809- Assert . NotNull ( verboseBestBlock . NextBlockHash ) ;
1773+ {
1774+ var verboseGenesis = await cli . GetBlockAsync ( Network . RegTest . GenesisHash , GetBlockVerbosity . WithFullTx ) ;
1775+ Assert . True ( verboseGenesis . Block . ToBytes ( ) . SequenceEqual ( Network . RegTest . GetGenesis ( ) . ToBytes ( ) ) ) ;
1776+ Assert . Equal ( 0 , verboseGenesis . Height ) ;
1777+ var height = await cli . GetBlockCountAsync ( ) ;
1778+ Assert . Equal ( height + 1 , verboseGenesis . Confirmations ) ;
1779+ Assert . Equal ( 285 , verboseGenesis . StrippedSize ) ;
1780+ Assert . Equal ( 285 , verboseGenesis . Size ) ;
1781+ Assert . Equal ( 1140 , verboseGenesis . Weight ) ;
1782+ Assert . Equal ( 0 , verboseGenesis . Height ) ;
1783+ Assert . Equal ( "00000001" , verboseGenesis . VersionHex ) ;
1784+ Assert . Equal ( 1 , verboseGenesis . Block . Header . Version ) ;
1785+ Assert . Equal ( Network . RegTest . GenesisHash , verboseGenesis . Block . GetHash ( ) ) ;
1786+ Assert . Equal ( uint256 . Parse ( "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b" ) , verboseGenesis . Block . Transactions . First ( ) . GetHash ( ) ) ;
1787+ Assert . Single ( verboseGenesis . Block . Transactions ) ;
1788+ Assert . Equal ( verboseGenesis . MedianTime , verboseGenesis . Block . Header . BlockTime ) ;
1789+ Assert . Equal ( 2u , verboseGenesis . Block . Header . Nonce ) ;
1790+ Assert . Equal ( new Target ( 0x207fffff ) , verboseGenesis . Block . Header . Bits ) ;
1791+ Assert . Equal ( 4.656542373906925e-10 , verboseGenesis . Difficulty ) ;
1792+ Assert . Equal ( uint256 . Parse ( "0000000000000000000000000000000000000000000000000000000000000002" ) , verboseGenesis . ChainWork ) ;
1793+
1794+ // NextBlockHash must be included iff the block is not on the tip.
1795+ Assert . Null ( verboseGenesis . NextBlockHash ) ;
1796+ addr = await cli . GetNewAddressAsync ( ) ;
1797+ await cli . GenerateToAddressAsync ( 1 , addr ) ;
1798+ verboseGenesis = await cli . GetBlockAsync ( Network . RegTest . GenesisHash , GetBlockVerbosity . WithOnlyTxId ) ;
1799+ Assert . NotNull ( verboseGenesis . NextBlockHash ) ;
1800+ Assert . Null ( verboseGenesis . Block ) ; // there will be no Block if we specify false to second argument.
1801+ Assert . NotNull ( verboseGenesis . TxIds ) ; // But txids are still there.
1802+ Assert . Single ( verboseGenesis . TxIds ) ;
1803+ }
1804+
1805+ // case 2: Get second block with information about transaction (verbosity 2).
1806+ {
1807+ var secondBlockHash = await cli . GetBestBlockHashAsync ( ) ;
1808+ GetBlockRPCResponse verboseBestBlock = await cli . GetBlockAsync ( secondBlockHash , GetBlockVerbosity . WithOnlyTxId ) ;
1809+ Assert . Equal ( Network . RegTest . GenesisHash , verboseBestBlock . Header . HashPrevBlock ) ;
1810+ Assert . Null ( verboseBestBlock . NextBlockHash ) ;
1811+
1812+ await cli . GenerateToAddressAsync ( 1 , addr ) ;
1813+ verboseBestBlock = await cli . GetBlockAsync ( secondBlockHash , GetBlockVerbosity . WithOnlyTxId ) ;
1814+ Assert . NotNull ( verboseBestBlock . NextBlockHash ) ;
1815+ Assert . Null ( verboseBestBlock . PrevOuts ) ;
1816+ }
1817+
1818+ // case 3: Get third block with information about transaction and prevOuts (verbosity 3).
1819+ {
1820+ await cli . GenerateToAddressAsync ( 1 , addr ) ;
1821+
1822+ var thirdBlockHash = await cli . GetBestBlockHashAsync ( ) ;
1823+ GetBlockRPCResponse verboseBestBlock = await cli . GetBlockAsync ( thirdBlockHash , GetBlockVerbosity . WithFullTxAndPrevouts ) ;
1824+
1825+ var coinbaseTx = Assert . Single ( verboseBestBlock . Block . Transactions ) ;
1826+ Assert . True ( coinbaseTx . IsCoinBase ) ;
1827+
1828+ // There is only coinbase transaction.
1829+ Assert . NotNull ( verboseBestBlock . PrevOuts ) ;
1830+ var prevOutInfos = Assert . Single ( verboseBestBlock . PrevOuts ) ;
1831+ var prevOutInfo = Assert . Single ( prevOutInfos ) ;
1832+ Assert . Null ( prevOutInfo ) ;
1833+ }
1834+
1835+ // case 4: Send a transaction to ourselves and verify the prevout is populated (verbosity 3).
1836+ {
1837+ // Coinbase outputs need 100 confirmations before they're spendable.
1838+ await cli . GenerateToAddressAsync ( 98 , addr ) ;
1839+ var spendTxid = await cli . SendToAddressAsync ( addr , Money . Coins ( 1m ) ) ;
1840+ await cli . GenerateToAddressAsync ( 1 , addr ) ;
1841+
1842+ var latestBlockHash = await cli . GetBestBlockHashAsync ( ) ;
1843+ GetBlockRPCResponse verboseBestBlock = await cli . GetBlockAsync ( latestBlockHash , GetBlockVerbosity . WithFullTxAndPrevouts ) ;
1844+
1845+ // There are just two transactions: coinbase and our transaction.
1846+ Assert . Equal ( 2 , verboseBestBlock . Block . Transactions . Count ) ;
1847+
1848+ var spendTxIndex = verboseBestBlock . Block . Transactions . FindIndex ( tx => tx . GetHash ( ) == spendTxid ) ;
1849+ Assert . Equal ( 1 , spendTxIndex ) ;
1850+ Assert . NotNull ( verboseBestBlock . PrevOuts ) ;
1851+
1852+ // Assert prevOuts for the coinbase transaction.
1853+ {
1854+ var prevOutInfos = verboseBestBlock . PrevOuts [ 0 ] ;
1855+ var prevOutInfo = Assert . Single ( prevOutInfos ) ;
1856+ Assert . Null ( prevOutInfo ) ;
1857+ }
1858+
1859+ // Assert the prevOut for our transaction.
1860+ {
1861+ var ourTx = verboseBestBlock . Block . Transactions [ spendTxIndex ] ;
1862+ var txPrevOuts = verboseBestBlock . PrevOuts [ spendTxIndex ] ;
1863+
1864+ _ = Assert . Single ( ourTx . Inputs ) ;
1865+ PrevOutInfo prevOutInfo = Assert . Single ( txPrevOuts ) ;
1866+
1867+ // Spending coinbase coins.
1868+ Assert . True ( prevOutInfo . Generated ) ;
1869+ Assert . Equal ( 1 , prevOutInfo . Height ) ;
1870+ Assert . NotNull ( prevOutInfo . ScriptPubKey ) ;
1871+ Assert . Equal ( addr . ScriptPubKey , prevOutInfo . ScriptPubKey ) ;
1872+ Assert . Equal ( Money . Coins ( 50m ) , prevOutInfo . Value ) ;
1873+ }
1874+ }
18101875 }
18111876
18121877 static void AssertException < T > ( Action act , Action < T > assert ) where T : Exception
0 commit comments