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 e663ce3
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 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 @@ -211,7 +221,13 @@ class Ethereum extends BlockchainInterface {
let nonce = context.nonces[context.fromAddress];
context.nonces[context.fromAddress] = nonce + 1;
params.nonce = nonce;
// leaving these values unset causes web3 to fetch gasPrice and
// chainId on the fly. This can cause transactions to be
// reordered, which in turn causes nonce failures
params.gasPrice = context.gasPrice;
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 e663ce3

Please sign in to comment.