bitcoin多重签名

来源:互联网 发布:java 日期和时间控件 编辑:程序博客网 时间:2024/05/16 07:47

参考:http://bbs.btcman.com/thread-1311-1-2.html

帮助-调试窗口-控制台:

商家A输入, validateaddress <商家的任意收款地址>
获得公钥 pubkey_A ,并对外公开。

getnewaddress mmCNcSDvkbm4itzUsUaw2UEuQL4m1WbNi2

validateaddress mmCNcSDvkbm4itzUsUaw2UEuQL4m1WbNi2

02359bf483d557b12d121d49ae0a835753c75c471dc7ebd44130d5da341e843a9c           (pubkey_A)

买家B输入,validateaddress  <自己的任意收款地址>
获得公钥 pubkey_B,

getnewaddress mzM6vZ9ubb7pV3u5KEkFWCXFK6vvwMw4zs

validateaddress mzM6vZ9ubb7pV3u5KEkFWCXFK6vvwMw4zs

0210d70075bc334a6e91afdaf3b472b30345f47738fc9efa6af926de0371f4c39d           (pubkey_B)


然后再输入 addmultisigaddress 2 '["<pubkey_A>","<pubkey_B>"]'           // 记得替换掉啊。<>符号也替换掉,下同。
则可生成多重签名的<收款地址C>

addmultisigaddress 2 "[\"02359bf483d557b12d121d49ae0a835753c75c471dc7ebd44130d5da341e843a9c\",\"0210d70075bc334a6e91afdaf3b472b30345f47738fc9efa6af926de0371f4c39d\”]"

2N5LMhodfmbxwHa94rAX4nGfteMb7t99UUD            (收款地址_C)
买家发币给<收款地址C>, 并把pubkey_B还有交易ID发给商家
sendtoaddress 2N5LMhodfmbxwHa94rAX4nGfteMb7t99UUD 0.11

88ed7174bc580c50e05404504e7d9ac94c3a4157d981fbe31ec7df8cd19fa092 (交易ID)
等待全网确认。
此时<收款地址C>,需要商家A和买家B同时签名,才能转币出去,也就是P2P担保地址。

商家收都买家发来的信息时,先检查买家确实是发给担保地址,输入
商家: addmultisigaddress 2 '["<pubkey_A>","<pubkey_B>"]' 

addmultisigaddress 2 "[\"02359bf483d557b12d121d49ae0a835753c75c471dc7ebd44130d5da341e843a9c\",\"0210d70075bc334a6e91afdaf3b472b30345f47738fc9efa6af926de0371f4c39d\”]"

2N5LMhodfmbxwHa94rAX4nGfteMb7t99UUD            (收款地址_C)
则可获得<收款地址C>,可检查买家确实是发送币到< P2P担保地址 - 收款地址C>上。
若相同,则可以确认是与你相关的担保地址,则可以发货。否则是假的。

getrawtransaction 88ed7174bc580c50e05404504e7d9ac94c3a4157d981fbe31ec7df8cd19fa092 1

21:36:11

