From 97340d071c5ce7f5ac32709c6cc40321fc770e0d Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Thu, 29 Apr 2021 12:08:12 -0700 Subject: [PATCH 1/4] dtl: index the value field (#686) * chore: add changeset * chore: add changeset * dtl: pass through value field * core-utils: update and test toRpcString * lint: fix * l2geth: parse value fields * chore: add changeset --- .changeset/beige-keys-hammer.md | 5 ++++ .changeset/brown-bananas-deny.md | 5 ++++ .changeset/tough-lamps-hammer.md | 5 ++++ l2geth/rollup/client.go | 8 +++++-- packages/core-utils/src/common/hex-strings.ts | 15 ++++++++---- .../core-utils/test/common/hex-utils.spec.ts | 24 ++++++++++++++++++- .../handlers/sequencer-batch-appended.ts | 3 +++ .../l2-ingestion/handlers/transaction.ts | 2 ++ .../src/types/database-types.ts | 2 ++ 9 files changed, 62 insertions(+), 7 deletions(-) create mode 100644 .changeset/beige-keys-hammer.md create mode 100644 .changeset/brown-bananas-deny.md create mode 100644 .changeset/tough-lamps-hammer.md diff --git a/.changeset/beige-keys-hammer.md b/.changeset/beige-keys-hammer.md new file mode 100644 index 0000000000000..c7f737b878627 --- /dev/null +++ b/.changeset/beige-keys-hammer.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/data-transport-layer": patch +--- + +Parse and index the value field in the data transport layer diff --git a/.changeset/brown-bananas-deny.md b/.changeset/brown-bananas-deny.md new file mode 100644 index 0000000000000..0f8c2ca18e103 --- /dev/null +++ b/.changeset/brown-bananas-deny.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/l2geth": patch +--- + +Add value parsing to the rollup client diff --git a/.changeset/tough-lamps-hammer.md b/.changeset/tough-lamps-hammer.md new file mode 100644 index 0000000000000..204262b71f8ff --- /dev/null +++ b/.changeset/tough-lamps-hammer.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/core-utils": patch +--- + +Update toRpcHexString to accept ethers.BigNumber and add tests diff --git a/l2geth/rollup/client.go b/l2geth/rollup/client.go index 0e55550e46b03..795c8d39453cb 100644 --- a/l2geth/rollup/client.go +++ b/l2geth/rollup/client.go @@ -70,6 +70,7 @@ type transaction struct { BatchIndex uint64 `json:"batchIndex"` BlockNumber uint64 `json:"blockNumber"` Timestamp uint64 `json:"timestamp"` + Value hexutil.Uint64 `json:"value"` GasLimit uint64 `json:"gasLimit"` Target common.Address `json:"target"` Origin *common.Address `json:"origin"` @@ -104,6 +105,7 @@ type signature struct { // it means that the decoding failed. type decoded struct { Signature signature `json:"sig"` + Value hexutil.Uint64 `json:"value"` GasLimit uint64 `json:"gasLimit"` GasPrice uint64 `json:"gasPrice"` Nonce uint64 `json:"nonce"` @@ -228,6 +230,7 @@ func enqueueToTransaction(enqueue *Enqueue) (*types.Transaction, error) { } data := *enqueue.Data + // enqueue transactions have no value value := big.NewInt(0) tx := types.NewTransaction(nonce, target, value, gasLimit, big.NewInt(0), data) @@ -303,7 +306,7 @@ func batchedTransactionToTransaction(res *transaction, signer *types.OVMSigner) if res.Decoded != nil { nonce := res.Decoded.Nonce to := res.Decoded.Target - value := new(big.Int) + value := new(big.Int).SetUint64(uint64(res.Decoded.Value)) // Note: there are two gas limits, one top level and // another on the raw transaction itself. Maybe maxGasLimit // for the top level? @@ -357,7 +360,8 @@ func batchedTransactionToTransaction(res *transaction, signer *types.OVMSigner) gasLimit := res.GasLimit data := res.Data origin := res.Origin - tx := types.NewTransaction(nonce, target, big.NewInt(0), gasLimit, big.NewInt(0), data) + value := new(big.Int).SetUint64(uint64(res.Value)) + tx := types.NewTransaction(nonce, target, value, gasLimit, big.NewInt(0), data) txMeta := types.NewTransactionMeta( new(big.Int).SetUint64(res.BlockNumber), res.Timestamp, diff --git a/packages/core-utils/src/common/hex-strings.ts b/packages/core-utils/src/common/hex-strings.ts index d87c3673fc9eb..71b412c76b569 100644 --- a/packages/core-utils/src/common/hex-strings.ts +++ b/packages/core-utils/src/common/hex-strings.ts @@ -60,11 +60,18 @@ export const toHexString = (inp: Buffer | string | number | null): string => { } } -export const toRpcHexString = (n: number): string => { - if (n === 0) { - return '0x0' +export const toRpcHexString = (n: number | BigNumber): string => { + let num + if (typeof n === 'number') { + num = '0x' + n.toString(16) } else { - return '0x' + toHexString(n).slice(2).replace(/^0+/, '') + num = n.toHexString() + } + + if (num === '0x0') { + return num + } else { + return num.replace(/^0x0/, '0x') } } diff --git a/packages/core-utils/test/common/hex-utils.spec.ts b/packages/core-utils/test/common/hex-utils.spec.ts index 7bb26b70dec90..c91ceca9f2074 100644 --- a/packages/core-utils/test/common/hex-utils.spec.ts +++ b/packages/core-utils/test/common/hex-utils.spec.ts @@ -1,7 +1,8 @@ import { expect } from '../setup' +import { BigNumber } from 'ethers' /* Imports: Internal */ -import { getRandomHexString } from '../../src' +import { getRandomHexString, toRpcHexString } from '../../src' describe('getRandomHexString', () => { const random = global.Math.random @@ -18,3 +19,24 @@ describe('getRandomHexString', () => { expect(getRandomHexString(8)).to.equal('0x' + '88'.repeat(8)) }) }) + +describe('toRpcHexString', () => { + it('should parse 0', () => { + expect(toRpcHexString(0)).to.deep.equal('0x0') + expect(toRpcHexString(BigNumber.from(0))).to.deep.equal('0x0') + }) + + it('should parse non 0', () => { + const cases = [ + { input: 2, output: '0x2' }, + { input: BigNumber.from(2), output: '0x2' }, + { input: 100, output: '0x64' }, + { input: BigNumber.from(100), output: '0x64' }, + { input: 300, output: '0x12c' }, + { input: BigNumber.from(300), output: '0x12c' }, + ] + for (const test of cases) { + expect(toRpcHexString(test.input)).to.deep.equal(test.output) + } + }) +}) diff --git a/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts b/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts index 5ecf06fdc0cf9..52c3d43b66982 100644 --- a/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts +++ b/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts @@ -5,6 +5,7 @@ import { ctcCoder, fromHexString, toHexString, + toRpcHexString, TxType, EventArgsSequencerBatchAppended, } from '@eth-optimism/core-utils' @@ -120,6 +121,7 @@ export const handleEventsSequencerBatchAppended: EventHandlerSet< data: toHexString(sequencerTransaction), queueOrigin: 'sequencer', type, + value: decoded.value, queueIndex: null, decoded, confirmed: true, @@ -152,6 +154,7 @@ export const handleEventsSequencerBatchAppended: EventHandlerSet< data: '0x', queueOrigin: 'l1', type: 'EIP155', + value: '0x0', queueIndex: queueIndex.toNumber(), decoded: null, confirmed: true, diff --git a/packages/data-transport-layer/src/services/l2-ingestion/handlers/transaction.ts b/packages/data-transport-layer/src/services/l2-ingestion/handlers/transaction.ts index b4199ba537016..1769004224b5b 100644 --- a/packages/data-transport-layer/src/services/l2-ingestion/handlers/transaction.ts +++ b/packages/data-transport-layer/src/services/l2-ingestion/handlers/transaction.ts @@ -32,6 +32,7 @@ export const handleSequencerBlock = { let transactionEntry: Partial = { // Legacy support. index: transactionIndex, + value: transaction.value, batchIndex: null, blockNumber: BigNumber.from(transaction.l1BlockNumber).toNumber(), timestamp: BigNumber.from(transaction.l1Timestamp).toNumber(), @@ -47,6 +48,7 @@ export const handleSequencerBlock = { r: padHexString(transaction.r, 32), s: padHexString(transaction.s, 32), }, + value: transaction.value, gasLimit: BigNumber.from(transaction.gas).toNumber(), gasPrice: BigNumber.from(transaction.gasPrice).toNumber(), // ? nonce: BigNumber.from(transaction.nonce).toNumber(), diff --git a/packages/data-transport-layer/src/types/database-types.ts b/packages/data-transport-layer/src/types/database-types.ts index 42074ee459fcd..f477f5a37f23f 100644 --- a/packages/data-transport-layer/src/types/database-types.ts +++ b/packages/data-transport-layer/src/types/database-types.ts @@ -4,6 +4,7 @@ export interface DecodedSequencerBatchTransaction { s: string v: number } + value: string gasLimit: number gasPrice: number nonce: number @@ -31,6 +32,7 @@ export interface TransactionEntry { gasLimit: number target: string origin: string + value: string queueOrigin: 'sequencer' | 'l1' queueIndex: number | null type: 'EIP155' | 'ETH_SIGN' | null From 885f34da81ac6057caa6240ae88ba8168f6055f9 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Tue, 4 May 2021 18:37:54 -0700 Subject: [PATCH 2/4] dtl: prevent null reference in L1 handler (#757) * dtl: prevent reference of null value * chore: add changeset --- .changeset/violet-comics-reflect.md | 5 +++++ .../l1-ingestion/handlers/sequencer-batch-appended.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/violet-comics-reflect.md diff --git a/.changeset/violet-comics-reflect.md b/.changeset/violet-comics-reflect.md new file mode 100644 index 0000000000000..8f52dda5c2b98 --- /dev/null +++ b/.changeset/violet-comics-reflect.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/data-transport-layer': patch +--- + +Prevent access of null value in L1 transaction deserialization diff --git a/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts b/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts index 52c3d43b66982..8ff8d75c81e6d 100644 --- a/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts +++ b/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts @@ -121,7 +121,7 @@ export const handleEventsSequencerBatchAppended: EventHandlerSet< data: toHexString(sequencerTransaction), queueOrigin: 'sequencer', type, - value: decoded.value, + value: decoded ? decoded.value : '0x0', queueIndex: null, decoded, confirmed: true, From ab5baf66817754d8c72ccd97dbd786d7c46a1cdd Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Wed, 5 May 2021 11:14:57 -0700 Subject: [PATCH 3/4] dtl: propagate value --- .../services/l1-ingestion/handlers/sequencer-batch-appended.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts b/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts index 8ff8d75c81e6d..010e9e7801797 100644 --- a/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts +++ b/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts @@ -108,6 +108,7 @@ export const handleEventsSequencerBatchAppended: EventHandlerSet< sequencerTransaction ) + transactionEntries.push({ index: extraData.prevTotalElements .add(BigNumber.from(transactionIndex)) @@ -257,6 +258,8 @@ const maybeDecodeSequencerBatchTransaction = ( } else { throw new Error(`Unknown sequencer transaction type.`) } + // Temporary fix to propagate the value + decoded.value = '0x0' // Validate the transaction if (!validateBatchTransaction(type, decoded)) { decoded = null From 456e235326b90f46b27ef7e8aaef67fe13f01177 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Wed, 5 May 2021 11:22:19 -0700 Subject: [PATCH 4/4] lint: fix --- .../services/l1-ingestion/handlers/sequencer-batch-appended.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts b/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts index 010e9e7801797..c162994a7d597 100644 --- a/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts +++ b/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts @@ -108,7 +108,6 @@ export const handleEventsSequencerBatchAppended: EventHandlerSet< sequencerTransaction ) - transactionEntries.push({ index: extraData.prevTotalElements .add(BigNumber.from(transactionIndex))