namecoin和dogecoin如何实现的合并挖矿? 以Namecoin的merge mining为例: bitcoin作为父链(Parent blockchain), namecoin作为辅链(Auxiliary blockchain)。父链不需要知道辅链的存在;而辅链需要有协议来支持复用父链的POW结果(AuxPoW)。 目标:需要实现只计算 H = Hash256(bitcoin header)。 当H符合Bitcoin的难度要求时,那么就挖出BTC,而符合Namecoin的难度要求时,那么就挖出NMC。 原理:Bitcoin的block中,由于coinbase这一交易的脚本中可写入任意自定义数据,那么通过写入规定格式的数据,Namecoin的链可以解析并认可父链计算出的Hash值。 实现方法: 1. 父链端的工作量较小,只需在bitcoin block的coinbase的scriptSig中插入如下格式的数据(44字节): uint32_t magic; // 0xfa, 0xbe, 0x6d, 0x6d uint256 nmc_block_hash; // 当前namecoin的block hash int32_t merkle_size; // aux work merkle tree的大小,只有一个辅链时设置为1。 int32_t merkle_nonce; // 只有一个辅链时设置为0
(1)父链的coinbase的交易数据; 合并挖矿需要另一种币支持所谓的Auxiliary PoW, 这样的币的区块链里实际是有两种区块的,一种是正常的PoW,另一种是AuxPow, 当你收到一个AuxPow的区块时,校验方式也是不同的. 以Namecoin为例, AuxPow的区块包括: 2到5都是AuxPow区块特有的. 普通的PoW区块只需要计算1的Hash, 而这里我们首先看3是否满足当前的难度, 然后验证这个AuxPow确实是合并挖矿得到的. 接下来我们首先先检查2中插入coinbase的scriptSig中的字符串是否正确, 然后由2和4我们计算出合并挖矿时Bitcoin区块的Merkle root, 和5中对应的字段比较就可以知道2这个transaction确实在这个Bitcoin区块中. 合并挖矿在Bitcoin这边来看只是多了些coinbase略奇葩的区块, 可以找一些合并挖矿的矿池挖到的区块查看其中的coinbase transaction 本文节选自:http://www.zhihu.com/question/25401169 |