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
@@ -2,19 +2,21 @@
2
2
 
3
3
  module Bitcoin
4
4
  module Protocol
5
-
5
+ # TxIn section of https://en.bitcoin.it/wiki/Protocol_documentation#tx
6
6
  class TxIn
7
-
8
7
  # previous output hash
9
8
  attr_accessor :prev_out_hash
10
- alias :prev_out :prev_out_hash
11
- def prev_out=(hash); @prev_out_hash = hash; end
9
+ alias prev_out prev_out_hash
10
+ def prev_out=(hash)
11
+ @prev_out_hash = hash
12
+ end
12
13
 
13
14
  # previous output index
14
15
  attr_accessor :prev_out_index
15
16
 
16
17
  # script_sig input Script (signature)
17
- attr_accessor :script_sig, :script_sig_length
18
+ attr_reader :script_sig
19
+ attr_accessor :script_sig_length
18
20
 
19
21
  # signature hash and the address of the key that needs to sign it
20
22
  # (used when dealing with unsigned or partly signed tx)
@@ -23,17 +25,17 @@ module Bitcoin
23
25
  # segregated witness
24
26
  attr_accessor :script_witness
25
27
 
26
- alias :script :script_sig
27
- alias :script_length :script_sig_length
28
+ alias script script_sig
29
+ alias script_length script_sig_length
28
30
 
29
31
  # sequence
30
32
  attr_accessor :sequence
31
33
 
32
- DEFAULT_SEQUENCE = "\xff\xff\xff\xff"
33
- NULL_HASH = "\x00"*32
34
+ DEFAULT_SEQUENCE = "\xff\xff\xff\xff".freeze
35
+ NULL_HASH = "\x00" * 32
34
36
  COINBASE_INDEX = 0xffffffff
35
37
 
36
- def initialize *args
38
+ def initialize(*args)
37
39
  @prev_out_hash, @prev_out_index, @script_sig_length,
38
40
  @script_sig, @sequence = *args
39
41
  @script_sig_length ||= 0
@@ -48,13 +50,18 @@ module Bitcoin
48
50
  @prev_out_index == other.prev_out_index &&
49
51
  @script_sig == other.script_sig &&
50
52
  @sequence == other.sequence
51
- rescue
53
+ rescue StandardError
52
54
  false
53
55
  end
54
-
56
+
57
+ def is_final? # rubocop:disable Naming/PredicateName
58
+ warn '[DEPRECATION] `TxIn.is_final?` is deprecated. Use `final?` instead.'
59
+ final?
60
+ end
61
+
55
62
  # returns true if the sequence number is final (DEFAULT_SEQUENCE)
56
- def is_final?
57
- self.sequence == DEFAULT_SEQUENCE
63
+ def final?
64
+ sequence == DEFAULT_SEQUENCE
58
65
  end
59
66
 
60
67
  # parse raw binary data for transaction input
@@ -65,11 +72,13 @@ module Bitcoin
65
72
  end
66
73
 
67
74
  def self.from_io(buf)
68
- txin = new; txin.parse_data_from_io(buf); txin
75
+ txin = new
76
+ txin.parse_data_from_io(buf)
77
+ txin
69
78
  end
70
79
 
71
80
  def parse_data_from_io(buf)
72
- @prev_out_hash, @prev_out_index = buf.read(36).unpack("a32V")
81
+ @prev_out_hash, @prev_out_index = buf.read(36).unpack('a32V')
73
82
  @script_sig_length = Protocol.unpack_var_int_from_io(buf)
74
83
  @script_sig = buf.read(@script_sig_length)
75
84
  @sequence = buf.read(4)
@@ -79,40 +88,39 @@ module Bitcoin
79
88
  @parsed_script ||= Bitcoin::Script.new(script_sig)
80
89
  end
81
90
 
82
- def to_payload(script=@script_sig, sequence=@sequence)
83
- [@prev_out_hash, @prev_out_index].pack("a32V") << Protocol.pack_var_int(script.bytesize) << script << (sequence || DEFAULT_SEQUENCE)
91
+ def to_payload(script = @script_sig, sequence = @sequence)
92
+ [@prev_out_hash, @prev_out_index].pack('a32V') << Protocol.pack_var_int(script.bytesize) \
93
+ << script << (sequence || DEFAULT_SEQUENCE)
84
94
  end
