比特人-比特币第一中文社区

 找回密码
 立即注册(register)
查看: 675|回复: 2

合成地址(多重签名地址、合同地址)的一些特性和应用...

[复制链接]
发表于 2014-5-19 06:45:32 | 显示全部楼层 |阅读模式
本帖最后由 Watchmen 于 2014-5-19 10:52 编辑


20121205162049_35.jpg


合成地址的翻译未统一,也叫多重签名地址、合同地址。

可能对你有用的内容:
1,合成地址的应用举例-押金证明
2,合成地址的应用举例-脑钱包+分裂储存
3,合成地址特性-合成公钥数量上限
4,合成地址特性-加权的公钥
5,合成地址交易演示-软妹币押金证明

打赏 1BfXayW2vrj6uRpoZg3nR8rMEckLpGmaiL
SSC SKZkDHNBZbo8VU8d3Rcb9TcmUPsE5B5Dix

使用n把公钥创造合成地址,用这些公钥对应私钥中至少m把签名才可以支付。
(下文记作m~n合成地址)

对于比特币来说,在核心客户端执行命令createmultisig,就可以产生3开头的地址(即合成地址)与其对应的redeemScript(签名时用到),参数是数字m和n个公钥。
1<=m<=n。
n>15时,客户端会报错,但是能生成地址,慎用。n>175时,不能生成地址。
公钥排列顺序影响合成地址结果。所以,创建合成地址时,不但要公布公钥,还应同时公布公钥的排列顺序。
使用压缩公钥可以有效缩短redeemScript。
公钥可以重复。

——合同地址应用举例——

——1,押金证明
本例修改自 http://www.8btc.com/bitcoin_contracts 示例1。

本例中进行的交易与日常的比特币交易相比,仅额外利用了lock_time字段和合同地址两个特性,并不复杂。(最后有用软妹币做的交易演示)

因为协议对“内存池交易替换机制”的修改,原文与本文中的操作稍有不同,但是并不影响本例的最终结果。

用户A,服务商B。
B提供服务,允许免费试用服务1个月。
B需要:A支付押金,押金锁定1个月,以防小号恶意注册。
A需要:B不能侵吞押金,即使B倒闭,1个月后A也能取回押金。
过程。
A与B互相告知公钥,生成合同地址。
A构造交易T1,将押金发送到合同地址,但不广播,仅将T1的txid告知B,
B构造交易T2,将合同地址存放的押金(T1的输出)发回A的地址,locktime设为一个月后,签名(第1次),将签名后的交易告知A。
A验证交易,签名(第2次,签名完毕)。广播T1。
(下面内容操作与原文不同,但结果相同)
现在押金在合同地址上。如果双方达成新的协议,可以构造交易T3,签名、广播,那么T2自动失效。
如果双方没能达成新的协议,一个月后,A广播T2,将押金收回。

——2,脑钱包+分裂储存

本例借鉴了bitaddress.org的“分裂钱包”

例如,制作7个脑钱包,生成5~7合成地址并存币,这样只需要回想起5个脑钱包口令即可找回币。
也就是传说中的“精神~分裂~钱包”。

——3,合成公钥数量上限

通常情况下redeemScript的组成:

5
<m>        //1位,最少所需签名数m,不小于n
<公钥类型>        //3位,21代表压缩公钥,41代表非压缩公钥
<公钥>               
[<公钥类型><公钥>]...        //直到列出所有公钥
5
<n>        //1位。n
ae        

注意5<n>这两位。
n=15        0x5f        //正常情况的极限
n=16        0x60        //n溢出到前一位
n=175        0xff        //5这一位也到达了极限
n=176        0x100        //溢出

经测试,
n<=15时,一切正常;
n>15时,核心客户端会报错,但仍然能生成貌似合理的redeemScript;
n=175时,5<n>已经是最大值ff了
n>175时,客户端会报错,不能生成redeemScript。

——4,“加权”公钥

重复使用公钥相当于“加权”。
用类似这样的语句可以生成一个2~4合成地址。

输入:
createmultisig 2 '["03157785C98AA89239580B508B555C82C6C217EE6D58C9B97F88E574426C725656","03157785C98AA89239580B508B555C82C6C217EE6D58C9B97F88E574426C725656","02B71CE7191DFDE3FA51A0574B2955DB7A85B57998AFE8E73874A4A7DB7F42A3D7","031979CA5FC3EDDC8A85AA7CE3C16D030DF32D19B96FC84792808E90A895E0EE10"]'

