一种增强隐私的多重签名:树签名

Posted sCrypt 智能合约

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一种增强隐私的多重签名:树签名相关的知识,希望对你有一定的参考价值。

我们使用称为树签名(Tree Signatures)的技术提出了一种具有增强隐私的多重签名的有效实现。

与原始树签名¹相反,我们的实现不需要对比特币协议进行任何更改。

树签名

在标准的 M-of-N 多重签名中,需要 M 个签名来转移资金。所有 N 个公钥都必须在区块链上公开。当 N 很大时,这会迅速增加脚本大小,例如,在 1-of-100 的多重签名中。

Merkle 树和 Merkle 路径

为了解决这个问题,树签名将密钥组织在 Merkle 树中。每个叶子代表 NM 个键的特定组合。总共有 C(M, N)² 个叶子。在 M1 的情况下,有 N 个叶子,每个叶子只是一个唯一的键。

与标准多重签名相比,树签名带来了几个显着的好处,尤其是当 M-of-N 组合的数量很大时。

  • 可扩展:脚本大小是以 log(C(M, N)) 的复杂度扩展,因为只需要选择的分支及其 merkle 路径,而不是所有公钥。
  • 隐私性:只有签名时使用的公钥在链上公开,其他的都是隐藏的。

M = 3 时的示例实现如下所示。

contract TreeSig 
    static const int DEPTH = 4;
    // M out of N multisig
    static const int M = 3;
    
    const Sha256 merkleRoot;

    public function main(PubKey[M] pubKeys, Sig[M] sigs, MerklePath merklePath) 
        // validate public keys are from the merkle tree
        require(calMerkleRoot(pubKeys2Leaf(pubKeys), merklePath) == this.merkleRoot);

        // check if all M signatures are valid
        bool allMatch = true;
        loop (M) : i 
            allMatch = allMatch && checkSig(sigs[i], pubKeys[i]);
        
        require(allMatch);
    

    // map public keys to a leaf
    static function pubKeys2Leaf(PubKey[M] pubKeys) : bytes 
        bytes leaf = b'';

        loop (M) : i 
            leaf += pubKeys[i];
        
        return leaf;
    

    static function calMerkleRoot(bytes leaf, MerklePath merklePath) : Sha256 
        Sha256 root = sha256(leaf);

        loop (DEPTH) : i 
            Sibling s = merklePath[i];
            root = s.left ? sha256(s.hash + root) : sha256(root + s.hash);
        

        return root;
    

树签名合约

高级用法

M-of-N 的子集

扩展标准树签名的一种直接方法是选择任意严格的 M-of-N 键组合子集作为叶子,而不是所有 M-of-N 组合。例如,在 2-of-3 方案中,包括 (key1, key2)(key2, key3),但不包括 (key1, key3)。这提供了比标准多重签名更大的灵活性。

可组合性

我们甚至可以将多个签名树合并为一棵树,它可以通过原始子树中任何叶子中的密钥的签名来解锁。

合并两个树签名

[1] Pieter Wuille, 树签名(Tree Signatures), 2015

[2] C(M, N) 代表 N 个中选择 M 个

以上是关于一种增强隐私的多重签名:树签名的主要内容,如果未能解决你的问题,请参考以下文章

集成公告|Protofire将Gnosis安全多重签名Fork部署至Moonriver以增强安全性

多重签名(Multisig)

《Nodejs开发加密货币》之十九:签名和多重签名

脚本与多重签名技术

专利学习一种基于聚合签名的联盟链隐私保护方法

多重签名