85
95
 
86
- def to_hash(options = {})
87
- t = { 'prev_out' => { 'hash' => @prev_out_hash.reverse_hth, 'n' => @prev_out_index } }
96
+ def to_hash(_options = {})
97
+ t = { 'prev_out' => { 'hash' => @prev_out_hash.reverse_hth, 'n' => @prev_out_index } }
88
98
  if coinbase?
89
- t['coinbase'] = @script_sig.unpack("H*")[0]
99
+ t['coinbase'] = @script_sig.unpack('H*')[0]
90
100
  else # coinbase tx
91
101
  t['scriptSig'] = Bitcoin::Script.new(@script_sig).to_string
92
102
  end
93
- t['sequence'] = @sequence.unpack("V")[0] unless @sequence == "\xff\xff\xff\xff"
94
- t['witness'] = @script_witness.stack.map{|s|s.bth} unless @script_witness.empty?
103
+ t['sequence'] = @sequence.unpack('V')[0] unless @sequence == "\xff\xff\xff\xff"
104
+ t['witness'] = @script_witness.stack.map(&:bth) unless @script_witness.empty?
95
105
  t
96
106
  end
97
107
 
98
108
  def self.from_hash(input)
99
109
  previous_hash = input['previous_transaction_hash'] || input['prev_out']['hash']
100
110
  previous_output_index = input['output_index'] || input['prev_out']['n']
101
- txin = TxIn.new([ previous_hash ].pack('H*').reverse, previous_output_index)
102
- if input['coinbase']
103
- txin.script_sig = [ input['coinbase'] ].pack("H*")
104
- else
105
- txin.script_sig = Script.binary_from_string(input['scriptSig'] || input['script'])
106
- end
107
- if input['witness']
108
- input['witness'].each {|w| txin.script_witness.stack << w.htb}
109
- end
110
- txin.sequence = [ input['sequence'] || 0xffffffff ].pack("V")
111
+ txin = TxIn.new([previous_hash].pack('H*').reverse, previous_output_index)
112
+ txin.script_sig = if input['coinbase']
113
+ [input['coinbase']].pack('H*')
114
+ else
115
+ Script.binary_from_string(input['scriptSig'] || input['script'])
116
+ end
117
+ input['witness'].each { |w| txin.script_witness.stack << w.htb } if input['witness']
118
+ txin.sequence = [input['sequence'] || 0xffffffff].pack('V')
111
119
  txin
112
120
  end
113
121
 
114
122
  def self.from_hex_hash(hash, index)
115
- TxIn.new([hash].pack("H*").reverse, index, 0)
123
+ TxIn.new([hash].pack('H*').reverse, index, 0)
116
124
  end
117
125
 
118
126
  # previous output in hex
@@ -130,13 +138,11 @@ module Bitcoin
130
138
  @script_sig_length = script_sig.bytesize
131
139
  @script_sig = script_sig
132
140
  end
133
- alias :script= :script_sig=
141
+ alias script= script_sig=
134
142
 
135
143
  def add_signature_pubkey_script(sig, pubkey_hex)
136
- self.script = Bitcoin::Script.to_signature_pubkey_script(sig, [pubkey_hex].pack("H*"))
144
+ self.script = Bitcoin::Script.to_signature_pubkey_script(sig, [pubkey_hex].pack('H*'))
137
145
  end
138
-
139
146
  end
140
-
141
147
  end
142
148
  end
@@ -2,9 +2,8 @@
2
2
 
3
3
  module Bitcoin
4
4
  module Protocol
5
-
5
+ # TxOut section of https://en.bitcoin.it/wiki/Protocol_documentation#tx
6
6
  class TxOut
7
-
8
7
  # output value (in base units; "satoshi")
9
8
  attr_accessor :value
10
9
 
@@ -14,16 +13,20 @@ module Bitcoin
14
13
  # p2sh redeem script (optional, not included in the serialized binary format)
15
14
  attr_accessor :redeem_script
16
15
 
17
- def initialize *args
16
+ def initialize(*args)
18
17
  if args.size == 2
19
- @value, @pk_script_length, @pk_script = args[0], args[1].bytesize, args[1]
18
+ @value = args[0]
19
+ @pk_script_length = args[1].bytesize
20
+ @pk_script = args[1]
20
21
  else
