Кто-нибудь понимает как клиент определяет валидность TapRoot-транзакции?
Я неделю ломаю голову над кодом из десяти строчек. У меня не сходится. И как понять что я делаю не так?
Не, ну есть способ, который 100% приведет к результату:
1) Поставить новую убунту (у меня старая, а код Bitcoin-Core хочет чтобы компилятор был бы С++2017 ) на виртуальной машине
2) Скомпилять там сорцы клиента, вставив бы туда в нужные места логгирование всего на свете
3) Отправить себе (в тестовой сети) транзакцию на p2tr-адрес
4) Запустить бы в том клиенте в консоли команду testmempoolaccept заведомо валидной транзакции вывода с этого адреса
Но, Карл! Карл! Ради 10 строчек? Может уже кто-то занимался этим?
Я уже и с питоном подружился, и умножение на кривых стал чуть больше понимать
Мне тут говорят, мол все просто:
https://bitcointalk.org/index.php?topic=5503168.msg64332617#msg64332617Хуяк-хуяк и все получается типа. А у меня не получается. Па-ма-ги-тя!
Взялся проверить валидность транзакции
https://www.blockchain.com/explorer/transactions/btc/445f592c71e364670ecf8d168eb651319d1fc17527df7addd35aa09555733cd6Код вот такой (извините за хардкод констант, это мой первый опыт в питоне):
def my_test() -> bool:
key = 0x2913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c1
cblock = "c00000000000000000000000000000000000000000000000000000000000000001"
leaf_version = 0 # ( 0xc0 & 0xfe ) ### hardcoded
# 3. Extract p as the 2nd to 33rd bytes of the control block.
p = 0x0000000000000000000000000000000000000000000000000000000000000001;
# 4. Set P by interpreting p as the x coordinate for a point on secp256k1 where the y coordinate is even
P = point_mul(G,p)
assert has_even_y(P)
#4. Compute the hash k of the script as follows: sha256(sha256("TapLeaf") || sha256("TapLeaf") || leaf_version || compact_size(script) || script), where || is concatenation
data0 = leaf_version.to_bytes ( 1 ) + bytes.fromhex ( "0151" )
k = int_from_bytes ( tagged_hash ( "TapLeaf", data0 ) )
#5. Compute t as sha256(sha256("TapTweak") || sha256("TapTweak") || p || k) and interpret it as an integer.
data1 = bytes_from_int ( p ) + bytes_from_int ( k )
t = int_from_bytes ( tagged_hash ( "TapTweak", data1 ) )
#6. Let Q = P + t * G where G is the generator for secp256k1
Q = point_add ( P, point_mul ( G, t ) )
#7. Check the x coordinate of Q matches the key in the output script
xx = x ( Q )
debug_print_vars()
return True
Я эту функцию засунул в
https://github.com/bitcoin/bips/blob/master/bip-0340/test-vectors.py чтобы не писать всю мумбу-юмбу
По идее, в конце
xx должно хоть как-то коррелировать с
keyА у меня в результатах совершенно другое. И в какой из десяти строчек ошибка?
Variables in function my_test at line 140:
key == 0x2913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c1
cblock == c00000000000000000000000000000000000000000000000000000000000000001
leaf_version == 0x0000000000000000000000000000000000000000000000000000000000000000
p == 0x0000000000000000000000000000000000000000000000000000000000000001
P == ('0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798', '0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8')
data0 == 0x000151
k == 0x8fe98416aeedc4ff4bdd55d79dd3e5399c9c2b1d2d2beea8c300c2ba262c5bbc
data1 == 0x00000000000000000000000000000000000000000000000000000000000000018fe98416aeedc4ff4bdd55d79dd3e5399c9c2b1d2d2beea8c300c2ba262c5bbc
t == 0xf1643f7a852c98c9319797a4e0177999288bfd5c788fad852f5973357eb38d5e
Q == ('0xc090e69051099c46d8f33dace5549623e5afc52a51cc545d6bd077ccc33098b2', '0xb289f42f0098f658717a44679b2f0571eb9ea0034d78e8e9639cbe48133f3cc9')
xx == 0xc090e69051099c46d8f33dace5549623e5afc52a51cc545d6bd077ccc33098b2