BiFi如何获得挖块奖励?

BiFi是BTC的分叉币,与2017年12月25日在高度501225分叉,并非向后兼容,按照1:1000的比例进行Airdrop。
BiFi主链每天约每5分钟生成一个block,每个block大小32M,每天约288个block,目前每个block奖励10000个BiFi,采用SHA-3和CryptoNight的混合模式
BiFi支持POC挖矿,用硬盘进行工作证明,硬盘容量越大,算力越大,目前livenet算力约16000+KH,可以用普通家用电脑等x86架构的机器进行POC挖矿(不支持ASIC,ARM未作兼容性测试)。

BiFi基于UTXO模型,
并提供两种挖矿方式:
一种是基于磁盘空间的严谨的POC(Proof of Capacity)方式,所有BitcoinFile的块奖励均由此种形式挖出;
另一种则是在整合了BiFi的IPFS网络中,所有资源共享者(矿工)可以通过共享自身的磁盘空间及网络带宽进行挖矿,所获得的BiFi币的数量取决于其共享的磁盘空间及带宽流量的多少,并且只有真正被使用者使用的磁盘空间和带宽流量才会用于计算工作量,以此提高整个网络的性能和效率


我们先讨论币的产生过程,即磁盘空间的严谨的POC方式获得第一笔挖矿奖励,表现为:

UTXO模型中,一个输入引用了之前交易的一个输出:txid 存储的是之前交易的 ID,vout 存储的是该输出在那笔交易中所有输出的索引(因为一笔交易可能有多个输出,需要有信息指明是具体的哪一个)。Sig 是一个脚本,提供了可解锁输出结构里面 PubKey 字段的数据。如果 Sig 提供的数据是正确的,那么输出就会被解锁,然后被解锁的值就可以被用于产生新的输出;如果数据不正确,输出就无法被引用在输入中,或者说,无法使用这个输出。这种机制,保证了用户无法花费属于其他人的币。再次强调,由于我们还没有实现地址,所以目前 Sig 将仅仅存储一个用户自定义的任意钱包地址。我们会在下一篇文章中实现公钥(public key)和签名(signature)。输出,就是 “币” 存储的地方。每个输出都会带有一个解锁脚本,这个脚本定义了解锁该输出的逻辑。每笔新的交易,必须至少有一个输入和输出。一个输入引用了之前一笔交易的输出,并提供了解锁数据(也就是 Sig 字段),该数据会被用在输出的解锁脚本中解锁输出,解锁完成后即可使用它的值去产生新的输出。每一笔输入都是之前一笔交易的输出,那么假设从某一笔交易开始不断往前追溯,它所涉及的输入和输出到底是谁先存在呢?换个说法,这是个鸡和蛋谁先谁后的问题,是先有蛋还是先有鸡呢?答案是:先有蛋。

 

coinbase 交易只有一个输出,没有输入。在我们的实现中,它表现为 txid 为空,vout 等于 -1。并且,在当前实现中,coinbase 交易也没有在 Sig 中存储脚本,而只是存储了一个任意的字符串 data。subsidy 是挖出新块的奖励金。

将交易保存到区块链

从现在开始,每个块必须存储至少一笔交易。如果没有交易,也就不可能出新的块。这意味着我们应该移除 Block 的 Data 字段,取而代之的是存储交易:

NewBlock 和 NewGenesisBlock 也必须做出相应改变:

接下来修改创建区块链的函数:

现在,这个函数会接受一个地址作为参数,这个地址将会被用来接收挖出创世块的奖励。

POC工作量证明

工作量证明算法必须要将存储在区块里面的交易考虑进去,从而保证区块链交易存储的一致性和可靠性。所以,我们必须修改 ProofOfWork.prepareData 方法:

不像之前使用 pow.block.Data,现在我们使用 pow.block.HashTransactions() :

通过哈希提供数据的唯一表示,这种做法我们已经不是第一次遇到了。我们想要通过仅仅一个哈希,就可以识别一个块里面的所有交易。为此,先获得每笔交易的哈希,然后将它们关联起来,最后获得一个连接后的组合哈希。

它将一个块里面包含的所有交易表示为一个 Merkle tree ,然后在工作量证明系统中使用树的根哈希(root hash)。这个方法能够让我们快速检索一个块里面是否包含了某笔交易,即只需 root hash 而无需下载所有交易即可完成判断。

以上就可以获得第一个块奖励了,然后准备好电脑(x86),在github(https://github.com/bitcoinfile/bitcoinfile)上下载其开源的挖矿程序,并更新完全节点数据(大约4-5g),设置好挖矿配置文件(收款地址,磁盘大小等)开始生成种子文件,然后就可以坐等收POC挖块奖励了。

下一次我们将探讨另一种基于磁盘带宽的挖块奖励。