21
22
  @value, @pk_script_length, @pk_script = *args
22
23
  end
23
24
  end
24
25
 
25
26
  def ==(other)
26
- @value == other.value && @pk_script == other.pk_script rescue false
27
+ @value == other.value && @pk_script == other.pk_script
28
+ rescue StandardError
29
+ false
27
30
  end
28
31
 
29
32
  # parse raw binary data for transaction output
@@ -34,18 +37,20 @@ module Bitcoin
34
37
  end
35
38
 
36
39
  def self.from_io(buf)
37
- txout = new; txout.parse_data_from_io(buf); txout
40
+ txout = new
41
+ txout.parse_data_from_io(buf)
42
+ txout
38
43
  end
39
44
 
40
45
  # parse raw binary data for transaction output
41
46
  def parse_data_from_io(buf)
42
47
  clear_parsed_script_cache
43
- @value = buf.read(8).unpack("Q")[0]
48
+ @value = buf.read(8).unpack('Q')[0]
44
49
  @pk_script_length = Protocol.unpack_var_int_from_io(buf)
45
50
  @pk_script = buf.read(@pk_script_length)
46
51
  end
47
52
 
48
- alias :parse_payload :parse_data
53
+ alias parse_payload parse_data
49
54
 
50
55
  def parsed_script
51
56
  @parsed_script ||= Bitcoin::Script.new(pk_script)
@@ -56,7 +61,7 @@ module Bitcoin
56
61
  end
57
62
 
58
63
  def to_payload
59
- [@value].pack("Q") << Protocol.pack_var_int(@pk_script_length) << @pk_script
64
+ [@value].pack('Q') << Protocol.pack_var_int(@pk_script_length) << @pk_script
60
65
  end
61
66
 
62
67
  def to_null_payload
@@ -64,14 +69,17 @@ module Bitcoin
64
69
  end
65
70
 
66
71
  def to_hash(options = {})
67
- h = { 'value' => "%.8f" % (@value / 100000000.0),
68
- 'scriptPubKey' => parsed_script.to_string }
69
- h["address"] = parsed_script.get_address if parsed_script.is_hash160? && options[:with_address]
72
+ h = { 'value' => format('%.8f', (@value / 100_000_000.0)),
73
+ 'scriptPubKey' => parsed_script.to_string }
74
+ if options[:with_address]
75
+ addrs = parsed_script.get_addresses
76
+ h['address'] = addrs.first if addrs.size == 1
77
+ end
70
78
  h
71
79
  end
72
80
 
73
81
  def self.from_hash(output)
74
- amount = output['value'] ? output['value'].gsub('.','').to_i : output['amount']
82
+ amount = output['value'] ? output['value'].delete('.').to_i : output['amount']
75
83
  script = Script.binary_from_string(output['scriptPubKey'] || output['script'])
76
84
  new(amount, script)
77
85
  end
@@ -79,14 +87,15 @@ module Bitcoin
79
87
  # set pk_script and pk_script_length
80
88
  def pk_script=(pk_script)
81
89
  clear_parsed_script_cache
82
- @pk_script_length, @pk_script = pk_script.bytesize, pk_script
90
+ @pk_script_length = pk_script.bytesize
91
+ @pk_script = pk_script
83
92
  end
84
93
 
85
- alias :amount :value
86
- alias :amount= :value=
94
+ alias amount value
95
+ alias amount= value=
87
96
 
88
- alias :script :pk_script
89
- alias :script= :pk_script=
97
+ alias script pk_script
98
+ alias script= pk_script=
90
99
 
91
100
  # create output spending +value+ btc (base units) to +address+
92
101
  def self.value_to_address(value, address)
@@ -94,8 +103,6 @@ module Bitcoin
94
103
  raise "Script#pk_script nil with address #{address}" unless pk_script
95
104
  new(value, pk_script)
96
105
  end
97
-
98
106
  end
99
-
100
107
  end
101
108
  end
@@ -2,7 +2,6 @@
2
2
 
3
3
  module Bitcoin
4
4
  module Protocol
5
-
6
5
  # https://en.bitcoin.it/wiki/Protocol_specification#version
7
6
  class Version
8
7
  # services bit constants
@@ -11,78 +10,92 @@ module Bitcoin
11
10
 
12
11
  attr_reader :fields
13
12
 
