Skip to content

Commit

Permalink
ethereum: prevent unnecessary additional requests
Browse files Browse the repository at this point in the history
Web3 has recently added features that lazily fetches missing information
when signing and sending transactions. In our case, this was the
chainId, and the current gasPrice. Because transactions are submitted
asynchronously, these additional requests would sometimes cause
transactions to be submitted out of order. Even if this probelm were
mitigated, these additional requests added spurious latency spikes to
some transactions, negatively impacting the test results.

This partially addresses #776 by eliminating request reordering issues
for stable websocket connections. This change does not however address
transaction reordering for HTTP connections, or for websocket
connections that require reconnects. It also does not solve the
"christmas tree light" issue w.r.t. nonce errors.

Signed-off-by: Ben Burns <[email protected]>
  • Loading branch information
benjamincburns committed Mar 31, 2020
1 parent bffcd48 commit b5ab767
Showing 1 changed file with 25 additions and 0 deletions.
25 changes: 25 additions & 0 deletions packages/caliper-ethereum/lib/ethereum.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,22 @@ class Ethereum extends BlockchainInterface {
*/
async getContext(name, args) {
let context = {
chainId: 1,
clientIndex: this.clientIndex,
gasPrice: 0,
contracts: {},
nonces: {},
web3: this.web3
};

context.gasPrice = this.ethereumConfig.gasPrice !== undefined ?
this.ethereumConfig.gasPrice :
await this.web3.eth.getGasPrice();

context.chainId = this.ethereumConfig.chainId !== undefined ?
this.ethereumConfig.chainId :
await this.web3.eth.getChainId();

for (const key of Object.keys(args.contracts)) {
context.contracts[key] = {
contract: new this.web3.eth.Contract(args.contracts[key].abi, args.contracts[key].address),
Expand Down Expand Up @@ -212,6 +222,21 @@ class Ethereum extends BlockchainInterface {
context.nonces[context.fromAddress] = nonce + 1;
params.nonce = nonce;
}

if (context.gasPrice !== undefined) {
// leaving this value unset causes web3 to fetch gasPrice on the
// fly this can cause transactions to be reordered, which in
// turn causes nonce failures
params.gasPrice = context.gasPrice;
}

if (context.chainId !== undefined) {
// leaving this value unset causes web3 to fetch chainId on the
// fly this can cause transactions to be reordered, which in
// turn causes nonce failures
params.chainId = context.chainId;
}

if (methodCall.args) {
if (contractInfo.gas && contractInfo.gas[methodCall.verb]) {
params.gas = contractInfo.gas[methodCall.verb];
Expand Down

0 comments on commit b5ab767

Please sign in to comment.