mirror of
https://github.com/arnaucube/hermez-node.git
synced 2026-02-06 19:06:42 +01:00
Add tests connecting TxSelector, BatchBuilder, ZKInputs, ProofServer
- Add tests connecting TxSelector, BatchBuilder, ZKInputs, ProofServer - Added test to check that the signatures of the PoolL2Txs from the L2DB pool can be verified, to check that the parameters of the PoolL2Tx match the original parameters signed before inserting them into the L2DB
This commit is contained in:
@@ -1,10 +1,8 @@
|
||||
package txselector
|
||||
|
||||
import (
|
||||
"crypto/ecdsa"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"math/big"
|
||||
"os"
|
||||
"strconv"
|
||||
"testing"
|
||||
@@ -22,13 +20,12 @@ import (
|
||||
"github.com/hermeznetwork/hermez-node/test/til"
|
||||
"github.com/hermeznetwork/hermez-node/test/txsets"
|
||||
"github.com/hermeznetwork/hermez-node/txprocessor"
|
||||
"github.com/iden3/go-iden3-crypto/babyjub"
|
||||
"github.com/jmoiron/sqlx"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func initTest(t *testing.T, chainID uint16, hermezContractAddr ethCommon.Address, testSet string) (*TxSelector, *til.Context) {
|
||||
func initTest(t *testing.T, chainID uint16, hermezContractAddr ethCommon.Address, coordUser *til.User) *TxSelector {
|
||||
pass := os.Getenv("POSTGRES_PASS")
|
||||
db, err := dbUtils.InitSQLDB(5432, "localhost", "hermez", pass, "hermez")
|
||||
require.NoError(t, err)
|
||||
@@ -37,45 +34,36 @@ func initTest(t *testing.T, chainID uint16, hermezContractAddr ethCommon.Address
|
||||
dir, err := ioutil.TempDir("", "tmpdb")
|
||||
require.NoError(t, err)
|
||||
defer assert.NoError(t, os.RemoveAll(dir))
|
||||
sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeTxSelector, 0)
|
||||
syncStateDB, err := statedb.NewStateDB(dir, 128, statedb.TypeTxSelector, 0)
|
||||
require.NoError(t, err)
|
||||
|
||||
txselDir, err := ioutil.TempDir("", "tmpTxSelDB")
|
||||
require.NoError(t, err)
|
||||
defer assert.NoError(t, os.RemoveAll(dir))
|
||||
|
||||
// coordinator keys
|
||||
var ethSk ecdsa.PrivateKey
|
||||
ethSk.D = big.NewInt(int64(1)) // only for testing
|
||||
ethSk.PublicKey.X, ethSk.PublicKey.Y = ethCrypto.S256().ScalarBaseMult(ethSk.D.Bytes())
|
||||
ethSk.Curve = ethCrypto.S256()
|
||||
addr := ethCrypto.PubkeyToAddress(ethSk.PublicKey)
|
||||
var bjj babyjub.PublicKeyComp
|
||||
err = bjj.UnmarshalText([]byte("c433f7a696b7aa3a5224efb3993baf0ccd9e92eecee0c29a3f6c8208a9e81d9e"))
|
||||
require.NoError(t, err)
|
||||
// use Til Coord keys for tests compatibility
|
||||
coordAccount := &CoordAccount{
|
||||
Addr: addr,
|
||||
BJJ: bjj,
|
||||
Addr: coordUser.Addr,
|
||||
BJJ: coordUser.BJJ.Public().Compress(),
|
||||
AccountCreationAuth: nil,
|
||||
}
|
||||
fmt.Printf("%v", coordAccount)
|
||||
auth := common.AccountCreationAuth{
|
||||
EthAddr: addr,
|
||||
BJJ: bjj,
|
||||
EthAddr: coordUser.Addr,
|
||||
BJJ: coordUser.BJJ.Public().Compress(),
|
||||
}
|
||||
err = auth.Sign(func(hash []byte) ([]byte, error) {
|
||||
return ethCrypto.Sign(hash, ðSk)
|
||||
return ethCrypto.Sign(hash, coordUser.EthSk)
|
||||
}, chainID, hermezContractAddr)
|
||||
assert.NoError(t, err)
|
||||
coordAccount.AccountCreationAuth = auth.Signature
|
||||
|
||||
txsel, err := NewTxSelector(coordAccount, txselDir, sdb, l2DB)
|
||||
txsel, err := NewTxSelector(coordAccount, txselDir, syncStateDB, l2DB)
|
||||
require.NoError(t, err)
|
||||
|
||||
test.WipeDB(txsel.l2db.DB())
|
||||
|
||||
tc := til.NewContext(chainID, common.RollupConstMaxL1UserTx)
|
||||
|
||||
return txsel, tc
|
||||
return txsel
|
||||
}
|
||||
|
||||
func addAccCreationAuth(t *testing.T, tc *til.Context, txsel *TxSelector, chainID uint16, hermezContractAddr ethCommon.Address, username string) []byte {
|
||||
@@ -155,15 +143,16 @@ func checkSortedByNonce(t *testing.T, testAccNonces map[common.Idx]common.Nonce,
|
||||
|
||||
func TestGetL2TxSelectionMinimumFlow0(t *testing.T) {
|
||||
chainID := uint16(0)
|
||||
hermezContractAddr := ethCommon.HexToAddress("0xc344E203a046Da13b0B4467EB7B3629D0C99F6E6")
|
||||
txsel, tc := initTest(t, chainID, hermezContractAddr, txsets.SetPool0)
|
||||
|
||||
tc := til.NewContext(chainID, common.RollupConstMaxL1UserTx)
|
||||
// generate test transactions, the L1CoordinatorTxs generated by Til
|
||||
// will be ignored at this test, as will be the TxSelector who
|
||||
// generates them when needed
|
||||
blocks, err := tc.GenerateBlocks(txsets.SetBlockchainMinimumFlow0)
|
||||
assert.NoError(t, err)
|
||||
|
||||
hermezContractAddr := ethCommon.HexToAddress("0xc344E203a046Da13b0B4467EB7B3629D0C99F6E6")
|
||||
txsel := initTest(t, chainID, hermezContractAddr, tc.Users["Coord"])
|
||||
|
||||
// restart nonces of TilContext, as will be set by generating directly
|
||||
// the PoolL2Txs for each specific batch with tc.GeneratePoolL2Txs
|
||||
tc.RestartNonces()
|
||||
@@ -262,21 +251,22 @@ func TestGetL2TxSelectionMinimumFlow0(t *testing.T) {
|
||||
// simulate the PoolL2Txs of the batch7
|
||||
batchPoolL2 := `
|
||||
Type: PoolL2
|
||||
PoolTransfer(1) A-B: 200 (126)
|
||||
PoolTransfer(0) B-C: 100 (126)`
|
||||
PoolTransferToEthAddr(1) A-B: 200 (126)
|
||||
PoolTransferToEthAddr(0) B-C: 100 (126)`
|
||||
poolL2Txs, err := tc.GeneratePoolL2Txs(batchPoolL2)
|
||||
require.NoError(t, err)
|
||||
// add AccountCreationAuths that will be used at the next batch
|
||||
accAuthSig0 := addAccCreationAuth(t, tc, txsel, chainID, hermezContractAddr, "B")
|
||||
accAuthSig1 := addAccCreationAuth(t, tc, txsel, chainID, hermezContractAddr, "C")
|
||||
// add ToEthAddr for the corresponent ToIdx, and remove ToIdx for Batches[6].L2Tx
|
||||
poolL2Txs[0].ToEthAddr = tc.Users["B"].Addr
|
||||
poolL2Txs[0].ToIdx = common.Idx(0)
|
||||
poolL2Txs[1].ToEthAddr = tc.Users["C"].Addr
|
||||
poolL2Txs[1].ToIdx = common.Idx(0)
|
||||
// add the PoolL2Txs to the l2DB
|
||||
addL2Txs(t, txsel, poolL2Txs)
|
||||
|
||||
// check signatures of L2Txs from the L2DB (to check that the
|
||||
// parameters of the PoolL2Tx match the original parameters signed
|
||||
// before inserting it to the L2DB)
|
||||
l2TxsFromDB, err := txsel.l2db.GetPendingTxs()
|
||||
require.NoError(t, err)
|
||||
assert.True(t, l2TxsFromDB[0].VerifySignature(chainID, tc.Users["A"].BJJ.Public().Compress()))
|
||||
assert.True(t, l2TxsFromDB[1].VerifySignature(chainID, tc.Users["B"].BJJ.Public().Compress()))
|
||||
l1UserTxs = til.L1TxsToCommonL1Txs(tc.Queues[*blocks[0].Rollup.Batches[6].Batch.ForgeL1TxsNum])
|
||||
coordIdxs, accAuths, oL1UserTxs, oL1CoordTxs, oL2Txs, err := txsel.GetL1L2TxSelection(selectionConfig, l1UserTxs)
|
||||
require.NoError(t, err)
|
||||
@@ -314,6 +304,15 @@ func TestGetL2TxSelectionMinimumFlow0(t *testing.T) {
|
||||
poolL2Txs, err = tc.GeneratePoolL2Txs(batchPoolL2)
|
||||
require.NoError(t, err)
|
||||
addL2Txs(t, txsel, poolL2Txs)
|
||||
// check signatures of L2Txs from the L2DB (to check that the
|
||||
// parameters of the PoolL2Tx match the original parameters signed
|
||||
// before inserting it to the L2DB)
|
||||
l2TxsFromDB, err = txsel.l2db.GetPendingTxs()
|
||||
require.NoError(t, err)
|
||||
assert.True(t, l2TxsFromDB[0].VerifySignature(chainID, tc.Users["A"].BJJ.Public().Compress()))
|
||||
assert.True(t, l2TxsFromDB[1].VerifySignature(chainID, tc.Users["C"].BJJ.Public().Compress()))
|
||||
assert.True(t, l2TxsFromDB[2].VerifySignature(chainID, tc.Users["B"].BJJ.Public().Compress()))
|
||||
assert.True(t, l2TxsFromDB[3].VerifySignature(chainID, tc.Users["A"].BJJ.Public().Compress()))
|
||||
l1UserTxs = til.L1TxsToCommonL1Txs(tc.Queues[*blocks[0].Rollup.Batches[7].Batch.ForgeL1TxsNum])
|
||||
coordIdxs, accAuths, oL1UserTxs, oL1CoordTxs, oL2Txs, err = txsel.GetL1L2TxSelection(selectionConfig, l1UserTxs)
|
||||
require.NoError(t, err)
|
||||
@@ -348,6 +347,13 @@ func TestGetL2TxSelectionMinimumFlow0(t *testing.T) {
|
||||
poolL2Txs, err = tc.GeneratePoolL2Txs(batchPoolL2)
|
||||
require.NoError(t, err)
|
||||
addL2Txs(t, txsel, poolL2Txs)
|
||||
// check signatures of L2Txs from the L2DB (to check that the
|
||||
// parameters of the PoolL2Tx match the original parameters signed
|
||||
// before inserting it to the L2DB)
|
||||
l2TxsFromDB, err = txsel.l2db.GetPendingTxs()
|
||||
require.NoError(t, err)
|
||||
assert.True(t, l2TxsFromDB[0].VerifySignature(chainID, tc.Users["D"].BJJ.Public().Compress()))
|
||||
assert.True(t, l2TxsFromDB[1].VerifySignature(chainID, tc.Users["B"].BJJ.Public().Compress()))
|
||||
l1UserTxs = til.L1TxsToCommonL1Txs(tc.Queues[*blocks[1].Rollup.Batches[0].Batch.ForgeL1TxsNum])
|
||||
coordIdxs, accAuths, oL1UserTxs, oL1CoordTxs, oL2Txs, err = txsel.GetL1L2TxSelection(selectionConfig, l1UserTxs)
|
||||
require.NoError(t, err)
|
||||
|
||||
Reference in New Issue
Block a user