14
- def initialize(opts={})
13
+ def initialize(opts = {})
15
14
  @fields = {
16
- :version => Bitcoin.network[:protocol_version],
17
- :services => NODE_NETWORK,
18
- :time => Time.now.tv_sec,
19
- :from => "127.0.0.1:8333",
20
- :to => "127.0.0.1:8333",
21
- :nonce => Bitcoin::Protocol::Uniq,
22
- :user_agent => "/bitcoin-ruby:#{Bitcoin::VERSION}/",
23
- :last_block => 0, # 188617
24
- :relay => true # BIP0037
25
- }.merge( opts.reject{|k,v| v == nil } )
15
+ version: Bitcoin.network[:protocol_version],
16
+ services: NODE_NETWORK,
17
+ time: Time.now.tv_sec,
18
+ from: '127.0.0.1:8333',
19
+ to: '127.0.0.1:8333',
20
+ nonce: Bitcoin::Protocol::Uniq,
21
+ user_agent: "/bitcoin-ruby:#{Bitcoin::VERSION}/",
22
+ last_block: 0, # 188617
23
+ relay: true # BIP0037
24
+ }.merge(opts.reject { |_k, v| v.nil? })
26
25
  end
27
26
 
28
27
  def to_payload
29
28
  [
30
- @fields.values_at(:version, :services, :time).pack("VQQ"),
29
+ @fields.values_at(:version, :services, :time).pack('VQQ'),
31
30
  pack_address_field(@fields[:from]),
32
31
  pack_address_field(@fields[:to]),
33
- @fields.values_at(:nonce).pack("Q"),
32
+ @fields.values_at(:nonce).pack('Q'),
34
33
  Protocol.pack_var_string(@fields[:user_agent]),
35
- @fields.values_at(:last_block).pack("V"),
36
- Protocol.pack_boolean(@fields[:relay]) # Satoshi 0.8.6 doesn't send this but it does respect it
34
+ @fields.values_at(:last_block).pack('V'),
35
+ # Satoshi 0.8.6 doesn't send this but it does respect it
36
+ Protocol.pack_boolean(@fields[:relay])
37
37
  ].join
38
38
  end
39
39
 
40
40
  def to_pkt
41
- Bitcoin::Protocol.pkt("version", to_payload)
41
+ Bitcoin::Protocol.pkt('version', to_payload)
42
42
  end
43
43
 
44
44
  def parse(payload)
45
- version, services, timestamp, to, from, nonce, payload = payload.unpack("VQQa26a26Qa*")
46
- to, from = unpack_address_field(to), unpack_address_field(from)
45
+ version, services, timestamp, to, from, nonce, payload = payload.unpack('VQQa26a26Qa*')
46
+ to = unpack_address_field(to)
47
+ from = unpack_address_field(from)
47
48
  user_agent, payload = Protocol.unpack_var_string(payload)
48
- last_block, payload = payload.unpack("Va*")
49
- relay, payload = unpack_relay_field(version, payload)
49
+ last_block, payload = payload.unpack('Va*')
50
+ relay, = unpack_relay_field(version, payload)
50
51
 
51
52
  @fields = {
52
- :version => version, :services => services, :time => timestamp,
53
- :from => from, :to => to, :nonce => nonce,
54
- :user_agent => user_agent.to_s, :last_block => last_block, :relay => relay
53
+ version: version, services: services, time: timestamp,
54
+ from: from, to: to, nonce: nonce,
55
+ user_agent: user_agent.to_s, last_block: last_block, relay: relay
55
56
  }
56
57
  self
57
58
  end
58
59
 
59
60
  def unpack_address_field(payload)
60
- ip, port = payload.unpack("x8x12a4n")
61
- "#{ip.unpack("C*").join(".")}:#{port}"
61
+ ip, port = payload.unpack('x8x12a4n')
62
+ "#{ip.unpack('C*').join('.')}:#{port}"
62
63
  end
63
64
 
64
65
  def pack_address_field(addr_str)
65
- host, port = addr_str.split(":")
66
+ host, port = addr_str.split(':')
66
67
  port = port ? port.to_i : 8333
67
68
  sockaddr = Socket.pack_sockaddr_in(port, host)
