首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >签署比特币分段交易

签署比特币分段交易
EN

Stack Overflow用户
提问于 2020-02-17 04:13:13
回答 1查看 1.1K关注 0票数 1

为了了解更多关于比特币交易的知识,我正在学习二进制,而不是真正使用像BitcoinTx或比特币-cli这样的工具。不管怎么说,我在试图签下一笔小笔交易时遇到了一点麻烦。现在这是一个简单的事务,一个UTXO和一个收件人,它是一个P2WPKH事务。

问题是,在签署事务之前,我不知道该在SigScript字段中放什么。文档中说应该是空的,但这似乎不起作用。

代码语言:javascript
复制
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事务的那样)?

任何指针都会非常感谢,因为我认为我已经接近了,我只是需要知道交易的样子,然后我签署它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-21 03:50:09

您需要将ScriptPubKey放在SigScript字段上,以便进行签名。在椭圆曲线的特征上,要非常小心地使用恩迪内斯和低高R和S规则.

说明来源:https://bitcoin.stackexchange.com/posts/32695/edit

逐步描述:

我们开始创建一个新事务,并对其进行散列和签名。

01000000

  • One-byte

  • 添加四字节版本字段:01

  • 32-byte varint,指定输入数:我们想要从其中赎回输出的事务的01

  • 32-byte散列(反向顺序):be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396

  • Four-byte字段,表示我们要用上面的哈希(从零计数)从事务中赎回的输出索引:00000000

  • ,然后编写一个四字节的字段来表示序列。这目前总是设置为0 0xffffffff:ffffffff

  • Next来了一个包含我们新事务中的输出数的一个字节的varint。在本例中,我们将此设置为1:01

  • We然后编写一个8字节字段(64位整数,小endian),其中包含我们希望从指定的输出中赎回的数量。我将把它设置为输出中可用的总量减去0.0001 BTC (128307 - 10000):23ce010000000000

  • Then,我们开始编写事务的输出。我们从一个表示输出脚本(0x19或25个字节)长度的字节varint开始:19

  • Then实际输出脚本:76 a9 14 a2fd2e039a86dbcf0e1a664729e09e8007f89510 88 ac (这是将资金转移回地址1 FromKBPAS8MWsk1Yv1yu8rjbjfviobhc)

  • ,然后编写四字节“锁定时间”字段:00000000

  • And,最后,我们编写一个四字节的“哈希代码类型”(在本例中为1):01000000

好的,结果是

代码语言:javascript
复制
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

  • Now,我们应该创建签名.1MBngSqZbMydscpzSoehjP8kznMaHAzh9y是一个名为“mr冒泡”的脑钱包,它恰好编码了一个以'MB‘开头的地址(链接这2相当容易,请参见下面的WizardOfAussie词组注释)。WIF中的私钥:5HvofFG7K1e2aeWESm5pbCzRHtCSiZNbfLYXBvxyA57DhKHV4U3

在十六进制中,私钥是0ecd20654c2e2be708495853e8da35c664247040c00bd10b9b13e5e86e6a808d。在每个密码库中都有一个符号(键,摘要)方法。它将返回一个字节数组。这个数组不超过72个字节,从十六进制代码30开始。让我们假设签名是3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e,然后再加上一个字节的哈希代码类型:01。1MBngSqZbMydscpzSoehjP8kznMaHAzh9y的公钥是:042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9

  1. 我们通过连接来构造最终的scriptSig:|<,实际的DER编码签名加上包含公共key>|

长度的单字节哈希码type>|<单字节脚本OPCODE。

scriptSig将是

代码语言:javascript
复制
49 3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e 01
41 042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9

第一行是“推送签名与01连接”,第二行是“推送公键”。scriptSig的长度为140个字节(十六进制为0x8c)。

然后,用步骤16中的数据长度替换步骤5中的一个字节,varint长度字段。长度为140个字节,或0x8C字节:8c

  • And用步骤16中构造的数据结构替换实际的scriptSig。

  • ,我们最后删除了我们在步骤13中添加的四字节哈希代码类型,最后得到了以下字节流,这是最后的事务:

01000000 01 be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396 00000000 8c 49 3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e 01 41 042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9 ffffffff 01 23ce0100000000 19 76 a9 14 a2fd2e039a86dbcf0e1a664729e09e8007f89510 88 ac 00000000

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60255876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档