What you might not know about VeChainThor yet (Part IV)  Mining gas price

What you might not know about VeChainThor yet (Part IV)  Mining gas price
This is the fourth article of the "What you might not know about VeChainThor yet" series. You can find the link of the previous article at the end.
VeChainThor allows a transaction (TX) sender to mine extra gas price for his TX. In particular, the sender conducts some computation locally to search for the best TX nonce that maximizes some predefined proof of work (PoW) within a limited amount of time before he sends the TX off to the network.
When processing the TX, the system converts any valid PoW into extra gas price for calculating the reward for packing the TX into a new block for the block generator. In this way, the TX sender can increase the priority of the TX within the TX pool at the cost of some local computation.
How to Mine?
Let n and g represent the values of TX fields
Nonce
andGas
, respectively. We use b to denote the number of the block indexed by TX fieldBlockRef
and h the number of the block that includes the TX. Let Ω denote the TX without fieldsNonce
andSignature
, S the TX sender's account address, P the base gas price, H the hash function and E the RLP encoding function.The PoW, w, is defined as:
From the above equations, we know that
 Since b is a valid block number,
BlockRef
must refer to an existing block, that is, its value must equal the first four bytes of an existing block ID;  The TX must be packed into a block within the period of 30 blocks after block b, or otherwise, the PoW would not be recognized by the system;
 The extra gas price ΔP can not be greater than base gas price P.
Demo
I have made a demo that implements the relevant functions for mining gas price. It also provides a simple example of mining gas price for a sample TX.
In the demo code, function
POW.encode
does the RLP encoding, that is,Function
POW.evalWork
computes the PoW, w, for a given nonce while functionsPOW.workToGas
andPOW.minedGasPrice
compute the extra gas price, ΔP defined by the above second equation.Example
The provided example does the following things:

Connect to VeChain test net and obtain a Connex instance within a NodeJs environment.
const net = new SimpleNet("https://synctestnet.vechain.org"); const driver = await Driver.connect(net); const connex = new Framework(driver);

Get the genesis and latest block, and compute TX fields
ChainTag
, the last byte of the genesis block ID, andBlockRef
, the first four bytes of the ID of the latest block.body.chainTag = parseInt(connex.thor.genesis.id.slice(2), 16); body.blockRef = lastBlock.id.slice(0, 18);

Call function
mine
to search for the bestNonce
value that maximizes the PoW in the next 100second period.const duration = 100; const rlp = pow.encode(body, origin); body.nonce = safeToHexString(mine(rlp, duration));

Prepare and send the TX.

Get the TX receipt and show results.
Results
The following are the results I gained from running the code.
PoW = 15081760 nonce = 5438147356160918000 Number of rounds = 4900000 Duration (sec) = 101.459
The first part of the output was from function
mine
. It shows the largest PoW found and the correspondingNonce
value. The program then printed out the TXID:TXID = 0x46bf31e8df3dfd5a31ad38cf53a3cf93b285eb0ff517c2b19d9ad133416f19bf
It then computed the mined gas price ΔP based the equation for estimating reward r and printed out its value:
Mined gas price computed from TX receipt = 4.3129e+14
Finally, the program computed the mined gas price ΔP based on the equation for estimating ΔP and obtained the same result as shown below:
Mined gas price computed from TX data = 4.3129e+14
To verify my results, you can set
const txid = '0x46bf31e8df3dfd5a31ad38cf53a3cf93b285eb0ff517c2b19d9ad133416f19bf'; body.blockRef = '0x003626bd3a756fc1'; body.nonce = '0x4b782e35383381f0';
and run the part of the code that computes the results.
Previous Articles
What you might not know about VeChainThor yet (Part I)  Transaction Uniqueness
What you might not know about VeChainThor yet (Part II)  Forcible Transaction Dependency
What you might not know about VeChainThor yet (Part III)  Transaction Fee Delegation (VIP191)
 Since b is a valid block number,