bitcoin-ruby 0.0.18 → 0.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +8 -0
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +46 -0
  5. data/.travis.yml +5 -1
  6. data/Gemfile +11 -9
  7. data/Gemfile.lock +64 -12
  8. data/README.rdoc +17 -4
  9. data/Rakefile +58 -83
  10. data/bitcoin-ruby.gemspec +5 -2
  11. data/lib/bitcoin.rb +31 -14
  12. data/lib/bitcoin/bech32.rb +126 -132
  13. data/lib/bitcoin/bloom_filter.rb +24 -21
  14. data/lib/bitcoin/builder.rb +168 -126
  15. data/lib/bitcoin/connection.rb +21 -24
  16. data/lib/bitcoin/contracthash.rb +20 -24
  17. data/lib/bitcoin/dogecoin.rb +79 -77
  18. data/lib/bitcoin/electrum/mnemonic.rb +28 -25
  19. data/lib/bitcoin/ext_key.rb +3 -3
  20. data/lib/bitcoin/ffi/bitcoinconsensus.rb +17 -13
  21. data/lib/bitcoin/ffi/openssl.rb +355 -338
  22. data/lib/bitcoin/ffi/secp256k1.rb +97 -64
  23. data/lib/bitcoin/protocol.rb +6 -3
  24. data/lib/bitcoin/protocol/address.rb +15 -13
  25. data/lib/bitcoin/protocol/aux_pow.rb +12 -15
  26. data/lib/bitcoin/protocol/block.rb +102 -76
  27. data/lib/bitcoin/protocol/handler.rb +2 -4
  28. data/lib/bitcoin/protocol/parser.rb +108 -92
  29. data/lib/bitcoin/protocol/partial_merkle_tree.rb +59 -47
  30. data/lib/bitcoin/protocol/reject.rb +26 -28
  31. data/lib/bitcoin/protocol/script_witness.rb +3 -8
  32. data/lib/bitcoin/protocol/tx.rb +250 -137
  33. data/lib/bitcoin/protocol/txin.rb +44 -38
  34. data/lib/bitcoin/protocol/txout.rb +27 -20
  35. data/lib/bitcoin/protocol/version.rb +47 -34
  36. data/lib/bitcoin/script.rb +18 -17
  37. data/lib/bitcoin/trezor/mnemonic.rb +113 -98
  38. data/lib/bitcoin/version.rb +1 -1
  39. data/spec/examples.txt +399 -0
  40. data/spec/{bitcoin/fixtures → fixtures}/000000000000056b1a3d84a1e2b33cde8915a4b61c0cae14fca6d3e1490b4f98.json +0 -0
  41. data/spec/{bitcoin/fixtures → fixtures}/03d7e1fa4d5fefa169431f24f7798552861b255cd55d377066fedcd088fb0e99.json +0 -0
  42. data/spec/{bitcoin/fixtures → fixtures}/0961c660358478829505e16a1f028757e54b5bbf9758341a7546573738f31429.json +0 -0
  43. data/spec/{bitcoin/fixtures → fixtures}/0f24294a1d23efbb49c1765cf443fba7930702752aba6d765870082fe4f13cae.json +0 -0
  44. data/spec/{bitcoin/fixtures → fixtures}/156e6e1b84c5c3bd3a0927b25e4119fadce6e6d5186f363317511d1d680fae9a.json +0 -0
  45. data/spec/{bitcoin/fixtures → fixtures}/23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63.json +0 -0
  46. data/spec/{bitcoin/fixtures → fixtures}/315ac7d4c26d69668129cc352851d9389b4a6868f1509c6c8b66bead11e2619f.json +0 -0
  47. data/spec/{bitcoin/fixtures → fixtures}/35e2001b428891fefa0bfb73167c7360669d3cbd7b3aa78e7cad125ddfc51131.json +0 -0
  48. data/spec/{bitcoin/fixtures → fixtures}/3a17dace09ffb919ed627a93f1873220f4c975c1248558b18d16bce25d38c4b7.json +0 -0
  49. data/spec/{bitcoin/fixtures → fixtures}/3e58b7eed0fdb599019af08578effea25c8666bbe8e200845453cacce6314477.json +0 -0
  50. data/spec/{bitcoin/fixtures → fixtures}/514c46f0b61714092f15c8dfcb576c9f79b3f959989b98de3944b19d98832b58.json +0 -0
  51. data/spec/{bitcoin/fixtures → fixtures}/51bf528ecf3c161e7c021224197dbe84f9a8564212f6207baa014c01a1668e1e.json +0 -0
  52. data/spec/{bitcoin/fixtures → fixtures}/60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1.json +0 -0
  53. data/spec/{bitcoin/fixtures → fixtures}/69216b8aaa35b76d6613e5f527f4858640d986e1046238583bdad79b35e938dc.json +0 -0
  54. data/spec/{bitcoin/fixtures → fixtures}/7208e5edf525f04e705fb3390194e316205b8f995c8c9fcd8c6093abe04fa27d.json +0 -0
  55. data/spec/{bitcoin/fixtures → fixtures}/761d8c5210fdfd505f6dff38f740ae3728eb93d7d0971fb433f685d40a4c04f6.json +0 -0
  56. data/spec/{bitcoin/fixtures → fixtures}/8d0b238a06b5a70be75d543902d02d7a514d68d3252a949a513865ac3538874c.json +0 -0
  57. data/spec/{bitcoin/fixtures → fixtures}/aea682d68a3ea5e3583e088dcbd699a5d44d4b083f02ad0aaf2598fe1fa4dfd4.json +0 -0
  58. data/spec/{bitcoin/fixtures → fixtures}/base58_keys_invalid.json +0 -0
  59. data/spec/{bitcoin/fixtures → fixtures}/base58_keys_valid.json +0 -0
  60. data/spec/{bitcoin/fixtures → fixtures}/bc179baab547b7d7c1d5d8d6f8b0cc6318eaa4b0dd0a093ad6ac7f5a1cb6b3ba.json +0 -0
  61. data/spec/{bitcoin/fixtures → fixtures}/bd1715f1abfdc62bea3f605bdb461b3ba1f2cca6ec0d73a18a548b7717ca8531.json +0 -0
  62. data/spec/{bitcoin/fixtures → fixtures}/block-testnet-0000000000ac85bb2530a05a4214a387e6be02b22d3348abc5e7a5d9c4ce8dab.bin +0 -0
  63. data/spec/{bitcoin/fixtures → fixtures}/cd874fa8cb0e2ec2d385735d5e1fd482c4fe648533efb4c50ee53bda58e15ae2.json +0 -0
  64. data/spec/{bitcoin/fixtures → fixtures}/ce5fad9b4ef094d8f4937b0707edaf0a6e6ceeaf67d5edbfd51f660eac8f398b.json +0 -0
  65. data/spec/{bitcoin/fixtures → fixtures}/coinbase-toshi.json +0 -0
  66. data/spec/{bitcoin/fixtures → fixtures}/coinbase.json +0 -0
  67. data/spec/{bitcoin/fixtures → fixtures}/dogecoin-block-60323982f9c5ff1b5a954eac9dc1269352835f47c2c5222691d80f0d50dcf053.bin +0 -0
  68. data/spec/{bitcoin/fixtures → fixtures}/f003f0c1193019db2497a675fd05d9f2edddf9b67c59e677c48d3dbd4ed5f00b.json +0 -0
  69. data/spec/{bitcoin/fixtures → fixtures}/filteredblock-0.bin +0 -0
  70. data/spec/{bitcoin/fixtures → fixtures}/litecoin-block-80ca095ed10b02e53d769eb6eaf92cd04e9e0759e5be4a8477b42911ba49c78f.bin +0 -0
  71. data/spec/{bitcoin/fixtures → fixtures}/litecoin-block-80ca095ed10b02e53d769eb6eaf92cd04e9e0759e5be4a8477b42911ba49c78f.json +0 -0
  72. data/spec/{bitcoin/fixtures → fixtures}/litecoin-genesis-block-12a765e31ffd4059bada1e25190f6e98c99d9714d334efa41a195a7e7e04bfe2.bin +0 -0
  73. data/spec/{bitcoin/fixtures → fixtures}/litecoin-genesis-block-12a765e31ffd4059bada1e25190f6e98c99d9714d334efa41a195a7e7e04bfe2.json +0 -0
  74. data/spec/{bitcoin/fixtures → fixtures}/litecoin-tx-f5aa30f574e3b6f1a3d99c07a6356ba812aabb9661e1d5f71edff828cbd5c996.json +0 -0
  75. data/spec/{bitcoin/fixtures → fixtures}/rawblock-0.bin +0 -0
  76. data/spec/{bitcoin/fixtures → fixtures}/rawblock-0.json +0 -0
  77. data/spec/{bitcoin/fixtures → fixtures}/rawblock-1.bin +0 -0
  78. data/spec/{bitcoin/fixtures → fixtures}/rawblock-1.json +0 -0
  79. data/spec/{bitcoin/fixtures → fixtures}/rawblock-131025.bin +0 -0
  80. data/spec/{bitcoin/fixtures → fixtures}/rawblock-131025.json +0 -0
  81. data/spec/{bitcoin/fixtures → fixtures}/rawblock-170.bin +0 -0
  82. data/spec/{bitcoin/fixtures → fixtures}/rawblock-9.bin +0 -0
  83. data/spec/{bitcoin/fixtures → fixtures}/rawblock-auxpow.bin +0 -0
  84. data/spec/{bitcoin/fixtures → fixtures}/rawblock-testnet-1151351.bin +0 -0
  85. data/spec/{bitcoin/fixtures → fixtures}/rawblock-testnet-26478.bin +0 -0
  86. data/spec/{bitcoin/fixtures → fixtures}/rawblock-testnet-26478.json +0 -0
  87. data/spec/{bitcoin/fixtures → fixtures}/rawblock-testnet-265322.bin +0 -0
  88. data/spec/{bitcoin/fixtures → fixtures}/rawtx-01-toshi.json +0 -0
  89. data/spec/{bitcoin/fixtures → fixtures}/rawtx-01.bin +0 -0
  90. data/spec/{bitcoin/fixtures → fixtures}/rawtx-01.json +0 -0
  91. data/spec/{bitcoin/fixtures → fixtures}/rawtx-02-toshi.json +0 -0
  92. data/spec/{bitcoin/fixtures → fixtures}/rawtx-02.bin +0 -0
  93. data/spec/{bitcoin/fixtures → fixtures}/rawtx-02.json +0 -0
  94. data/spec/{bitcoin/fixtures → fixtures}/rawtx-03-toshi.json +0 -0
  95. data/spec/{bitcoin/fixtures → fixtures}/rawtx-03.bin +0 -0
  96. data/spec/{bitcoin/fixtures → fixtures}/rawtx-03.json +0 -0
  97. data/spec/{bitcoin/fixtures → fixtures}/rawtx-04.json +0 -0
  98. data/spec/{bitcoin/fixtures → fixtures}/rawtx-0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9.bin +0 -0
  99. data/spec/{bitcoin/fixtures → fixtures}/rawtx-05.json +0 -0
  100. data/spec/{bitcoin/fixtures → fixtures}/rawtx-14be6fff8c6014f7c9493b4a6e4a741699173f39d74431b6b844fcb41ebb9984.bin +0 -0
  101. data/spec/{bitcoin/fixtures → fixtures}/rawtx-2f4a2717ec8c9f077a87dde6cbe0274d5238793a3f3f492b63c744837285e58a.bin +0 -0
  102. data/spec/{bitcoin/fixtures → fixtures}/rawtx-2f4a2717ec8c9f077a87dde6cbe0274d5238793a3f3f492b63c744837285e58a.json +0 -0
  103. data/spec/{bitcoin/fixtures → fixtures}/rawtx-406b2b06bcd34d3c8733e6b79f7a394c8a431fbf4ff5ac705c93f4076bb77602.json +0 -0
  104. data/spec/{bitcoin/fixtures → fixtures}/rawtx-52250a162c7d03d2e1fbc5ebd1801a88612463314b55102171c5b5d817d2d7b2.bin +0 -0
  105. data/spec/{bitcoin/fixtures → fixtures}/rawtx-b5d4e8883533f99e5903ea2cf001a133a322fa6b1370b18a16c57c946a40823d.bin +0 -0
  106. data/spec/{bitcoin/fixtures → fixtures}/rawtx-ba1ff5cd66713133c062a871a8adab92416f1e38d17786b2bf56ac5f6ffdfdf5.json +0 -0
  107. data/spec/{bitcoin/fixtures → fixtures}/rawtx-c99c49da4c38af669dea436d3e73780dfdb6c1ecf9958baa52960e8baee30e73.json +0 -0
  108. data/spec/{bitcoin/fixtures → fixtures}/rawtx-de35d060663750b3975b7997bde7fb76307cec5b270d12fcd9c4ad98b279c28c.json +0 -0
  109. data/spec/{bitcoin/fixtures → fixtures}/rawtx-f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16.bin +0 -0
  110. data/spec/{bitcoin/fixtures → fixtures}/rawtx-p2wpkh.bin +0 -0
  111. data/spec/{bitcoin/fixtures → fixtures}/rawtx-p2wpkh.json +0 -0
  112. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-04fdc38d6722ab4b12d79113fc4b2896bdcc5169710690ee4e78541b98e467b4.bin +0 -0
  113. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-0b294c7d11dd21bcccb8393e6744fed7d4d1981a08c00e3e88838cc421f33c9f.bin +0 -0
  114. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-3bc52ac063291ad92d95ddda5fd776a342083b95607ad32ed8bc6f8f7d30449e.bin +0 -0
  115. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-6f0bbdd4e71a8af4305018d738184df32dbb6f27284fdebd5b56d16947f7c181.bin +0 -0
  116. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-a220adf1902c46a39db25a24bc4178b6a88440f977a7e2cabfdd8b5c1dd35cfb.json +0 -0
  117. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-a7c9b06e275e8674cc19a5f7d3e557c72c6d93576e635b33212dbe08ab7cdb60.bin +0 -0
  118. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-e232e0055dbdca88bbaa79458683195a0b7c17c5b6c524a8d146721d4d4d652f.bin +0 -0
  119. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-e232e0055dbdca88bbaa79458683195a0b7c17c5b6c524a8d146721d4d4d652f.json +0 -0
  120. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-f80acbd2f594d04ddb0e1cacba662132104909157dff526935a3c88abe9201a5.bin +0 -0
  121. data/spec/{bitcoin/fixtures → fixtures}/script_tests.json +0 -0
  122. data/spec/{bitcoin/fixtures → fixtures}/sighash.json +0 -0
  123. data/spec/{bitcoin/fixtures → fixtures}/tx-0295028ef826b2a188409cb905b631faebb9bb3cdf14510571c5f4bd8591338f.json +0 -0
  124. data/spec/{bitcoin/fixtures → fixtures}/tx-03339a725007a279484fb6f5361f522dd1cf4d0923d30e6b973290dba4275f92.json +0 -0
  125. data/spec/{bitcoin/fixtures → fixtures}/tx-0a6a357e2f7796444e02638749d9611c008b253fb55f5dc88b739b230ed0c4c3.json +0 -0
  126. data/spec/{bitcoin/fixtures → fixtures}/tx-0ce7e5238fbdb6c086cf1b384b21b827e91cc23f360417265874a5a0d86ce367.json +0 -0
  127. data/spec/{bitcoin/fixtures → fixtures}/tx-0ef34c49f630aea17df0080728b0fc67bf5f87fbda936934a4b11b4a69d7821e.json +0 -0
  128. data/spec/{bitcoin/fixtures → fixtures}/tx-1129d2a8bd5bb3a81e54dc96a90f1f6b2544575748caa17243470935c5dd91b7.json +0 -0
  129. data/spec/{bitcoin/fixtures → fixtures}/tx-19aa42fee0fa57c45d3b16488198b27caaacc4ff5794510d0c17f173f05587ff.json +0 -0
  130. data/spec/{bitcoin/fixtures → fixtures}/tx-1a4f3b9dc4494aeedeb39f30dd37e60541b2abe3ed4977992017cc0ad4f44956.json +0 -0
  131. data/spec/{bitcoin/fixtures → fixtures}/tx-1f9191dcf2b1844ca28c6ef4b969e1d5fab70a5e3c56b7007949e55851cb0c4f.json +0 -0
  132. data/spec/{bitcoin/fixtures → fixtures}/tx-22cd5fef23684d7b304e119bedffde6f54538d3d54a5bfa237e20dc2d9b4b5ad.json +0 -0
  133. data/spec/{bitcoin/fixtures → fixtures}/tx-28204cad1d7fc1d199e8ef4fa22f182de6258a3eaafe1bbe56ebdcacd3069a5f.json +0 -0
  134. data/spec/{bitcoin/fixtures → fixtures}/tx-2958fb00b4fd6fe0353503b886eb9a193d502f4fd5fc042d5e03216ba918bbd6.json +0 -0
  135. data/spec/{bitcoin/fixtures → fixtures}/tx-29f277145749ad6efbed3ae6ce301f8d33c585ec26b7c044ad93c2f866e9e942.json +0 -0
  136. data/spec/{bitcoin/fixtures → fixtures}/tx-2c5e5376c20e9cc78d0fb771730e5d840cc2096eff0ef045b599fe92475ace1c.json +0 -0
  137. data/spec/{bitcoin/fixtures → fixtures}/tx-2c63aa814701cef5dbd4bbaddab3fea9117028f2434dddcdab8339141e9b14d1.json +0 -0
  138. data/spec/{bitcoin/fixtures → fixtures}/tx-313897799b1e37e9ecae15010e56156dddde4e683c96b0e713af95272c38aee0.json +0 -0
  139. data/spec/{bitcoin/fixtures → fixtures}/tx-326882a7f22b5191f1a0cc9962ca4b878cd969cf3b3a70887aece4d801a0ba5e.json +0 -0
  140. data/spec/{bitcoin/fixtures → fixtures}/tx-345bed8785c3282a264ffb0dbee61cde54854f10e16f1b3e75b7f2d9f62946f2.json +0 -0
  141. data/spec/{bitcoin/fixtures → fixtures}/tx-39ba7440b7103557560cc8ce258009936796485aaf8b478e66ab4cb97c66e31b.json +0 -0
  142. data/spec/{bitcoin/fixtures → fixtures}/tx-3a04d57a833367f1655cc5ec3beb587888ef4977a86caa8c8ad4ba7cc717eae7.json +0 -0
  143. data/spec/{bitcoin/fixtures → fixtures}/tx-3da75972766f0ad13319b0b461fd16823a731e44f6e9de4eb3c52d6a6fb6c8ae.json +0 -0
  144. data/spec/{bitcoin/fixtures → fixtures}/tx-4142ee4877eb116abf955a7ec6ef2dc38133b793df762b76d75e3d7d4d8badc9.json +0 -0
  145. data/spec/{bitcoin/fixtures → fixtures}/tx-44b833074e671120ba33106877b49e86ece510824b9af477a3853972bcd8d06a.json +0 -0
  146. data/spec/{bitcoin/fixtures → fixtures}/tx-46224764c7870f95b58f155bce1e38d4da8e99d42dbb632d0dd7c07e092ee5aa.json +0 -0
  147. data/spec/{bitcoin/fixtures → fixtures}/tx-5df1375ffe61ac35ca178ebb0cab9ea26dedbd0e96005dfcee7e379fa513232f.json +0 -0
  148. data/spec/{bitcoin/fixtures → fixtures}/tx-62d9a565bd7b5344c5352e3e9e5f40fa4bbd467fa19c87357216ec8777ba1cce.json +0 -0
  149. data/spec/{bitcoin/fixtures → fixtures}/tx-6327783a064d4e350c454ad5cd90201aedf65b1fc524e73709c52f0163739190.json +0 -0
  150. data/spec/{bitcoin/fixtures → fixtures}/tx-6606c366a487bff9e412d0b6c09c14916319932db5954bf5d8719f43f828a3ba.json +0 -0
  151. data/spec/{bitcoin/fixtures → fixtures}/tx-6aaf18b9f1283b939d8e5d40ff5f8a435229f4178372659cc3a0bce4e262bf78.json +0 -0
  152. data/spec/{bitcoin/fixtures → fixtures}/tx-6b48bba6f6d2286d7ec0883c0fc3085955090813a4c94980466611c798b868cc.json +0 -0
  153. data/spec/{bitcoin/fixtures → fixtures}/tx-70cfbc6690f9ab46712db44e3079ac227962b2771a9341d4233d898b521619ef.json +0 -0
  154. data/spec/{bitcoin/fixtures → fixtures}/tx-7a1a9db42f065f75110fcdb1bc415549c8ef7670417ba1d35a67f1b8adc562c1.json +0 -0
  155. data/spec/{bitcoin/fixtures → fixtures}/tx-9a768fc7d0c4bdc86e25154357ef7c0063ca21310e5740a2f12f90b7455184a7.json +0 -0
  156. data/spec/{bitcoin/fixtures → fixtures}/tx-9cad8d523a0694f2509d092c39cebc8046adae62b4e4297102d568191d9478d8.json +0 -0
  157. data/spec/{bitcoin/fixtures → fixtures}/tx-9e052eb694bd7e15906433f064dff0161a12fd325c1124537766377004023c6f.json +0 -0
  158. data/spec/{bitcoin/fixtures → fixtures}/tx-9fb65b7304aaa77ac9580823c2c06b259cc42591e5cce66d76a81b6f51cc5c28.json +0 -0
  159. data/spec/{bitcoin/fixtures → fixtures}/tx-a6ce7081addade7676cd2af75c4129eba6bf5e179a19c40c7d4cf6a5fe595954.json +0 -0
  160. data/spec/{bitcoin/fixtures → fixtures}/tx-a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944.json +0 -0
  161. data/spec/{bitcoin/fixtures → fixtures}/tx-aab7ef280abbb9cc6fbaf524d2645c3daf4fcca2b3f53370e618d9cedf65f1f8.json +0 -0
  162. data/spec/{bitcoin/fixtures → fixtures}/tx-ab9805c6d57d7070d9a42c5176e47bb705023e6b67249fb6760880548298e742.json +0 -0
  163. data/spec/{bitcoin/fixtures → fixtures}/tx-ad4bcf3241e5d2ad140564e20db3567d41594cf4c2012433fe46a2b70e0d87b8.json +0 -0
  164. data/spec/{bitcoin/fixtures → fixtures}/tx-b5b598de91787439afd5938116654e0b16b7a0d0f82742ba37564219c5afcbf9.json +0 -0
  165. data/spec/{bitcoin/fixtures → fixtures}/tx-b8fd633e7713a43d5ac87266adc78444669b987a56b3a65fb92d58c2c4b0e84d.json +0 -0
  166. data/spec/{bitcoin/fixtures → fixtures}/tx-bbca0628c42cb8bf7c3f4b2ad688fa56da5308dd2a10255da89fb1f46e6e413d.json +0 -0
  167. data/spec/{bitcoin/fixtures → fixtures}/tx-bc7fd132fcf817918334822ee6d9bd95c889099c96e07ca2c1eb2cc70db63224.json +0 -0
  168. data/spec/{bitcoin/fixtures → fixtures}/tx-c192b74844e4837a34c4a5a97b438f1c111405b01b99e2d12b7c96d07fc74c04.json +0 -0
  169. data/spec/{bitcoin/fixtures → fixtures}/tx-d3d77d63709e47d9ef58f0b557800115a6b676c6a423012fbb96f45d8fcef830.json +0 -0
  170. data/spec/{bitcoin/fixtures → fixtures}/tx-e335562f7e297aadeed88e5954bc4eeb8dc00b31d829eedb232e39d672b0c009.json +0 -0
  171. data/spec/{bitcoin/fixtures → fixtures}/tx-eb3b82c0884e3efa6d8b0be55b4915eb20be124c9766245bcc7f34fdac32bccb.json +0 -0
  172. data/spec/{bitcoin/fixtures → fixtures}/tx-fee1b9b85531c8fb6cd7831f83490c7f2aa768b6eefe29854ef5e89ce7b9ecb1.json +0 -0
  173. data/spec/{bitcoin/fixtures → fixtures}/txscript-invalid-too-many-sigops-followed-by-invalid-pushdata.bin +0 -0
  174. data/spec/helpers/block_helpers.rb +58 -0
  175. data/spec/helpers/fixture_helpers.rb +20 -0
  176. data/spec/helpers/library_helpers.rb +15 -0
  177. data/spec/spec_helper.rb +109 -0
  178. data/spec/unit/bitcoin/bech32_spec.rb +187 -0
  179. data/spec/unit/bitcoin/bitcoin_spec.rb +1079 -0
  180. data/spec/unit/bitcoin/bloom_filter_spec.rb +33 -0
  181. data/spec/unit/bitcoin/builder_spec.rb +559 -0
  182. data/spec/unit/bitcoin/contracthash_spec.rb +52 -0
  183. data/spec/unit/bitcoin/ext_key_spec.rb +281 -0
  184. data/spec/unit/bitcoin/key_spec.rb +457 -0
  185. data/spec/unit/bitcoin/network_spec.rb +71 -0
  186. data/spec/unit/bitcoin/protocol/addr_spec.rb +90 -0
  187. data/spec/unit/bitcoin/protocol/aux_pow_spec.rb +45 -0
  188. data/spec/unit/bitcoin/protocol/bip143_spec.rb +334 -0
  189. data/spec/unit/bitcoin/protocol/block_spec.rb +280 -0
  190. data/spec/unit/bitcoin/protocol/getblocks_spec.rb +44 -0
  191. data/spec/unit/bitcoin/protocol/inv_spec.rb +166 -0
  192. data/spec/unit/bitcoin/protocol/notfound_spec.rb +44 -0
  193. data/spec/unit/bitcoin/protocol/parser_spec.rb +69 -0
  194. data/spec/unit/bitcoin/protocol/partial_merkle_tree_spec.rb +47 -0
  195. data/spec/unit/bitcoin/protocol/ping_spec.rb +62 -0
  196. data/spec/unit/bitcoin/protocol/tx_spec.rb +1515 -0
  197. data/spec/unit/bitcoin/protocol/txin_spec.rb +47 -0
  198. data/spec/unit/bitcoin/protocol/txout_spec.rb +36 -0
  199. data/spec/unit/bitcoin/protocol/version_spec.rb +121 -0
  200. data/spec/unit/bitcoin/script/opcodes_spec.rb +864 -0
  201. data/spec/unit/bitcoin/script/script_spec.rb +1610 -0
  202. data/spec/unit/bitcoin/secp256k1_spec.rb +138 -0
  203. data/spec/unit/bitcoin/trezor/mnemonic_spec.rb +193 -0
  204. data/spec/unit/integrations/dogecoin_spec.rb +215 -0
  205. metadata +381 -372
  206. data/lib/bitcoin/logger.rb +0 -86
  207. data/lib/bitcoin/protocol/alert.rb +0 -46
  208. data/spec/bitcoin/bech32_spec.rb +0 -160
  209. data/spec/bitcoin/bitcoin_spec.rb +0 -666
  210. data/spec/bitcoin/bloom_filter_spec.rb +0 -23
  211. data/spec/bitcoin/builder_spec.rb +0 -375
  212. data/spec/bitcoin/contracthash_spec.rb +0 -45
  213. data/spec/bitcoin/dogecoin_spec.rb +0 -176
  214. data/spec/bitcoin/ext_key_spec.rb +0 -180
  215. data/spec/bitcoin/ffi_openssl.rb +0 -45
  216. data/spec/bitcoin/fixtures/rawblock-170.json +0 -68
  217. data/spec/bitcoin/fixtures/rawblock-9.json +0 -39
  218. data/spec/bitcoin/fixtures/reorg/blk_0_to_4.dat +0 -0
  219. data/spec/bitcoin/fixtures/reorg/blk_3A.dat +0 -0
  220. data/spec/bitcoin/fixtures/reorg/blk_4A.dat +0 -0
  221. data/spec/bitcoin/fixtures/reorg/blk_5A.dat +0 -0
  222. data/spec/bitcoin/fixtures/testnet/block_0.bin +0 -0
  223. data/spec/bitcoin/fixtures/testnet/block_1.bin +0 -0
  224. data/spec/bitcoin/fixtures/testnet/block_2.bin +0 -0
  225. data/spec/bitcoin/fixtures/testnet/block_3.bin +0 -0
  226. data/spec/bitcoin/fixtures/testnet/block_4.bin +0 -0
  227. data/spec/bitcoin/fixtures/testnet/block_5.bin +0 -0
  228. data/spec/bitcoin/fixtures/txdp-1.txt +0 -32
  229. data/spec/bitcoin/fixtures/txdp-2-signed.txt +0 -19
  230. data/spec/bitcoin/fixtures/txdp-2-unsigned.txt +0 -14
  231. data/spec/bitcoin/helpers/fake_blockchain.rb +0 -183
  232. data/spec/bitcoin/key_spec.rb +0 -326
  233. data/spec/bitcoin/network_spec.rb +0 -50
  234. data/spec/bitcoin/performance/storage_spec.rb +0 -41
  235. data/spec/bitcoin/protocol/addr_spec.rb +0 -82
  236. data/spec/bitcoin/protocol/alert_spec.rb +0 -22
  237. data/spec/bitcoin/protocol/aux_pow_spec.rb +0 -45
  238. data/spec/bitcoin/protocol/bip143_spec.rb +0 -116
  239. data/spec/bitcoin/protocol/block_spec.rb +0 -208
  240. data/spec/bitcoin/protocol/getblocks_spec.rb +0 -32
  241. data/spec/bitcoin/protocol/inv_spec.rb +0 -134
  242. data/spec/bitcoin/protocol/notfound_spec.rb +0 -31
  243. data/spec/bitcoin/protocol/parser_spec.rb +0 -50
  244. data/spec/bitcoin/protocol/partial_merkle_tree_spec.rb +0 -38
  245. data/spec/bitcoin/protocol/ping_spec.rb +0 -51
  246. data/spec/bitcoin/protocol/reject.rb +0 -17
  247. data/spec/bitcoin/protocol/tx_spec.rb +0 -894
  248. data/spec/bitcoin/protocol/txin_spec.rb +0 -45
  249. data/spec/bitcoin/protocol/txout_spec.rb +0 -33
  250. data/spec/bitcoin/protocol/version_spec.rb +0 -110
  251. data/spec/bitcoin/script/opcodes_spec.rb +0 -773
  252. data/spec/bitcoin/script/script_spec.rb +0 -977
  253. data/spec/bitcoin/secp256k1_spec.rb +0 -78
  254. data/spec/bitcoin/spec_helper.rb +0 -108
  255. data/spec/bitcoin/trezor/mnemonic_spec.rb +0 -161