68
- #raise "invalid IPv4 Address: #{addr}" unless sockaddr[0...2] == "\x02\x00"
69
- port, host = sockaddr[2...4], sockaddr[4...8]
70
- [[1].pack("Q"), "\x00"*10, "\xFF\xFF", host, port].join
69
+ # raise "invalid IPv4 Address: #{addr}" unless sockaddr[0...2] == "\x02\x00"
70
+ port = sockaddr[2...4]
71
+ host = sockaddr[4...8]
72
+ [[1].pack('Q'), "\x00" * 10, "\xFF\xFF", host, port].join
71
73
  end
72
74
 
73
75
  # BIP0037: this field starts with version 70001 and is allowed to be missing, defaults to true
74
76
  def unpack_relay_field(version, payload)
75
- ( version >= 70001 and payload ) ? Protocol.unpack_boolean(payload) : [ true, nil ]
77
+ version >= 70_001 && payload ? Protocol.unpack_boolean(payload) : [true, nil]
76
78
  end
77
79
 
78
80
  def uptime
79
81
  @fields[:time] - Time.now.tv_sec
80
82
  end
81
83
 
82
- def method_missing(*a); (@fields[a.first] rescue nil) or super(*a); end
84
+ def method_missing(*a)
85
+ @fields[a.first]
86
+ rescue StandardError
87
+ super
88
+ end
83
89
 
84
- def self.parse(payload); new.parse(payload); end
85
- end
90
+ def respond_to_missing?(*a)
91
+ @fields[a.first]
92
+ rescue StandardError
93
+ super
94
+ end
86
95
 
96
+ def self.parse(payload)
97
+ new.parse(payload)
98
+ end
99
+ end
87
100
  end
88
101
  end
@@ -161,9 +161,13 @@ class Bitcoin::Script
161
161
  attr_reader :raw, :chunks, :debug, :stack
162
162
 
163
163
  # create a new script. +bytes+ is typically input_script + output_script
164
+
164
165
  def initialize(input_script, previous_output_script=nil)
165
166
  @raw_byte_sizes = [input_script.bytesize, previous_output_script ? previous_output_script.bytesize : 0]
166
167
  @input_script, @previous_output_script = input_script, previous_output_script
168
+ @parse_invalid = nil
169
+ @inner_p2sh = nil
170
+ @script_codeseparator_index = nil
167
171
 
168
172
  @raw = if @previous_output_script
169
173
  @input_script + [ Bitcoin::Script::OP_CODESEPARATOR ].pack("C") + @previous_output_script
