分类
Uncategorized

手动签名比特币交易

我正在尝试创建一个BTC事务,其中有一个输入和两个输出,一个用于更改,另一个用于返回锚定数据。我在我的regtest后端上做这些。原始的未签名事务是
01000000018BE9D0E99E74D69D915E105DB1328707F713D42A894909B18A78FE68E1D8290C0000000023210340165231215A98E7A32ABCE9D410ECD09AC05938B25F9451DEFA0591EBF8ACFFFF0218EE052A0000001976A9143EB52FB0BE4BE87EDC74848B371547F663E26E88AC0000000000226A40897B447DDA5312B1EF5B5509667229630D1DD328D5E55317DEF98F165D200000000
然后我可以使用比特币rpc来签名,并且它可以工作,所以我非常确定这部分是正确的。然而,当我尝试手动签名时,我得到了错误
500:{“result”:null,“error”:{“code”:-26,“message”:“16:强制脚本验证标志失败(非规范DER签名)”},“id”:2}
我遵循了“如何兑换基本Tx”中概述的步骤?以及使用Python ECDSA(或OpenSSL)对原始事务进行签名,以及尝试使用pybitcointools对输入进行签名,但都没有成功。
我使用的地址和私钥是
地址:“mmexezugcmmilsfxxm8gb8tqstkur1drf”
主键:“ctyf9pebh3kwzut5gzaxsdq1dbqyfx4p1i4d1tyjtsdeufgysk”
另外,尽管PK是./bitcoin cli-regtest dumpprivkey<addr>给我的,但它似乎与地址不匹配,我也不知道为什么或者我需要对它做什么(它是WIF格式的,经过压缩,即0x01追加到末尾)
原始TX包含utxo的scriptPubKey。然后,我将整个原始tx(如上所示)加倍,并使用以下代码将scriptPubKey部分替换为sigScript | pubkey:
私钥,压缩的\u pk=wif到\u私钥(private \u key \u wif)
发送=bytearray.fromhex格式(原始\无符号\事务)+int(1).到\字节(4,’小’)
双\u sha256 \u tx=哈希库.sha256(哈希库.sha256(tx).digest()).digest()
签名密钥=ecdsa.SigningKey.from\字符串(bytearray.fromhex格式(私钥),曲线=ecdsa.SECP256k1)
公钥=bytearray.fromhex格式(privatopub(私钥)
signature=签名_key.sign\u摘要(双\u sha256 \u tx,sigencode)=ecdsa.util.sigencode命令)+int(1).到\u字节(1,’小’)
scriptSig=to\u varstr(签名)+to\u varstr(公钥)
to|varstr只打印[len]|[data],privtopub是pybitcointools的函数,因为我不知道如何手动从压缩的私钥转到地址。值得注意的是,这里的公钥privtoaddr from pybitcointools也没有返回正确的地址,这可能是问题的根本原因?
如果你能给我指点什么或者做点什么,我会很感激的
干杯,克里斯
PS:另一个有趣的方面是,我生成的已签名事务比signtransaction rpc调用生成的事务长得多:
rpc:01000000018BE9D0E99E74D69D915E105DB1328707F713D42A894909B18A78FE68E1D8290C0000000023210340165231215A98E7A32ABCE9D410ECD09AC05938B25F9451DEFA051D591EBF8ACFFFF0218EE052A00000001976A9143EB52FB0BE4BE87EDC74848B371547F663C7E88AC0000000000226A40AC4F0818B683EEAFF2F508C2CC814E690251C70D7C414EBBFC30A000000000
手册:01000000018be9d0e99e74d69d915e105db1328707f713d42a894909b18a78fe68e1d8290c00000006b483045022100d6e538aa819f3162d5c6a0e4d9ee0323395df89e943c769d96ae939baec5c6920220083a11cb35df3c98d7a6bd0b80d98a7f8e25ba908ea4b72a4ea8b3010343395a6e84c7f2b1d50c1f96783664a6b5beb3becc57334e2a9afff0218ee05000001a91a4bed52fb4bed8C74848B371547F663E26C7E88AC0000000000226A40AC4F0818B683EEAA1FBF2F508AF2FC22CC814E69025152C70D7C414EBBFC30A00000000
交易