{
"hex" : "0100000001853740f10b659192f7049eab388f19ecd86ef5775932ad83a012d2c6449f1b85010000006a47304402207c02df0d58c06385e06f2f7488473060b7f8fbaacaee06f8c2d1519fdc05cae8022076db45927677366fe4ade4a391c7229e87e22e8af69dede2d345a05bbfbaedc301210210d70075bc334a6e91afdaf3b472b30345f47738fc9efa6af926de0371f4c39dfeffffff0228821e00000000001976a9149af2b48e5327e7f9e77f3047e5f2c872b40c502c88acc0d8a7000000000017a914849a07b4e66aed7443cd6f7b3ded78c270b47eb9876d200700",
"txid" : "88ed7174bc580c50e05404504e7d9ac94c3a4157d981fbe31ec7df8cd19fa092",
"version" : 1,
"locktime" : 467053,
"vin" : [
{
"txid" : "851b9f44c6d212a083ad325977f56ed8ec198f38ab9e04f79291650bf1403785",
"vout" : 1,
"scriptSig" : {
"asm" : "304402207c02df0d58c06385e06f2f7488473060b7f8fbaacaee06f8c2d1519fdc05cae8022076db45927677366fe4ade4a391c7229e87e22e8af69dede2d345a05bbfbaedc301 0210d70075bc334a6e91afdaf3b472b30345f47738fc9efa6af926de0371f4c39d",
"hex" : "47304402207c02df0d58c06385e06f2f7488473060b7f8fbaacaee06f8c2d1519fdc05cae8022076db45927677366fe4ade4a391c7229e87e22e8af69dede2d345a05bbfbaedc301210210d70075bc334a6e91afdaf3b472b30345f47738fc9efa6af926de0371f4c39d"
},
"sequence" : 4294967294
}
],
"vout" : [
{
"value" : 0.01999400,
"n" : 0,
"scriptPubKey" : {
"asm" : "OP_DUP OP_HASH160 9af2b48e5327e7f9e77f3047e5f2c872b40c502c OP_EQUALVERIFY OP_CHECKSIG",
"hex" : "76a9149af2b48e5327e7f9e77f3047e5f2c872b40c502c88ac",
"reqSigs" : 1,
"type" : "pubkeyhash",
"addresses" : [
"mueF74B9VinaTKNPhsDeGWyAjYtNoLWR27"
]
}
},
{
"value" : 0.11000000,
"n" : 1,
"scriptPubKey" : {
"asm" : "OP_HASH160 849a07b4e66aed7443cd6f7b3ded78c270b47eb9 OP_EQUAL",
"hex" : "a914849a07b4e66aed7443cd6f7b3ded78c270b47eb987",
"reqSigs" : 1,
"type" : "scripthash",
"addresses" : [
"2N5LMhodfmbxwHa94rAX4nGfteMb7t99UUD"
]
}
}
],
"blockhash" : "0000000000002c659e0b611e1772e52ebf58de107e81da61cbfff35203636bd0",
"confirmations" : 2,
"time" : 1434375357,
"blocktime" : 1434375357
}


另外的,Bitcoin的<P2P担保地址> 有个直观的特点, 其是以3xxxxx开头的收款地址(2开头的是测试网络的)

此时买家可以等到货确认了。

----------- 确认到货 -------
如果确认到货的话,则需要输入.
商家:  createrawtransaction '[{"txid":"<交易ID>","vout":0}]' '{"<商家的任意收款地址>":<币值>}'
会生成:会生成<16进制的交易数据1>

createrawtransaction "[{\"txid\":\"88ed7174bc580c50e05404504e7d9ac94c3a4157d981fbe31ec7df8cd19fa092\",\"vout\":0}]" "{\"mmCNcSDvkbm4itzUsUaw2UEuQL4m1WbNi2\":0.11}"

010000000192a09fd18cdfc71ee3fb81d957413a4cc99a7d4e500454e0500c58bc7471ed880000000000ffffffff01c0d8a700000000001976a9143e4d2671eafe425b0839c4e422940499b4096ffd88ac00000000<16进制的交易数据1>


以上<交易ID>是之前发送给<收款地址C>时的交易ID,在买家发送时候会有生成,也可以blockchain或交易记录上查询,一般需要买家提供信息才行。
商家:  signrawtransaction <16进制的交易数据1>
会生成 <部分签名与交易数据1>

signrawtransaction 010000000192a09fd18cdfc71ee3fb81d957413a4cc99a7d4e500454e0500c58bc7471ed880000000000ffffffff01c0d8a700000000001976a9143e4d2671eafe425b0839c4e422940499b4096ffd88ac00000000

{
"hex" : "010000000192a09fd18cdfc71ee3fb81d957413a4cc99a7d4e500454e0500c58bc7471ed880000000000ffffffff01c0d8a700000000001976a9143e4d2671eafe425b0839c4e422940499b4096ffd88ac00000000",
"complete" : false
}


将生成的<部分签名与交易数据1>,发给买家,需要买家来签名。
以上操作可以提早做,比如在发货的同时,发给的买家的。
/////
买家拿到商家的<部分签名与交易数据1>,先检查下确实是从<p2p担保地址C>里转币出去的,防止转的是自己其他地址的币。(这部分原文档上是没有的,我这里加上去。)
买家:  decoderawtransaction  <部分签名与交易数据1>

decoderawtransaction 010000000192a09fd18cdfc71ee3fb81d957413a4cc99a7d4e500454e0500c58bc7471ed880000000000ffffffff01c0d8a700000000001976a9143e4d2671eafe425b0839c4e422940499b4096ffd88ac00000000

22:11:50

