diff --git a/lib/src/encoding/utils.dart b/lib/src/encoding/utils.dart index ac7d42a..0c641d0 100644 --- a/lib/src/encoding/utils.dart +++ b/lib/src/encoding/utils.dart @@ -56,24 +56,25 @@ BigInt hexToUint64(List hexBuffer) { return BigInt.parse(HEX.encode(hexBuffer), radix: 16).toUnsigned(64); } -List varintBufNum(n) { -// List buf ; - ByteDataWriter writer = ByteDataWriter(); - if (n < 253) { - writer.writeUint8(n); - } else if (n < 0x10000) { - writer.writeUint8(253); - writer.writeUint16(n, Endian.little); - } else if (n < 0x100000000) { - writer.writeUint8(254); - writer.writeUint32(n, Endian.little); - } else { - writer.writeUint8(255); - writer.writeInt32(n & -1, Endian.little); - writer.writeUint32((n / 0x100000000).floor(), Endian.little); - } - return writer.toBytes().toList(); -} +// List varintBufNum(n) { +// // List buf ; +// ByteDataWriter writer = ByteDataWriter(); +// if (n < 253) { +// writer.writeUint8(n); +// } else if (n < 0x10000) { +// writer.writeUint8(253); +// writer.writeUint16(n, Endian.little); +// } else if (n < 0x100000000) { +// writer.writeUint8(254); +// writer.writeUint32(n, Endian.little); +// } else { +// writer.writeUint8(255); +// writer.writeInt32(n & -1, Endian.little); +// writer.writeUint32((n / 0x100000000).floor(), Endian.little); +// } +// return writer.toBytes().toList(); +// } + Uint8List varIntWriter(int? length) { ByteDataWriter writer = ByteDataWriter(); @@ -114,22 +115,41 @@ Uint8List varIntWriter(int? length) { return writer.toBytes(); } -List calcVarInt(int? length) { - if (length == null) return Uint8List(0); - - if (length < 0xFD) return HEX.decode(length.toRadixString(16)); - - if (length < 0xFFFF) return HEX.decode("FD" + length.toRadixString(16)); - - if (length < 0xFFFFFFFF) return HEX.decode("FE" + length.toRadixString(16)); - - if (BigInt.parse("0xFFFFFFFFFFFFFFFF").compareTo(BigInt.from(length)) == -1) - return HEX.decode("FF" + length.toRadixString(16)); +/** + * Returns the minimum encoded size of the given unsigned long value. + * + * @param value the unsigned long value (beware widening conversion of negatives!) + */ +int sizeOf(int value) { + // if negative, it's actually a very large unsigned long value + if (value < 0) return 9; // 1 marker + 8 data bytes + if (value < 253) return 1; // 1 data byte + if (value <= 0xFFFF) return 3; // 1 marker + 2 data bytes + if (value <= 0xFFFFFFFF) return 5; // 1 marker + 4 data bytes + return 9; // 1 marker + 8 data bytes +} + +List calcVarInt(int value) { + var writer = ByteDataWriter(); + switch (sizeOf(value)) { + case 1: + return [value]; + case 3: + writer.writeUint8(253); + writer.writeUint16(value, Endian.little); + return writer.toBytes(); + case 5: + writer.writeUint8(254); + writer.writeUint32(value, Endian.little); + return writer.toBytes(); - return Uint8List(0); + default: + writer.writeUint8(255); + writer.writeInt64(value, Endian.little); + return writer.toBytes(); + } } -//Implementation from bsv lib int readVarIntNum(ByteDataReader reader) { var varint = VarInt.fromStream(reader); return varint.value; @@ -156,16 +176,6 @@ BigInt readVarInt(Uint8List buffer) { } } -int? getBufferOffset(int count) { - if (count < 0xFD) return 1; - - if (count == 0xFD) return 3; //2 bytes == Uint16 - - if (count == 0xFE) return 5; //4 bytes == Uint32 - - if (count == 0xFF) return 9; -} - Uint8List encodeBigIntSV(BigInt number) { int size = (number.bitLength + 7) >> 3; diff --git a/lib/src/script/svscript.dart b/lib/src/script/svscript.dart index e199906..7024d34 100644 --- a/lib/src/script/svscript.dart +++ b/lib/src/script/svscript.dart @@ -727,6 +727,10 @@ class SVScript { os.writeUint8(OpCodes.OP_PUSHDATA2); os.writeUint16(buf.length, Endian.little); os.write(buf); + } else if (buf.length < pow(2, 32)) { + os.writeUint8(OpCodes.OP_PUSHDATA4); + os.writeUint32(buf.length, Endian.little); + os.write(buf); } else { throw Exception("Unimplemented"); } diff --git a/lib/src/sighash.dart b/lib/src/sighash.dart index 407ebeb..6e7ef9c 100644 --- a/lib/src/sighash.dart +++ b/lib/src/sighash.dart @@ -319,7 +319,8 @@ class Sighash { writer.writeUint32(input.prevTxnOutputIndex, Endian.little); // scriptCode of the input (serialized as scripts inside CTxOuts) - writer.write(varIntWriter(subscript.buffer.length).toList(), copy: true); + var scriptSize = VarInt.fromInt(subscript.buffer.length); + writer.write(scriptSize.encode(), copy: true); writer.write(subscript.buffer); // value of the output spent by this input (8-byte little endian) diff --git a/lib/src/transaction/script_builder.dart b/lib/src/transaction/script_builder.dart index 8d76a46..393efc1 100644 --- a/lib/src/transaction/script_builder.dart +++ b/lib/src/transaction/script_builder.dart @@ -1,4 +1,5 @@ import 'dart:collection'; +import 'dart:math'; import 'dart:typed_data'; import 'package:dartsv/dartsv.dart'; @@ -42,7 +43,7 @@ class ScriptBuilder { int opcode; if (data.length == 0) { - opcode = 0; + opcode = OpCodes.OP_0; } else if (data.length == 1) { int b = data[0]; if (b >= 1 && b <= 16) { @@ -50,16 +51,16 @@ class ScriptBuilder { } else { opcode = 1; } - } else if (data.length < 76) { + } else if (data.length < OpCodes.OP_PUSHDATA1) { opcode = data.length; } else if (data.length < 256) { - opcode = 76; - } else { - if (data.length >= 65536) { - throw new Exception("Unimplemented"); - } - - opcode = 77; + opcode = OpCodes.OP_PUSHDATA1; + } else if (data.length < 65536) { + opcode = OpCodes.OP_PUSHDATA2; + } else if (data.length < pow(2, 32)){ + opcode = OpCodes.OP_PUSHDATA4; + }else{ + throw Exception ("Data push of > 2Gb size is not supported"); } return this.insertChunk(index, ScriptChunk(copy, copy.length, opcode)); diff --git a/lib/src/transaction/transaction.dart b/lib/src/transaction/transaction.dart index ac3a287..63cba5d 100644 --- a/lib/src/transaction/transaction.dart +++ b/lib/src/transaction/transaction.dart @@ -242,7 +242,8 @@ class Transaction { writer.writeInt32(version, Endian.little); // set the number of inputs - writer.write(varintBufNum(inputs.length)); + var numInputs= VarInt.fromInt(inputs.length); + writer.write(numInputs.encode()); // write the inputs inputs.forEach((input) { @@ -250,7 +251,8 @@ class Transaction { }); //set the number of outputs to come - writer.write(varintBufNum(outputs.length)); + var numOutputs= VarInt.fromInt(outputs.length); + writer.write(numOutputs.encode()); // write the outputs outputs.forEach((output) { diff --git a/lib/src/transaction/transaction_input.dart b/lib/src/transaction/transaction_input.dart index 902d9a9..36c3301 100644 --- a/lib/src/transaction/transaction_input.dart +++ b/lib/src/transaction/transaction_input.dart @@ -101,7 +101,9 @@ class TransactionInput { var scriptBytes = _unlockingScriptBuilder!.getScriptSig().buffer; - writer.write(varIntWriter(scriptBytes.length).toList(), copy: true); + // varIntWriter(scriptBytes.length).toList() + var scriptSize = VarInt.fromInt(scriptBytes.length); + writer.write(scriptSize.encode(), copy: true); writer.write(scriptBytes, copy: true); writer.writeUint32(sequenceNumber, Endian.little); diff --git a/test/data/bitcoin_whitepaper.pdf b/test/data/bitcoin_whitepaper.pdf new file mode 100644 index 0000000..1e19b73 Binary files /dev/null and b/test/data/bitcoin_whitepaper.pdf differ diff --git a/test/data/lorem_ipsum.txt b/test/data/lorem_ipsum.txt new file mode 100644 index 0000000..1596284 --- /dev/null +++ b/test/data/lorem_ipsum.txt @@ -0,0 +1,5 @@ +

Lorem ipsum dolor sit amet. Vel molestiae voluptatem aut ullam possimus sed commodi perspiciatis. +Aut delectus praesentium eum rerum cupiditate et laboriosam esse ut voluptatem quod non rerum unde ut exercitationem omnis non minus quaerat. Ut quasi adipisci aut repudiandae error eos consequatur voluptatem. Eum accusamus repellat et voluptatibus enim cum internos enim eum eveniet libero aut accusantium facilis! In dolore modi sit voluptas expedita ut numquam ullam et incidunt vero eum esse facere in dolorem molestiae hic fuga facilis. Aut officiis illo qui maxime veritatis sed aperiam quis. Et dolores excepturi 33 omnis quis hic fuga sunt! Ut saepe quam eum vero distinctio qui consequatur beatae qui mollitia deserunt.

Vel ullam quia qui nobis nesciunt ut voluptatem commodi qui animi aliquid et voluptates unde est tenetur ipsam. Qui error rerum sed rerum eaque sit molestiae dolores est reprehenderit dignissimos. Est provident laboriosam aut corrupti error aut laborum asperiores At sequi accusantium. Quo doloribus saepe ut optio temporibus non pariatur facilis aut aliquam alias est deserunt corporis quo atque accusantium sit facilis placeat. Est nisi voluptas et enim perferendis et adipisci aperiam est nulla tenetur aut error officiis At eveniet dolores. Et pariatur doloribus et reprehenderit veniam sit delectus nihil! Ut beatae soluta qui quibusdam sint et eius officiis qui eius dolore aut sunt quisquam ut culpa illo. Ea velit praesentium cum molestiae tempora hic expedita impedit est nisi praesentium ut quibusdam suscipit quo provident perferendis. Et impedit fugiat nam sunt odit cum dolorem recusandae. Sed voluptatem quod est totam voluptatem eum commodi illum sed quae alias et esse facere quo sequi deserunt. Nam odit iste et magnam velit qui earum quam?

Est possimus placeat aut voluptas fuga ut repellat repellendus et reiciendis error qui voluptatem totam. Est expedita quidem sed nihil facilis vel illum ullam et quasi maxime est nemo consequuntur eos itaque explicabo. Rem fugit sapiente est architecto perspiciatis eum accusantium dolores et quas voluptas est consequatur voluptas. Eos vitae saepe eos recusandae iste est dignissimos aspernatur sed illo mollitia. Et nemo quisquam vel sapiente quam qui nemo voluptatem aut quod dicta cum odio numquam aut amet fugiat. Vel voluptatibus molestias ut molestiae excepturi quo nulla laborum. Sit quidem voluptatem ex minus voluptatem qui nihil vitae. Id asperiores perspiciatis ut ipsam labore et voluptatem quam ex debitis suscipit et accusamus numquam a voluptas autem et placeat incidunt.

In officiis consequuntur et totam omnis et natus voluptatem. Est eligendi laudantium et molestiae vero est consectetur fugit in voluptatum amet et esse tenetur. Aut consequatur accusantium qui dolorem magnam est animi quia id iure quae? Et iusto blanditiis et distinctio necessitatibus quo placeat illum sit quaerat laborum ea labore officia! Et delectus molestiae a accusantium suscipit et fugiat galisum sed alias dignissimos in provident minima sed optio earum. At adipisci exercitationem in voluptates fuga ab dicta excepturi sit harum mollitia et molestias dolor. Sed autem dolorem vel voluptatibus tempora eos similique nemo est numquam cumque cum voluptas Quis et ipsum similique vel error doloremque. Et doloremque inventore sed omnis placeat nam consectetur doloremque aut sequi fuga qui obcaecati nobis est voluptas omnis. Ea laudantium inventore ut dolor nihil eos fuga iste a veritatis pariatur. Ut illum ullam et veritatis aliquid non impedit nostrum. At facere molestiae quo enim nemo et rerum consectetur hic voluptatem officia eum quae temporibus quo libero assumenda! Et animi sint eos iure aperiam 33 laudantium dolor in quidem voluptatem in omnis nobis. Ad assumenda earum hic libero placeat aut consequatur culpa. Et similique facere eos autem sunt ut iusto consequatur qui delectus quisquam.

Id harum quibusdam et enim quasi eum excepturi beatae. Non facere odit rem molestias commodi aut consectetur maxime qui modi maxime sit enim dolorem ab dolores fugiat. 33 esse voluptatem ea similique inventore et unde omnis quo quas quia. Vel iste consectetur et enim incidunt ea necessitatibus reprehenderit et dolorem perspiciatis ad doloremque repudiandae sed numquam consectetur. Vel temporibus tempora et eveniet labore et cupiditate obcaecati vel doloremque quam ea dolorum doloribus. Ab quia voluptatum ut impedit consequuntur est quia velit et suscipit error et voluptatem quis. Qui natus omnis quo quia sunt aut omnis galisum qui officia atque vel internos nulla qui accusamus nobis ab dignissimos enim? Et voluptas autem ea enim consectetur qui similique incidunt!

Sit animi exercitationem hic labore quia et velit accusantium. Et reiciendis molestias qui laboriosam praesentium At libero dolorem et praesentium corporis est necessitatibus quas sed repudiandae dolor non sint distinctio. Aut dicta consequatur non expedita sunt ea facere explicabo et omnis iste. Sed architecto nobis et voluptas dolor nam quisquam minus qui ducimus corporis. A error voluptatem et maiores eligendi ut rerum veritatis quo totam molestias ex possimus exercitationem et asperiores molestiae! Ad illum sequi qui eligendi eius sed porro sint. Et dicta unde ut error nihil et culpa exercitationem eum cupiditate fugiat est nobis facilis. Est voluptatem aliquid eum sint aliquid ea animi sunt sed dolores fugit eum nihil galisum aut omnis voluptatem. Est possimus esse et sint laboriosam 33 dignissimos tempora aut impedit deserunt a commodi consequatur! Vel enim voluptatibus qui tenetur quae in voluptatem quidem non incidunt perspiciatis et quod soluta eos officiis omnis. Non officiis voluptates et recusandae maiores in inventore debitis qui molestiae autem quo quibusdam enim sit aliquam aliquam. Qui animi dolor et dolores debitis aut dignissimos voluptates qui pariatur provident. Sed voluptatem cupiditate non corrupti eveniet id praesentium accusamus sit accusamus deserunt eum unde doloribus qui nobis voluptatibus. Qui quaerat voluptate qui sequi ullam et dolore delectus quo rerum consequatur.

Ea libero nulla eos veniam reiciendis est aperiam iste quo aspernatur praesentium. Quo impedit ducimus in dolorem aspernatur sit quis esse et reiciendis impedit eum quia nulla. Sit natus quos sit quos maiores est odit numquam qui culpa exercitationem et doloribus fugit rem iste dolorem et odit culpa. Qui ducimus consectetur ut distinctio corporis in iusto accusantium ut sint autem a placeat ipsam. Eos eveniet nesciunt aut rerum nemo eos illum temporibus aut temporibus voluptatem est facere minima. Sed tempora veniam At aliquam delectus hic maxime Quis. Et reiciendis dolore non perspiciatis minus et voluptas adipisci ut aperiam consequuntur non commodi quia. Quo harum aliquam eos quasi aspernatur eum ipsum deleniti ut molestiae voluptatem.

Id facere sunt non omnis soluta id accusantium fugit. In saepe suscipit ut incidunt nostrum et sint nisi est reprehenderit animi et natus vitae est officiis saepe. Qui omnis nostrum non laudantium maxime ea sapiente facilis est porro sint aut nemo praesentium et distinctio maxime aut error dolorum. Quo maiores doloribus qui voluptatum quibusdam et iusto voluptas ut laborum voluptas. Ut perferendis amet et eaque error et ipsam doloribus in voluptatum voluptas. Et exercitationem voluptatibus est voluptatem sequi aut sunt molestias eos cumque dignissimos et placeat omnis. Ad suscipit numquam eos galisum molestiae sit repellat veritatis non accusantium doloribus non nobis distinctio et labore voluptate id veniam laborum. Ad sunt cumque nam aperiam laudantium in odio nostrum eos voluptatum error est sint officia.

Sit magni iusto sed unde omnis sit necessitatibus corrupti hic voluptates vero eos quia enim non nulla inventore! Sed nisi dolores vel recusandae doloremque et quod ipsa ea quod rerum ut deserunt alias et fugit illo qui nesciunt dolorem. Ea earum tempore et sapiente esse 33 autem corporis At natus enim. Non eius quisquam sit architecto autem et sint fugit qui ducimus quia aut impedit quaerat in doloribus ratione. Et impedit veritatis sed maiores consequatur nam odit voluptatem ut modi quidem eum nostrum officiis ut repellat nostrum. Ea libero exercitationem ut sint sapiente vel ratione consequatur. Aut quidem aspernatur in odit consequuntur in suscipit recusandae 33 nesciunt labore et facilis quaerat in quia quae ut labore molestias. Eos fugiat laboriosam qui eius iure ut sequi voluptatem qui dicta architecto At perferendis similique.

Ut omnis minima hic quam omnis sit ipsa ipsa est omnis debitis qui error eligendi. Eos reiciendis vitae sit nesciunt natus quo veritatis adipisci ut ipsam officiis sit quam assumenda et dolore voluptas! Et sint Quis nam dolorum sint qui nihil quia et autem magnam et similique rerum qui nostrum itaque. 33 numquam nisi aut odit modi non voluptatum iusto sit animi maiores At eaque eligendi qui mollitia quia ad nihil nihil. A aspernatur dolores hic laudantium distinctio qui nesciunt ipsum ea dignissimos consequatur ex fugiat eveniet sed placeat omnis. Hic neque perferendis est adipisci quaerat qui recusandae sunt ab saepe sunt est ipsum galisum. Ex velit alias aut sunt consectetur eos itaque molestiae. Est animi dolor eos laudantium exercitationem qui animi dolores ad sunt cupiditate ad aspernatur quod sit consectetur alias. Qui velit doloribus eum dignissimos laboriosam et distinctio accusamus. Ad placeat blanditiis est autem ipsam aut veniam doloremque! At illum nesciunt aut alias eius est pariatur architecto sit molestias molestias. Eum officia minus qui dolores quis qui dolore assumenda qui quaerat voluptate in optio omnis ea eveniet impedit vel rerum molestiae. Aut ratione voluptatem sed quia veniam aut doloremque amet ut porro veniam qui perspiciatis aperiam non omnis suscipit eos suscipit corporis. Ut laudantium nisi qui fugit voluptatibus eum mollitia tempora sit culpa nihil At explicabo molestiae.

Eum unde omnis qui quam numquam vel illo molestiae aut voluptatibus quos. Rem nostrum quis et accusamus voluptatem id consequuntur porro aut saepe itaque non dolore dolores. Vel nisi pariatur eos vitae voluptates sit tempora optio ut ducimus tenetur ut reprehenderit consequatur. Ut vitae perspiciatis non impedit dolorem sit sint praesentium. Ab corrupti fugit ut quos corporis qui molestias vero aut deleniti reiciendis et inventore dolorum ea laborum consequuntur eos suscipit dignissimos! Quo neque fugiat et alias voluptatem id eaque tempore ut distinctio nihil sed vitae nulla. Aut fugiat ipsam qui repellat veniam eos dolorum odio ut minus saepe. Et quisquam quod non recusandae unde sit provident quia ea magnam incidunt et deserunt eveniet.

Est internos totam ut asperiores possimus rem officia molestiae ut rerum fuga 33 atque quia. Eum sint provident qui explicabo totam qui ullam omnis? Ut vitae vero est doloribus tempore ea debitis accusamus hic asperiores deleniti hic omnis maxime ut temporibus magnam qui quis sunt. Aut vitae provident id sunt voluptatem est quidem tempore non voluptatibus animi. Ea perferendis reiciendis sit Quis obcaecati quo dicta adipisci ab maiores expedita. Id Quis nihil qui dolorem reiciendis eos repellat praesentium! Quo deserunt nemo et sint ipsum id voluptas sint ut ipsa voluptate qui quos autem aut numquam exercitationem. Sit rerum perferendis non architecto voluptatem aut cumque incidunt aut facere numquam id quisquam sapiente non pariatur ipsam At nemo commodi. Eos laborum nostrum qui amet rerum qui quod quae hic veritatis pariatur ea minima voluptas rem sint possimus? Non corporis officiis eum fuga mollitia ut voluptatibus rerum qui ipsa alias aut iure molestiae qui autem nostrum. Aut dolorem omnis ut neque laborum et autem eaque. Ad maxime error ut eligendi unde aut possimus laborum eos incidunt voluptates quo nisi rerum quo possimus fuga. Et aspernatur ratione et aliquid illum 33 mollitia vitae aut voluptatem galisum. Ad quia quasi est totam magni ut quia voluptatem non alias iusto est beatae quos.

Est fugit harum aut galisum laudantium qui aperiam maiores in magnam voluptatem! Id temporibus perspiciatis qui error minus ut ipsam quisquam et quae cupiditate ad dolores sapiente sit eligendi velit aut amet doloremque. Qui dolore ullam id dolor iure in minus voluptate. Et laborum suscipit rem expedita voluptas qui repellendus architecto ut galisum magni aut quasi illo. Nam tenetur unde aut reprehenderit unde est excepturi consequuntur hic accusantium asperiores At voluptates fugiat et neque nemo. Aut omnis magni non animi porro aut ipsa atque? Sit suscipit exercitationem quo eius pariatur est aspernatur galisum et doloribus veniam qui fugit sint in nostrum sunt eum facere illum. Et unde doloremque et corporis porro vel enim voluptates et doloremque alias est corporis impedit. Non dolor unde qui nulla nesciunt qui soluta molestias qui fuga dolor est iure dolorem. Eum doloremque illum ut velit quia in dolores perspiciatis aut similique consequuntur. Ea laudantium eligendi aut voluptatum officia nam odit quas vel beatae quia qui labore repellendus sed nihil repudiandae.

Et dolores repellat et iusto laudantium est sequi quia qui beatae dolorum. Vel placeat enim ea tenetur fugiat id excepturi neque non sint consequatur. Ut quos eveniet qui nulla voluptas aut illum temporibus et libero incidunt ut repellat alias ut accusantium tenetur aut illum voluptas. Aut esse rerum aut dolor ducimus et eligendi beatae est officiis molestias. Est nihil exercitationem aut nobis reiciendis eum possimus nihil aut labore corporis et dolores voluptas qui amet omnis eos perspiciatis atque. Ab reprehenderit eaque non temporibus ullam qui magnam blanditiis. Ea quia totam et quisquam voluptatem est aliquam quaerat qui saepe suscipit. Eum vitae reiciendis 33 accusantium nobis est possimus molestiae ut voluptate atque rem rerum quia sed nemo repellat vel voluptatem ipsum.

At laboriosam fugit sit odit amet ea nemo odit sed voluptatibus repellat qui eius deserunt. Eos autem inventore At perferendis architecto et voluptatem facere qui alias dolorem a corporis numquam et sequi iusto. Et incidunt voluptate aut veniam aliquid eos nulla possimus aut necessitatibus sint. Ut provident laborum quo voluptatibus impedit ut suscipit quia qui ipsam sapiente ex corporis porro sed assumenda veritatis. Ut quia culpa est mollitia sint est aspernatur consequatur sit voluptas voluptates nam omnis earum aut autem fugit. Aut explicabo deserunt eos maxime quasi ut rerum dolorem est quasi quibusdam id voluptatum dicta. Vel voluptatum tempore ea architecto corrupti et amet possimus ad modi repellat At libero ullam rem animi modi! Qui mollitia consequatur ut quasi obcaecati sed quibusdam sint est voluptates commodi aut enim optio sed autem incidunt.

Est doloribus labore aut quae facere ut neque autem est nihil amet ea praesentium voluptatem ut nisi incidunt et aperiam Quis. Qui provident numquam eos dolorum atque aut quidem explicabo hic sint aliquam et molestiae voluptatem. Est repellat provident qui quae iure et aliquid vero et iste quaerat et obcaecati minima aut sint obcaecati aut voluptatem impedit. Vel voluptates voluptatem ab deserunt quia est ipsum repellat est eligendi nesciunt et soluta temporibus At aspernatur dolores est fugiat modi. Non velit voluptatum et quae obcaecati quo consequatur atque. Et architecto quasi qui consequatur odio ad doloribus voluptatibus in enim nisi. Ut tempore blanditiis in quia consequatur ut sequi delectus qui maiores nesciunt ut galisum vero est amet saepe. Aut tempora quas et nemo deleniti sit sapiente voluptatem in laboriosam dolor. Ea odit voluptatum ex distinctio quae in atque fugiat est architecto explicabo ut repudiandae libero? Qui velit error et nobis quia et dolore recusandae aut aliquid inventore sed voluptatem rerum et consequuntur quam. Rem excepturi dolor eos quas accusamus ut laboriosam perferendis ex consequatur expedita?

Ut quaerat modi ad sint quaerat cum repellat voluptatem est voluptas minus eos alias debitis? In voluptate tempora aut possimus tenetur et dolor explicabo nam excepturi aliquam ea consequuntur neque aut eligendi voluptatibus. Quo doloribus pariatur rem quae cupiditate non accusantium animi et cupiditate omnis aut fugiat perferendis et numquam provident. Sed amet nihil ex obcaecati amet qui reiciendis saepe qui deleniti magni. Qui necessitatibus harum et sunt magnam ut illo perferendis aut vitae ipsam et repudiandae Quis non officia quasi! 33 consequatur molestiae ut voluptate error et consequatur corrupti cum sapiente suscipit hic corporis beatae id nesciunt ducimus eos consequatur rerum. Aut consequuntur sunt sed commodi possimus eos voluptatem minus et repellat error aut itaque excepturi. Ut numquam sint id quia neque et omnis voluptatem.

+ + + diff --git a/test/data/profile_image_medium.png b/test/data/profile_image_medium.png new file mode 100644 index 0000000..c0ce3f4 Binary files /dev/null and b/test/data/profile_image_medium.png differ diff --git a/test/script/interpreter_test.dart b/test/script/interpreter_test.dart index 16a0641..9407044 100644 --- a/test/script/interpreter_test.dart +++ b/test/script/interpreter_test.dart @@ -202,8 +202,7 @@ void main() { } } on ScriptException catch (e) { if (!(e.error == expectedError)) { - print(thisTest); - print(e); + print("${e.error} - ${e.cause}"); throw e; } } @@ -240,7 +239,7 @@ void main() { }); } - test('bitcoin SV Node script evaluation fixtures', () async { + test('bitcoin SV Node Test vectors', () async { await runScripTestFixtures(File("${Directory.current.path}/test/data/bitcoind/script_tests_svnode.json")); }); diff --git a/test/script/svscript_test.dart b/test/script/svscript_test.dart index 62dddb2..cd94554 100644 --- a/test/script/svscript_test.dart +++ b/test/script/svscript_test.dart @@ -144,17 +144,6 @@ main() { expect(HEX.encode(script.chunks[0].buf!), equals('010203')); }); - test('should parse this buffer containing OP_PUSHDATA2 and three bytes of data', () { - var writer = ByteDataWriter(); - writer.write([OpCodes.OP_PUSHDATA2]); - writer.writeUint16(3, Endian.little); - writer.write([1, 2, 3]); //concatenate rest of buffer - var buf = writer.toBytes(); - - var script = SVScript.fromBuffer(buf); - expect(script.chunks.length, equals(1)); - expect(HEX.encode(script.chunks[0].buf!), equals('010203')); - }); test('should parse this buffer containing OP_PUSHDATA4 and three bytes of data', () { var writer = ByteDataWriter(); @@ -225,30 +214,6 @@ main() { expect(script.toHex(), HEX.encode(writer.toBytes())); }); - test('should output this buffer containing OP_PUSHDATA2 and three bytes of data', () { - var writer = ByteDataWriter(); - writer.write([OpCodes.OP_PUSHDATA2]); - writer.writeUint16(3, Endian.little); - writer.write([ 1, 2, 3]); - - var script = SVScript.fromBuffer(writer.toBytes()); - expect(script.chunks.length, equals(1)); - expect(HEX.encode(script.chunks[0].buf!), equals('010203')); - expect(script.toHex(), equals(HEX.encode(writer.toBytes()))); - }); - - test('should output this buffer containing OP_PUSHDATA4 and three bytes of data', () { - var writer = ByteDataWriter(); - writer.write([OpCodes.OP_PUSHDATA4]); - writer.writeUint16(3, Endian.little); - writer.write([ 0, 0, 1, 2, 3]); - - var script = SVScript.fromBuffer(writer.toBytes()); - expect(script.chunks.length, equals(1)); - expect(HEX.encode(script.chunks[0].buf!), equals('010203')); - expect(script.toHex(), equals(HEX.encode(writer.toBytes()))); - }); - test('should output this buffer an OP code, data, and another OP code', () { var writer = ByteDataWriter(); writer.write([OpCodes.OP_0]); diff --git a/test/transaction/transaction_test.dart b/test/transaction/transaction_test.dart index 56ebfda..208f3a5 100644 --- a/test/transaction/transaction_test.dart +++ b/test/transaction/transaction_test.dart @@ -825,5 +825,53 @@ main() { expect(() => interp.correctlySpends(scriptSig, scriptPubKey, txSpend, 0, scriptFlags, Coin.ZERO), returnsNormally); }); -} + + testLargeOutput(File file) async { + + var fundingTxHex = "0200000004419066dec2905bf2dd48b4983efb874e7d727fe42a888480df31168060bd9faa0000000049483045022100fd73b305714b5ecfe1ea7c37a73633ffba06a9aea218e2e431aaa33d331fac2d02203ce9c16d7abc4f1e66ffa076356ec3bfe08878bca08629fe7db75541c251007541fefffffff7aa7a800840c04eddcad5380a472dae7829e0b3f4cc0a7f943dd95deaefd4a00000000048473044022056a6436a3591e6975bf31c8265f250a64581b46aa56822a31a483006e802ae3602202e0909897f39dc1dc2e2b18ef5842c08a0a6e9e6552abe13a75dcf8fd820ce5541feffffffc82066e8120f1f2a82b1b485ce1170a7c4a148af4725146a6d7c05f64ea87c6d000000004847304402200269b3b8c43faf4a318adb87a06d6b5935a9348102cd2136fe9be1ef7c45047e02203151d9736d7f1d86467d8571dd0f0d207094c14492eb5312957b296df12e8b9e41feffffff806d7cf11b9766d6cc0fcf7d9644ffcd46b97a56bb19158e1d9c964620f684ac010000006b4830450221008403260de0b52f63ee74a758e1ffd1d78f25faea99b04914d124f2fd909f3b10022018a3b712e1ee431ba5d08116f6540361db2f2e1210444d1375758459555c435d412102726a0bf178f2cd5986fcf0ad788058d0bc1eda7dbc97fa31e1d18fdde4522ebffeffffff0200e1f505000000001976a91488d9931ea73d60eaf7e5671efc0552b912911f2a88acb7181400000000001976a91451951cf496faa66920dbd3eda83792603a83f95088aca2070000"; + var fundingTx = Transaction.fromHex(fundingTxHex); + var outputAmount = fundingTx.outputs[0].satoshis; + var fundingOutput = fundingTx.outputs[0]; + var changeAddress = Address.fromPublicKey(privateKey.publicKey, NetworkType.TEST); + + var largeData = await file; + + var dataLockBuilder = UnspendableDataLockBuilder(largeData.readAsBytesSync()); + var sighashType = SighashType.SIGHASH_FORKID.value | SighashType.SIGHASH_ALL.value; + var signer = TransactionSigner(sighashType, privateKey); + + var outpoint = TransactionOutpoint(fundingTx.id, 0, outputAmount, fundingTx.outputs[0].script); + + var unlocker = P2PKHUnlockBuilder(privateKey.publicKey); + + var tx = TransactionBuilder() + .spendFromOutpointWithSigner(signer, outpoint, TransactionInput.MAX_SEQ_NUMBER, unlocker) + .spendToPKH(toAddress, BigInt.from(100000)) + .spendToLockBuilder(dataLockBuilder, BigInt.zero) + .sendChangeToPKH(changeAddress) + .withFeePerKb(1000) + .withOption(TransactionOption.DISABLE_DUST_OUTPUTS) + .build(true); + + // we then extract the signature from the first input + var inputIndex = 0; + + var scriptSig = tx.inputs[0].script; + var scriptPubkey = fundingOutput.script; + + var flags = Set()..addAll([VerifyFlag.SIGHASH_FORKID, VerifyFlag.UTXO_AFTER_GENESIS]); + var interpreter = Interpreter(); + + interpreter.correctlySpends(scriptSig!, scriptPubkey, tx, inputIndex, flags, Coin.ofSat(outputAmount )); + } + + + test('can craft a large output txn > 256 < 65535 bytes', () async { + await testLargeOutput(File("${Directory.current.path}/test/data/lorem_ipsum.txt")); + }); + + test('can craft a large output txn > 65535 bytes', () async { + await testLargeOutput(File("${Directory.current.path}/test/data/bitcoin_whitepaper.pdf")); + }); +} \ No newline at end of file