Transactions 签署比特币Segwit交易

Transactions 签署比特币Segwit交易,transactions,bitcoin,ecdsa,Transactions,Bitcoin,Ecdsa,为了了解更多关于比特币交易的信息,我正在研究二进制,而不是真正使用任何工具,如BitcoinTx或Bitcoin cli。无论如何,我在尝试签署segwit交易时遇到了一点小麻烦。这是一个简单的事务,一个UTXO和一个接收者,这是一个P2WPKH事务 问题是,对于segwit,在签署事务之前,我不知道在SigScript字段中输入什么。文档说它应该是空的,但这似乎不起作用 02000000010a02214430acee2ed509798187210171bb387075ce2c82ef5a73

为了了解更多关于比特币交易的信息,我正在研究二进制,而不是真正使用任何工具,如BitcoinTx或Bitcoin cli。无论如何,我在尝试签署segwit交易时遇到了一点小麻烦。这是一个简单的事务,一个UTXO和一个接收者,这是一个P2WPKH事务

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

02000000010a02214430acee2ed509798187210171bb387075ce2c82ef5a73774d6159387500000000 00 ffffffff
018ca1b404000000001976a914906ec1c4804632c0b067e5a2732c41cdf620c4e688ac0000000001000000
以上是原始事务,1个输入,1个输出。在segwit字段中,我有一个0x00字节,如图所示。因此,我使用sha256(sha256)处理上述二进制文件,然后创建签名segwit事务,如下所示:

020000000000010A022144030ACEE2ED509798187210171BB387075CE2C82EF5A7377D61593875000000017160014D99F1EA19E98D9ED10E5D442BE37A44B6B63C477FFFFFF 018CA1B404000000001976A914906EC1C4804632CB067E5A2732C41CDF620C4E688AC 02 4830460221009F5743A2FC62BB9CEE292EF79EB3EC3A20A3ED1EC84BDF9E85205922CA1D84F35022100922F887BE7283EB0FD73DA53EFA5544E62A589F6E268C0D300AD727791C2F936C 41047D011958B661181242ADDD300B6D5C51F80D626745531DD855B3435B57E05FB46477BA167A57B23B8A492305C0085D8C34AA04D483B7F15A2D551E2FF66200000000

在上面,我得到了我的输入事务,在SigScript中,我把一个push设置为0,后跟一个20字节的Hash160公钥

接下来是输出事务,它只有一个带有OP_DUP的公钥散列,OP_hash_160 OP_EQUALVERIFY,OP_CHECKSIG

最后是签名,它有2个部分,1是签名本身(der编码),最后是公钥

出于某种原因,它说签名不正确,我不知道为什么。在我签名之前,事务中的SigScript是否应该实际为NULL?在我签名之前,钱包的公钥是否应该包含资金(就像P2PKH交易一样)


如果有任何提示,我将不胜感激,因为我认为我很接近,我只需要在签名之前知道事务的外观。

您需要将ScriptPubKey放在SigScript字段上以进行签名。在ELIPHIC曲线签名上,要非常小心Endianness和Low-High R和S规则

解释来自:

分步说明:

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

  • 添加四字节版本字段:
    01000000
  • 指定输入数量的单字节变量:
    01
  • 要从中兑换输出的事务的32字节散列(逆序):
    be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396
  • 四字节字段,表示我们要使用上述散列(从零开始计数)从事务中赎回的输出索引:
    00000000
  • 现在是脚本信号。为了对事务进行签名,这将临时填充我们要兑换的输出的scriptPubKey。首先,我们编写一个单字节变量,表示scriptSig的长度(0x19=25字节):
    19
  • 然后我们编写实际的scriptSig(这是我们要兑换的输出的scriptPubKey):
    76 a9 14 dd6cce9f255a8cc17bda8ba0373df8e861cb866e 88 ac
    (查看上的底线)
  • 然后我们写一个四字节的字段来表示序列。该值当前始终设置为0xFFFFFF:
    ffffffff
  • 接下来是一个单字节变量,其中包含新事务中的输出数。在本例中,我们将其设置为1:
    01
  • 然后,我们编写一个8字节字段(64位整数,小尾数),其中包含我们要从指定输出中兑换的金额。我将此设置为输出中可用的总金额减去0.0001 BTC(128307-10000)的费用:
    23ce010000000000
  • 然后我们开始编写事务的输出。我们从一个单字节变量开始,该变量表示输出脚本的长度(0x19或25字节):
    19
  • 然后实际输出脚本:
    76 a9 14 a2fd2e039a86dbcf0e1a664729e09e8007f8951088 ac
    (这是将资金转移回地址1FromKBPAS8MWsk1Yv1Yiu8rJbjfVioBHc)
  • 然后我们写入四字节的“锁定时间”字段:
    00000000
  • 最后,我们编写了一个四字节的“哈希代码类型”(本例中为1):
    01000000
  • 好的,结果是

    01000000
    01
    be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396
    00000000
    19 76 a9 14 dd6cce9f255a8cc17bda8ba0373df8e861cb866e 88 ac
    ffffffff
    01
    23ce010000000000
    19 76 a9 14 a2fd2e039a86dbcf0e1a664729e09e8007f89510 88 ac
    00000000
    01000000
    
  • 现在我们对整个结构进行双SHA256散列,这将产生散列
    1cde0239b55717cca8003104abc2ec2673d4f6fabea0b74351940e382e88486f

  • 现在我们应该创建ECDSA签名。。。
    1MBngSqZbMydscpzSoehjP8kznMaHAzh9y
    是一个“MrbobymrbybyMrbuby!”的智能钱包,它恰好编码了一个以“MB”开头的地址(使链接2变得非常容易;有关短语来源,请参阅下面的@WizardOfAussie注释)。 WIF中的私钥:
    5hvoffg7k1e2aewesm5pbczrhtcsiznbflyxbxbya57dhkhv4u3

  • 在十六进制中,私钥是
    0ecd20654c2e2be708495853e8da35c664247040c00bd10b9b13e5e86e6a808d
    。每个加密库中都有一个sign(key,digest)方法。它将返回一个字节数组。此数组将不超过72字节,并以十六进制代码30开头。让我们假设签名是
    3046022100CF4D7571DD47A4D47F5CB767D54D670530A3555726B27B6AC56117F5E7808FE0221008CBB4233BB04D7F28A715CF7C938E238AFDE90207E9D103DD9018E12CB7180E
    在这个签名之后,我们附加了一个字节的哈希代码类型:
    01
    。1MBngSqZbMydscpzSoehjP8kznMaHAzh9y的公钥是:
    042DAA93315EEBBE2CB9B5C3505DF4C6FB6CACA8B756786098567550D4820C09DB988FE9997D049D687292F815CCD6E7FB5C1B1A91137999818D17C73D00AEF9

  • 我们通过连接:|<实际的DER编码签名加上一字节哈希码类型>|<包含公钥长度的一字节脚本操作码>|
  • scriptSig将是

    49 3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e 01
    41 042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9
    
    第一行是“推”