From 84a55fdd94ea5dcfc46ad529a45c091b092ac3d1 Mon Sep 17 00:00:00 2001 From: AlexandreBelling Date: Mon, 23 Sep 2024 09:45:03 +0000 Subject: [PATCH 1/2] Prover: fix the txnrlp duplicated txnrlp bug --- prover/backend/execution/craft.go | 19 +++++++----- prover/backend/execution/prove.go | 2 ++ prover/zkevm/prover/ecdsa/adress.go | 30 ++++++++++--------- prover/zkevm/prover/ecdsa/antichamber_test.go | 2 +- prover/zkevm/prover/ecdsa/ecdsa.go | 4 ++- prover/zkevm/prover/ecdsa/unaligned_gnark.go | 7 +++-- prover/zkevm/witness.go | 29 +++++++++++++----- 7 files changed, 60 insertions(+), 33 deletions(-) diff --git a/prover/backend/execution/craft.go b/prover/backend/execution/craft.go index be0fb7722..8b06aab2c 100644 --- a/prover/backend/execution/craft.go +++ b/prover/backend/execution/craft.go @@ -143,12 +143,13 @@ func inspectStateManagerTraces( resp.ParentStateRootHash = firstParent.Hex() } -func (req *Request) collectSignatures() map[[32]byte]ethereum.Signature { +func (req *Request) collectSignatures() ([]ethereum.Signature, [][32]byte) { var ( - res = map[[32]byte]ethereum.Signature{} - blocks = req.Blocks() - currTx = 0 + signatures = []ethereum.Signature{} + txHashes = [][32]byte{} + blocks = req.Blocks() + currTx = 0 ) for i := range blocks { @@ -159,12 +160,14 @@ func (req *Request) collectSignatures() map[[32]byte]ethereum.Signature { txSignature = ethereum.GetJsonSignature(tx) ) - res[txHash] = txSignature + signatures = append(signatures, txSignature) + txHashes = append(txHashes, txHash) + currTx++ } } - return res + return signatures, txHashes } // FuncInput are all the relevant fields parsed by the prover that @@ -207,11 +210,13 @@ func (rsp *Response) FuncInput() *execution.FunctionalPublicInput { } func NewWitness(cfg *config.Config, req *Request, rsp *Response) *Witness { + txSignatures, txHashes := req.collectSignatures() return &Witness{ ZkEVM: &zkevm.Witness{ ExecTracesFPath: path.Join(cfg.Execution.ConflatedTracesDir, req.ConflatedExecutionTracesFile), SMTraces: req.StateManagerTraces(), - TxSignatures: req.collectSignatures(), + TxSignatures: txSignatures, + TxHashes: txHashes, L2BridgeAddress: cfg.Layer2.MsgSvcContract, ChainID: cfg.Layer2.ChainID, }, diff --git a/prover/backend/execution/prove.go b/prover/backend/execution/prove.go index f3848032e..2d09c91e3 100644 --- a/prover/backend/execution/prove.go +++ b/prover/backend/execution/prove.go @@ -176,7 +176,9 @@ func mustProveAndPass( fullZkEvm := zkevm.FullZkEVMCheckOnly(traces) // this will panic to alert errors, so there is no need to handle or // sanity-check anything. + logrus.Infof("Prover starting the prover") _ = fullZkEvm.ProveInner(w.ZkEVM) + logrus.Infof("Prover checks passed") return "", "" default: diff --git a/prover/zkevm/prover/ecdsa/adress.go b/prover/zkevm/prover/ecdsa/adress.go index 7328df215..8949bb25a 100644 --- a/prover/zkevm/prover/ecdsa/adress.go +++ b/prover/zkevm/prover/ecdsa/adress.go @@ -104,20 +104,22 @@ func newAddress(comp *wizard.CompiledIOP, size int, ecRec *EcRecover, ac *antich column.Shift(addr.isAddressHiEcRec, -1), addr.isAddressFromEcRec, ) - td.csTxnData(comp) - - // Waiting for the resolution of: - // - // // projection from txn-data to address columns - // projection.InsertProjection(comp, ifaces.QueryIDf("Project_AddressHi_TxnData"), - // []ifaces.Column{td.fromHi}, []ifaces.Column{addr.addressHi}, - // td.isFrom, addr.isAddressFromTxnData, - // ) - // - // projection.InsertProjection(comp, ifaces.QueryIDf("Project_AddressLO_TxnData"), - // []ifaces.Column{td.fromLo}, []ifaces.Column{addr.addressLo}, - // td.isFrom, addr.isAddressFromTxnData, - // ) + // projection from txn-data to address columns + projection.InsertProjection(comp, ifaces.QueryIDf("Project_AddressHi_TxnData"), + []ifaces.Column{td.fromHi}, []ifaces.Column{addr.addressHi}, + td.isFrom, addr.isAddressFromTxnData, + ) + + // projection from txn-data to address columns + projection.InsertProjection(comp, ifaces.QueryIDf("Project_AddressHi_TxnData"), + []ifaces.Column{td.fromHi}, []ifaces.Column{addr.addressHi}, + td.isFrom, addr.isAddressFromTxnData, + ) + + projection.InsertProjection(comp, ifaces.QueryIDf("Project_AddressLO_TxnData"), + []ifaces.Column{td.fromLo}, []ifaces.Column{addr.addressLo}, + td.isFrom, addr.isAddressFromTxnData, + ) // impose that hashNum = ac.ID + 1 comp.InsertGlobal(0, ifaces.QueryIDf("Hash_NUM_IS_ID"), diff --git a/prover/zkevm/prover/ecdsa/antichamber_test.go b/prover/zkevm/prover/ecdsa/antichamber_test.go index b572df6fc..e9faa3128 100644 --- a/prover/zkevm/prover/ecdsa/antichamber_test.go +++ b/prover/zkevm/prover/ecdsa/antichamber_test.go @@ -99,7 +99,7 @@ func TestAntichamber(t *testing.T) { } } -func dummyTxSignatureGetter(txHash []byte) (r, s, v *big.Int, err error) { +func dummyTxSignatureGetter(i int, txHash []byte) (r, s, v *big.Int, err error) { // some dummy values from the traces m := map[[32]byte]struct{ r, s, v string }{ {0x27, 0x9d, 0x94, 0x62, 0x15, 0x58, 0xf7, 0x55, 0x79, 0x68, 0x98, 0xfc, 0x4b, 0xd3, 0x6b, 0x6d, 0x40, 0x7c, 0xae, 0x77, 0x53, 0x78, 0x65, 0xaf, 0xe5, 0x23, 0xb7, 0x9c, 0x74, 0xcc, 0x68, 0xb}: { diff --git a/prover/zkevm/prover/ecdsa/ecdsa.go b/prover/zkevm/prover/ecdsa/ecdsa.go index fae9b5fe0..0a0958b4d 100644 --- a/prover/zkevm/prover/ecdsa/ecdsa.go +++ b/prover/zkevm/prover/ecdsa/ecdsa.go @@ -49,11 +49,13 @@ func getEcdataArithmetization(comp *wizard.CompiledIOP) *ecDataSource { } func getTxnDataArithmetization(comp *wizard.CompiledIOP) *txnData { - return &txnData{ + td := &txnData{ fromHi: comp.Columns.GetHandle("txndata.FROM_HI"), fromLo: comp.Columns.GetHandle("txndata.FROM_LO"), ct: comp.Columns.GetHandle("txndata.CT"), } + td.csTxnData(comp) + return td } func getRlpTxnArithmetization(comp *wizard.CompiledIOP) generic.GenDataModule { diff --git a/prover/zkevm/prover/ecdsa/unaligned_gnark.go b/prover/zkevm/prover/ecdsa/unaligned_gnark.go index 03e250ca8..0396eca4e 100644 --- a/prover/zkevm/prover/ecdsa/unaligned_gnark.go +++ b/prover/zkevm/prover/ecdsa/unaligned_gnark.go @@ -54,7 +54,10 @@ type unalignedGnarkDataSource struct { TxHashLo ifaces.Column } -type TxSignatureGetter func(txHash []byte) (r, s, v *big.Int, err error) +// TxSignatureGetter is a function that is expected a signature for a transaction +// hash and/or a integer id. In production, the function returns the signature +// from the transaction id but uses the txHash as a sanity-check. +type TxSignatureGetter func(i int, txHash []byte) (r, s, v *big.Int, err error) func newUnalignedGnarkData(comp *wizard.CompiledIOP, size int, src *unalignedGnarkDataSource) *UnalignedGnarkData { createCol := createColFn(comp, NAME_UNALIGNED_GNARKDATA, size) @@ -176,7 +179,7 @@ func (d *UnalignedGnarkData) assignUnalignedGnarkData(run *wizard.ProverRuntime, txHighBts := txHigh.Bytes() copy(prehashedMsg[:16], txHighBts[16:]) copy(prehashedMsg[16:], txLowBts[16:]) - r, s, v, err = txSigs(prehashedMsg[:]) + r, s, v, err = txSigs(txCount, prehashedMsg[:]) if err != nil { utils.Panic("error getting tx-signature err=%v, txNum=%v", err, txCount) } diff --git a/prover/zkevm/witness.go b/prover/zkevm/witness.go index 45ecb231e..4ae976201 100644 --- a/prover/zkevm/witness.go +++ b/prover/zkevm/witness.go @@ -6,6 +6,7 @@ import ( "github.com/consensys/linea-monorepo/prover/backend/ethereum" "github.com/consensys/linea-monorepo/prover/backend/execution/statemanager" + "github.com/consensys/linea-monorepo/prover/utils" "github.com/ethereum/go-ethereum/common" ) @@ -16,21 +17,33 @@ type Witness struct { // proof trace generation. ExecTracesFPath string // StateManager traces - SMTraces [][]statemanager.DecodedTrace - TxSignatures map[[32]byte]ethereum.Signature + SMTraces [][]statemanager.DecodedTrace + // TxSignatures lists the signatures of the transaction as found + // chronologically in the block. + TxSignatures []ethereum.Signature + // TxHashes lists the hash of the transactions in the order found in the + // block. + TxHashes [][32]byte L2BridgeAddress common.Address ChainID uint } -func (w Witness) TxSignatureGetter(txHash []byte) (r, s, v *big.Int, err error) { - var ( - sig, found = w.TxSignatures[[32]byte(txHash)] - ) +// TxSignatureGetter implements the ecdsa.TxSignatureGetter interface +func (w Witness) TxSignatureGetter(i int, txHash []byte) (r, s, v *big.Int, err error) { - if !found { - return nil, nil, nil, fmt.Errorf("could not find signature for tx hash = 0x%x", txHash) + if i > len(w.TxHashes) { + return nil, nil, nil, fmt.Errorf("requested txID outgoes the total number of transactions we found in the conflation") } + if utils.HexEncodeToString(txHash) != utils.HexEncodeToString(w.TxHashes[i][:]) { + return nil, nil, nil, fmt.Errorf( + "requested txID=%v while txnrlp expects it to have it for txhash=%v but the blocks transaction has hash=%v", + i, utils.HexEncodeToString(w.TxHashes[i][:]), utils.HexEncodeToString(txHash), + ) + } + + sig := w.TxSignatures[i] + r, _ = new(big.Int).SetString(sig.R, 0) s, _ = new(big.Int).SetString(sig.S, 0) v, _ = new(big.Int).SetString(sig.V, 0) From 37145a5303e998b01e7e1c39e9b93b420c1d40aa Mon Sep 17 00:00:00 2001 From: AlexandreBelling Date: Mon, 23 Sep 2024 23:46:35 +0800 Subject: [PATCH 2/2] fix(ecdsa): fix failing test for ecdsa --- prover/zkevm/prover/ecdsa/adress.go | 8 ++------ prover/zkevm/prover/ecdsa/ecdsa.go | 1 - 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/prover/zkevm/prover/ecdsa/adress.go b/prover/zkevm/prover/ecdsa/adress.go index 8949bb25a..b75c93787 100644 --- a/prover/zkevm/prover/ecdsa/adress.go +++ b/prover/zkevm/prover/ecdsa/adress.go @@ -75,6 +75,8 @@ func newAddress(comp *wizard.CompiledIOP, size int, ecRec *EcRecover, ac *antich hashNum: createCol("HASH_NUM"), } + td.csTxnData(comp) + // addresses are fetched from two arithmetization modules (ecRecover and txn-data) // IsAddress = IsAdressFromEcRec + IsAdressFromTxnData comp.InsertGlobal(0, ifaces.QueryIDf("Format_IsAddress"), @@ -110,12 +112,6 @@ func newAddress(comp *wizard.CompiledIOP, size int, ecRec *EcRecover, ac *antich td.isFrom, addr.isAddressFromTxnData, ) - // projection from txn-data to address columns - projection.InsertProjection(comp, ifaces.QueryIDf("Project_AddressHi_TxnData"), - []ifaces.Column{td.fromHi}, []ifaces.Column{addr.addressHi}, - td.isFrom, addr.isAddressFromTxnData, - ) - projection.InsertProjection(comp, ifaces.QueryIDf("Project_AddressLO_TxnData"), []ifaces.Column{td.fromLo}, []ifaces.Column{addr.addressLo}, td.isFrom, addr.isAddressFromTxnData, diff --git a/prover/zkevm/prover/ecdsa/ecdsa.go b/prover/zkevm/prover/ecdsa/ecdsa.go index 0a0958b4d..c808cf9c0 100644 --- a/prover/zkevm/prover/ecdsa/ecdsa.go +++ b/prover/zkevm/prover/ecdsa/ecdsa.go @@ -54,7 +54,6 @@ func getTxnDataArithmetization(comp *wizard.CompiledIOP) *txnData { fromLo: comp.Columns.GetHandle("txndata.FROM_LO"), ct: comp.Columns.GetHandle("txndata.CT"), } - td.csTxnData(comp) return td }