я Wouldnt беспокоиться о них еще нет. которые могут не использоваться в любом месте blockchain и они для будущих типов транзакций. они управляют, какими родители ТХ Арентов хэшируются.
вместе с ними вы можете сделать заменяемые операции с использованием порядковых номеров, например.
Во всяком случае, если кто-то хочет немного сырой код, чтобы сделать OP_CHECKSIG затем libbitcoin имеет модульное тестирование по тестам / EC-key.cpp (сделать ес-ключ && ./bin/tests/ec-key) ... Будет ли загружать завтра вместо с рабочей OP_CHECKSIG моей системы скриптового однажды я очищено все это внутренне:
#включают
#включают
#включают
#включают
#включают
#включают
#включают
#включают
#включают
#включают
используя libbitcoin :: elliptic_curve_key;
используя libbitcoin :: сериалайзер;
используя libbitcoin :: hash_digest;
используя libbitcoin :: data_chunk;
используя libbitcoin :: LOG_INFO;
используя libbitcoin :: log_fatal;
Int основных ()
{
сериализатору сс;
// BLK номер 170, ТЕ 1, вход 0
// версия = 1
ss.write_4_bytes (1);
// 1 входы
ss.write_var_uint (1);
// вход 0
// prevout хэш
ss.write_hash (hash_digest {0x04, 0x37, 0xcd, 0x7F, 0x85, 0x25, 0xce, 0xed, 0x23, 0x24, 0x35, 0x9C, 0x2d, 0x0B, 0xa2, 0x60, 0x06, 0xd9, 0x2d, 0x85, 0x6a, 0x9C, 0x20, 0xFA, 0x02, 0x41, 0x10, 0x6e, 0xe5, 0xA5, 0x97, 0xc9});
// индекс prevout
ss.write_4_bytes (0);
// сценарий ввода после запуска OP_CHECKSIG для этого ТХ один
// OP_CHECKSIG опкод
data_chunk raw_data;
raw_data = {0x04, 0x11, 0xdb, 0x93, 0xE1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, 0x49, 0x84, 0x0F, 0x8c, 0x53, 0xbc, 0x1E, 0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48 , 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9A, 0x5c, 0xb2, 0xE0, 0xea, 0xdd, 0xfb, 0x84, 0xCC, 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0B, 0xFA , 0x9b, 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56, 0xb4, 0x12, 0xa3};
data_chunk raw_script;
raw_script = data_chunk ();
raw_script.push_back (raw_data.size ());
libbitcoin :: extend_data (raw_script, raw_data);
raw_script.push_back (172);
ss.write_var_uint (raw_script.size ());
ss.write_data (raw_script);
// последовательность
ss.write_4_bytes (0xffffffff);
// 2 выхода для этого TX
ss.write_var_uint (2);
// выход 0
ss.write_8_bytes (1000000000);
// Скрипт для вывода 0
raw_data = {0x04, 0xAE, 0x1a, 0x62, 0xfe, 0x09, 0xc5, 0xf5, 0x1b, 0x13, 0x90, 0x5f, 0x07, 0xf0, 0x6b, 0x99, 0xa2, 0xf7, 0x15, 0x9b, 0x22, 0x25, 0xf3, 0x74 , 0xcd, 0x37, 0x8d, 0x71, 0x30, 0x2f, 0xa2, 0x84, 0x14, 0xe7, 0xAA, 0xb3, 0x73, 0x97, 0xf5, 0x54, 0xa7, 0xDF, 0x5f, 0x14, 0x2c, 0x21, 0xc1, 0xB7, 0x30 , 0x3b, 0x8a, 0x06, 0x26, 0xF1, 0xBA, 0xDE, 0xd5, 0xc7, 0x2a, 0x70, 0x4F, 0x7e, 0x6c, 0xd8, 0x4c};
// когда данные < 75, мы можем просто написать его длина в один байт ( «специальный»
// опкоды)
raw_script = data_chunk ();
raw_script.push_back (raw_data.size ());
libbitcoin :: extend_data (raw_script, raw_data);
// OP_CHECKSIG
raw_script.push_back (172);
// теперь на самом деле написать сценарий
ss.write_var_uint (raw_script.size ());
ss.write_data (raw_script);
// выход 0
ss.write_8_bytes (4000000000);
// Скрипт для вывода 0
raw_data = {0x04, 0x11, 0xdb, 0x93, 0xE1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, 0x49, 0x84, 0x0F, 0x8c, 0x53, 0xbc, 0x1E, 0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48 , 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9A, 0x5c, 0xb2, 0xE0, 0xea, 0xdd, 0xfb, 0x84, 0xCC, 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0B, 0xFA , 0x9b, 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56, 0xb4, 0x12, 0xa3};
// когда данные < 75, мы можем просто написать его длина в один байт ( «специальный»
raw_script.push_back (raw_data.size ());
libbitcoin :: extend_data (raw_script, raw_data);
// OP_CHECKSIG
raw_script.push_back (172);
// теперь на самом деле написать сценарий
ss.write_var_uint (raw_script.size ());
ss.write_data (raw_script);
// Конец 2 выходов
// Locktime
ss.write_4_bytes (0);
// hash_type_code записи
ss.write_4_bytes (1);
// шестнадцатеричного на экран
LOG_INFO () << "хеширования:";
{
автоматическое log_obj = LOG_INFO ();
log_obj << станд :: шестигранный;
для (INT вал: ss.get_data ())
log_obj << станд :: setfill ( '0') << станд :: setw (2) << вал << ' «;
}
LOG_INFO ();
data_chunk raw_tx = {0x01, 0x00, 0x00, 0x00, 0x01, 0xc9, 0x97, 0xA5, 0xe5, 0x6e, 0x10, 0x41, 0x02, 0xFA, 0x20, 0x9C, 0x6a, 0x85, 0x2d, 0xd9, 0x06, 0x60, 0xa2, 0x0B, 0x2d, 0x9C, 0x35, 0x24, 0x23, 0xed, 0xce, 0x25, 0x85, 0x7F, 0xcd, 0x37, 0x04, 0x00, 0x00, 0x00, 0x00, 0x43, 0x41, 0x04, 0x11, 0xdb, 0x93, 0xE1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, 0x49, 0x84, 0x0F, 0x8c, 0x53, 0xbc, 0x1E, 0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9A, 0x5c, 0xb2, 0xE0, 0xea, 0xdd, 0xfb, 0x84, 0xCC, 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0B, 0xFA, 0x9b, 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56, 0xb4, 0x12, 0xa3, 0xac, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0xca, 0x9A, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x43, 0x41, 0x04, 0xAE, 0x1a, 0x62, 0xfe, 0x09, 0xc5, 0xf5, 0x1b, 0x13, 0x90, 0x5f, 0x07, 0xf0, 0x6b, 0x99, 0xa2, 0xf7, 0x15, 0x9b, 0x22, 0x25, 0xf3, 0x74, 0xcd, 0x37, 0x8d, 0x71, 0x30, 0x2f, 0xa2, 0x84, 0x14, 0xe7, 0xAA, 0xb3, 0x73, 0x97, 0xf5, 0 x54, 0xa7, 0xDF, 0x5f, 0x14, 0x2c, 0x21, 0xc1, 0xB7, 0x30, 0x3b, 0x8a, 0x06, 0x26, 0xF1, 0xBA, 0xDE, 0xd5, 0xc7, 0x2a, 0x70, 0x4F, 0x7e, 0x6c, 0xd8, 0x4c, 0xac, 0x00, 0x28, 0x6b, 0xEE, 0x00, 0x00, 0x00, 0x00, 0x43, 0x41, 0x04, 0x11, 0xdb, 0x93, 0xE1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, 0x49, 0x84, 0x0F, 0x8c, 0x53, 0xbc, 0x1E, 0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9A, 0x5c, 0xb2, 0xE0, 0xea, 0xdd, 0xfb, 0x84, 0xCC, 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0B, 0xFA, 0x9b, 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56, 0xb4, 0x12, 0xa3, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00};
BITCOIN_ASSERT (raw_tx == ss.get_data ());
hash_digest tx_hash = libbitcoin :: generate_sha256_hash (ss.get_data ());
data_chunk Публичных {0x04, 0x11, 0xdb, 0x93, 0xE1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b, 0x49, 0x84, 0x0F, 0x8c, 0x53, 0xbc, 0x1E, 0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48 , 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9A, 0x5c, 0xb2, 0xE0, 0xea, 0xdd, 0xfb, 0x84, 0xCC, 0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0B, 0xFA , 0x9b, 0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56, 0xb4, 0x12, 0xa3};
// Оставить из последнего байта, так как это hash_type_code (SIGHASH_ALL в этом
// дело)
data_chunk подпись {0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xE1, 0x69, 0x32, 0xb8, 0xAF, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1, 0xa2, 0x5f, 0xDF, 0x3f, 0x4F, 0x77, 0x32 , 0xe9, 0xd6, 0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd, 0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca, 0x07, 0xDE, 0x48, 0x60, 0xa4 , 0xac, 0xdd, 0x12, 0x90, 0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xBB, 0xac, 0x46, 0x22, 0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1D, 0x09};
BITCOIN_ASSERT (signature.size () == 70);
elliptic_curve_key ключ;
если (! key.set_public_key (Публичный))
{
log_fatal () << "не в состоянии установить открытый ключ EC";
вернуться -1;
}
LOG_INFO () << "checksig возвращается: " << (Key.verify (tx_hash, подпись)? "правда" : "ложный");
возвращать 0;
}
Кстати, что это первый провел ТХ в Bitcoin из блока 170,
http://blockexplorer.com/block/00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2eehttp://blockexplorer.com/tx/f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16