合并挖矿 merged mining——是指在不牺牲整体挖矿性能的情况下同时挖矿两种或多种加密货币的行为

联合挖矿(merged mining)

2018.06.09 10:12 字数 1006 阅读 3756评论 0

    本周机缘巧合遇到了“联合挖矿”这个概念,一脸懵逼不懂什么玩意儿,百度上搜索着了一下仍然不太懂,最后在知乎上(https://www.zhihu.com/question/25401169/answer/30664770)链接到国外两篇文章,才简单弄懂了基本概念。(在这里禁不住想吐槽一下百度搜索功能:如果你从事专业研究或者技术开发,想从网络上获取专业知识,建议你放弃百度,转投google;至于怎么能上google,呵呵,大家想办法自己解决吧)

    这里简单总结一下联合挖矿的原理,主要以namecoin与bitcoin为例;最后分析一下这种技术的优势与劣势;namecoin虽然没有发展起来,但是留下了merged mining和one name的思想。

1. 什么是联合挖矿?

    首先猜一下什么是联合挖矿,从字面意思看很可能是一种区块链和另外一种区块链联合起来一起挖矿,但是怎么联合呢?我们以namecoin与bitcoin为例说明。

    namecoin所有的机制几乎和bitcoin一模一样,实现了one name业务,主要是区块链dns服务,相比于传统的dns服务,namecoin的安全性更高,在链上存储dns对应的ip同时保证name的唯一性。bitcoin 的共识算法pow浪费算力,namecoin利用了这些算力,namecoin自己不做mining,而是利用bitcoin mining的计算结果,如果满足namecoin的mining难度值,namecoin挖矿成功。简单过程如下所示:

    a. bitcoin miner 计算得到一个随机数,如果随机数满足namecoin的难度值(namecoin的难度值一般情况肯定比bitcoin小,或者相等),namecoin挖矿成功,打包交易成区块,然后上链;如果随机数同时满足bitcoin的难度值,bitcoin挖矿成功,打包交易上链(注意是bitcoin的区块链,bitcoin与namecoin拥有自己独立的区块链)。

    b. namecoin也是保证10分钟出一个块,刚开始难度值肯定小,但是随着难度系数的调整,namecoin的难度值会趋向于bitcoin的难度值。也就是namecoin的区块和bitcoin的区块几乎同时产生。

    那么namecoin怎样证明工作量呢?namecoin的工作量证明其实是bitcoin的工作量证明,在namecoin的区块上需要链接到相对应的bitcoin的区块。

    以上就是联合挖矿的基本原理,具体可以参考上面知乎上的两个链接:

    how does merged mining work?

    Merged mining specification

    具体实现可以参考namecoin的source code,可以查看blockheader结构变化和挖矿过程,google直接搜 github namecoin。如果不想看源码可以查看网络上的总结:

https://www.zhihu.com/question/25401169/answer/30664770

2. 联合挖矿的优势与劣势

   优势:

    namecoin被成为bitcoin的第一个代币,很好的利用了bitcoin的pow共识算法,缓解了pow算力浪费;namecoin利用bitcoin的pow算法保证自己的安全性,同时和bitcoin绑定吸引更多的bitcoin 节点运行namcoin,在挖bitcoin的同时还挖namecoin。

   劣势:

    bitcoin pow存在的所有问题都会表现在namecoin上,在namecoin上交易都要以nmc支付费用,同时namecoin的dns服务需要浏览器插件支持,这些问题导致了namecoin已经成为过去时。

    namecoin 现在不是主流,但是merged mining和one name的思想还是很好的,这种思想以后可能会用在区块链其他领域。以上就是个人对于namecoin的一些总结和看法,如有错误欢迎大家指正。

 

 

文章目录

        什么是合并挖矿
        合并挖矿的特性
        如何合并挖矿
            Aux proof-of-work block (auxiliary blockchain)
            Merkle Branch
            Merged mining coinbase (parent blockchain)
            Aux work merkle tree
            Example
        多辅助链联合挖矿
        合并挖矿类型
        参考

什么是合并挖矿

合并挖矿是指在不牺牲整体挖矿性能的情况下同时挖矿两种或多种加密货币的行为。从本质上讲,矿工可以通过使用所谓的辅助工作证明(AuxPoW),利用他们的计算能力在多个链上同时挖掘区块。

AuxPoW 背后的想法是,在一个区块链上完成的工作可以被用作另一条链上的有效工作。提供工作量证明的区块链称为父区块链(parent blockchain),而接受它为有效的区块链称为辅助区块链(auxiliary blockchain)。

要执行合并挖掘,所有涉及的加密货币必须使用相同的算法。例如,比特币使用 SHA-256 ,这意味着几乎任何其他使用 SHA-256 的硬币都可以与比特币一起开采——只要技术实施得当。

值得注意的是,父区块链几乎不受影响,因为它不需要进行任何类型的技术修改。另一方面,辅助区块链需要编程以有效接收和接受母链的工作。通常,添加或删除对合并挖矿的支持需要硬分叉。

从理论上讲,通过利用比特币或其他更大链的算力,合并挖矿对于小型(low-hash)区块链来说是一种提高其安全性的有趣方法。只要有足够多的矿工同意采用合并挖矿,这可能会降低 51% 攻击的可能性。

然而,许多开发人员不同意这样的想法,并声称合并挖掘提供了一种虚假的安全感。主要是因为一个相对较大的矿池在比特币上不是特别占优势,可以很容易地在较小的链上达到 51% 的哈希能力。对此的反驳是,如果奖励或激励足够好来挖掘这条辅助链,它将吸引更多的矿工,从而减少中心化并增加安全性。

除此之外,有人说合并挖矿会降低安全性,因为从过程中消除了经济损失。例如,比特币矿工可以在较小的链上使用他们的算力,而不用冒着失去比特币区块奖励的风险。因此,矿工没有理由在较小的链上诚实行事。

84673BCBE66F32C3
合并挖矿的特性

    矿工必须构建一个与他们参与的区块链兼容的区块。例如,如果合并挖掘与比特币和 Namecoin 区块链一起使用,则在比特币区块链上生成的块将被调整为适用于两个网络,因为 Namecoin 是辅助网络,因此接受 AuxPoW 。在这种情况下,矿工可以从两个网络获得挖矿奖励。而如果区块是在 Namecoin 网络中生成的,其难度水平远低于主区块链,则它将与比特币区块链不兼容,因为比特币不识别 AuxPoW 协议。因此,矿工只能获得 Namecoin 网络中产生的奖励。
    当在主链的 Merkle 树中添加额外的哈希时,它不会像在辅助链中那样进行任何更改或修改。在这种情况下,矿工将创建的哈希值和主区块链的区块头添加到辅助区块链,作为工作量证明。但是, AuxPoW 协议将忽略这些任意数据,并且只会将顶级哈希添加到辅助区块链中。

如何合并挖矿

以 namecoin 和 btc 为例:

14FFFCF3F975B046

FEAB68923689BD21

为两个区块链组装了一个交易集。然后将 AuxPoW 区块头的哈希插入到 coinbase 交易的“空闲”字节区域(coinbase 字段)中,并提交给父区块链的工作量证明(PoW)。如果合并矿工在任一区块链或两个区块链的难度级别解决区块,则相应的区块将与完成的 PoW 重新组装并提交到正确的区块链。在 Auxiliary 区块链的情况下, Parent 的区块哈希、Merkle 树分支和 coinbase 交易被插入到 Auxiliary 区块的 AuxPoW 标头中。这是为了证明在父区块链上做了足够多的工作来满足辅助区块链的难度级别。

父块和辅助块的传播是完全独立的,仅受每个链的难度级别控制。例如,下图显示了当父难度( DBTC ) 大于辅助难度( DNMC ) 时, Namecoin 和比特币在实践中如何发挥作用。请注意, BTC 区块 2 没有成为父区块链传播的一部分。

77F0CBAFF9CBD4C5
Aux proof-of-work block (auxiliary blockchain)

这用于证明辅助区块链上的工作。在 vinced 的原始实现中,它是通过在父区块链客户端( bitcoind ) 上调用 getworkauxRPC 方法生成的,然后通过将其传递给辅助链客户端( namecoind )作为getauxblock 的第二个参数来提交工作。

当在 block 网络消息中接收到 Auxproof-of-workblock 时,接收到的数据类似于标准块,但在 nonce 和 txn_count 元素之间插入了额外的数据。
Bytes    Name    Data Type    Description
4    version    int32_t    区块版本号(不同的版本号遵守不同的区块验证规则)。
32    prev_block    char[32]    上一个区块的 SHA256(SHA256()) hash 值,是区块链的核心含义,新的数据必须包含上一个历史数据,从使得新的数据不断挂在老数据的后面。
32    merkle_root    char[32]    当前这个区块组成的 merkle tree 的根,实际上代表了当前这个区块中的所有的交易内容的摘要信息。
4    timestamp    uint32_t    区块产生的时间戳,收到这个区块的节点若是发现这个时间戳要是偏离太多会拒绝这个块。
4    bits    uint32_t    衡量矿工计算出一个块耗费代价的“当前计算难度”
4    nonce    uint32_t    用于工作量证明算法的计数器
—    —    —    —
?    coinbase_txn    txn    位于父区块中的 Coinbase 交易,将 AuxPOW 区块链接到其父区块 block
32    block_hash    char[32]    parent_block 头的哈希值
?    coinbase_branch    Merkle branch    将 coinbase_txn 链接到父区块的 merkle_root 的 Merkle 分支
?    blockchain_branch    Merkle branch    当在具有多个辅助链的合并挖矿设置中使用时,将这个辅助区块链链接到其他区块链的默克尔分支
80    parent_block    Block header    父区块头
—    —    —    —
?    txn_count    var_int    
?    txns    tx[]    

对于 coinbase_branchmerkle 分支,因为 coinbase 交易是区块中的第一笔交易(如果使用比特币作为父链,即下面给出的示例中的哈希 #7 ), branch_side_mask 将始终为全零,因为分支散列将始终位于工作散列的“右侧”。

当只在一个辅助区块链上工作时, blockchain_branch 链接是不需要的,并通过显示为 5 个字节的零(解释为一字节 var_int 表示分支长度为零,以及一个 32 位(4 字节)) 全零的 branch_side_mask )。

请注意,不需要 block_hash 元素,因为您拥有完整的 parent_block 标头元素,并且可以从中计算哈希值。当前的 Namecoin 客户端不检查此字段的有效性,因此一些 AuxPOW 块具有小端序,有些具有大端序。
Merkle Branch

假设 Alice 创建了一个 Merkle 树,它的根元素是公开的。例如:

现在她想向 Bob 证明给定的哈希(#10)是那棵树的一部分,但是 Bob 没有完整的树(只有公共根;哈希#0)。 Alice 可以向 Bob 发送她最初用来制作树的所有哈希值(哈希值 #7-#14 ,总共 7 个额外的哈希值),因此 Bob 可以构建整个树以验证根是否相同,但这更像是数据密集型。相反,她可以给 Bob 散列#9、#3 和#2(来自树的每个级别一个,将#10 返回到根)。在 Bob 不知道树的结构的情况下, Alice 还必须告诉 Bob 应用散列的顺序(因为 hash(#9,#10)==#4 , 但是hash(#10 ,#9)!=#4)。所以爱丽丝告诉鲍勃 “左,左,右” 分别指示哪个操作数 #9、#3 和#2 。可以将其编码为位掩码并占用很少的数据进行传输。因此, Alice 不是向 Bob 传输 7 个散列,而是传输 3 个散列和一个位掩码。如果默克尔树变得更大,则节省的数据会更加明显。

这是总体前提,特别是对于 AuxPOW 协议,它被称为“默克尔分支”(因为它是默克尔树的一个路径),并通过以下方式传输:
Field Size    Description    Data type    Comments
?    branch_length    var_int    组成分支的哈希数
?    branch_hash[]    char[32]    分支中的单个 hash;重复 branch_length 次数
4    branch_side_mask    int32_t    branch_hash 元素应该在默克尔散列函数的哪一侧的位掩码。零表示在右边,一表示在左边。它等于该默克尔分支的默克尔树最宽级别中起始哈希的索引。

首先使用第一个 branch_hash , branch_side_mask 的最低位决定了它的 hash 位置。然后第二个 branch_hash 与 branch_side_mask 的第二个最低有效位一起应用,等等。所以对于 Alice 的例子, branch_length 将是 3 ,散列将按照#9、#3、然后#2 的顺序给出,并且 branch_side_mask 将是 0b011=3(等于默克尔树最宽级别中#10 的索引)。
Merged mining coinbase (parent blockchain)

父链端的工作量较小,只需在 coinbase 的 scriptSig 中插入如下格式的数据(44字节)
Field Size    Description    Data type    Comments
4    magic    char[4]    0xfa, 0xbe, ‘m’, ‘m’ (仅在脚本开头超过 20 个字节时才需要;其他可选)
32    block_hash    char[32]    AuxPOW 区块头的哈希(默克尔分支的根)
4    merkle_size    int32_t    辅助工作默克尔树中的条目数。 (必须是 2 的幂)
4    merkle_nonce    int32_t    Nonce 用于计算辅助工作 merkle 树的索引;只有一个辅链时设置为 0

作为 coinbase 脚本一部分的 44 字节字符串意味着矿工在创建 coinbase 之前构建了 AuxPOW 块。
Aux work merkle tree

如果您只是在挖掘单个辅助链并使用 getauxblock ,则不必担心这一点-只需将 coinbase 中的 merkle 树哈希设置为 getauxblock 给出的辅助链块的哈希, merkle 大小为 1 ,并将默克尔随机数设置为 0 。如果您正在挖掘多个,这有点坏了。它使用以下算法将链 ID 转换为 Merkle 树基部的槽,该链的区块哈希必须位于该槽中:

这个想法是你可以增加 merkle_nonce 直到你正在挖掘的链不会在同一个插槽上发生冲突。问题是这行不通;因为它只是将一个从 merkle_nonce 派生的数字添加到 chain_id ,如果两个链因一个随机数发生冲突,它们仍然会为所有可能的随机数发生冲突。新实现者:请选择您的 chain_id ,以便不与现有链发生冲突需要尽可能小的 merkle_size 值,或者使用更好的算法来计算您链的插槽 id 。

一旦你知道不同链在默克尔树中的位置,反转 getauxblock 给你的每个链的块哈希的字节(因此开头的字节移动到结尾等)并插入适当的插槽,填充未使用的具有任意数据的。现在像往常一样构建默克尔树,方法是获取初始行中的每一对值,然后对它们进行双 SHA-256 散列以给出新的散列行,重复此操作直到只有一个散列。最后一个哈希是默克尔根。在将其插入 coinbase 之前,您需要再次反转它的字节。如果您不使用 getauxblock 来获取块哈希,则可以跳过第一次反转,但在将其添加到 coinbase 时仍需要反转最终的默克尔根。

辅助工作量证明还需要一个默克尔分支,其构建方式如下:在默克尔树中找到区块哈希的位置,并添加您在构建默克尔树时对其进行哈希处理的另一个值。现在添加您对该结果进行哈希处理的值。继续这样做,直到你到达根部。 Merkle 根本身从不包含在 Merkle 分支中。如果您只有一个辅助链,则可以将其完全留空。(看来您也不需要反转这些哈希值。)
Example

这是 Namecoin 链中高度为 19200 的 AuxPOW 块(第一个允许 AuxPOW 身份验证的块)。它的哈希值为 d8a7c3e01e1e95bcee015e6fcc7583a2ca60b79e5a3aa0a171eddd344ada903d ,并且只有一个 Namecoin 交易(coinbase 向矿工地址发送 50NMC)。用作工作量证明的父区块的哈希值低于当时 Namecoin 的难度目标,但不是比特币目标:

因此,这个 AuxPOW 区块在 Namecoin 区块链中是有效的,但在比特币区块链中无效(你会发现没有比特币区块的哈希以 3d47277359fb969c 开头。如果是,它会在 4a59b7deb5c4e01b 之后,因为这是使用的 previous_block 哈希)
多辅助链联合挖矿

矿工可以使用单个 Parent 在多个辅助区块链上执行合并挖掘。然后,必须将包含辅助块的块哈希作为叶子的 Merkle 树的 Merkle 树根插入到 Parent 的 coinbase 字段中,如下图所示。为了防止双花攻击,每个辅助区块链必须指定一个唯一的 ID ,该 ID 可用于推导出 Merkle 树的叶子,相应的块哈希必须位于该叶子上。

C223B9651F6DCC77
合并挖矿类型

合并挖矿按照其实现方式,主要分为两类。第一类,将辅助链的 block_hash 等数据嵌入到父链的 coinbase 中,如前面示例中的 Namecoin ,其他还有诸如 Dogecoin , Elastos 等;第二类,将 block_hash 作为一个打款地址,在 coinbasetransation 里出现:主币在创造 coinbasetransation 的时候将一笔价格为 0 的款项记打入 blockHashForMergedMining 给出的地址(hash),代表币种有 RSK 和 Vcash 等。

以 Bitcoin 区块高度 696331 为例,对应的 RSK 区块高度为 3610440。

    OP_RETURN(0x6a) + Length(0x29) + RSKBLOCK(0x52534b424c4f434b3a) + RSK Header Hash

示例中的 RSK 的 HashForMergedMining 为 0x6c54352250aee9549d5ef7381642cc612f58be59a2bc0f90509eb62a00371748 ,和 Bitcoin 对应 output一致。

FE32D60EE2A35157

24A835B2CD3B32E2
参考

    Merged Mining

    What is Merged Mining or Combined Mining?

    Merged mining specification

    Merged Mining Introduction
————————————————
版权声明:本文为CSDN博主「MyHerux」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/MyHerux/article/details/119776346

posted @ 2022-07-18 11:24  bonelee  阅读(543)  评论(0编辑  收藏  举报