@@ -258,7 +262,7 @@ class Bitcoin::Script
258
262
  (chunks || @chunks).each.with_index{|i,idx|
259
263
  string << " " unless idx == 0
260
264
  string << case i
261
- when Fixnum
265
+ when Bitcoin::Integer
262
266
  if opcode = OPCODES_PARSE_BINARY[i]
263
267
  opcode
264
268
  else
@@ -276,9 +280,10 @@ class Bitcoin::Script
276
280
  end
277
281
 
278
282
  def to_binary(chunks=nil)
283
+
279
284
  (chunks || @chunks).map{|chunk|
280
285
  case chunk
281
- when Fixnum; [chunk].pack("C*")
286
+ when Bitcoin::Integer; [chunk].pack("C*")
282
287
  when String; self.class.pack_pushdata(chunk)
283
288
  end
284
289
  }.join
@@ -317,7 +322,7 @@ class Bitcoin::Script
317
322
  # Adds opcode (OP_0, OP_1, ... OP_CHECKSIG etc.)
318
323
  # Returns self.
319
324
  def append_opcode(opcode)
320
- raise "Opcode should be a Fixnum" if !opcode.is_a?(Fixnum)
325
+ raise "Opcode should be an integer" if !opcode.is_a?(Bitcoin::Integer)
321
326
  if opcode >= OP_0 && opcode <= 0xff
322
327
  @chunks << opcode
323
328
  else
@@ -417,7 +422,7 @@ class Bitcoin::Script
417
422
  end
418
423
  end
419
424
 
420
- buf << if i.is_a?(Fixnum)
425
+ buf << if i.is_a?(Bitcoin::Integer)
421
426
  i < 256 ? [i].pack("C") : [OpenSSL::BN.new(i.to_s,10).to_hex].pack("H*")
422
427
  else
423
428
  i
@@ -452,7 +457,7 @@ class Bitcoin::Script
452
457
  #p [@stack, @do_exec]
453
458
 
454
459
  case chunk
455
- when Fixnum
460
+ when Bitcoin::Integer
456
461
  if DISABLED_OPCODES.include?(chunk)
457
462
  @script_invalid = true
458
463
  @debug << "DISABLED_#{OPCODES[chunk]}"
@@ -550,7 +555,8 @@ class Bitcoin::Script
550
555
 
551
556
  # is this a :script_hash (pay-to-script-hash/p2sh) script?
552
557
  def is_pay_to_script_hash?
553
- return false if @inner_p2sh
558
+ @inner_p2sh ||= false
559
+ return false if @inner_p2sh
554
560
  if @previous_output_script
555
561
  chunks = Bitcoin::Script.new(@previous_output_script).chunks
556
562
  chunks.size == 3 &&
@@ -590,7 +596,7 @@ class Bitcoin::Script
590
596
 
591
597
  # is this a multisig script
592
598
  def is_multisig?
593
- return false if @chunks.size < 4 || !@chunks[-2].is_a?(Fixnum)
599
+ return false if @chunks.size < 4 || !@chunks[-2].is_a?(Bitcoin::Integer)
594
600
  @chunks[-1] == OP_CHECKMULTISIG and get_multisig_pubkeys.all?{|c| c.is_a?(String) }
595
601
  end
596
602
 
@@ -616,12 +622,12 @@ class Bitcoin::Script
616
622
 
617
623
  # Verify the script is only pushing data onto the stack
618
624
  def is_push_only?(script_data=nil)
619
- check_pushes(push_only=true, canonical_only=false, (script_data||@input_script))
625
+ check_pushes(true, false, (script_data||@input_script))
620
626
  end
621
627
 
622
628
  # Make sure opcodes used to push data match their intended length ranges
623
629
  def pushes_are_canonical?(script_data=nil)
624
- check_pushes(push_only=false, canonical_only=true, (script_data||@raw))
630
+ check_pushes(false, true, (script_data||@raw))
625
631
  end
626
632
 
627
633
  def check_pushes(push_only=true, canonical_only=false, buf)
@@ -930,7 +936,7 @@ class Bitcoin::Script
930
936
  elsif chunk == OP_CHECKMULTISIG || chunk == OP_CHECKMULTISIGVERIFY
931
937
  # Accurate mode counts exact number of pubkeys required (not signatures, but pubkeys!). Only used in P2SH scripts.
932
938
  # Inaccurate mode counts every multisig as 20 signatures.
933
- if is_accurate && last_opcode && last_opcode.is_a?(Fixnum) && last_opcode >= OP_1 && last_opcode <= OP_16
939
+ if is_accurate && last_opcode && last_opcode.is_a?(Bitcoin::Integer) && last_opcode >= OP_1 && last_opcode <= OP_16
934
940
  count += ::Bitcoin::Script.decode_OP_N(last_opcode)
935
941
  else
936
942
  count += 20
@@ -956,7 +962,7 @@ class Bitcoin::Script
956
962
  data = nil
957
963
  @chunks.each do |chunk|
958
964
  case chunk
959
- when Fixnum
965
+ when Bitcoin::Integer
960
966
  data = ""
961
967
  return 0 if chunk > OP_16
962
968
  when String
@@ -974,7 +980,7 @@ class Bitcoin::Script
974
980
  if opcode == OP_0
975
981
  return 0
976
982
  end
977
- if opcode.is_a?(Fixnum) && opcode >= OP_1 && opcode <= OP_16
983
+ if opcode.is_a?(Bitcoin::Integer) && opcode >= OP_1 && opcode <= OP_16
978
984
  return opcode - (OP_1 - 1);
979
985
  else
980
986
  nil
@@ -1533,11 +1539,6 @@ class Bitcoin::Script
1533
1539
  op_verify
1534
1540
  end
1535
1541
 
1536
- # op_eval: https://en.bitcoin.it/wiki/BIP_0012
1537
- # the BIP was never accepted and must be handled as old OP_NOP1
1538
- def op_nop1
1539
- end
1540
-
1541
1542
  OPCODES_METHOD = Hash[*instance_methods.grep(/^op_/).map{|m|
1542
1543
  [ (OPCODES.find{|k,v| v == m.to_s.upcase }.first rescue nil), m ]
1543
1544
  }.flatten]