为了了解更多关于比特币交易的知识,我正在学习二进制,而不是真正使用像BitcoinTx或比特币-cli这样的工具。不管怎么说,我在试图签下一笔小笔交易时遇到了一点麻烦。现在这是一个简单的事务,一个UTXO和一个收件人,它是一个P2WPKH事务。
问题是,在签署事务之前,我不知道该在SigScript字段中放什么。文档中说应该是空的,但这似乎不起作用。
02000000010a02214430acee2ed509798187210171bb387075ce2c82ef5a73774d6159387500000000 00 ffffffff
018ca1b404000000001976a914906ec1c4804632c0b067e5a2732c41cdf620c4e688ac0000000001000000以上是原始事务,1输入,1输出。在segwit字段中,如所示,我有一个0x00字节。因此,我对上面的二进制文件进行sha256(sha256),然后创建已签名的分段事务,如下所示:
020000000001010a02214430acee2ed509798187210171bb387075ce2c82ef5a73774d615938750000000017160014d99f1ea19e98d9ed10e5d442be37a44b6b63c477ffffffff 018ca1b404000000001976a914906ec1c4804632c0b067e5a2732c41cdf620c4e688ac 02 4830460221009f5743a2fc62bb9cee292ef79eb3ec3a20a3ed1ec84bdf9e8520592ca1d84f35022100922f887be7283eb0fd73da53efa554e62a589f6e268c0d300ad727791c2f936c 41047d011958b661181242addd300b6d5c51f80d62674555831dd855b34358b57e05fb46477ba167a57b23bf8a492305c0085d8c34aa04d483b7f15a2d551e2ff66200000000
因此,在上面,我得到了我的输入事务,在SigScript中,我将推送为0,然后是一个20字节的公钥Hash160。
接下来是输出事务,它只有一个带有OP_DUP、OP_HASH_160 OP_EQUALVERIFY、OP_CHECKSIG的公钥哈希。
最后是签名,它有两个部分的02,一个是签名本身(der编码),最后是公钥。
因为某些原因,它说签名不正确,我不知道为什么。在我签名之前,事务中的SigScript实际上应该是NULL吗?在我签名之前,是否应该是钱包的公钥的HASH160 (就像用于P2PKH事务的那样)?
任何指针都会非常感谢,因为我认为我已经接近了,我只是需要知道交易的样子,然后我签署它。
发布于 2020-03-21 03:50:09
您需要将ScriptPubKey放在SigScript字段上,以便进行签名。在椭圆曲线的特征上,要非常小心地使用恩迪内斯和低高R和S规则.
说明来源:https://bitcoin.stackexchange.com/posts/32695/edit
逐步描述:
我们开始创建一个新事务,并对其进行散列和签名。
01000000
01
01
be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396
00000000
76 a9 14 dd6cce9f255a8cc17bda8ba0373df8e861cb866e 88 ac (查看https://blockchain.info/tx/96534da2f213367a6d589f18d7d6d1689748cd911f8c33a9aee754a80de166be?show_adv=true的底线)
ffffffff
01
23ce010000000000
19
76 a9 14 a2fd2e039a86dbcf0e1a664729e09e8007f89510 88 ac (这是将资金转移回地址1 FromKBPAS8MWsk1Yv1yu8rjbjfviobhc)
00000000
01000000。
好的,结果是
01000000
01
be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396
00000000
19 76 a9 14 dd6cce9f255a8cc17bda8ba0373df8e861cb866e 88 ac
ffffffff
01
23ce010000000000
19 76 a9 14 a2fd2e039a86dbcf0e1a664729e09e8007f89510 88 ac
00000000
01000000现在我们使用双the 256散列这整个结构,这将产生散列1cde0239b55717cca8003104abc2ec2673d4f6fabea0b74351940e382e88486f
1MBngSqZbMydscpzSoehjP8kznMaHAzh9y是一个名为“mr冒泡”的脑钱包,它恰好编码了一个以'MB‘开头的地址(链接这2相当容易,请参见下面的WizardOfAussie词组注释)。WIF中的私钥:5HvofFG7K1e2aeWESm5pbCzRHtCSiZNbfLYXBvxyA57DhKHV4U3在十六进制中,私钥是0ecd20654c2e2be708495853e8da35c664247040c00bd10b9b13e5e86e6a808d。在每个密码库中都有一个符号(键,摘要)方法。它将返回一个字节数组。这个数组不超过72个字节,从十六进制代码30开始。让我们假设签名是3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e,然后再加上一个字节的哈希代码类型:01。1MBngSqZbMydscpzSoehjP8kznMaHAzh9y的公钥是:042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9
长度的单字节哈希码type>|<单字节脚本OPCODE。
scriptSig将是
49 3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e 01
41 042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9第一行是“推送签名与01连接”,第二行是“推送公键”。scriptSig的长度为140个字节(十六进制为0x8c)。
然后,用步骤16中的数据长度替换步骤5中的一个字节,varint长度字段。长度为140个字节,或0x8C字节:8c
01000000 01 be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396 00000000 8c 49 3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e 01 41 042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9 ffffffff 01 23ce0100000000 19 76 a9 14 a2fd2e039a86dbcf0e1a664729e09e8007f89510 88 ac 00000000
https://stackoverflow.com/questions/60255876
复制相似问题