第一次在stackexchange上寻求帮助,抱歉我犯了错误(英语不是我的母语)。
我试图在C上创建一个有效的原始事务,并使用Boungycaster,我似乎卡住了,找不到哪里是我的错误。我在testnet网络上进行测试,并使用了许多源来帮助自己,主要是这个。首先,我有下一个地址和私钥
地址:mjhcWg5SvS96kk85R8G1wp7mru55UCNGY5
公钥十六进制:0482052EF9560585ED62F046EE45C1B5F85448BCF1BD5C36A7EB00C8A146C14BF99223907F9A68688E6844FD747A637BB82F02E2296203E7A6B40059F
Wif:93U5P1QHPXAHXHIW15Z3F1CBQFW9FWRD3YZ1和K8B2 RBRRM
专用钥匙六角:F7DBD21285F621F1C7A47AE7F63D06C276FE49839F442DF805477936812A5
我想使用上一个(testnet)事务中的6.49689241 btc
912A22C3D84C8572B39C173B2BCDE950CFE07756BAC189AC98F198D5CB7D
并将一些(作为测试)发送回水龙头MWCWTCEJVYV27KXB3NJZYS6CJSGSOEMF
首先,要构建未签名的原始事务,我添加以下字节:
01000000(版本号)
01(输入数量)
7DCB5C8D198FE9AC89C1BA5677E04AFE0C95DECB273C1392B57C8843D2C2A91(反转以前的tx哈希)
01000000(输出指数)
1976A9142DE4909EF146737AF2B498FCB9F6B8446A84E88AC(以前的tx脚本,其长度在开始时)
ffffffff(序列)
02(输出数量)
496FF502000000(第一个输出小端数)。水龙头)
1976A914AC19D3FD17710E6B9A31022FE92C693FDF6659588AC(第一个输出脚本,其长度在开始时)
0046c32300000000(第二输出小端数。我的地址,要更改)
1976A9142DE4909EF146737AF2B498FCB9F6B8446A84E88AC(第二个脚本,开始时长度)
00000000(锁定时间)
01000000(散列码类型)
结果是
01000000017DCB5C8D198FE9AC89C15677E04AFE0C95DEBC273C1392B57C8843D2C2A910100000176A9142DE490B09EF14673AF2B49998FCB9F6B8446A84E88ACFFFFFF02496FF502000000001976A914AC19D3FD17710E6B9B9A31022FE92C693FDF6659588AC0046C323000000001976A919DE49094B494B44AFB498F9F9F6B44F8446A84AC00000000010000000000
然后,我通过在返回我的双SHA256函数中推送原始事务来检索事务哈希
F64B6480A2888596636D495153 E990CE95582A1308C9C568D2698E6DC1F7893
然后,我用私钥十六进制(prvkeyHex)使用此函数对事务哈希(txHash)进行签名:
X9ECParameters curve=SecNamedCurves.GetByName(“secp256k1”);
ECDomainParameters dom=新的ECDomainParameters(curve.curve,curve.G,curve.N,curve.H)
ECKeyParameters params=新的ECPrivateKeyParameters(新BigInteger(1,prvkeyHex),dom);
ECDsaSigner signer=新ECDsaSigner();
signer.Init(true,params);
BigInteger[]sig=签名者.GenerateSignature(txHash);
MemoryStream ms=新MemoryStream(72);
DerSequenceGenerator seq=新的DerSequenceGenerator(ms);
seq.AddObject(新的deringer(sig[0]);
seq.AddObject(新的deringer(sig[1]);
seq.Close();
字节[]签名=ms.Toaray();
它返回一个字节数组,最大72字节长度从30开始。在我上次测试中:
3015022100ABCEF62D3192B686C405D10516FF0F9FF221C0284D6A6ABB42361BE02297297036D6B9308467E16EBFD3F6B11886071E3C429B34E9407E8D23
然后,我用公钥十六进制及其长度构造我的最后脚本sig,结果如下
483045022100ABCEFF62D3192B686C405D10516FF0E6F9FF221C0284D76620A6缩写42361BE022972970369D6B9308467E15EBAFD3F6B9FAF111886071E3C429B34E9407E8D2301410480EF9560585ED62F046EE45C1B5F85448BCF1BD5E36A7D35EB00C8A146C14B99223907F9A8688E6F84B54FD747A637BB82F02E296203E735E7A60059F
我终于建立了我的签名原始事务:
01000000(版本号)
01(输入数)
7dcb5c8d198fe9ac89c1ba5677e04afe0c95debcb273c1392b57c8843d2c2a91(反转先前的tx散列)
01000000(产出指数)
8b(脚本长度)
483045022100ABCEFF62D3192B686C405D10516FF0E6F9FF221C0284D76620A6ABB42361BE022972970369D6B9308467E15EBAFD3F6B9FAF111886071E3C429B34E9407E8D230141042052EF9560585ED62F046EE45C1B5F85448BCF1BD5E36A7D35EB00C8A146C14B99223907F9A8688E6F84B54FD747A637BB82F02E296203E735E7A60059F(脚本SIG)
FFFFFF(序列)
02(输出数量)
496ff50200000000(首次输出小端量。水龙头)
1976A914AC19D3FD17710E6B9A33022FE92C693FDF6659588AC(第一个输出脚本,其长度在开始处)
0046c32300000000(秒输出小端量。我的地址,请更改)
1976a9142de490b09ef14673af2bb4998fcb9f6b8446a84e88ac(第二个脚本,长度在开始处)
00000000(锁定时间)
最后的结果给了我那个签名的原始事务
01000000017DCB5C8D198FE9AC89C1BA5677E04AFE0C95DEBCB2731392B57C8843D2C2A9101000000B483045022100ABCEFF62D3192B686C405D10516FF0E6F9FF221C0284D766200A6AB42361BE022972970369D6B9308467E15EBAFD3F6B9FAF111886071E3C429B34E9407E8D2301410482052EF9560585ED62F046EE45C1B5F85448BCF15E36A7D35EB00C8A146C14BF9923907F9A686E6F84B547A637B82F02E290E735E7A6B40059FFFFFFFO2496FF5020000001976A914AC19D3FD17710E6B9A331022FE92C693FDF6659588AC0046C323000000001976A9142DE490B09EF14673AF2BB4998FCB9F6B8446A84E88AC00000000
但是现在,当我试图通过web服务在testnet网络上发送签名的原始事务时,每次我都会遇到错误。sandbox.smartbit.com.au/txs/pushtx返回我
“推送事务错误:16:MANDATORY-SCRIPT-VERIFY-FLAG-FAILED(脚本求值时没有错误,但以假/空的顶层堆栈元素结束)”
live.blockcypher.com/btc-testnet/pushtx/返回我
“发送事务时出错:为引用912a2c3d84c8572b39c173b2bcde950cfe4ae07756bac189ace98f198d5ccb7d的输入0运行脚本时出错:脚本未成功验证。”
与tbtc.blockr.io/tx/push相同
我还远远没有掌握比特币或c#,我正在学习(并想学习如何工作)。有人知道我的错在哪里吗?谢谢
交易
c级#
未经加工的
分享
改进这个问题
跟随
问8月20日16日9:55
格里多米赫罗
3133青铜徽章
添加评论
2个答案
0
为什么不使用NBitcoin库来创建一个原始事务,并将其发布到blockr.io或您正在使用的任何API提供程序?NBitcoin是C加密货币开发人员的一个很好的库。
分享
改进这个答案
跟随
10月4日14:53答复
郝阮
12633青铜徽章
添加评论
0
你的签名是正确的,但“信息”有误,这是我能找到的唯一错误。这是你的签名:
F64B6480A2888596636D499513E990CE95582A1308C9C568D2698E6DC1F7893
这是错误的(因为你颠倒了结果)。相反,您应该将从SHA256(SHA256(<bytes>)得到的实际结果签名到签名函数,这意味着:
93781fdce698268d569c8c30a18255e90c993e1595496d63968588a280644bf6
有几个地方我们反转散列结果,这不是其中之一。在这里,您只需对序列化事务进行散列,将其大小从任意长度转换为固定的32字节大小,以便使用ECDSA方案对其进行签名。
直接使用BouncyCastle或任何类似库(通常为加密而不是比特币设计)还有一个可能的问题,它们返回的签名可能有一个s值(签名中的第二个大整数)大于曲线N/2。在这种情况下,您必须通过计算s’=N-s将其改为s’。
分享