@@ -0,0 +1,280 @@
1
+ # encoding: ascii-8bit
2
+ # frozen_string_literal: true
3
+
4
+ require 'spec_helper'
5
+
6
+ describe Bitcoin::Protocol::Block do
7
+ let(:blocks) do
8
+ {
9
+ # block 0:
10
+ # 00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048
11
+ '0' => fixtures_file('rawblock-0.bin'),
12
+ # block 1:
13
+ # 000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd
14
+ '1' => fixtures_file('rawblock-1.bin'),
15
+ # block 9:
16
+ # 000000008d9dc510f23c2657fc4f67bea30078cc05a90eb89e84cc475c080805
17
+ '9' => fixtures_file('rawblock-9.bin'),
18
+ # block 170:
19
+ # 00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee
20
+ '170' => fixtures_file('rawblock-170.bin'),
21
+ # block 131025:
22
+ # 00000000000007d938dbdd433c5ae12a782de74abf7f566518bc2b2d0a1df145
23
+ '131025' => fixtures_file('rawblock-131025.bin'),
24
+ # block 26478:
25
+ # 000000000214a3f06ee99a033a7f2252762d6a18d27c3cd8c8fe2278190da9f3
26
+ 'testnet-26478' => fixtures_file('rawblock-testnet-26478.bin'),
27
+ 'testnet-265322' => fixtures_file('rawblock-testnet-265322.bin'),
28
+ # block 1151351:
29
+ # 000000000000031525003c4e061fd2e5ce5f4fda6121a836e66f70ec2df621de
30
+ 'testnet-1151351' => fixtures_file('rawblock-testnet-1151351.bin'),
31
+ # block 100005:
32
+ # 000000000000dab0130bbcc991d3d7ae6b81aa6f50a798888dfe62337458dc45
33
+ 'filtered-0' => fixtures_file('filteredblock-0.bin')
34
+ }
35
+ end
36
+ let(:block) { Bitcoin::Protocol::Block.new(blocks['0']) }
37
+
38
+ it '#new' do
39
+ Bitcoin::Protocol::Block.new(nil)
40
+ Bitcoin::Protocol::Block.new(blocks['0'])
41
+
42
+ expect do
43
+ Bitcoin::Protocol::Block.new(blocks['0'][0..20])
44
+ end.to raise_error(TypeError, "can't convert nil into Integer")
45
+
46
+ block = Bitcoin::Protocol::Block.new(nil)
47
+ expect(block.parse_data(blocks['0'])).to be true
48
+ expect(block.header_info[7]).to eq(215)
49
+ expect(block.to_payload).to eq(blocks['0'])
50
+
51
+ block = Bitcoin::Protocol::Block.new(nil)
52
+ expect(block.parse_data(blocks['0'] + 'AAAA')).to eq('AAAA')
53
+ expect(block.header_info[7]).to eq(215)
54
+ expect(block.to_payload).to eq(blocks['0'])
55
+
56
+ # parse block which includes segwit tx
57
+ block = Bitcoin::Protocol::Block.new(blocks['testnet-1151351'])
58
+ expect(block.mrkl_root)
59
+ .to eq('e4bbfc681f2bf0ed5fe13a01f5f82bd1844d406fe793a7ec590151f4ea4060d5'.htb.reverse)
60
+ end
61
+
62
+ it '#hash' do
63
+ expect(block.hash)
64
+ .to eq('00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048')
65
+ end
66
+
67
+ it '#tx' do
68
+ expect(block.tx.size).to eq(1)
69
+ expect(block.tx[0].is_a?(Bitcoin::Protocol::Tx)).to be true
70
+ expect(block.tx[0].hash)
71
+ .to eq('0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098')
72
+ end
73
+
74
+ it '#tx_hashes' do
75
+ expect(block.tx_hashes)
76
+ .to eq(['0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098'])
77
+ end
78
+
79
+ it '#to_hash' do
80
+ expect(block.to_hash.keys)
81
+ .to eq(%w[hash ver prev_block mrkl_root time bits nonce n_tx size tx mrkl_tree])
82
+ end
83
+
84
+ it '#to_json' do
85
+ expect(block.to_json).to eq(fixtures_file('rawblock-0.json'))
86
+ expect(Bitcoin::Protocol::Block.new(blocks['1']).to_json)
87
+ .to eq(fixtures_file('rawblock-1.json'))
88
+ expect(Bitcoin::Protocol::Block.new(blocks['131025']).to_json)
89
+ .to eq(fixtures_file('rawblock-131025.json'))
90
+ expect(Bitcoin::Protocol::Block.new(blocks['testnet-26478']).to_json)
91
+ .to eq(fixtures_file('rawblock-testnet-26478.json'))
92
+ expect(Bitcoin::Protocol::Block.from_json(block.to_json).tx[0].in[0].sequence)
93
+ .to eq("\xff\xff\xff\xff")
94
+ end
95
+
96
+ it '#to_payload' do
97
+ expect(block.to_payload).to eq(block.payload)
98
+ expect(Bitcoin::Protocol::Block.new(block.to_payload).to_payload)
99
+ .to eq(block.payload)
100
+ expect(Bitcoin::Protocol::Block.new(blocks['1']).to_payload)
101
+ .to eq(blocks['1'])
102
+ expect(Bitcoin::Protocol::Block.new(blocks['131025']).to_payload)
103
+ .to eq(blocks['131025'])
104
+ expect(Bitcoin::Protocol::Block.new(blocks['testnet-26478']).to_payload)
105
+ .to eq(blocks['testnet-26478'])
106
+ end
107
+
108
+ describe '.from_json' do
109
+ it 'should load blocks from json' do
110
+ block = Bitcoin::Protocol::Block.from_json(
111
+ fixtures_file('rawblock-0.json')
112
+ )
113
+ expect(block.to_payload).to eq(blocks['0'])
114
+ expect(block.tx[0].in[0].sequence).to eq("\xff\xff\xff\xff")
115
+ expect(
116
+ Bitcoin::Protocol::Block.from_json(
117
+ fixtures_file('rawblock-1.json')
118
+ ).to_payload
119
+ ).to eq(blocks['1'])
120
+
121
+ expect(
122
+ Bitcoin::Protocol::Block.from_json(
123
+ fixtures_file('rawblock-131025.json')
124
+ ).to_payload
125
+ ).to eq(blocks['131025'])
126
+
127
+ expect(
128
+ Bitcoin::Protocol::Block.from_json(
129
+ fixtures_file('rawblock-testnet-26478.json')
130
+ ).to_payload
131
+ ).to eq(blocks['testnet-26478'])
132
+
133
+ # testnet3 block
134
+ # 0000000000ac85bb2530a05a4214a387e6be02b22d3348abc5e7a5d9c4ce8dab
135
+ block_raw = fixtures_file(
136
+ 'block-testnet-0000000000ac85bb2530a05a4214a387e6be02b22d3348abc5e7a5d9c4ce8dab.bin'
137
+ )
138
+ expect(Bitcoin::Protocol::Block.new(block_raw).to_payload)
139
+ .to eq(block_raw)
140
+ end
141
+
142
+ it 'should work with litecoin blocks' do
143
+ Bitcoin.network = :litecoin # change to litecoin
144
+ litecoin_block =
145
+ 'litecoin-genesis-block-12a765e31ffd4059bada1e25190f6e98c99d9714d334efa41a195a7e7e04bfe2'
146
+ expect(
147
+ Bitcoin::Protocol::Block.from_json(
148
+ fixtures_file("#{litecoin_block}.json")
149
+ ).to_payload
150
+ ).to eq(fixtures_file("#{litecoin_block}.bin"))
151
+
152
+ json = Bitcoin::Protocol::Block.new(
153
+ fixtures_file("#{litecoin_block}.bin")
154
+ ).to_json
155
+ expect(Bitcoin::Protocol::Block.from_json(json).to_payload)
156
+ .to eq(fixtures_file("#{litecoin_block}.bin"))
157
+ expect(Bitcoin::Protocol::Block.from_json(json).hash)
158
+ .to eq(litecoin_block.split('-').last)
159
+
160
+ litecoin_block =
161
+ 'litecoin-block-80ca095ed10b02e53d769eb6eaf92cd04e9e0759e5be4a8477b42911ba49c78f'
162
+ expect(
163
+ Bitcoin::Protocol::Block.from_json(
164
+ fixtures_file("#{litecoin_block}.json")
165
+ ).to_payload
166
+ ).to eq(fixtures_file("#{litecoin_block}.bin"))
167
+
168
+ json = Bitcoin::Protocol::Block.new(
169
+ fixtures_file("#{litecoin_block}.bin")
170
+ ).to_json
171
+ expect(Bitcoin::Protocol::Block.from_json(json).to_payload)
172
+ .to eq(fixtures_file("#{litecoin_block}.bin"))
173
+ expect(Bitcoin::Protocol::Block.from_json(json).hash)
174
+ .to eq(litecoin_block.split('-').last)
175
+ end
176
+
177
+ it 'should check block hash' do
178
+ block = Bitcoin::Protocol::Block.from_json(
179
+ fixtures_file('rawblock-0.json')
180
+ )
181
+ h = block.to_hash
182
+ h['hash'][0] = '1'
183
+
184
+ expect do
185
+ Bitcoin::Protocol::Block.from_hash(h)
186
+ end.to raise_error(
187
+ RuntimeError,
188
+ 'Block hash mismatch! Claimed: 10000000839a8e6886ab5951d76f411475428a' \
189
+ 'fc90947ee320161bbf18eb6048, Actual: 00000000839a8e6886ab5951d76f4114' \
190
+ '75428afc90947ee320161bbf18eb6048'
191
+ )
192
+ end
193
+
194
+ it 'should check merkle tree' do
195
+ block = Bitcoin::Protocol::Block.from_json(
196
+ fixtures_file('rawblock-0.json')
197
+ )
198
+ h = block.to_hash
199
+ h['tx'][0]['ver'] = 2
200
+ h['tx'][0]['hash'] =
201
+ '5ea04451af738d113f0ae8559225b7f893f186f099d88c72230a5e19c0bb830d'
202
+
203
+ expect do
204
+ Bitcoin::Protocol::Block.from_hash(h)
205
+ end.to raise_error(RuntimeError, /Block merkle root mismatch/)
206
+ end
207
+ end
208
+
209
+ #
210
+ # following test cases are borrowed from
211
+ # https://github.com/bitcoinj/bitcoinj/blob/master/core/src/test/java/org/bitcoinj/core/FilteredBlockAndPartialMerkleTreeTests.java
212
+ #
213
+ it 'filtered block parsing' do
214
+ block = Bitcoin::Protocol::Block.new
215
+
216
+ block.parse_data_from_io(blocks['filtered-0'], :filtered)
217
+
218
+ expect(block.verify_mrkl_root).to be true
219
+ expect(block.hash)
220
+ .to eq('000000000000dab0130bbcc991d3d7ae6b81aa6f50a798888dfe62337458dc45')
221
+ expect(block.tx_hashes)
222
+ .to eq(['63194f18be0af63f2c6bc9dc0f777cbefed3d9415c4af83f3ee3a3d669c00cb5'])
223
+ end
224
+
225
+ it '#header_to_json' do
226
+ # rubocop:disable Layout/IndentHeredoc,Layout/ClosingHeredocIndentation
227
+ json = <<-JSON.chomp
228
+ {
229
+ "hash":"00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048",
230
+ "ver":1,
231
+ "prev_block":"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
232
+ "mrkl_root":"0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098",
233
+ "time":1231469665,
234
+ "bits":486604799,
235
+ "nonce":2573394689,
236
+ "n_tx":1,
237
+ "size":215
238
+ }
239
+ JSON
240
+ # rubocop:enable Layout/IndentHeredoc,Layout/ClosingHeredocIndentation
241
+ expect(block.header_to_json).to eq(json)
242
+ end
243
+
244
+ it '#verify_mrkl_root' do
245
+ block0 = Bitcoin::Protocol::Block.from_json(
246
+ fixtures_file('rawblock-0.json')
247
+ )
248
+ block1 = Bitcoin::Protocol::Block.from_json(
249
+ fixtures_file('rawblock-1.json')
250
+ )
251
+ expect(block0.tx.size).to eq(1)
252
+ expect(block0.verify_mrkl_root).to be true
253
+ block0.tx << block.tx.last # test against CVE-2012-2459
254
+ expect(block0.verify_mrkl_root).to be false
255
+ block0.tx = block1.tx
256
+ expect(block0.verify_mrkl_root).to be false
257
+ end
258
+
259
+ it '#bip34_block_height' do
260
+ # block version 1
261
+ block = Bitcoin::Protocol::Block.from_json(
262
+ fixtures_file('rawblock-131025.json')
263
+ )
264
+ expect(block.ver).to eq(1)
265
+ expect(block.bip34_block_height).to be_nil
266
+ # block version 2 (introduced by BIP_0034)
267
+ block = Bitcoin::Protocol::Block.from_json(
268
+ fixtures_file(
269
+ '000000000000056b1a3d84a1e2b33cde8915a4b61c0cae14fca6d3e1490b4f98.json'
270
+ )
271
+ )
272
+ expect(block.ver).to eq(2)
273
+ expect(block.bip34_block_height).to eq(197_657)
274
+ end
275
+
276
+ it 'should work with huge block version' do
277
+ expect(Bitcoin::Protocol::Block.new(blocks['testnet-265322']).hash)
278
+ .to eq('0000000000014b351588a177be099e39afd4962cd3d58e9ab5cbe45a9cf83c8a')
279
+ end
280
+ end
@@ -0,0 +1,44 @@
1
+ # encoding: ascii-8bit
2
+ # frozen_string_literal: true
3
+
4
+ require 'spec_helper'
5
+
6
+ describe 'Bitcoin::Protocol::Parser (getblocks)' do
7
+ # Mock handler interface
8
+ class GetblocksHandler < Bitcoin::Protocol::Handler
9
+ attr_reader :version, :locator, :stop_hash
10
+
11
+ def on_getblocks(version, locator, stop_hash)
12
+ @version = version
13
+ @locator = locator
14
+ @stop_hash = stop_hash
15
+ end
16
+ end
17
+
18
+ let(:handler) { GetblocksHandler.new }
19
+ let(:parser) { Bitcoin::Protocol::Parser.new(handler) }
20
+ let(:pkt) do
21
+ 'f9beb4d9676574626c6f636b7300000065000000b3b7ad6e71110100026fe28c0ab6f1b3' \
22
+ '72c1a6a246ae63f74f931e8365e15a089c68d61900000000006fe28c0ab6f1b372c1a6a2' \
23
+ '46ae63f74f931e8365e15a089c68d6190000000000000000000000000000000000000000' \
24
+ '0000000000000000000000000000000000'.htb
25
+ end
26
+
27
+ it 'parses getblocks' do
28
+ expect(parser.parse(pkt + 'AAAA')).to eq('AAAA')
29
+ expect(handler.version).to eq(70_001)
30
+ expect(handler.locator).to eq(
31
+ %w[
32
+ 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
33
+ 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
34
+ ]
35
+ )
36
+ expect(handler.stop_hash).to eq('00' * 32)
37
+ end
38
+
39
+ it 'builds getblocks' do
40
+ parser.parse(pkt + 'AAAA')
41
+ expect(Bitcoin::Protocol.getblocks_pkt(70_001, handler.locator).hth)
42
+ .to eq(pkt.hth)
43
+ end
44
+ end
@@ -0,0 +1,166 @@
1
+ # encoding: ascii-8bit
2
+ # frozen_string_literal: true
3
+
4
+ require 'spec_helper'
5
+
6
+ describe 'Bitcoin::Protocol::Parser - Inventory Vectors' do
7
+ # Protocol handler that exposes information required from tests.
8
+ class TestProtocolHandler < Bitcoin::Protocol::Handler
9
+ attr_reader :tx_inv, :block_inv, :err, :pkt
10
+
11
+ def on_inv_transaction(hash)
12
+ (@tx_inv ||= []) << hash.hth
13
+ end
14
+
15
+ def on_get_transaction(hash)
16
+ (@tx_inv ||= []) << hash.hth
17
+ end
18
+
19
+ def on_inv_block(hash)
20
+ (@block_inv ||= []) << hash.hth
21
+ end
22
+
23
+ def on_get_block(hash)
24
+ (@block_inv ||= []) << hash.hth
25
+ end
26
+
27
+ def on_error(*err)
28
+ (@err ||= []) << err
29
+ end
30
+
31
+ def on_getblocks(version, hashes, stop_hash)
32
+ @pkt = {
33
+ version: version,
34
+ locator_hashes: hashes,
35
+ stop_hash: stop_hash
36
+ }
37
+ end
38
+ end
39
+
40
+ let(:handler) { TestProtocolHandler.new }
41
+
42
+ it 'parses inv (transaction)' do
43
+ pkt = [
44
+ 'f9 be b4 d9 69 6e 76 00 00 00 00 00 00 00 00 00 49 00 00 00 11 ea 1c ' \
45
+ '91 02 01 00 00 00 e0 41 c2 38 f7 32 1a 68 0a 34 06 bf fd 72 12 e3 d1 ' \
46
+ '2c b5 12 2a 8c 0b 52 76 de 82 30 b1 00 7a 42 01 00 00 00 33 00 09 71 ' \
47
+ 'a9 70 7b 6c 6d 6e 77 aa 2e ac 43 f3 e5 67 84 cb 61 b2 35 fb 8d fe e0 ' \
48
+ '86 8b 40 7c f3'.split(' ').join
49
+ ].pack('H*')
50
+
51
+ parser = Bitcoin::Protocol::Parser.new(handler)
52
+ expect(parser.parse(pkt + 'AAAA')).to eq('AAAA')
53
+
54
+ expect(handler.tx_inv).to eq(
55
+ %w[
56
+ 427a00b13082de76520b8c2a12b52cd1e31272fdbf06340a681a32f738c241e0
57
+ f37c408b86e0fe8dfb35b261cb8467e5f343ac2eaa776e6d6c7b70a971090033
58
+ ]
59
+ )
60
+ end
61
+
62
+ it 'parses getdata (transaction)' do
63
+ # 000013C4 f9 be b4 d9 67 65 74 64 61 74 61 00 00 00 00 00 ....getd ata.....
64
+ # 000013D4 25 00 00 00 c5 38 cd bb 01 01 00 00 00 b4 02 2d %....8.. .......-
65
+ # 000013E4 9f e5 28 fb 90 70 50 01 16 4b 0c c3 a8 f5 a1 9c ..(..pP. .K......
66
+ # 000013F4 b8 ed 02 bf d4 fc 2c b6 25 66 d1 9d 6e ......,. %f..n
67
+
68
+ pkt = [
69
+ 'f9 be b4 d9 67 65 74 64 61 74 61 00 00 00 00 00 25 00 00 00 c5 38 cd ' \
70
+ 'bb 01 01 00 00 00 b4 02 2d 9f e5 28 fb 90 70 50 01 16 4b 0c c3 a8 f5 ' \
71
+ 'a1 9c b8 ed 02 bf d4 fc 2c b6 25 66 d1 9d 6e'.split(' ').join
72
+ ].pack('H*')
73
+
74
+ parser = Bitcoin::Protocol::Parser.new(handler)
75
+ expect(parser.parse(pkt + 'AAAA')).to eq('AAAA')
76
+
77
+ expect(handler.tx_inv).to eq(
78
+ %w[6e9dd16625b62cfcd4bf02edb89ca1f5a8c30c4b1601507090fb28e59f2d02b4]
79
+ )
80
+ end
81
+
82
+ it 'parses inv (block)' do
83
+ # 00003C27 f9 be b4 d9 69 6e 76 00 00 00 00 00 00 00 00 00 ....inv. ........
84
+ # 00003C37 25 00 00 00 ae 13 a1 04 01 02 00 00 00 9d b9 c4 %....... ........
85
+ # 00003C47 e2 7c 5b cd 3f 62 e1 af 18 fd 9d 81 6d 6c 6b c7 .|[.?b.. ....mlk.
86
+ # 00003C57 b2 26 0a 39 c5 49 39 00 00 00 00 00 00 .&.9.I9. .....
87
+ pkt = [
88
+ 'f9 be b4 d9 69 6e 76 00 00 00 00 00 00 00 00 00 25 00 00 00 ae 13 a1 ' \
89
+ '04 01 02 00 00 00 9d b9 c4 e2 7c 5b cd 3f 62 e1 af 18 fd 9d 81 6d 6c ' \
90
+ '6b c7 b2 26 0a 39 c5 49 39 00 00 00 00 00 00'.split(' ').join
91
+ ].pack('H*')
92
+
93
+ parser = Bitcoin::Protocol::Parser.new(handler)
94
+ expect(parser.parse(pkt + 'AAAA')).to eq('AAAA')
95
+ expect(handler.block_inv).to eq(
96
+ %w[0000000000003949c5390a26b2c76b6c6d819dfd18afe1623fcd5b7ce2c4b99d]
97
+ )
98
+ end
99
+
100
+ it 'parses getdata (block)' do
101
+ # 000039E3 f9 be b4 d9 67 65 74 64 61 74 61 00 00 00 00 00 ....getd ata.....
102
+ # 000039F3 25 00 00 00 ae 13 a1 04 01 02 00 00 00 9d b9 c4 %....... ........
103
+ # 00003A03 e2 7c 5b cd 3f 62 e1 af 18 fd 9d 81 6d 6c 6b c7 .|[.?b.. ....mlk.
104
+ # 00003A13 b2 26 0a 39 c5 49 39 00 00 00 00 00 00 .&.9.I9. .....
105
+ pkt = [
106
+ 'f9 be b4 d9 67 65 74 64 61 74 61 00 00 00 00 00 25 00 00 00 ae 13 a1 ' \
107
+ '04 01 02 00 00 00 9d b9 c4 e2 7c 5b cd 3f 62 e1 af 18 fd 9d 81 6d 6c ' \
108
+ '6b c7 b2 26 0a 39 c5 49 39 00 00 00 00 00 00'.split(' ').join
109
+ ].pack('H*')
110
+
111
+ parser = Bitcoin::Protocol::Parser.new(handler)
112
+ expect(parser.parse(pkt + 'AAAA')).to eq('AAAA')
113
+
114
+ expect(handler.block_inv).to eq(
115
+ %w[0000000000003949c5390a26b2c76b6c6d819dfd18afe1623fcd5b7ce2c4b99d]
116
+ )
117
+ end
118
+
119
+ it 'parses getblocks' do
120
+ locator_hashes = %w[
121
+ 00000000068866924696f410b778911316f92035e9b69b62afa03573974fd750
122
+ 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
123
+ ]
124
+ pkt = Bitcoin::Protocol.getblocks_pkt(
125
+ Bitcoin.network[:protocol_version],
126
+ locator_hashes
127
+ )
128
+
129
+ parser = Bitcoin::Protocol::Parser.new(handler)
130
+ expect(parser.parse(pkt + 'AAAA')).to eq('AAAA')
131
+
132
+ expect(handler.pkt).to eq(
133
+ version: Bitcoin.network[:protocol_version],
134
+ locator_hashes: locator_hashes,
135
+ stop_hash: '0000000000000000000000000000000000000000000000000000000000000000'
136
+ )
137
+ end
138
+
139
+ it 'parses getheaders' do
140
+ locator_hashes = %w[
141
+ 00000000068866924696f410b778911316f92035e9b69b62afa03573974fd750
142
+ 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
143
+ ]
144
+ stop_hash = '0000000000000000000000000000000000000000000000000000000000007e57'
145
+ pkt = Bitcoin::Protocol.getblocks_pkt(
146
+ Bitcoin.network[:protocol_version], locator_hashes, stop_hash
147
+ )
148
+
149
+ parser = Bitcoin::Protocol::Parser.new(handler)
150
+ expect(parser.parse(pkt + 'AAAA')).to eq('AAAA')
151
+
152
+ expect(handler.pkt).to eq(
153
+ version: Bitcoin.network[:protocol_version],
154
+ locator_hashes: locator_hashes,
155
+ stop_hash: '0000000000000000000000000000000000000000000000000000000000007e57'
156
+ )
157
+ end
158
+
159
+ it 'parses broken inv packet' do
160
+ pkt = [('01 00 00 00 00' + ' 00' * 32).split(' ').join].pack('H*')
161
+ parser = Bitcoin::Protocol::Parser.new(handler)
162
+ expect(parser.parse_inv(pkt)).to be_nil
163
+ expect(handler.tx_inv).to be_nil
164
+ expect(handler.err).to eq([[:parse_inv, pkt[1..-1]]])
165
+ end
166
+ end