输出:
{
"address" : "37HVHGESfaepSd5igixiUkdZJaRFARE2d6",
"redeemScript" : "522103157785c98aa89239580b508b555c82c6c217ee6d58c9b97f88e574426c7256562103157785c98aa89239580b508b555c82c6c217ee6d58c9b97f88e574426c7256562102b71ce7191dfde3fa51a0574b2955db7a85b57998afe8e73874a4a7db7f42a3d721031979ca5fc3eddc8a85aa7ce3c16d030df32d19b96fc84792808e90a895e0ee1054ae"
}


上例中,公钥03157785C98AA89239580B508B555C82C6C217EE6D58C9B97F88E574426C725656
使用了两次,使用它对应的私钥签名,就相当于普通公钥对应的私钥签名两次。

下面情况演示了“加权”的公钥,为这个公钥签名,相当与签名两次。

signrawtransaction '010000000116e8243bb546579b08b446014178dcc88c1f2824a2f4b92700c776aafeba543d010000000100010000000100e1f505000000001976a914ed0d2b8df94dae2637b32f9c34cc86a1d201ed3f88acacbe7853' '[{"txid":"3d54bafeaa76c70027b9f4a224281f8cc8dc78410146b4089b5746b53b24e816","vout":1,"scriptPubKey":"a9143d5d9bb8e788adc7ffee64ecf7cf951c59925df187","redeemScript": "522103157785c98aa89239580b508b555c82c6c217ee6d58c9b97f88e574426c7256562103157785c98aa89239580b508b555c82c6c217ee6d58c9b97f88e574426c7256562102b71ce7191dfde3fa51a0574b2955db7a85b57998afe8e73874a4a7db7f42a3d721031979ca5fc3eddc8a85aa7ce3c16d030df32d19b96fc84792808e90a895e0ee1054ae"}]'  '["V(给压缩公钥签名,须使用压缩私钥)"] '

输出
{
"hex" : "010000000116e8243bb546579b08b446014178dcc88c1f2824a2f4b92700c776aafeba543d01000000fd200100483045022061da50d993d8e1581895d25fec3b78baba3f02d7f702f59c53bf2ea01e02fdaf022100ff45673df8da90cc0f869794d96a4e4c2d7b831669908800124d317685bb80c7014830450220693ce6b1cd05109f8f8d57ec3adf2b8fc7f20468d37300f57a653c923888df250221008a0494e730bde09f746d084665584f55045ca68571529ba1b5a0aa15fa5c0348014c8b522103157785c98aa89239580b508b555c82c6c217ee6d58c9b97f88e574426c7256562103157785c98aa89239580b508b555c82c6c217ee6d58c9b97f88e574426c7256562102b71ce7191dfde3fa51a0574b2955db7a85b57998afe8e73874a4a7db7f42a3d721031979ca5fc3eddc8a85aa7ce3c16d030df32d19b96fc84792808e90a895e0ee1054ae010000000100e1f505000000001976a914ed0d2b8df94dae2637b32f9c34cc86a1d201ed3f88acacbe7853",
"complete" : true
}

——5,合同地址的交易演示,软妹币押金证明——

模拟了上文“合同地址应用举例—1”的状况。
A的付款地址:SKZJ31LHifYvJG73Tksv6jqL96AKmA3iBb

双方协定后,互相告知公钥,生成合同地址。

合同地址:37HVHGESfaepSd5igixiUkdZJaRFARE2d6
这是一个m=2的合成地址,需要至少2次签名。


A构造交易,向合成地址汇入1ssc。
createrawtransaction
'[{"txid":"d24c1c50c536571c91b8dee76163b47a29900bd2ace5342fd0afd036665531cc","vout":0}]'
'{"SKZoyGrF6wiupuH3h8hNoFedPyEtf61zGw":97.56000110,"37HVHGESfaepSd5igixiUkdZJaRFARE2d6":1}'

输出
0100000001cc31556636d0afd02f34e5acd20b90297ab46361e7deb8911c5736c5501c4cd20000000000ffffffff026ebf8045020000001976a914ed0d2b8df94dae2637b32f9c34cc86a1d201ed3f88ac00e1f5050000000017a9143d5d9bb8e788adc7ffee64ecf7cf951c59925df18700000000

A签名
signrawtransaction
'0100000001cc31556636d0afd02f34e5acd20b90297ab46361e7deb8911c5736c5501c4cd20000000000ffffffff026ebf8045020000001976a914ed0d2b8df94dae2637b32f9c34cc86a1d201ed3f88ac00e1f5050000000017a9143d5d9bb8e788adc7ffee64ecf7cf951c59925df18700000000'
'[{"txid":"d24c1c50c536571c91b8dee76163b47a29900bd2ace5342fd0afd036665531cc","vout":1,"scriptPubKey":"76a914752ed09d60cdb089591566c0756ae527c91314d488ac"}]'

