这是「关于唯链雷神区块链,你可能还不知道那些事儿」系列的第四篇,文末附有前三篇链接。在本篇唯链首席科学家 Peter Zhou 阐述并演示了唯链雷神区块链如何使交易发起方用挖矿的方式为其交易获取额外的 Gas 单价,交易发起方可以通过消耗一些本地算力来提高其交易在交易池中的优先级。

原文标题:《关于唯链雷神区块链,你可能还不知道那些事儿(第四篇)- 挖矿获取额外交易 Gas 单价》
作者:Peter Zhou,唯链首席科学家,英国南安普顿大学计算机博士,于 2017 年加入唯链,主要负责唯链雷神区块链的科研研发及知识产权保护等工作

使用本地算力提高交易优先级?技术详解唯链挖矿获额外交易 Gas PricePeter Zhou,唯链首席科学家,英国南安普顿大学计算机博士,先后以研究员和资深研究员的身份任职于英国肯特大学和芬兰奥卢大学,参与了欧盟和芬兰科学院重要科研项目,拥有十年计算机科研研发以及在国际一流学术杂志和会议上发表科研成果之经验,于 2017 年加入唯链,主要负责唯链雷神区块链的科研研发及知识产权保护等工作

唯链雷神区块链允许一个交易发起方用挖矿的方式为其交易获取额外的 Gas 单价(GasPrice)。具体来说,交易发起方可以利用其本地算力资源计算,在有限的时间内寻找最优的 TX nonce 值,从而最大化预先定义的计算证明(PoW)。

在处理交易的时候,系统将会把任何有效的计算量证明转换成额外的 Gas 单价,来计算出块节点将交易打包进新区块的奖励。通过这种方式,交易发起方可以通过消耗一些本地算力来提高其交易在交易池中的优先级。

如何挖矿?

我们用 ng 分别代表交易模型中的 NonceGas 的值,用 b 来表示 BlockRef 对应的区块编号,用 h 代表包括了该交易的区块的编号(高度)。另外,我们用 Ω 表示没有 NonceSignature 的交易,S 表示交易发起方的账户地址,P 表示基准 Gas 单价,H 代表哈希函数,E 代表 RLP 编码函数。

我们定义计算量证明 w 为:

使用本地算力提高交易优先级?技术详解唯链挖矿获额外交易 Gas Price

额外获得的 gas 单价 Δ*P* ,可以通过如下表达式来计算:

使用本地算力提高交易优先级?技术详解唯链挖矿获额外交易 Gas Price

其中变量 *h* 需要满足:

使用本地算力提高交易优先级?技术详解唯链挖矿获额外交易 Gas Price

将交易打包进新区块的 VTHO 奖励 *r*,可以通过如下表达式来计算:使用本地算力提高交易优先级?技术详解唯链挖矿获额外交易 Gas Price

其中 *φ*∈ [0, 1] 为 gas 单价系数(GasPriceCoef),*g** 为实际执行交易时需要使用的 Gas 数量。

从以上表达式中,我们可以得知:

  1. 由于 b 是一个有效的区块编号,BlockRef 必须指向一个已经存在的区块。也就是说,它的值必须等于一个现有区块 ID 的前四个字节;
  2. 该交易必须在区块 b 之后的 30 个区块内被打包进一个区块,不然计算量证明将不会被系统承认;
  3. 额外的 gas 单价 Δ P ,不会大于基准 gas 单价 P

演示

我们还是通过一个 演示 来更好理解一下上述的挖矿机制。在演示代码中,函数 POW.encode 负责 RLP 编码,也就是,

使用本地算力提高交易优先级?技术详解唯链挖矿获额外交易 Gas Price

函数 `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

附:「关于唯链雷神区块链,你可能还不知道那些事儿」系列

第一篇《区块链如何对抗重放攻击?硬核详解唯链 TXID 方案
第二篇《区块链如何保证交易安全?硬核详解唯链「强制交易依赖性」功能
第三篇《区块链普及尝试:技术详解唯链指定交易费代付协议 VIP-191

来源链接:bbs.vechainworld.io