# 关于唯链雷神区块链,你可能还不知道的那些事儿(第四篇)- 挖矿获取额外交易Gas单价
-
关于唯链雷神区块链,你可能还不知道的那些事儿(第四篇)- 挖矿获取额外交易Gas单价
这是“关于唯链雷神区块链,你可能还不知道那些事儿”系列的第四篇,你可以在文章最后找到前三篇的链接。
唯链雷神区块链允许一个交易发起方用挖矿的方式为其交易获取额外的Gas单价(GasPrice)。具体来说,
交易发起方可以利用其本地算力资源计算,在有限的时间内寻找最优的TX nonce值,从而最大化预先定义的计算证明(POW)。在处理交易的时候,系统将会把任何有效的计算量证明转换成额外的Gas单价,来计算出块节点将交易打包进新区块的奖励。通过这种方式,交易发起方可以通过消耗一些本地算力来提高其交易在交易池中的优先级。
如何挖矿?
我们用 n 和 g 分别代表交易模型中的
Nonce
和Gas
的值,用 b 来表示BlockRef
对应的区块编号,用 h 代表包括了该交易的区块的编号(高度)。另外,我们用 Ω 表示没有Nonce
和Signature
的交易,S 表示交易发起方的账户地址,P 表示基准Gas单价,H 代表哈希函数,E 代表RLP编码函数。我们定义计算量证明 w 为:
额外获得的gas单价 Δ*P*,可以通过如下表达式来计算:
其中变量 *h* 需要满足:
将交易打包进新区块的VTHO奖励 *r*,可以通过如下表达式来计算:
其中 *φ* ∈ [0, 1] 为gas单价系数(`GasPriceCoef`), *g** 为实际执行交易时需要使用的Gas数量。从以上表达式中,我们可以得知:
- 由于 b 是一个有效的区块编号,
BlockRef
必须指向一个已经存在的区块。也就是说,它的值必须等于一个现有区块ID的前四个字节; - 该交易必须在区块 b 之后的30个区块内被打包进一个区块,不然计算量证明将不会被系统承认;
- 额外的gas单价 ΔP,不会大于基准gas单价 P。
演示
我们还是通过一个演示来更好理解一下上述的挖矿机制。在演示代码中,函数
POW.encode
负责RLP编码,也就是,
函数`POW.evalWork`用来计算计算量证明,而函数`POW.workToGas`和`POW.minedGasPrice`实现了上述用来计算了额外的Gas单价 Δ*P* 的等式。示例
演示中的示例做了以下这些事情:
1.在一个NodeJs环境中链接到唯链测试网并获取了一个Connex事例。
const net = new SimpleNet("https://sync-testnet.vechain.org"); const driver = await Driver.connect(net); const connex = new Framework(driver);
2.提取出创世区块和最新的区块ID,计算
ChainTag
(创世区块ID的最后一位),以及BlockRef
(最新区块ID的前四个字节)。body.chainTag = parseInt(connex.thor.genesis.id.slice(-2), 16); body.blockRef = lastBlock.id.slice(0, 18);
3.调用函数
mine
在接下来的100秒内搜索最佳的Nonce
值,最大化计算量证明。const duration = 100; const rlp = pow.encode(body, origin); body.nonce = safeToHexString(mine(rlp, duration));
4.准备和发起交易。
5.获取交易收据并打印结果。
结果
以下是我运行代码后得到的结果。
PoW = 15081760 nonce = 5438147356160918000 Number of rounds = 4900000 Duration (sec) = 101.459
打印出的结果的第一部分是由函数
mine
产生的。它展现了找到的最大的计算量证明值以及对应的Nonce
值。之后我们看到的是交易的TXID:TXID = 0x46bf31e8df3dfd5a31ad38cf53a3cf93b285eb0ff517c2b19d9ad133416f19bf
随后,我们看到的根据交易收据计算出来的通过挖矿获得的额外的Gas单价 ΔP:
Mined gas price computed from TX receipt = 4.3129e+14
最后,是通过计算公式得到的 ΔP 值:
Mined gas price computed from TX data = 4.3129e+14
文章链接
关于唯链雷神区块链,你可能还不知道的那些事儿(第一篇)- 交易唯一性
- 由于 b 是一个有效的区块编号,