A得到签名后的交易Tx1
0100000001cc31556636d0afd02f34e5acd20b90297ab46361e7deb8911c5736c5501c4cd2000000006b483045022100e0f1e9f9712609b6d6b4396556f3876951c62eb8f484c17f9487365efe5785b602205dc46e457085f2d913625f86de218f097a697cfbcfe4b566558717f0a434ded6012102758b6645cb3884ed5fad1941ceb283de952b316450110d05f8617a38290a79c4ffffffff026ebf8045020000001976a914ed0d2b8df94dae2637b32f9c34cc86a1d201ed3f88ac00e1f5050000000017a9143d5d9bb8e788adc7ffee64ecf7cf951c59925df18700000000

A暂时不广播Tx1,只把交易中的3个参数:
txid:3d54bafeaa76c70027b9f4a224281f8cc8dc78410146b4089b5746b53b24e816
vout:1
金额1.000ssc
告诉B。

B使用上面的参数构造交易(本例未考虑手续费,实际应用时不要吝啬手续费)

createrawtransaction
'[{"txid":"3d54bafeaa76c70027b9f4a224281f8cc8dc78410146b4089b5746b53b24e816","vout":1}]'
'{"SKZoyGrF6wiupuH3h8hNoFedPyEtf61zGw":1.00}'

输出
010000000116e8243bb546579b08b446014178dcc88c1f2824a2f4b92700c776aafeba543d0100000000ffffffff0100e1f505000000001976a914ed0d2b8df94dae2637b32f9c34cc86a1d201ed3f88ac00000000

根据需要修改lock_time字段和sequence字段的值
{
    "hash": "57e390004e545282b2c0efad9dc6a16b5e751503b751d7fe064000b66ee2b9d7",
    "ver": 1,
    "vin_sz": 1,
    "vout_sz": 1,
    "lock_time": 1400422060,
    "size": 85,
    "in": [
        {
            "prev_out": {
                "hash": "3d54bafeaa76c70027b9f4a224281f8cc8dc78410146b4089b5746b53b24e816",
                "n": 1
            },
            "scriptSig": "",
            "sequence": 1
        }
    ],
    "out": [
        {
            "value": "1.00000000",
            "scriptPubKey": "OP_DUP OP_HASH160 ed0d2b8df94dae2637b32f9c34cc86a1d201ed3f OP_EQUALVERIFY OP_CHECKSIG"
        }
    ]
}

