Parametrize ChainID
jump to
@@ -31,11 +31,12 @@ }
// API serves HTTP requests to allow external interaction with the Hermez node type API struct { - h *historydb.HistoryDB - cg *configAPI - s *statedb.StateDB - l2 *l2db.L2DB - status Status + h *historydb.HistoryDB + cg *configAPI + s *statedb.StateDB + l2 *l2db.L2DB + status Status + chainID uint16 } // NewAPI sets the endpoints and the appropriate handlers, but doesn't start the server@@ -46,6 +47,7 @@ hdb *historydb.HistoryDB,
sdb *statedb.StateDB, l2db *l2db.L2DB, config *Config, + chainID uint16, ) (*API, error) { // Check input // TODO: is stateDB only needed for explorer endpoints or for both?@@ -63,9 +65,10 @@ RollupConstants: *newRollupConstants(config.RollupConstants),
AuctionConstants: config.AuctionConstants, WDelayerConstants: config.WDelayerConstants, }, - s: sdb, - l2: l2db, - status: Status{}, + s: sdb, + l2: l2db, + status: Status{}, + chainID: chainID, } // Add coordinator endpoints
@@ -211,7 +211,8 @@ if err := os.RemoveAll(dir); err != nil {
panic(err) } }() - sdb, err := statedb.NewStateDB(dir, statedb.TypeTxSelector, 0) + chainID := uint16(0) + sdb, err := statedb.NewStateDB(dir, statedb.TypeTxSelector, 0, chainID) if err != nil { panic(err) }@@ -237,6 +238,7 @@ hdb,
sdb, l2DB, &_config, + chainID, ) if err != nil { panic(err)@@ -253,7 +255,7 @@ // Reset DB
test.WipeDB(api.h.DB()) // Genratre blockchain data with til - tcc := til.NewContext(common.RollupConstMaxL1UserTx) + tcc := til.NewContext(chainID, common.RollupConstMaxL1UserTx) tilCfgExtra := til.ConfigExtra{ BootCoordAddr: ethCommon.HexToAddress("0xE39fEc6224708f0772D2A74fd3f9055A90E0A9f2"), CoordUser: "Coord",
@@ -180,7 +180,7 @@ if err != nil {
return tracerr.Wrap(err) } // Check signature - if !poolTx.VerifySignature(account.PublicKey) { + if !poolTx.VerifySignature(a.chainID, account.PublicKey) { return tracerr.Wrap(errors.New("wrong signature")) } return nil
@@ -15,7 +15,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.Nil(t, err) defer assert.Nil(t, os.RemoveAll(dir)) - synchDB, err := statedb.NewStateDB(dir, statedb.TypeBatchBuilder, 0) + chainID := uint16(0) + synchDB, err := statedb.NewStateDB(dir, statedb.TypeBatchBuilder, 0, chainID) assert.Nil(t, err) bbDir, err := ioutil.TempDir("", "tmpBatchBuilderDB")
@@ -1,6 +1,7 @@
package common import ( + "encoding/binary" "errors" "fmt" "math/big"@@ -128,7 +129,7 @@ // [ 48 bits ] fromIdx // 6 bytes
// [ 16 bits ] chainId // 2 bytes // [ 32 bits ] signatureConstant // 4 bytes // Total bits compressed data: 241 bits // 31 bytes in *big.Int representation -func (tx *PoolL2Tx) TxCompressedData() (*big.Int, error) { +func (tx *PoolL2Tx) TxCompressedData(chainID uint16) (*big.Int, error) { amountFloat16, err := NewFloat16(tx.Amount) if err != nil { return nil, tracerr.Wrap(err)@@ -160,7 +161,7 @@ if err != nil {
return nil, tracerr.Wrap(err) } copy(b[19:25], fromIdxBytes[:]) - copy(b[25:27], []byte{0, 0}) // TODO this will be generated by the ChainID config parameter + binary.BigEndian.PutUint16(b[25:27], chainID) copy(b[27:31], SignatureConstantBytes[:]) bi := new(big.Int).SetBytes(b[:])@@ -271,8 +272,8 @@ return bi, nil
} // HashToSign returns the computed Poseidon hash from the *PoolL2Tx that will be signed by the sender. -func (tx *PoolL2Tx) HashToSign() (*big.Int, error) { - toCompressedData, err := tx.TxCompressedData() +func (tx *PoolL2Tx) HashToSign(chainID uint16) (*big.Int, error) { + toCompressedData, err := tx.TxCompressedData(chainID) if err != nil { return nil, tracerr.Wrap(err) }@@ -292,8 +293,8 @@ return poseidon.Hash([]*big.Int{toCompressedData, toEthAddr, toBJJY, rqTxCompressedDataV2, rqToEthAddr, rqToBJJY})
} // VerifySignature returns true if the signature verification is correct for the given PublicKeyComp -func (tx *PoolL2Tx) VerifySignature(pkComp babyjub.PublicKeyComp) bool { - h, err := tx.HashToSign() +func (tx *PoolL2Tx) VerifySignature(chainID uint16, pkComp babyjub.PublicKeyComp) bool { + h, err := tx.HashToSign(chainID) if err != nil { return false }
@@ -25,6 +25,7 @@ assert.Equal(t, "0x020000000156660000000090", poolL2Tx.TxID.String())
} func TestTxCompressedData(t *testing.T) { + chainID := uint16(0) var sk babyjub.PrivateKey _, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001")) assert.NoError(t, err)@@ -36,12 +37,24 @@ TokenID: 5,
Nonce: 6, ToBJJ: sk.Public().Compress(), } - txCompressedData, err := tx.TxCompressedData() + txCompressedData, err := tx.TxCompressedData(chainID) assert.NoError(t, err) // test vector value generated from javascript implementation expectedStr := "1766847064778421992193717128424891165872736891548909569553540445094274575" assert.Equal(t, expectedStr, txCompressedData.String()) assert.Equal(t, "010000000000060000000500040000000000030000000000020000c60be60f", hex.EncodeToString(txCompressedData.Bytes())) + // using a different chainID + txCompressedData, err = tx.TxCompressedData(uint16(100)) + assert.NoError(t, err) + expectedStr = "1766847064778421992193717128424891165872736891548909569553540874591004175" + assert.Equal(t, expectedStr, txCompressedData.String()) + assert.Equal(t, "010000000000060000000500040000000000030000000000020064c60be60f", hex.EncodeToString(txCompressedData.Bytes())) + txCompressedData, err = tx.TxCompressedData(uint16(65535)) + assert.NoError(t, err) + expectedStr = "1766847064778421992193717128424891165872736891548909569553821915776017935" + assert.Equal(t, expectedStr, txCompressedData.String()) + assert.Equal(t, "01000000000006000000050004000000000003000000000002ffffc60be60f", hex.EncodeToString(txCompressedData.Bytes())) + tx = PoolL2Tx{ RqFromIdx: 7, RqToIdx: 8,@@ -51,12 +64,12 @@ RqNonce: 11,
RqFee: 12, RqToBJJ: sk.Public().Compress(), } - txCompressedData, err = tx.RqTxCompressedDataV2() + rqTxCompressedData, err := tx.RqTxCompressedDataV2() assert.NoError(t, err) // test vector value generated from javascript implementation expectedStr = "6571340879233176732837827812956721483162819083004853354503" - assert.Equal(t, expectedStr, txCompressedData.String()) - assert.Equal(t, "010c000000000b0000000a0009000000000008000000000007", hex.EncodeToString(txCompressedData.Bytes())) + assert.Equal(t, expectedStr, rqTxCompressedData.String()) + assert.Equal(t, "010c000000000b0000000a0009000000000008000000000007", hex.EncodeToString(rqTxCompressedData.Bytes())) } func TestTxCompressedDataV2(t *testing.T) {@@ -109,6 +122,7 @@ assert.Equal(t, "010c000000000b0000000a0009000000000008000000000007", hex.EncodeToString(txCompressedData.Bytes()))
} func TestHashToSign(t *testing.T) { + chainID := uint16(0) var sk babyjub.PrivateKey _, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001")) assert.NoError(t, err)@@ -120,12 +134,13 @@ TokenID: 5,
Nonce: 6, ToEthAddr: ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370"), } - toSign, err := tx.HashToSign() + toSign, err := tx.HashToSign(chainID) assert.NoError(t, err) assert.Equal(t, "1469900657138253851938022936440971384682713995864967090251961124784132925291", toSign.String()) } func TestVerifyTxSignature(t *testing.T) { + chainID := uint16(0) var sk babyjub.PrivateKey _, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001")) assert.NoError(t, err)@@ -139,13 +154,13 @@ ToBJJ: sk.Public().Compress(),
RqToEthAddr: ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370"), RqToBJJ: sk.Public().Compress(), } - toSign, err := tx.HashToSign() + toSign, err := tx.HashToSign(chainID) assert.NoError(t, err) assert.Equal(t, "18645218094210271622244722988708640202588315450486586312909439859037906375295", toSign.String()) sig := sk.SignPoseidon(toSign) tx.Signature = sig.Compress() - assert.True(t, tx.VerifySignature(sk.Public().Compress())) + assert.True(t, tx.VerifySignature(chainID, sk.Public().Compress())) } func TestDecompressEmptyBJJComp(t *testing.T) {
@@ -282,7 +282,7 @@ return json.Marshal(m)
} // NewZKInputs returns a pointer to an initialized struct of ZKInputs -func NewZKInputs(nTx, maxL1Tx, maxTx, maxFeeIdxs, nLevels uint32, currentNumBatch *big.Int) *ZKInputs { +func NewZKInputs(chainID uint16, nTx, maxL1Tx, maxTx, maxFeeIdxs, nLevels uint32, currentNumBatch *big.Int) *ZKInputs { zki := &ZKInputs{} zki.Metadata.NTx = nTx zki.Metadata.MaxFeeIdxs = maxFeeIdxs@@ -290,12 +290,13 @@ zki.Metadata.MaxLevels = uint32(48) //nolint:gomnd
zki.Metadata.NLevels = nLevels zki.Metadata.MaxL1Tx = maxL1Tx zki.Metadata.MaxTx = maxTx + zki.Metadata.ChainID = chainID // General zki.CurrentNumBatch = currentNumBatch zki.OldLastIdx = big.NewInt(0) zki.OldStateRoot = big.NewInt(0) - zki.GlobalChainID = big.NewInt(0) // TODO pass by parameter + zki.GlobalChainID = big.NewInt(int64(chainID)) zki.FeeIdxs = newSlice(maxFeeIdxs) zki.FeePlanTokens = newSlice(maxFeeIdxs)
@@ -9,7 +9,8 @@ "github.com/stretchr/testify/require"
) func TestZKInputs(t *testing.T) { - zki := NewZKInputs(100, 16, 512, 24, 32, big.NewInt(1)) + chainID := uint16(0) + zki := NewZKInputs(chainID, 100, 16, 512, 24, 32, big.NewInt(1)) _, err := json.Marshal(zki) require.NoError(t, err) // fmt.Println(string(s))
@@ -48,7 +48,9 @@ ProofServerPollInterval Duration `validate:"required"`
// SyncRetryInterval is the waiting interval between calls to the main // handler of a synced block after an error SyncRetryInterval Duration `validate:"required"` - L2DB struct { + // ChainID is the ChainID from the Ethereum chain + ChainID uint16 `validate:"required"` + L2DB struct { SafetyPeriod common.BatchNum `validate:"required"` MaxTxs uint32 `validate:"required"` TTL Duration `validate:"required"`
@@ -91,13 +91,14 @@ var maxL1CoordinatorTxs uint64 = maxL1Txs - maxL1UserTxs
var maxTxs uint64 = 376 var nLevels uint32 = 32 //nolint:deadcode,unused var maxFeeTxs uint32 = 64 //nolint:deadcode,varcheck +var chainID uint16 = 0 func newTestModules(t *testing.T) modules { var err error syncDBPath, err = ioutil.TempDir("", "tmpSyncDB") require.NoError(t, err) deleteme = append(deleteme, syncDBPath) - syncStateDB, err := statedb.NewStateDB(syncDBPath, statedb.TypeSynchronizer, 48) + syncStateDB, err := statedb.NewStateDB(syncDBPath, statedb.TypeSynchronizer, 48, chainID) assert.NoError(t, err) pass := os.Getenv("POSTGRES_PASS")@@ -526,7 +527,7 @@ set = append(set, til.Instruction{Typ: til.TypeNewBatchL1})
set = append(set, til.Instruction{Typ: til.TypeNewBatchL1}) set = append(set, til.Instruction{Typ: til.TypeNewBlock}) - tc := til.NewContext(common.RollupConstMaxL1UserTx) + tc := til.NewContext(chainID, common.RollupConstMaxL1UserTx) blocks, err := tc.GenerateBlocksFromInstructions(set) require.NoError(t, err) require.NotNil(t, blocks)
@@ -28,7 +28,7 @@ func newStateDB(t *testing.T) *statedb.LocalStateDB {
syncDBPath, err := ioutil.TempDir("", "tmpSyncDB") require.NoError(t, err) deleteme = append(deleteme, syncDBPath) - syncStateDB, err := statedb.NewStateDB(syncDBPath, statedb.TypeSynchronizer, 48) + syncStateDB, err := statedb.NewStateDB(syncDBPath, statedb.TypeSynchronizer, 48, chainID) assert.NoError(t, err) stateDBPath, err := ioutil.TempDir("", "tmpStateDB") require.NoError(t, err)@@ -194,7 +194,7 @@ > batchL1
> batchL1 > block ` - tc := til.NewContext(common.RollupConstMaxL1UserTx) + tc := til.NewContext(chainID, common.RollupConstMaxL1UserTx) blocks, err := tc.GenerateBlocks(set0) require.NoError(t, err) tilCfgExtra := til.ConfigExtra{
@@ -66,7 +66,7 @@ > block // blockNum=4
> block // blockNum=5 > block // blockNum=6 ` - tc := til.NewContext(1) + tc := til.NewContext(uint16(0), 1) blocks, err := tc.GenerateBlocks(set1) require.NoError(t, err) // Save timestamp of a block with UTC and change it without UTC@@ -138,7 +138,7 @@ Transfer(2) B-A: 100 (199)
> batch // batchNum=4, L2 only batch, forges transfer (without USD value) > block ` - tc := til.NewContext(common.RollupConstMaxL1UserTx) + tc := til.NewContext(uint16(0), common.RollupConstMaxL1UserTx) tilCfgExtra := til.ConfigExtra{ BootCoordAddr: ethCommon.HexToAddress("0xE39fEc6224708f0772D2A74fd3f9055A90E0A9f2"), CoordUser: "A",@@ -359,7 +359,7 @@ > batchL1
> block ` - tc := til.NewContext(common.RollupConstMaxL1UserTx) + tc := til.NewContext(uint16(0), common.RollupConstMaxL1UserTx) tilCfgExtra := til.ConfigExtra{ BootCoordAddr: ethCommon.HexToAddress("0xE39fEc6224708f0772D2A74fd3f9055A90E0A9f2"), CoordUser: "A",@@ -615,7 +615,7 @@ CreateAccountDeposit(1) D: 5
> block ` - tc := til.NewContext(128) + tc := til.NewContext(uint16(0), 128) blocks, err := tc.GenerateBlocks(set) require.NoError(t, err) // Sanity check@@ -712,7 +712,7 @@ > batchL1 // forge defined L1UserTxs{*}
> block // blockNum=3 ` - tc := til.NewContext(common.RollupConstMaxL1UserTx) + tc := til.NewContext(uint16(0), common.RollupConstMaxL1UserTx) tilCfgExtra := til.ConfigExtra{ BootCoordAddr: ethCommon.HexToAddress("0xE39fEc6224708f0772D2A74fd3f9055A90E0A9f2"), CoordUser: "A",@@ -799,7 +799,7 @@ > block // blockNum=4 (empty block)
> block // blockNum=5 (empty block) ` - tc := til.NewContext(common.RollupConstMaxL1UserTx) + tc := til.NewContext(uint16(0), common.RollupConstMaxL1UserTx) tilCfgExtra := til.ConfigExtra{ BootCoordAddr: ethCommon.HexToAddress("0xE39fEc6224708f0772D2A74fd3f9055A90E0A9f2"), CoordUser: "A",@@ -887,7 +887,7 @@ rollup, auction, wDelayer := exampleInitSCVars()
err := historyDB.SetInitialSCVars(rollup, auction, wDelayer) require.NoError(t, err) - tc := til.NewContext(common.RollupConstMaxL1UserTx) + tc := til.NewContext(uint16(0), common.RollupConstMaxL1UserTx) blocks, err := tc.GenerateBlocks(` Type: Blockchain > block // blockNum=2
@@ -64,7 +64,7 @@ > block
> block ` - tc = til.NewContext(common.RollupConstMaxL1UserTx) + tc = til.NewContext(uint16(0), common.RollupConstMaxL1UserTx) tilCfgExtra := til.ConfigExtra{ BootCoordAddr: ethCommon.HexToAddress("0xE39fEc6224708f0772D2A74fd3f9055A90E0A9f2"), CoordUser: "A",
@@ -76,6 +76,7 @@ currentBatch common.BatchNum
db *pebble.PebbleStorage mt *merkletree.MerkleTree typ TypeStateDB + chainID uint16 // idx holds the current Idx that the BatchBuilder is using idx common.Idx zki *common.ZKInputs@@ -88,7 +89,7 @@ }
// NewStateDB creates a new StateDB, allowing to use an in-memory or in-disk // storage -func NewStateDB(path string, typ TypeStateDB, nLevels int) (*StateDB, error) { +func NewStateDB(path string, typ TypeStateDB, nLevels int, chainID uint16) (*StateDB, error) { var sto *pebble.PebbleStorage var err error sto, err = pebble.NewPebbleStorage(path+PathCurrent, false)@@ -108,10 +109,11 @@ return nil, tracerr.Wrap(fmt.Errorf("invalid StateDB parameters: StateDB type==TypeStateDB can not have nLevels!=0"))
} sdb := &StateDB{ - path: path, - db: sto, - mt: mt, - typ: typ, + path: path, + db: sto, + mt: mt, + typ: typ, + chainID: chainID, } // load currentBatch@@ -521,7 +523,7 @@
// NewLocalStateDB returns a new LocalStateDB connected to the given // synchronizerDB func NewLocalStateDB(path string, synchronizerDB *StateDB, typ TypeStateDB, nLevels int) (*LocalStateDB, error) { - s, err := NewStateDB(path, typ, nLevels) + s, err := NewStateDB(path, typ, nLevels, synchronizerDB.chainID) if err != nil { return nil, tracerr.Wrap(err) }
@@ -45,7 +45,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, TypeTxSelector, 0) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeTxSelector, 0, chainID) assert.NoError(t, err) // test values@@ -67,7 +68,7 @@ assert.Equal(t, v0, v)
// call NewStateDB which should get the db at the last checkpoint state // executing a Reset (discarding the last 'testkey0'&'testvalue0' data) - sdb, err = NewStateDB(dir, TypeTxSelector, 0) + sdb, err = NewStateDB(dir, TypeTxSelector, 0, chainID) assert.NoError(t, err) v, err = sdb.db.Get(k0) assert.NotNil(t, err)@@ -109,7 +110,7 @@ assert.Equal(t, v1, v)
// call NewStateDB which should get the db at the last checkpoint state // executing a Reset (discarding the last 'testkey1'&'testvalue1' data) - sdb, err = NewStateDB(dir, TypeTxSelector, 0) + sdb, err = NewStateDB(dir, TypeTxSelector, 0, chainID) assert.NoError(t, err) v, err = sdb.db.Get(k0)@@ -127,7 +128,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, TypeTxSelector, 0) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeTxSelector, 0, chainID) assert.NoError(t, err) // create test accounts@@ -181,7 +183,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, TypeSynchronizer, 32) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeSynchronizer, 32, chainID) assert.NoError(t, err) // create test accounts@@ -233,7 +236,8 @@ dir, err := ioutil.TempDir("", "sdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, TypeSynchronizer, 32) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeSynchronizer, 32, chainID) assert.NoError(t, err) // create test accounts@@ -350,7 +354,8 @@ func TestStateDBGetAccounts(t *testing.T) {
dir, err := ioutil.TempDir("", "tmpdb") require.NoError(t, err) - sdb, err := NewStateDB(dir, TypeTxSelector, 0) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeTxSelector, 0, chainID) assert.NoError(t, err) // create test accounts@@ -397,7 +402,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, TypeSynchronizer, 32) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeSynchronizer, 32, chainID) require.NoError(t, err) ay0 := new(big.Int).Sub(new(big.Int).Exp(big.NewInt(2), big.NewInt(253), nil), big.NewInt(1))
@@ -93,7 +93,7 @@
exits := make([]processedExit, nTx) if s.typ == TypeBatchBuilder { - s.zki = common.NewZKInputs(ptc.MaxTx, ptc.MaxL1Tx, ptc.MaxTx, ptc.MaxFeeTx, ptc.NLevels, s.currentBatch.BigInt()) + s.zki = common.NewZKInputs(s.chainID, ptc.MaxTx, ptc.MaxL1Tx, ptc.MaxTx, ptc.MaxFeeTx, ptc.NLevels, s.currentBatch.BigInt()) s.zki.OldLastIdx = s.idx.BigInt() s.zki.OldStateRoot = s.mt.Root().BigInt() s.zki.Metadata.NewLastIdxRaw = s.idx@@ -544,7 +544,7 @@
// ZKInputs if s.zki != nil { // Txs - s.zki.TxCompressedData[s.i], err = tx.TxCompressedData() + s.zki.TxCompressedData[s.i], err = tx.TxCompressedData(s.chainID) if err != nil { return nil, nil, false, tracerr.Wrap(err) }
@@ -28,7 +28,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, TypeSynchronizer, 32) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeSynchronizer, 32, chainID) assert.NoError(t, err) set := `@@ -42,7 +43,7 @@ > batchL1
> batchL1 > block ` - tc := til.NewContext(common.RollupConstMaxL1UserTx) + tc := til.NewContext(chainID, common.RollupConstMaxL1UserTx) blocks, err := tc.GenerateBlocks(set) require.NoError(t, err)@@ -201,11 +202,12 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, TypeSynchronizer, 32) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeSynchronizer, 32, chainID) assert.NoError(t, err) // generate test transactions from test.SetBlockchain0 code - tc := til.NewContext(common.RollupConstMaxL1UserTx) + tc := til.NewContext(chainID, common.RollupConstMaxL1UserTx) blocks, err := tc.GenerateBlocks(til.SetBlockchainMinimumFlow0) require.NoError(t, err)@@ -333,11 +335,12 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, TypeSynchronizer, 32) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeSynchronizer, 32, chainID) assert.NoError(t, err) // generate test transactions from test.SetBlockchain0 code - tc := til.NewContext(common.RollupConstMaxL1UserTx) + tc := til.NewContext(0, common.RollupConstMaxL1UserTx) blocks, err := tc.GenerateBlocks(til.SetBlockchain0) require.NoError(t, err)@@ -461,11 +464,12 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, TypeBatchBuilder, 32) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeBatchBuilder, 32, chainID) assert.NoError(t, err) // generate test transactions from test.SetBlockchain0 code - tc := til.NewContext(common.RollupConstMaxL1UserTx) + tc := til.NewContext(0, common.RollupConstMaxL1UserTx) blocks, err := tc.GenerateBlocks(til.SetBlockchain0) require.NoError(t, err)@@ -549,7 +553,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, TypeBatchBuilder, 32) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeBatchBuilder, 32, chainID) assert.NoError(t, err) // same values than in the js test@@ -597,8 +602,8 @@ require.NoError(t, err)
defer assert.NoError(t, os.RemoveAll(dir)) nLevels := 16 - - sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels, chainID) assert.NoError(t, err) users := generateJsUsers(t)
@@ -20,7 +20,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, TypeTxSelector, 0) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeTxSelector, 0, chainID) assert.NoError(t, err) var sk babyjub.PrivateKey
@@ -65,8 +65,8 @@
return users } -func signL2Tx(t *testing.T, user til.User, l2Tx common.PoolL2Tx) common.PoolL2Tx { - toSign, err := l2Tx.HashToSign() +func signL2Tx(t *testing.T, chainID uint16, user til.User, l2Tx common.PoolL2Tx) common.PoolL2Tx { + toSign, err := l2Tx.HashToSign(chainID) require.NoError(t, err) sig := user.BJJ.SignPoseidon(toSign) l2Tx.Signature = sig.Compress()@@ -78,7 +78,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.Nil(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, TypeBatchBuilder, 32) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeBatchBuilder, 32, chainID) assert.Nil(t, err) // same values than in the js test@@ -152,7 +153,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.Nil(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, TypeBatchBuilder, 32) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeBatchBuilder, 32, chainID) assert.Nil(t, err) // same values than in the js test@@ -251,7 +253,8 @@ defer assert.Nil(t, os.RemoveAll(dir))
nLevels := 16 - sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels, chainID) assert.Nil(t, err) ptc := ProcessTxsConfig{@@ -330,7 +333,7 @@ Type: common.TxTypeTransfer,
}, } - toSign, err := l2Txs[0].HashToSign() + toSign, err := l2Txs[0].HashToSign(sdb.chainID) require.Nil(t, err) sig := users[0].BJJ.SignPoseidon(toSign) l2Txs[0].Signature = sig.Compress()@@ -399,8 +402,8 @@ require.NoError(t, err)
defer assert.Nil(t, os.RemoveAll(dir)) nLevels := 16 - - sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels, chainID) assert.Nil(t, err) // same values than in the js test@@ -431,7 +434,7 @@ Type: common.TxTypeTransfer,
}, } - toSign, err := l2Txs[0].HashToSign() + toSign, err := l2Txs[0].HashToSign(sdb.chainID) require.NoError(t, err) sig := users[0].BJJ.SignPoseidon(toSign) l2Txs[0].Signature = sig.Compress()@@ -487,8 +490,8 @@ require.NoError(t, err)
defer assert.Nil(t, os.RemoveAll(dir)) nLevels := 16 - - sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels, chainID) assert.Nil(t, err) // same values than in the js test@@ -530,7 +533,7 @@ Type: common.TxTypeTransfer,
}, } - toSign, err := l2Txs[0].HashToSign() + toSign, err := l2Txs[0].HashToSign(sdb.chainID) require.NoError(t, err) sig := users[0].BJJ.SignPoseidon(toSign) l2Txs[0].Signature = sig.Compress()@@ -594,8 +597,8 @@ require.NoError(t, err)
defer assert.Nil(t, os.RemoveAll(dir)) nLevels := 16 - - sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels, chainID) assert.Nil(t, err) // same values than in the js test@@ -668,8 +671,8 @@ Type: common.TxTypeTransfer,
}, } - l2Txs[0] = signL2Tx(t, users[0], l2Txs[0]) - l2Txs[1] = signL2Tx(t, users[0], l2Txs[1]) + l2Txs[0] = signL2Tx(t, sdb.chainID, users[0], l2Txs[0]) + l2Txs[1] = signL2Tx(t, sdb.chainID, users[0], l2Txs[1]) ptc := ProcessTxsConfig{ NLevels: uint32(nLevels),@@ -738,8 +741,8 @@ require.NoError(t, err)
defer assert.Nil(t, os.RemoveAll(dir)) nLevels := 16 - - sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels, chainID) assert.Nil(t, err) // same values than in the js test@@ -812,8 +815,8 @@ Type: common.TxTypeTransfer,
}, } - l2Txs[0] = signL2Tx(t, users[0], l2Txs[0]) - l2Txs[1] = signL2Tx(t, users[0], l2Txs[1]) + l2Txs[0] = signL2Tx(t, sdb.chainID, users[0], l2Txs[0]) + l2Txs[1] = signL2Tx(t, sdb.chainID, users[0], l2Txs[1]) ptc := ProcessTxsConfig{ NLevels: uint32(nLevels),@@ -882,8 +885,8 @@ require.NoError(t, err)
defer assert.Nil(t, os.RemoveAll(dir)) nLevels := 16 - - sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels, chainID) assert.Nil(t, err) // same values than in the js test@@ -966,8 +969,8 @@ Type: common.TxTypeTransfer,
}, } - l2Txs[0] = signL2Tx(t, users[0], l2Txs[0]) - l2Txs[1] = signL2Tx(t, users[0], l2Txs[1]) + l2Txs[0] = signL2Tx(t, sdb.chainID, users[0], l2Txs[0]) + l2Txs[1] = signL2Tx(t, sdb.chainID, users[0], l2Txs[1]) ptc := ProcessTxsConfig{ NLevels: uint32(nLevels),@@ -1036,8 +1039,8 @@ require.NoError(t, err)
defer assert.Nil(t, os.RemoveAll(dir)) nLevels := 16 - - sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels, chainID) assert.Nil(t, err) // same values than in the js test@@ -1098,8 +1101,8 @@ Fee: 126,
Type: common.TxTypeExit, }, } - l2Txs[0] = signL2Tx(t, users[0], l2Txs[0]) - l2Txs[1] = signL2Tx(t, users[0], l2Txs[1]) + l2Txs[0] = signL2Tx(t, sdb.chainID, users[0], l2Txs[0]) + l2Txs[1] = signL2Tx(t, sdb.chainID, users[0], l2Txs[1]) ptc := ProcessTxsConfig{ NLevels: uint32(nLevels),@@ -1160,8 +1163,8 @@ require.NoError(t, err)
defer assert.Nil(t, os.RemoveAll(dir)) nLevels := 16 - - sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels) + chainID := uint16(0) + sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels, chainID) assert.Nil(t, err) // Coordinator Idx where to send the fees@@ -1174,7 +1177,7 @@ MaxL1Tx: 4,
MaxFeeTx: 4, } - tc := til.NewContext(common.RollupConstMaxL1UserTx) + tc := til.NewContext(0, common.RollupConstMaxL1UserTx) blocks, err := tc.GenerateBlocks(til.SetBlockchainMinimumFlow0) require.NoError(t, err)
@@ -83,7 +83,7 @@ }
historyDB := historydb.NewHistoryDB(db) - stateDB, err := statedb.NewStateDB(cfg.StateDB.Path, statedb.TypeSynchronizer, 32) + stateDB, err := statedb.NewStateDB(cfg.StateDB.Path, statedb.TypeSynchronizer, 32, cfg.Coordinator.ChainID) if err != nil { return nil, tracerr.Wrap(err) }@@ -232,6 +232,7 @@ RollupConstants: scConsts.Rollup,
AuctionConstants: scConsts.Auction, WDelayerConstants: scConsts.WDelayer, }, + cfg.Coordinator.ChainID, ) if err != nil { return nil, tracerr.Wrap(err)@@ -286,6 +287,7 @@ hdb *historydb.HistoryDB,
sdb *statedb.StateDB, l2db *l2db.L2DB, config *api.Config, + chainID uint16, ) (*NodeAPI, error) { engine := gin.Default() engine.NoRoute(handleNoRoute)@@ -297,6 +299,7 @@ hdb,
sdb, l2db, config, + chainID, ) if err != nil { return nil, tracerr.Wrap(err)
@@ -52,7 +52,7 @@ assert.Equal(t, true, status.Status.IsReady())
} func testCalculateProof(t *testing.T) { - zkInputs := common.NewZKInputs(100, 16, 512, 24, 32, big.NewInt(1)) + zkInputs := common.NewZKInputs(0, 100, 16, 512, 24, 32, big.NewInt(1)) err := proofServerClient.CalculateProof(context.Background(), zkInputs) require.NoError(t, err) }@@ -71,7 +71,7 @@ assert.NotEqual(t, 0, len(pubInputs))
} func testCancel(t *testing.T) { - zkInputs := common.NewZKInputs(100, 16, 512, 24, 32, big.NewInt(1)) + zkInputs := common.NewZKInputs(0, 100, 16, 512, 24, 32, big.NewInt(1)) err := proofServerClient.CalculateProof(context.Background(), zkInputs) require.NoError(t, err) // TODO: remove sleep when the server has been reviewed
@@ -282,7 +282,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.Nil(t, os.RemoveAll(dir)) - stateDB, err := statedb.NewStateDB(dir, statedb.TypeSynchronizer, 32) + chainID := uint16(0) + stateDB, err := statedb.NewStateDB(dir, statedb.TypeSynchronizer, 32, chainID) require.NoError(t, err) // Init History DB@@ -379,7 +380,7 @@ > batchL1 // forge L1UserTxs{nil}, freeze defined L1UserTxs{3}
> batchL1 // forge L1UserTxs{3}, freeze defined L1UserTxs{nil} > block // blockNum=3 ` - tc := til.NewContext(common.RollupConstMaxL1UserTx) + tc := til.NewContext(chainID, common.RollupConstMaxL1UserTx) tilCfgExtra := til.ConfigExtra{ BootCoordAddr: bootCoordAddr, CoordUser: "A",@@ -567,7 +568,7 @@ > block // blockNum=4
> block // blockNum=5 > block // blockNum=6 ` - tc = til.NewContext(common.RollupConstMaxL1UserTx) + tc = til.NewContext(chainID, common.RollupConstMaxL1UserTx) tilCfgExtra = til.ConfigExtra{ BootCoordAddr: bootCoordAddr, CoordUser: "A",
@@ -44,7 +44,8 @@ func TestDebugAPI(t *testing.T) {
dir, err := ioutil.TempDir("", "tmpdb") require.Nil(t, err) - sdb, err := statedb.NewStateDB(dir, statedb.TypeSynchronizer, 32) + chainID := uint16(0) + sdb, err := statedb.NewStateDB(dir, statedb.TypeSynchronizer, 32, chainID) require.Nil(t, err) err = sdb.MakeCheckpoint() // Make a checkpoint to increment the batchNum require.Nil(t, err)
@@ -16,7 +16,7 @@ parser = newParser(strings.NewReader(SetPool0))
_, err = parser.parse() assert.NoError(t, err) - tc := NewContext(common.RollupConstMaxL1UserTx) + tc := NewContext(0, common.RollupConstMaxL1UserTx) _, err = tc.GenerateBlocks(SetBlockchain0) assert.NoError(t, err) _, err = tc.GeneratePoolL2Txs(SetPool0)@@ -25,7 +25,7 @@ }
func TestCompileSetsMinimumFlow(t *testing.T) { // minimum flow - tc := NewContext(common.RollupConstMaxL1UserTx) + tc := NewContext(0, common.RollupConstMaxL1UserTx) _, err := tc.GenerateBlocks(SetBlockchainMinimumFlow0) assert.NoError(t, err) _, err = tc.GeneratePoolL2Txs(SetPoolL2MinimumFlow0)
@@ -61,6 +61,7 @@ // rollupConstMaxL1UserTx Maximum L1-user transactions allowed to be
// queued in a batch rollupConstMaxL1UserTx int + chainID uint16 idx int currBlock common.BlockData currBatch common.BatchData@@ -78,7 +79,7 @@ extra contextExtra
} // NewContext returns a new Context -func NewContext(rollupConstMaxL1UserTx int) *Context { +func NewContext(chainID uint16, rollupConstMaxL1UserTx int) *Context { currBatchNum := 1 // The protocol defines the first batchNum to be 1 return &Context{ Users: make(map[string]*User),@@ -88,6 +89,7 @@ accountsByIdx: make(map[int]*Account),
LastRegisteredTokenID: 0, rollupConstMaxL1UserTx: rollupConstMaxL1UserTx, + chainID: chainID, idx: common.UserThreshold, // We use some placeholder values for StateRoot and ExitTree // because these values will never be nil@@ -630,7 +632,7 @@ return nil, tracerr.Wrap(fmt.Errorf("Line %d: %s", inst.LineNum, err.Error()))
} tx = *nTx // perform signature and set it to tx.Signature - toSign, err := tx.HashToSign() + toSign, err := tx.HashToSign(tc.chainID) if err != nil { return nil, tracerr.Wrap(fmt.Errorf("Line %d: %s", inst.LineNum, err.Error())) }@@ -656,7 +658,7 @@ return nil, tracerr.Wrap(fmt.Errorf("Line %d: %s", inst.LineNum, err.Error()))
} tx = *nTx // perform signature and set it to tx.Signature - toSign, err := tx.HashToSign() + toSign, err := tx.HashToSign(tc.chainID) if err != nil { return nil, tracerr.Wrap(fmt.Errorf("Line %d: %s", inst.LineNum, err.Error())) }
@@ -20,7 +20,7 @@ CreateAccountDeposit(2) B: 22
> block ` - tc := NewContext(common.RollupConstMaxL1UserTx) + tc := NewContext(0, common.RollupConstMaxL1UserTx) blocks, err := tc.GenerateBlocks(set) require.NoError(t, err) assert.Equal(t, 1, len(blocks))@@ -87,7 +87,7 @@ // this transaction should not be generated, as it's after last
// batch and last block Transfer(1) User1-User0: 1 (1) ` - tc := NewContext(common.RollupConstMaxL1UserTx) + tc := NewContext(0, common.RollupConstMaxL1UserTx) blocks, err := tc.GenerateBlocks(set) require.NoError(t, err) assert.Equal(t, 2, len(blocks))@@ -191,7 +191,7 @@ CreateAccountDeposit(2) D: 0
> batchL1 > batchL1 ` - tc := NewContext(common.RollupConstMaxL1UserTx) + tc := NewContext(0, common.RollupConstMaxL1UserTx) _, err := tc.GenerateBlocks(set) require.NoError(t, err) set = `@@ -251,7 +251,7 @@ > batchL1
> batchL1 > block ` - tc = NewContext(common.RollupConstMaxL1UserTx) + tc = NewContext(0, common.RollupConstMaxL1UserTx) _, err = tc.GenerateBlocks(set) require.NoError(t, err) set = `@@ -282,7 +282,7 @@ CreateAccountDeposit(1) B: 7
> batchL1 > batchL1 ` - tc := NewContext(common.RollupConstMaxL1UserTx) + tc := NewContext(0, common.RollupConstMaxL1UserTx) _, err := tc.GenerateBlocks(set) require.NoError(t, err)@@ -314,7 +314,7 @@ })
txsFromInstructions, err := tc.GeneratePoolL2TxsFromInstructions(instructionSet) require.NoError(t, err) // Generate Pool txs using string - tc = NewContext(common.RollupConstMaxL1UserTx) + tc = NewContext(0, common.RollupConstMaxL1UserTx) _, err = tc.GenerateBlocks(set) require.NoError(t, err) stringSet := `@@ -338,7 +338,7 @@ set := `Type: Blockchain
CreateAccountDeposit(1) A: 5 > batchL1 ` - tc := NewContext(common.RollupConstMaxL1UserTx) + tc := NewContext(0, common.RollupConstMaxL1UserTx) _, err := tc.GenerateBlocks(set) assert.Equal(t, "Line 2: Can not process CreateAccountDeposit: TokenID 1 not registered, last registered TokenID: 0", err.Error())@@ -347,7 +347,7 @@ set = `
Type: Blockchain AddToken(0) ` - tc = NewContext(common.RollupConstMaxL1UserTx) + tc = NewContext(0, common.RollupConstMaxL1UserTx) _, err = tc.GenerateBlocks(set) require.Equal(t, "Line 2: AddToken can not register TokenID 0", err.Error())@@ -355,7 +355,7 @@ set = `
Type: Blockchain AddToken(2) ` - tc = NewContext(common.RollupConstMaxL1UserTx) + tc = NewContext(0, common.RollupConstMaxL1UserTx) _, err = tc.GenerateBlocks(set) require.Equal(t, "Line 2: AddToken TokenID should be sequential, expected TokenID: 1, defined TokenID: 2", err.Error())@@ -366,7 +366,7 @@ AddToken(2)
AddToken(3) AddToken(5) ` - tc = NewContext(common.RollupConstMaxL1UserTx) + tc = NewContext(0, common.RollupConstMaxL1UserTx) _, err = tc.GenerateBlocks(set) require.Equal(t, "Line 5: AddToken TokenID should be sequential, expected TokenID: 4, defined TokenID: 5", err.Error())@@ -380,7 +380,7 @@ CreateAccountDeposit(1) B
Transfer(1) A-B: 6 (1) > batch ` - tc = NewContext(common.RollupConstMaxL1UserTx) + tc = NewContext(0, common.RollupConstMaxL1UserTx) _, err = tc.GenerateBlocks(set) require.Equal(t, "Line 5: CreateAccountDeposit(1)BTransfer(1) A-B: 6 (1)\n, err: Expected ':', found 'Transfer'", err.Error()) set = `@@ -394,7 +394,7 @@ > batch
Transfer(1) A-B: 6 (1) > batch ` - tc = NewContext(common.RollupConstMaxL1UserTx) + tc = NewContext(0, common.RollupConstMaxL1UserTx) _, err = tc.GenerateBlocks(set) require.NoError(t, err)@@ -412,7 +412,7 @@ Transfer(1) B-A: 6 (1)
Exit(1) A: 3 (1) > batch ` - tc = NewContext(common.RollupConstMaxL1UserTx) + tc = NewContext(0, common.RollupConstMaxL1UserTx) _, err = tc.GenerateBlocks(set) require.NoError(t, err) assert.Equal(t, common.Nonce(3), tc.Users["A"].Accounts[common.TokenID(1)].Nonce)@@ -518,7 +518,7 @@ // Literal: "> block",
Typ: TypeNewBlock, }) - tc := NewContext(common.RollupConstMaxL1UserTx) + tc := NewContext(0, common.RollupConstMaxL1UserTx) blockFromInstructions, err := tc.GenerateBlocksFromInstructions(setInst) require.NoError(t, err)@@ -537,7 +537,7 @@ Exit(1) A: 3 (1)
> batch > block ` - tc = NewContext(common.RollupConstMaxL1UserTx) + tc = NewContext(0, common.RollupConstMaxL1UserTx) blockFromString, err := tc.GenerateBlocks(setString) require.NoError(t, err)
@@ -20,7 +20,7 @@ "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" ) -func initTest(t *testing.T, testSet string) *TxSelector { +func initTest(t *testing.T, chainID uint16, testSet string) *TxSelector { pass := os.Getenv("POSTGRES_PASS") db, err := dbUtils.InitSQLDB(5432, "localhost", "hermez", pass, "hermez") require.NoError(t, err)@@ -29,7 +29,7 @@
dir, err := ioutil.TempDir("", "tmpdb") require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := statedb.NewStateDB(dir, statedb.TypeTxSelector, 0) + sdb, err := statedb.NewStateDB(dir, statedb.TypeTxSelector, 0, chainID) require.NoError(t, err) txselDir, err := ioutil.TempDir("", "tmpTxSelDB")@@ -64,7 +64,8 @@ assert.NoError(t, hdb.AddTokens(tokens))
} func TestCoordIdxsDB(t *testing.T) { - txsel := initTest(t, til.SetPool0) + chainID := uint16(0) + txsel := initTest(t, chainID, til.SetPool0) test.WipeDB(txsel.l2db.DB()) coordIdxs := make(map[common.TokenID]common.Idx)@@ -81,10 +82,11 @@ assert.Equal(t, coordIdxs, r)
} func TestGetL2TxSelection(t *testing.T) { - txsel := initTest(t, til.SetPool0) + chainID := uint16(0) + txsel := initTest(t, chainID, til.SetPool0) test.WipeDB(txsel.l2db.DB()) - tc := til.NewContext(common.RollupConstMaxL1UserTx) + tc := til.NewContext(chainID, common.RollupConstMaxL1UserTx) // generate test transactions blocks, err := tc.GenerateBlocks(til.SetBlockchain0) assert.NoError(t, err)