确切的问题是什么?您是否要求查找代码中的所有错误(不止一个)?准备好付钱了吗?–amaclin 2017年8月24日11:41
有趣的是,这些社区从真正想帮助别人到什么都想要钱,但我想我可以说服他们奖励一个好的答案。我并不特别关心回复的格式,或者是一个指向好资源的链接,或者是一个关于什么是错的指标。很高兴自己能读到一些东西–deadc0de 8月24日11:45
简而言之,你的问题是什么?–amaclin 2017年8月24日12:52
我想真的有两个问题:-如何验证私钥与地址匹配,因为它似乎代表了一个不同的地址-签名步骤是否有明显的问题(因为它基本上就是我在其他帖子中读到的)-deadc0de 8月24日’17日13:00
1
是的,你的问题花了一些时间去深入研究,尽量缩短它,这样会让别人更容易提供帮助。@阿玛克林:看来deadc0de在论坛里是新来的,让我们高兴地让人们愿意投入比特币——让我们给他一个拥抱。他不是在问如何通过不费吹灰之力的投资快速致富:-)-pebwindkraft 8月24日15:40
添加评论
1个答案
0
我查过钥匙了https://bitcoinpaperwallet.com/bitcoinpaperwallet/generate-wallet.html?design=alt testnet#,并在第一个选项卡上选择testnet,然后在第二个选项卡上选择“打印正面”。他们很般配,很好。然后我试着分解你的线路,你说它是signtransaction调用。在我看来,这似乎是未签名的:
[0]脚本Sig中的TX\u(uchar[])
210340165231215A98E7A32ABCE9D410ECD09AC50598B25F9451DEFA0591EBF8AC
##################################################################
###tcls输入信号_脚本.sh:从TX解码SIG\ U脚本操作码###
##################################################################
21:OP\ U DATA\ U 0x21:表示长度的类型标签
03:操作\u INT \u 0x03
40165231215A98E7:A32ABCE9D410ECD0
9AC05938B25F945:1DEFA051D591EBF8标准
自动控制
*这将终止公钥(X9.63压缩形式)
*相应的比特币地址是:
MVVWBGB3SZEZ495EDOAEM79QI876ZUG9S型
而第二行(手动)看起来不错:
[0]脚本Sig中的TX\u(uchar[])
483045022100D6E538AA819F3162D5C6A0E4D9EE0323395DF89E943C769D96AE939BAEC5C6920083A311CB35DF3C98D7A6BD0BC80D98A71FBDF8E325BA908EA4B721A4EA4B30103395A6E84C7F2B1D50C11F96783664A6F04D66B51BEFB3C57334E2A9ABC
##################################################################
###tcls输入信号_脚本.sh:从TX解码SIG\ U脚本操作码###
##################################################################
48:OP\ U DATA\ U 0x48:push十六进制48(十进制72)字节作为数据
30:OP\u SEQUENCE\u 0x30:type标记指示序列,begin sigscript
45:OP\U长度\U 0x45:R+S长度
02:OP\u INT \u 0x02:表示整数的类型标记
21:OP\u LENGTH\u 0x21:这是SIG R
00D6E538AA819F31:62D5C6A0E4D9EE03
23395DF89E943C76:9D96AE939BAEC5C6
92
02:OP\u INT \u 0x02:表示整数的类型标记
20:操作长度\u0x20:这是信号
083A311CB35DF3C9:8D7A6BD0BC80D98A
71FBDF8E325BA908:EA4B721A4EAC8BB3
01:OP_SIGHASHALL:这将终止ECDSA签名(ASN1-DER结构)
#########################################################
###严格检查DER编码签名的程序###
#########################################################
最小和最大尺寸限制-确定
scriptsig总是以0x30开始-确定
长度138个字符小于实际sig长度(144个字符)-可以
(十六进制0x45,十进制69,138个字符)
R坐标长度(66)>=0-正常
S坐标长度(64)>=0-正常
S值在scriptsig边界内-确定
确保R&amp;S长度覆盖整个签名-好的
S值必须小于N/2-正常
严格检查DER编码签名-确定
#########################################################
21:OP\ U DATA\ U 0x21:表示长度的类型标签
03:操作\u INT \u 0x03
43395A6E84C7F2B1:D50C11F96783664A
6F04D66B51BEFB3B3B:EFCC57334E2A9ABC
*这将终止公钥(X9.63压缩形式)
*相应的比特币地址是:
mmEXEzUGcMmmiLsfxxM8gB8TQSTkuR1drf公司
所以所有的签名检查都是可以的。但是我看到地址不同,实际上是输出地址,不是吗?也许你在手动签名时弄错了一些地址?你的消费地址是什么?
分享

嗨,很抱歉延迟回复,有一些私人的事情发生了,没有时间继续这个直到现在。其想法或意图是将货币从mmEXEzUGcMmmiLsfxxM8gB8TQSTkuR1drf转移到mmEXEzUGcMmmiLsfxxM8gB8TQSTkuR1drf,即将硬币转移给我自己,同时包括一些交易费用以及用于数据锚定的操作返回输出。我不知道你指的是什么地址?–2017年8月29日9:22死亡
在第一个tx中,我看到地址“mvVWbgb3sZeEz495eDoaem79Qi876zuG9S”,在第二个“mmexezugcmmilsfxxm8gb8tqstkur1drf”。如果第一个是确定的,那么您已经使用了正确的地址私钥。第二个地址用的是同一个私钥吗?–pebwindkraft 8月30日10:26
添加评论

(104)blockchainBTC比特币区块链

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注