Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ import { BlockBatches, BlockBatchListener } from '../../types'
const log: Logger = getLogger('block-batch-submitter')

export class BlockBatchSubmitter implements BlockBatchListener {
// params: [timestampHex, batchesArrayJSON, signedBatchesArrayJSON]
public static readonly sendBlockBatchesMethod: string =
'optimism_sendBlockBatches'
// params: [blockBatchesJSONString, signedBlockBatchesJSONString]
// -- note all numbers are replaces with hex strings when serialized
public static readonly sendBlockBatchesMethod: string = 'eth_sendBlockBatches'

private readonly l2Provider: JsonRpcProvider

Expand All @@ -35,24 +35,17 @@ export class BlockBatchSubmitter implements BlockBatchListener {
return
}

const timestamp: string = numberToHexString(blockBatches.timestamp)
const txs = JSON.stringify(
blockBatches.batches.map((y) =>
y.map((x) => {
return {
nonce: x.nonce >= 0 ? numberToHexString(x.nonce) : undefined,
sender: x.sender,
target: x.target,
calldata: x.calldata,
}
})
)
)
const signedTxsArray: string = await this.l2Wallet.signMessage(txs)
const payload = JSON.stringify(blockBatches, (k, v) => {
if (typeof v === 'number') {
return v >= 0 ? numberToHexString(v) : undefined
}
return v
})

const signedPayload: string = await this.l2Wallet.signMessage(payload)
await this.l2Provider.send(BlockBatchSubmitter.sendBlockBatchesMethod, [
timestamp,
txs,
signedTxsArray,
payload,
signedPayload,
])
}
}
1 change: 1 addition & 0 deletions packages/rollup-core/src/types/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ export interface L2ToL1Message {

export interface RollupTransaction {
nonce: number
gasLimit: number
sender: Address
target: Address
calldata: string
Expand Down
33 changes: 20 additions & 13 deletions packages/rollup-core/test/app/block-batch-processor.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import '../setup'
import { newInMemoryDB } from '@eth-optimism/core-db'
import {
add0x,
BigNumber,
keccak256,
sleep,
TestUtils,
Expand Down Expand Up @@ -86,6 +87,7 @@ const getTransactionResponse = (
timestamp: number,
data: string,
hash: string,
_gasLimit: number,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just noting there's a _, maybe that's a convention you want though.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's a gasLimit file-scoped const that this would shadow and our linter doesn't like that, so I just made it _gasLimit

blockNumber: number = 1,
blockHash: string = getHashFromString('block hash')
): TransactionResponse => {
Expand All @@ -95,10 +97,10 @@ const getTransactionResponse = (
hash,
blockNumber,
blockHash,
gasLimit: new BigNumber(_gasLimit, 10) as any,
confirmations: 1,
from: ZERO_ADDRESS,
nonce: 1,
gasLimit: undefined,
gasPrice: undefined,
value: undefined,
chainId: CHAIN_ID,
Expand Down Expand Up @@ -127,6 +129,7 @@ const getBlock = (timestamp: number, number: number = 1) => {
const throwOnParsing: L1Batch = [
{
nonce: -1,
gasLimit: -1,
sender: ZERO_ADDRESS,
target: ZERO_ADDRESS,
calldata: '0xdeadbeef',
Expand Down Expand Up @@ -160,22 +163,26 @@ const singleTxLogContext: BatchLogParserContext = {
}

const nonce: number = 0
const gasLimit: number = 10_000
const sender: string = Wallet.createRandom().address
const target: string = Wallet.createRandom().address
const calldata: string = keccak256(Buffer.from('calldata').toString('hex'))
const rollupTx: RollupTransaction = {
nonce,
gasLimit,
sender,
target,
calldata,
}

const nonce2: number = 1
const gasLimit2: number = 20_000
const sender2: string = Wallet.createRandom().address
const target2: string = Wallet.createRandom().address
const calldata2: string = keccak256(Buffer.from('calldata 2').toString('hex'))
const rollupTx2: RollupTransaction = {
nonce: nonce2,
gasLimit: gasLimit2,
sender: sender2,
target: target2,
calldata: calldata2,
Expand Down Expand Up @@ -238,7 +245,7 @@ describe('Block Batch Processor', () => {

mockedLogsProvider.transactionsByHash.set(
txHash,
getTransactionResponse(timestamp, calldata, txHash)
getTransactionResponse(timestamp, calldata, txHash, gasLimit)
)

mockedLogsProvider.logsToReturn.push([
Expand Down Expand Up @@ -283,15 +290,15 @@ describe('Block Batch Processor', () => {

mockedLogsProvider.transactionsByHash.set(
txHash,
getTransactionResponse(timestamp, calldata, txHash)
getTransactionResponse(timestamp, calldata, txHash, gasLimit)
)

const txHash2 = getHashFromString('derp derp derp2')
calldataParseMap.set(calldata2, [rollupTx2])

mockedLogsProvider.transactionsByHash.set(
txHash2,
getTransactionResponse(timestamp, calldata2, txHash2)
getTransactionResponse(timestamp, calldata2, txHash2, gasLimit2)
)

mockedLogsProvider.logsToReturn.push([
Expand Down Expand Up @@ -347,15 +354,15 @@ describe('Block Batch Processor', () => {

mockedLogsProvider.transactionsByHash.set(
txHash,
getTransactionResponse(timestamp, calldata, txHash)
getTransactionResponse(timestamp, calldata, txHash, gasLimit)
)

const txHash2 = getHashFromString('derp derp derp2')
calldataParseMap.set(calldata2, [rollupTx2])

mockedLogsProvider.transactionsByHash.set(
txHash2,
getTransactionResponse(timestamp, calldata2, txHash2)
getTransactionResponse(timestamp, calldata2, txHash2, gasLimit2)
)

mockedLogsProvider.logsToReturn.push([
Expand Down Expand Up @@ -411,7 +418,7 @@ describe('Block Batch Processor', () => {

mockedLogsProvider.transactionsByHash.set(
txHash,
getTransactionResponse(timestamp, calldata, txHash)
getTransactionResponse(timestamp, calldata, txHash, gasLimit)
)

mockedLogsProvider.logsToReturn.push([
Expand All @@ -429,7 +436,7 @@ describe('Block Batch Processor', () => {

mockedLogsProvider.transactionsByHash.set(
txHash2,
getTransactionResponse(timestamp2, calldata2, txHash2)
getTransactionResponse(timestamp2, calldata2, txHash2, gasLimit2)
)

mockedLogsProvider.logsToReturn.push([
Expand Down Expand Up @@ -499,7 +506,7 @@ describe('Block Batch Processor', () => {

mockedLogsProvider.transactionsByHash.set(
txHash2,
getTransactionResponse(timestamp2, calldata2, txHash2)
getTransactionResponse(timestamp2, calldata2, txHash2, gasLimit2)
)

mockedLogsProvider.logsToReturn.push([
Expand All @@ -517,7 +524,7 @@ describe('Block Batch Processor', () => {

mockedLogsProvider.transactionsByHash.set(
txHash,
getTransactionResponse(timestamp, calldata, txHash)
getTransactionResponse(timestamp, calldata, txHash, gasLimit)
)

mockedLogsProvider.logsToReturn.push([
Expand Down Expand Up @@ -587,7 +594,7 @@ describe('Block Batch Processor', () => {

mockedLogsProvider.transactionsByHash.set(
txHash,
getTransactionResponse(timestamp, calldata, txHash)
getTransactionResponse(timestamp, calldata, txHash, gasLimit)
)

mockedLogsProvider.logsToReturn.push([
Expand All @@ -612,7 +619,7 @@ describe('Block Batch Processor', () => {

mockedLogsProvider.transactionsByHash.set(
txHash,
getTransactionResponse(timestamp, calldata, txHash)
getTransactionResponse(timestamp, calldata, txHash, gasLimit)
)

mockedLogsProvider.logsToReturn.push([
Expand All @@ -637,7 +644,7 @@ describe('Block Batch Processor', () => {

mockedLogsProvider.transactionsByHash.set(
txHash,
getTransactionResponse(timestamp, calldata, txHash)
getTransactionResponse(timestamp, calldata, txHash, gasLimit)
)

mockedLogsProvider.logsToReturn.push([
Expand Down
68 changes: 43 additions & 25 deletions packages/rollup-core/test/app/block-batch-submitter.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { Wallet } from 'ethers'
import { JsonRpcProvider } from 'ethers/providers'

/* Internal Imports */
import { RollupTransaction } from '../../src/types'
import { BlockBatches, RollupTransaction } from '../../src/types'
import { BlockBatchSubmitter } from '../../src/app'
import { verifyMessage } from 'ethers/utils'

Expand Down Expand Up @@ -37,21 +37,25 @@ const blockNumber: number = 0
const blockNumber2: number = 1

const nonce: number = 0
const gasLimit: number = 10_000
const sender: string = Wallet.createRandom().address
const target: string = Wallet.createRandom().address
const calldata: string = keccak256(Buffer.from('calldata').toString('hex'))
const rollupTx: RollupTransaction = {
gasLimit,
nonce,
sender,
target,
calldata,
}

const nonce2: number = 1
const gasLimit2: number = 20_000
const sender2: string = Wallet.createRandom().address
const target2: string = Wallet.createRandom().address
const calldata2: string = keccak256(Buffer.from('calldata 2').toString('hex'))
const rollupTx2: RollupTransaction = {
gasLimit: gasLimit2,
nonce: nonce2,
sender: sender2,
target: target2,
Expand All @@ -65,6 +69,20 @@ const rollupTxsEqual = (
return JSON.stringify(one) === JSON.stringify(two)
}

const deserializeBlockBatches = (serialized: string): BlockBatches => {
return JSON.parse(serialized, (k, v) => {
switch (k) {
case 'blockNumber':
case 'timestamp':
case 'gasLimit':
case 'nonce':
return hexStrToNumber(v)
default:
return v
}
})
}

describe('L2 Transaction Batch Submitter', () => {
let blockBatchSubmitter: BlockBatchSubmitter
let mockedSendProvider: MockedProvider
Expand Down Expand Up @@ -125,20 +143,20 @@ describe('L2 Transaction Batch Submitter', () => {
'Incorrect params type!'
)
const paramsArray = mockedSendProvider.sent[0].params as string[]
paramsArray.length.should.equal(3, 'Incorrect params length')
const [timestampStr, batchesStr, signature] = paramsArray

hexStrToNumber(timestampStr).should.equal(timestamp, 'Incorrect timestamp!')
const parsedBatches = JSON.parse(batchesStr) as any[]
parsedBatches.length.should.equal(1, 'Incorrect num batches!')
parsedBatches[0].length.should.equal(1, 'Incorrect num txs!')
parsedBatches[0][0].nonce = hexStrToNumber(parsedBatches[0][0].nonce)
rollupTxsEqual(parsedBatches[0][0], rollupTx).should.equal(
paramsArray.length.should.equal(2, 'Incorrect params length')
const [payloadStr, signature] = paramsArray

const blockBatches: BlockBatches = deserializeBlockBatches(payloadStr)

blockBatches.timestamp.should.equal(timestamp, 'Incorrect timestamp!')
blockBatches.batches.length.should.equal(1, 'Incorrect num batches!')
blockBatches.batches[0].length.should.equal(1, 'Incorrect num txs!')
rollupTxsEqual(blockBatches.batches[0][0], rollupTx).should.equal(
true,
'Incorrect transaction received!'
)

verifyMessage(batchesStr, signature).should.equal(
verifyMessage(payloadStr, signature).should.equal(
wallet.address,
'IncorrectSignature!'
)
Expand All @@ -161,28 +179,28 @@ describe('L2 Transaction Batch Submitter', () => {
'Incorrect params type!'
)
const paramsArray = mockedSendProvider.sent[0].params as string[]
paramsArray.length.should.equal(3, 'Incorrect params length')
const [timestampStr, txsStr, signature] = paramsArray

hexStrToNumber(timestampStr).should.equal(timestamp, 'Incorrect timestamp!')
const parsedBatches = JSON.parse(txsStr) as any[]
parsedBatches.length.should.equal(1, 'Incorrect num batches!')
parsedBatches[0].length.should.equal(2, 'Incorrect num transactions!')
parsedBatches[0] = parsedBatches[0].map((x) => {
x.nonce = hexStrToNumber(x.nonce)
return x
})
rollupTxsEqual(parsedBatches[0][0], rollupTx).should.equal(
paramsArray.length.should.equal(2, 'Incorrect params length')
const [payloadStr, signature] = paramsArray

const blockBatches: BlockBatches = deserializeBlockBatches(payloadStr)

blockBatches.timestamp.should.equal(timestamp, 'Incorrect timestamp!')
blockBatches.batches.length.should.equal(1, 'Incorrect num batches!')
blockBatches.batches[0].length.should.equal(
2,
'Incorrect num transactions!'
)
rollupTxsEqual(blockBatches.batches[0][0], rollupTx).should.equal(
true,
'Incorrect transaction received!'
)

rollupTxsEqual(parsedBatches[0][1], rollupTx2).should.equal(
rollupTxsEqual(blockBatches.batches[0][1], rollupTx2).should.equal(
true,
'Incorrect transaction 2 received!'
)

verifyMessage(txsStr, signature).should.equal(
verifyMessage(payloadStr, signature).should.equal(
wallet.address,
'IncorrectSignature!'
)
Expand Down
2 changes: 2 additions & 0 deletions packages/rollup-full-node/test/app/web-rpc-handler.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -633,6 +633,7 @@ describe('Web3Handler', () => {
)
await web3Handler.handleL1ToL2Transaction({
nonce: 0,
gasLimit: 0,
calldata: callData,
sender: wallet.address,
target: simpleStorage.address,
Expand All @@ -653,6 +654,7 @@ describe('Web3Handler', () => {
)
await web3Handler.handleL1ToL2Transaction({
nonce: 0,
gasLimit: 0,
calldata: callData,
sender: wallet.address,
target: simpleStorage.address,
Expand Down