返回介绍

2.多重签名

发布于 2024-12-29 22:37:18 字数 3481 浏览 0 评论 0 收藏 0

比特币也可以共享所有权。

你将创建一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文