{
"txid" : "b081e7f08a93fe32b99eb22a3299d667c91e99ef98875df20f8d52f652f18fd5",
"version" : 1,
"locktime" : 0,
"vin" : [
{
"txid" : "88ed7174bc580c50e05404504e7d9ac94c3a4157d981fbe31ec7df8cd19fa092",
"vout" : 0,
"scriptSig" : {
"asm" : "",
"hex" : ""
},
"sequence" : 4294967295
}
],
"vout" : [
{
"value" : 0.11000000,
"n" : 0,
"scriptPubKey" : {
"asm" : "OP_DUP OP_HASH160 3e4d2671eafe425b0839c4e422940499b4096ffd OP_EQUALVERIFY OP_CHECKSIG",
"hex" : "76a9143e4d2671eafe425b0839c4e422940499b4096ffd88ac",
"reqSigs" : 1,
"type" : "pubkeyhash",
"addresses" : [
"mmCNcSDvkbm4itzUsUaw2UEuQL4m1WbNi2"
]
}
}
]
}


检查vin.txid = <交易ID>,确认是对的,则输入
买家:  signrawtransaction <部分签名与交易数据1>
会生成<完整签名与交易数据2>

signrawtransaction 010000000192a09fd18cdfc71ee3fb81d957413a4cc99a7d4e500454e0500c58bc7471ed880000000000ffffffff01c0d8a700000000001976a9143e4d2671eafe425b0839c4e422940499b4096ffd88ac00000000

{
"hex" : "010000000192a09fd18cdfc71ee3fb81d957413a4cc99a7d4e500454e0500c58bc7471ed88000000006a4730440220278bd3c75cf59556787806c703655b2fd023b21106aed8a63f9326c8926dd8e102206766077cd3d8fabc66b23f21c319ac4a57d88d75642c6e64d224e2633e2526e201210251afa1b664d9ab9b1fc59773b452401dfff8d7578c4fd671d673a867930bf6e9ffffffff01c0d8a700000000001976a9143e4d2671eafe425b0839c4e422940499b4096ffd88ac00000000",
"complete" : true
}


买家:  sendrawtransaction <完整签名与交易数据2>
发款完成。。已将<收款地址C>上的钱转给商家了

以上比较麻烦,现在没界面做,所以比较蛋疼。
------------  不确认到货,要求<收款地址C>上的钱打回来 -------
然后再说说不确认到货、退款的流程,其实都差不多的,但有个前提条件,那就是上面的[确认到货]没有做过,即<收款地址C>里的钱还未转到<商家收款地址>上。
先与商家协商好,确认可以退款。
买家:  createrawtransaction '[{"txid":"<交易ID>","vout":0}]' '{"<买家自己的任意收款地址>":<币值>}'
买家:  signrawtransaction <16进制的交易数据1>
相同,也会生成<部分签名与交易数据1>,也是发给商家,等商家确认签名退款。

商家先对<部分签名与交易数据1>检查,先确实是从<p2p担保地址C>里转币出去的,防止转的是自己其他地址的币。(这部分原文档上是没有的,我这里加上去。)
商家:  decoderawtransaction  <部分签名与交易数据1>
检查vin.txid = <交易ID>,确认是对的,则输入
商家:  signrawtransaction <部分签名与交易数据1>
会生成<完整签名与交易数据2>
商家:  sendrawtransaction <完整签名与交易数据2>
-------
OVER。
(以上的有关签名或交易数据,若是json数据{},则一般是复制hex字段.)

需要注意的,
1,在以上操作中,没有第三人协调,要是双方协调不了,那币就死在收款地址上了。(当然你可以考虑法庭来帮忙,强制要求他做)
2,一开始的收款地址A与收款地址B不能丢,即,不能换钱包,否则签名时会失败。
3,由于是两次转账,所以需要付两次全网手续费。
4,若两者的createrawtransaction搞混了,可以用decoderawtransaction 检查下发款金额,目标收款地址,和币来源的交易ID(不是发款地址哦,要看发款地址还需要再查一下前交易内容)

---------
补充 addmultisigaddress 的第二个参数是决定至少需要几个人的签名才可以提币。
换句话说,这里可以加入第三人协调
addmultisigaddress 2 '["<pubkey_商家A>","<pubkey_买家B>","<pubkey_第三方裁定人C>"]' 
这样,只需要其中两人,即可转币,可以实现第三方裁判.
--------




0 0
原创粉丝点击