- 1.前言
- 2.为什么是区块链编程而不是比特币编程?
- 3.为什么是 C#?
- 4.预备条件
- 5.本书众筹
- 6.补充阅读
- 7.图标
- 8.许可: CC (ASA 3U)
- 9.项目设置
- 1.比特币地址
- 2.交易
- 3.区块链
- 4. 区块链不仅仅是比特币
- 5.支付比特币
- 6.作为真实性验证方法的所有权证明
- 1.足够随机了吗?
- 2.秘钥加密
- 3.秘钥的生成
- 1.P2PK[H] (向公钥付款 [Hash])
- 2.多重签名
- 3.P2SH ( 向脚本哈希付款)
- 4.灵活机动性
- 5.使用 TransactionBuilder
- 1.颜色币
- 2.发行一项资产
- 3.传输资产
- 4.单元测试
- 5.李嘉图合约
- 6.流动的民主
- 7.烧钱和声誉证明
- 8.存在性证明
- 1.比特币发展的挑战
- 2.如何证明一个币存在于区块链上
- 3.如何证明一个颜色币存在于区块链上
- 4.断开与第三方 API 的信任关系
- 5.防止延展性攻击
- 6.保护你的私钥
2.多重签名
比特币也可以共享所有权。
你将创建一个 ScriptPubKey 表示 m-of-n 多重签名(multi sig),它的意思是,如果需要支付币,m 个私钥需要对 n 个不同的公钥签名。
我们看看是如何工作的,先通过 Bob, Alice, 和 Satoshi 创建一个多重签名,如果需要支付币,就需要得到他们中的两个签名。
Key bob = new Key();
Key alice = new Key();
Key satoshi = new Key();
var scriptPubKey = PayToMultiSigTemplate
.Instance
.GenerateScriptPubKey(2, new[] { bob.PubKey, alice.PubKey, satoshi.PubKey });
Console.WriteLine(scriptPubKey);
如上所述,scriptPubkey 的格式: OP_CHECKMULTISIG
仅仅调用 Transaction.Sign 不能奏效 , 相比而言对它进行签名的过程有点复杂。
就算我们将更深入地探讨这个话题,我们还是使用 TransactionBuilder 来对交易签名吧。
设想一下,在一个叫 received 的交易里面,多重签名收到一个币。
Transaction received = new Transaction();
received.Outputs.Add(new TxOut(Money.Coins(1.0m), scriptPubKey));
Satoshi 和 Alice 一致同意为我的服务付款 1.0BTC。
这样就获得了从交易中收到的币:
Coin coin = received.Outputs.AsCoins().First();
然后,使用 TransactionBuilder, 创建 unsigned transaction。
BitcoinAddress nico = new Key().PubKey.GetAddress(Network.Main);
TransactionBuilder builder = new TransactionBuilder();
Transaction unsigned =
builder
.AddCoins(coin)
.Send(nico, Money.Coins(1.0m))
.BuildTransaction(false);
交易还没有签名。 这是 Alice 的签名:
builder = new TransactionBuilder();
Transaction aliceSigned =
builder
.AddCoins(coin)
.AddKeys(alice)
.SignTransaction(unsigned);
然后是 Satoshi 的:
builder = new TransactionBuilder();
Transaction satoshiSigned =
builder
.AddCoins(coin)
.AddKeys(satoshi)
.SignTransaction(unsigned);
现在, Satoshi 和 Alice 可以将他们的签名合并到一个交易中了。
builder = new TransactionBuilder();
Transaction fullySigned =
builder
.AddCoins(coin)
.CombineSignatures(satoshiSigned, aliceSigned);
Console.WriteLine(fullySigned);
{
….
"in": [
{
"prev_out": {
"hash": "9df1e011984305b78210229a86b6ade9546dc69c4d25a6bee472ee7d62ea3c16",
"n": 0
},
"scriptSig": "0
3045022100a14d47c762fe7c04b4382f736c5de0b038b8de92649987bc59bca83ea307b1a202203e38
dcc9b0b7f0556a5138fd316cd28639243f05f5ca1afc254b883482ddb91f01
3044022044c9f6818078887587cac126c3c2047b6e5425758e67df64e8d682dfbe373a2902204ae7fda
6ada9b7a11c4e362a0389b1bf90abc1f3488fe21041a4f7f14f1d856201"
}
],
"out": [
{
"value": "1.00000000",
"scriptPubKey": "OP_DUP OP_HASH160 d4a0f6c5b4bcbf2f5830eabed3daa7304fb794d6
OP_EQUALVERIFY OP_CHECKSIG"
}
]
}
交易已经准备好了,可以发送到网络上了。
就算如上所述,比特币网络支持多重签名,但是仍然有个问题:一个对比特币没有太多概念的人而言,你如何叫他付款给 satoshi/alice/bob 的多重签名?因为这种 scriptPubKey 不能简单地使用比特币地址表示。
如果我们可以把 scriptPubKey 表示得跟比特币地址一样简洁的话,是不是很酷?
好吧,这是可能的,叫做 Bitcoin Script Address,也叫 Pay to Script Hash。(P2SH)
目前为止,这里你看到了 native Pay To Multi Sig,但是 native P2PK 还没有被直接用过,他们被打包进 Pay To Script Hash。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论