编码(这里为了方便,我使用了第三方工具http://brainwallet.org/#tx
010000000116e8243bb546579b08b446014178dcc88c1f2824a2f4b92700c776aafeba543d010000000100010000000100e1f505000000001976a914ed0d2b8df94dae2637b32f9c34cc86a1d201ed3f88acacbe7853

B进行签名

signrawtransaction '010000000116e8243bb546579b08b446014178dcc88c1f2824a2f4b92700c776aafeba543d010000000100010000000100e1f505000000001976a914ed0d2b8df94dae2637b32f9c34cc86a1d201ed3f88acacbe7853' '[{"txid":"3d54bafeaa76c70027b9f4a224281f8cc8dc78410146b4089b5746b53b24e816","vout":1,"scriptPubKey":"a9143d5d9bb8e788adc7ffee64ecf7cf951c59925df187","redeemScript": "522103157785c98aa89239580b508b555c82c6c217ee6d58c9b97f88e574426c7256562103157785c98aa89239580b508b555c82c6c217ee6d58c9b97f88e574426c7256562102b71ce7191dfde3fa51a0574b2955db7a85b57998afe8e73874a4a7db7f42a3d721031979ca5fc3eddc8a85aa7ce3c16d030df32d19b96fc84792808e90a895e0ee1054ae"}]'  '["V(给压缩公钥签名,须使用压缩私钥)"] '



输出
{
"hex" : "010000000116e8243bb546579b08b446014178dcc88c1f2824a2f4b92700c776aafeba543d01000000d60047304402205fe90addc78bd925c5d3d8af72ed8e734f6e9cd13e4047ed4587caab80e4723102203ba2c0c3aa4729229fbac8eb4ed2d8b1695e6cc02aeca40bd17836e4913a8da6014c8b522103157785c98aa89239580b508b555c82c6c217ee6d58c9b97f88e574426c7256562103157785c98aa89239580b508b555c82c6c217ee6d58c9b97f88e574426c7256562102b71ce7191dfde3fa51a0574b2955db7a85b57998afe8e73874a4a7db7f42a3d721031979ca5fc3eddc8a85aa7ce3c16d030df32d19b96fc84792808e90a895e0ee1054ae010000000100e1f505000000001976a914ed0d2b8df94dae2637b32f9c34cc86a1d201ed3f88acacbe7853",
"complete" : false
}

将这段Raw Transaction告知A。

这时A还没有付款,
A检查这段Raw Transaction,看金额有没有在约定时间返回自己的地址,如果确认无误,
A继续签名
signrawtransaction '010000000116e8243bb546579b08b446014178dcc88c1f2824a2f4b92700c776aafeba543d01000000d60047304402205fe90addc78bd925c5d3d8af72ed8e734f6e9cd13e4047ed4587caab80e4723102203ba2c0c3aa4729229fbac8eb4ed2d8b1695e6cc02aeca40bd17836e4913a8da6014c8b522103157785c98aa89239580b508b555c82c6c217ee6d58c9b97f88e574426c7256562103157785c98aa89239580b508b555c82c6c217ee6d58c9b97f88e574426c7256562102b71ce7191dfde3fa51a0574b2955db7a85b57998afe8e73874a4a7db7f42a3d721031979ca5fc3eddc8a85aa7ce3c16d030df32d19b96fc84792808e90a895e0ee1054ae010000000100e1f505000000001976a914ed0d2b8df94dae2637b32f9c34cc86a1d201ed3f88acacbe7853' '[{"txid":"3d54bafeaa76c70027b9f4a224281f8cc8dc78410146b4089b5746b53b24e816","vout":1,"scriptPubKey":"a9143d5d9bb8e788adc7ffee64ecf7cf951c59925df187","redeemScript": "522103157785c98aa89239580b508b555c82c6c217ee6d58c9b97f88e574426c7256562103157785c98aa89239580b508b555c82c6c217ee6d58c9b97f88e574426c7256562102b71ce7191dfde3fa51a0574b2955db7a85b57998afe8e73874a4a7db7f42a3d721031979ca5fc3eddc8a85aa7ce3c16d030df32d19b96fc84792808e90a895e0ee1054ae"}]'  '["V(给压缩公钥签名,须使用压缩私钥)"] '


签名成功,得到Tx2
010000000116e8243bb546579b08b446014178dcc88c1f2824a2f4b92700c776aafeba543d01000000fd1e010047304402205fe90addc78bd925c5d3d8af72ed8e734f6e9cd13e4047ed4587caab80e4723102203ba2c0c3aa4729229fbac8eb4ed2d8b1695e6cc02aeca40bd17836e4913a8da6014730440220157d6dd188f178f41bfa99d5ce6313f85d8c7b347f09b7056b68b83335e70f8702200179ee1324c69e4c0e6f9298396caace7ad644178cd1aa5a491c8a5b2244f10c014c8b522103157785c98aa89239580b508b555c82c6c217ee6d58c9b97f88e574426c7256562103157785c98aa89239580b508b555c82c6c217ee6d58c9b97f88e574426c7256562102b71ce7191dfde3fa51a0574b2955db7a85b57998afe8e73874a4a7db7f42a3d721031979ca5fc3eddc8a85aa7ce3c16d030df32d19b96fc84792808e90a895e0ee1054ae010000000100e1f505000000001976a914ed0d2b8df94dae2637b32f9c34cc86a1d201ed3f88acacbe7853

一切就绪后,A广播Tx1,B即收到押金。
除非AB都同意,A不可以在lock_time之前处置押金。这就尽量避免了A大量注册B账户的情况(当然,如果A非常非常有钱,就是想戏弄B,B也没办法)。
无论B是否同意,A都可以在lock_time之后将押金取回。这就避免了B卷款逃走的情况。

完毕。




发表于 2014-5-21 06:22:34 | 显示全部楼层
本帖最后由 cross1943 于 2014-5-21 06:30 编辑

谢谢楼主,虽然已经看过locktime的相关文章(比特币合同这篇文章中有提到),不过这篇文章更加通俗实例点。下个月我会更新我的(开源)担保交易工具,加入locktime的使用,或根据此文章对工具进行一定的调整
虽然我不任职评审,但此文章我打10分。
 楼主| 发表于 2014-6-13 22:01:20 | 显示全部楼层
cross1943 发表于 2014-5-21 06:22
谢谢楼主,虽然已经看过locktime的相关文章(比特币合同这篇文章中有提到),不过这篇文章更加通俗实例点。下 ...

我照搬他们的,然后自己用软妹币构造了交易(其间还彻底弄丢了一个软妹币)。
locktime是很好玩的东西,可惜策略容易导致ddos攻击,现在我们用的阉割版。

本版积分规则

小黑屋|Archiver|手机版|比特人-比特币第一中文社区

GMT+8, 2019-12-10 18:26 , Processed in 0.022436 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表