@ -11,6 +11,7 @@ import (
"github.com/hermeznetwork/hermez-node/common"
"github.com/hermeznetwork/hermez-node/common"
"github.com/hermeznetwork/hermez-node/db/statedb"
"github.com/hermeznetwork/hermez-node/db/statedb"
"github.com/hermeznetwork/hermez-node/log"
"github.com/hermeznetwork/hermez-node/prover"
"github.com/hermeznetwork/hermez-node/prover"
"github.com/hermeznetwork/hermez-node/test/til"
"github.com/hermeznetwork/hermez-node/test/til"
"github.com/hermeznetwork/hermez-node/test/txsets"
"github.com/hermeznetwork/hermez-node/test/txsets"
@ -26,9 +27,7 @@ const pollInterval = 200 * time.Millisecond
func TestMain ( m * testing . M ) {
func TestMain ( m * testing . M ) {
exitVal := 0
exitVal := 0
proofServerURL = os . Getenv ( "PROOF_SERVER_URL" )
proofServerURL = os . Getenv ( "PROOF_SERVER_URL" )
if proofServerURL != "" {
exitVal = m . Run ( )
}
exitVal = m . Run ( )
os . Exit ( exitVal )
os . Exit ( exitVal )
}
}
@ -38,7 +37,7 @@ const MaxL1Tx = 256
const MaxFeeTx = 64
const MaxFeeTx = 64
const ChainID uint16 = 1
const ChainID uint16 = 1
var config = txprocessor . Config {
var txpro cC onfig = txprocessor . Config {
NLevels : uint32 ( NLevels ) ,
NLevels : uint32 ( NLevels ) ,
MaxTx : MaxTx ,
MaxTx : MaxTx ,
MaxL1Tx : MaxL1Tx ,
MaxL1Tx : MaxL1Tx ,
@ -46,19 +45,24 @@ var config = txprocessor.Config{
ChainID : ChainID ,
ChainID : ChainID ,
}
}
func initStateDB ( t * testing . T ) * statedb . StateDB {
func initStateDB ( t * testing . T , typ statedb . TypeStateDB ) * statedb . StateDB {
dir , err := ioutil . TempDir ( "" , "tmpdb" )
dir , err := ioutil . TempDir ( "" , "tmpdb" )
require . NoError ( t , err )
require . NoError ( t , err )
defer assert . Nil ( t , os . RemoveAll ( dir ) )
defer assert . Nil ( t , os . RemoveAll ( dir ) )
sdb , err := statedb . NewStateDB ( dir , 128 , s tatedb . T ypeBatchBuilder , NLevels )
sdb , err := statedb . NewStateDB ( dir , 128 , typ , NLevels )
require . NoError ( t , err )
require . NoError ( t , err )
return sdb
return sdb
}
}
func sendProofAndCheckResp ( t * testing . T , ptOut * txprocessor . ProcessTxOutput ) {
func sendProofAndCheckResp ( t * testing . T , zki * common . ZKInputs ) {
if proofServerURL == "" {
log . Debug ( "No PROOF_SERVER_URL defined, not using ProofServer" )
return
}
// Store zkinputs json for debugging purposes
// Store zkinputs json for debugging purposes
zkInputsJSON , err := json . Marshal ( ptOut . ZKInputs )
zkInputsJSON , err := json . Marshal ( zki )
require . NoError ( t , err )
require . NoError ( t , err )
err = ioutil . WriteFile ( "/tmp/dbgZKInputs.json" , zkInputsJSON , 0640 ) //nolint:gosec
err = ioutil . WriteFile ( "/tmp/dbgZKInputs.json" , zkInputsJSON , 0640 ) //nolint:gosec
require . NoError ( t , err )
require . NoError ( t , err )
@ -66,7 +70,7 @@ func sendProofAndCheckResp(t *testing.T, ptOut *txprocessor.ProcessTxOutput) {
proofServerClient := prover . NewProofServerClient ( proofServerURL , pollInterval )
proofServerClient := prover . NewProofServerClient ( proofServerURL , pollInterval )
err = proofServerClient . WaitReady ( context . Background ( ) )
err = proofServerClient . WaitReady ( context . Background ( ) )
require . NoError ( t , err )
require . NoError ( t , err )
err = proofServerClient . CalculateProof ( context . Background ( ) , ptOut . ZKInputs )
err = proofServerClient . CalculateProof ( context . Background ( ) , zki )
require . NoError ( t , err )
require . NoError ( t , err )
proof , pubInputs , err := proofServerClient . GetProof ( context . Background ( ) )
proof , pubInputs , err := proofServerClient . GetProof ( context . Background ( ) )
require . NoError ( t , err )
require . NoError ( t , err )
@ -75,9 +79,9 @@ func sendProofAndCheckResp(t *testing.T, ptOut *txprocessor.ProcessTxOutput) {
}
}
func TestZKInputsEmpty ( t * testing . T ) {
func TestZKInputsEmpty ( t * testing . T ) {
sdb := initStateDB ( t )
sdb := initStateDB ( t , statedb . TypeBatchBuilder )
tp := txprocessor . NewTxProcessor ( sdb , config )
tp := txprocessor . NewTxProcessor ( sdb , txpro cC onfig)
coordIdxs := [ ] common . Idx { }
coordIdxs := [ ] common . Idx { }
l1UserTxs := [ ] common . L1Tx { }
l1UserTxs := [ ] common . L1Tx { }
@ -86,7 +90,7 @@ func TestZKInputsEmpty(t *testing.T) {
ptOut , err := tp . ProcessTxs ( coordIdxs , l1UserTxs , l1CoordTxs , l2Txs )
ptOut , err := tp . ProcessTxs ( coordIdxs , l1UserTxs , l1CoordTxs , l2Txs )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut ) // test empty batch ZKInputs
sendProofAndCheckResp ( t , ptOut . ZKInputs ) // test empty batch ZKInputs
_ , coordIdxs , l1UserTxs , l1CoordTxs , l2Txs = txsets . GenerateTxsZKInputs0 ( t , ChainID )
_ , coordIdxs , l1UserTxs , l1CoordTxs , l2Txs = txsets . GenerateTxsZKInputs0 ( t , ChainID )
@ -99,79 +103,79 @@ func TestZKInputsEmpty(t *testing.T) {
l2Txs = [ ] common . PoolL2Tx { }
l2Txs = [ ] common . PoolL2Tx { }
ptOut , err = tp . ProcessTxs ( coordIdxs , l1UserTxs , l1CoordTxs , l2Txs )
ptOut , err = tp . ProcessTxs ( coordIdxs , l1UserTxs , l1CoordTxs , l2Txs )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut ) // test empty batch ZKInputs after a non-empty batch
sendProofAndCheckResp ( t , ptOut . ZKInputs ) // test empty batch ZKInputs after a non-empty batch
}
}
func TestZKInputs0 ( t * testing . T ) {
func TestZKInputs0 ( t * testing . T ) {
sdb := initStateDB ( t )
sdb := initStateDB ( t , statedb . TypeBatchBuilder )
_ , coordIdxs , l1UserTxs , l1CoordTxs , l2Txs := txsets . GenerateTxsZKInputs0 ( t , ChainID )
_ , coordIdxs , l1UserTxs , l1CoordTxs , l2Txs := txsets . GenerateTxsZKInputs0 ( t , ChainID )
tp := txprocessor . NewTxProcessor ( sdb , config )
tp := txprocessor . NewTxProcessor ( sdb , txpro cC onfig)
ptOut , err := tp . ProcessTxs ( coordIdxs , l1UserTxs , l1CoordTxs , l2Txs )
ptOut , err := tp . ProcessTxs ( coordIdxs , l1UserTxs , l1CoordTxs , l2Txs )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut )
sendProofAndCheckResp ( t , ptOut . ZKInputs )
}
}
func TestZKInputs1 ( t * testing . T ) {
func TestZKInputs1 ( t * testing . T ) {
sdb := initStateDB ( t )
sdb := initStateDB ( t , statedb . TypeBatchBuilder )
_ , coordIdxs , l1UserTxs , l1CoordTxs , l2Txs := txsets . GenerateTxsZKInputs1 ( t , ChainID )
_ , coordIdxs , l1UserTxs , l1CoordTxs , l2Txs := txsets . GenerateTxsZKInputs1 ( t , ChainID )
tp := txprocessor . NewTxProcessor ( sdb , config )
tp := txprocessor . NewTxProcessor ( sdb , txpro cC onfig)
ptOut , err := tp . ProcessTxs ( coordIdxs , l1UserTxs , l1CoordTxs , l2Txs )
ptOut , err := tp . ProcessTxs ( coordIdxs , l1UserTxs , l1CoordTxs , l2Txs )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut )
sendProofAndCheckResp ( t , ptOut . ZKInputs )
}
}
func TestZKInputs2 ( t * testing . T ) {
func TestZKInputs2 ( t * testing . T ) {
sdb := initStateDB ( t )
sdb := initStateDB ( t , statedb . TypeBatchBuilder )
_ , coordIdxs , l1UserTxs , l1CoordTxs , l2Txs := txsets . GenerateTxsZKInputs2 ( t , ChainID )
_ , coordIdxs , l1UserTxs , l1CoordTxs , l2Txs := txsets . GenerateTxsZKInputs2 ( t , ChainID )
tp := txprocessor . NewTxProcessor ( sdb , config )
tp := txprocessor . NewTxProcessor ( sdb , txpro cC onfig)
ptOut , err := tp . ProcessTxs ( coordIdxs , l1UserTxs , l1CoordTxs , l2Txs )
ptOut , err := tp . ProcessTxs ( coordIdxs , l1UserTxs , l1CoordTxs , l2Txs )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut )
sendProofAndCheckResp ( t , ptOut . ZKInputs )
}
}
func TestZKInputs3 ( t * testing . T ) {
func TestZKInputs3 ( t * testing . T ) {
sdb := initStateDB ( t )
sdb := initStateDB ( t , statedb . TypeBatchBuilder )
_ , coordIdxs , l1UserTxs , l1CoordTxs , l2Txs := txsets . GenerateTxsZKInputs3 ( t , ChainID )
_ , coordIdxs , l1UserTxs , l1CoordTxs , l2Txs := txsets . GenerateTxsZKInputs3 ( t , ChainID )
tp := txprocessor . NewTxProcessor ( sdb , config )
tp := txprocessor . NewTxProcessor ( sdb , txpro cC onfig)
ptOut , err := tp . ProcessTxs ( coordIdxs , l1UserTxs , l1CoordTxs , l2Txs )
ptOut , err := tp . ProcessTxs ( coordIdxs , l1UserTxs , l1CoordTxs , l2Txs )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut )
sendProofAndCheckResp ( t , ptOut . ZKInputs )
}
}
func TestZKInputs4 ( t * testing . T ) {
func TestZKInputs4 ( t * testing . T ) {
sdb := initStateDB ( t )
sdb := initStateDB ( t , statedb . TypeBatchBuilder )
_ , coordIdxs , l1UserTxs , l1CoordTxs , l2Txs := txsets . GenerateTxsZKInputs4 ( t , ChainID )
_ , coordIdxs , l1UserTxs , l1CoordTxs , l2Txs := txsets . GenerateTxsZKInputs4 ( t , ChainID )
tp := txprocessor . NewTxProcessor ( sdb , config )
tp := txprocessor . NewTxProcessor ( sdb , txpro cC onfig)
ptOut , err := tp . ProcessTxs ( coordIdxs , l1UserTxs , l1CoordTxs , l2Txs )
ptOut , err := tp . ProcessTxs ( coordIdxs , l1UserTxs , l1CoordTxs , l2Txs )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut )
sendProofAndCheckResp ( t , ptOut . ZKInputs )
}
}
func TestZKInputs5 ( t * testing . T ) {
func TestZKInputs5 ( t * testing . T ) {
sdb := initStateDB ( t )
sdb := initStateDB ( t , statedb . TypeBatchBuilder )
_ , coordIdxs , l1UserTxs , l1CoordTxs , l2Txs := txsets . GenerateTxsZKInputs5 ( t , ChainID )
_ , coordIdxs , l1UserTxs , l1CoordTxs , l2Txs := txsets . GenerateTxsZKInputs5 ( t , ChainID )
tp := txprocessor . NewTxProcessor ( sdb , config )
tp := txprocessor . NewTxProcessor ( sdb , txpro cC onfig)
ptOut , err := tp . ProcessTxs ( coordIdxs , l1UserTxs , l1CoordTxs , l2Txs )
ptOut , err := tp . ProcessTxs ( coordIdxs , l1UserTxs , l1CoordTxs , l2Txs )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut )
sendProofAndCheckResp ( t , ptOut . ZKInputs )
}
}
func TestZKInputs6 ( t * testing . T ) {
func TestZKInputs6 ( t * testing . T ) {
sdb := initStateDB ( t )
sdb := initStateDB ( t , statedb . TypeBatchBuilder )
tc := til . NewContext ( ChainID , common . RollupConstMaxL1UserTx )
tc := til . NewContext ( ChainID , common . RollupConstMaxL1UserTx )
blocks , err := tc . GenerateBlocks ( txsets . SetBlockchainMinimumFlow0 )
blocks , err := tc . GenerateBlocks ( txsets . SetBlockchainMinimumFlow0 )
@ -181,12 +185,12 @@ func TestZKInputs6(t *testing.T) {
// the PoolL2Txs for each specific batch with tc.GeneratePoolL2Txs
// the PoolL2Txs for each specific batch with tc.GeneratePoolL2Txs
tc . RestartNonces ( )
tc . RestartNonces ( )
tp := txprocessor . NewTxProcessor ( sdb , config )
tp := txprocessor . NewTxProcessor ( sdb , txpro cC onfig)
// batch1
// batch1
ptOut , err := tp . ProcessTxs ( nil , nil , blocks [ 0 ] . Rollup . Batches [ 0 ] . L1CoordinatorTxs , nil )
ptOut , err := tp . ProcessTxs ( nil , nil , blocks [ 0 ] . Rollup . Batches [ 0 ] . L1CoordinatorTxs , nil )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut )
sendProofAndCheckResp ( t , ptOut . ZKInputs )
// batch2
// batch2
l1UserTxs := [ ] common . L1Tx { }
l1UserTxs := [ ] common . L1Tx { }
@ -194,7 +198,7 @@ func TestZKInputs6(t *testing.T) {
ptOut , err = tp . ProcessTxs ( nil , l1UserTxs , blocks [ 0 ] . Rollup . Batches [ 1 ] . L1CoordinatorTxs , l2Txs )
ptOut , err = tp . ProcessTxs ( nil , l1UserTxs , blocks [ 0 ] . Rollup . Batches [ 1 ] . L1CoordinatorTxs , l2Txs )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut )
sendProofAndCheckResp ( t , ptOut . ZKInputs )
// batch3
// batch3
l1UserTxs = til . L1TxsToCommonL1Txs ( tc . Queues [ * blocks [ 0 ] . Rollup . Batches [ 2 ] . Batch . ForgeL1TxsNum ] )
l1UserTxs = til . L1TxsToCommonL1Txs ( tc . Queues [ * blocks [ 0 ] . Rollup . Batches [ 2 ] . Batch . ForgeL1TxsNum ] )
@ -202,7 +206,7 @@ func TestZKInputs6(t *testing.T) {
ptOut , err = tp . ProcessTxs ( nil , l1UserTxs , blocks [ 0 ] . Rollup . Batches [ 2 ] . L1CoordinatorTxs , l2Txs )
ptOut , err = tp . ProcessTxs ( nil , l1UserTxs , blocks [ 0 ] . Rollup . Batches [ 2 ] . L1CoordinatorTxs , l2Txs )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut )
sendProofAndCheckResp ( t , ptOut . ZKInputs )
// batch4
// batch4
l1UserTxs = til . L1TxsToCommonL1Txs ( tc . Queues [ * blocks [ 0 ] . Rollup . Batches [ 3 ] . Batch . ForgeL1TxsNum ] )
l1UserTxs = til . L1TxsToCommonL1Txs ( tc . Queues [ * blocks [ 0 ] . Rollup . Batches [ 3 ] . Batch . ForgeL1TxsNum ] )
@ -210,7 +214,7 @@ func TestZKInputs6(t *testing.T) {
ptOut , err = tp . ProcessTxs ( nil , l1UserTxs , blocks [ 0 ] . Rollup . Batches [ 3 ] . L1CoordinatorTxs , l2Txs )
ptOut , err = tp . ProcessTxs ( nil , l1UserTxs , blocks [ 0 ] . Rollup . Batches [ 3 ] . L1CoordinatorTxs , l2Txs )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut )
sendProofAndCheckResp ( t , ptOut . ZKInputs )
// batch5
// batch5
l1UserTxs = til . L1TxsToCommonL1Txs ( tc . Queues [ * blocks [ 0 ] . Rollup . Batches [ 4 ] . Batch . ForgeL1TxsNum ] )
l1UserTxs = til . L1TxsToCommonL1Txs ( tc . Queues [ * blocks [ 0 ] . Rollup . Batches [ 4 ] . Batch . ForgeL1TxsNum ] )
@ -218,7 +222,7 @@ func TestZKInputs6(t *testing.T) {
ptOut , err = tp . ProcessTxs ( nil , l1UserTxs , blocks [ 0 ] . Rollup . Batches [ 4 ] . L1CoordinatorTxs , l2Txs )
ptOut , err = tp . ProcessTxs ( nil , l1UserTxs , blocks [ 0 ] . Rollup . Batches [ 4 ] . L1CoordinatorTxs , l2Txs )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut )
sendProofAndCheckResp ( t , ptOut . ZKInputs )
// batch6
// batch6
l1UserTxs = til . L1TxsToCommonL1Txs ( tc . Queues [ * blocks [ 0 ] . Rollup . Batches [ 5 ] . Batch . ForgeL1TxsNum ] )
l1UserTxs = til . L1TxsToCommonL1Txs ( tc . Queues [ * blocks [ 0 ] . Rollup . Batches [ 5 ] . Batch . ForgeL1TxsNum ] )
@ -226,10 +230,10 @@ func TestZKInputs6(t *testing.T) {
ptOut , err = tp . ProcessTxs ( nil , l1UserTxs , blocks [ 0 ] . Rollup . Batches [ 5 ] . L1CoordinatorTxs , l2Txs )
ptOut , err = tp . ProcessTxs ( nil , l1UserTxs , blocks [ 0 ] . Rollup . Batches [ 5 ] . L1CoordinatorTxs , l2Txs )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut )
sendProofAndCheckResp ( t , ptOut . ZKInputs )
// batch7
// batch7
// simulate the PoolL2Txs of the batch6
// simulate the PoolL2Txs of the batch7
batchPoolL2 := `
batchPoolL2 := `
Type : PoolL2
Type : PoolL2
PoolTransferToEthAddr ( 1 ) A - B : 200 ( 126 )
PoolTransferToEthAddr ( 1 ) A - B : 200 ( 126 )
@ -244,10 +248,10 @@ func TestZKInputs6(t *testing.T) {
ptOut , err = tp . ProcessTxs ( coordIdxs , l1UserTxs , blocks [ 0 ] . Rollup . Batches [ 6 ] . L1CoordinatorTxs , l2Txs )
ptOut , err = tp . ProcessTxs ( coordIdxs , l1UserTxs , blocks [ 0 ] . Rollup . Batches [ 6 ] . L1CoordinatorTxs , l2Txs )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut )
sendProofAndCheckResp ( t , ptOut . ZKInputs )
// batch8
// batch8
// simulate the PoolL2Txs of the batch7
// simulate the PoolL2Txs of the batch8
batchPoolL2 = `
batchPoolL2 = `
Type : PoolL2
Type : PoolL2
PoolTransfer ( 0 ) A - B : 100 ( 126 )
PoolTransfer ( 0 ) A - B : 100 ( 126 )
@ -262,7 +266,7 @@ func TestZKInputs6(t *testing.T) {
ptOut , err = tp . ProcessTxs ( coordIdxs , l1UserTxs , blocks [ 0 ] . Rollup . Batches [ 7 ] . L1CoordinatorTxs , l2Txs )
ptOut , err = tp . ProcessTxs ( coordIdxs , l1UserTxs , blocks [ 0 ] . Rollup . Batches [ 7 ] . L1CoordinatorTxs , l2Txs )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut )
sendProofAndCheckResp ( t , ptOut . ZKInputs )
// batch9
// batch9
// simulate the PoolL2Txs of the batch9
// simulate the PoolL2Txs of the batch9
@ -279,7 +283,7 @@ func TestZKInputs6(t *testing.T) {
ptOut , err = tp . ProcessTxs ( coordIdxs , l1UserTxs , blocks [ 1 ] . Rollup . Batches [ 0 ] . L1CoordinatorTxs , l2Txs )
ptOut , err = tp . ProcessTxs ( coordIdxs , l1UserTxs , blocks [ 1 ] . Rollup . Batches [ 0 ] . L1CoordinatorTxs , l2Txs )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut )
sendProofAndCheckResp ( t , ptOut . ZKInputs )
// batch10
// batch10
l1UserTxs = til . L1TxsToCommonL1Txs ( tc . Queues [ * blocks [ 1 ] . Rollup . Batches [ 1 ] . Batch . ForgeL1TxsNum ] )
l1UserTxs = til . L1TxsToCommonL1Txs ( tc . Queues [ * blocks [ 1 ] . Rollup . Batches [ 1 ] . Batch . ForgeL1TxsNum ] )
@ -288,5 +292,5 @@ func TestZKInputs6(t *testing.T) {
ptOut , err = tp . ProcessTxs ( coordIdxs , l1UserTxs , blocks [ 1 ] . Rollup . Batches [ 1 ] . L1CoordinatorTxs , l2Txs )
ptOut , err = tp . ProcessTxs ( coordIdxs , l1UserTxs , blocks [ 1 ] . Rollup . Batches [ 1 ] . L1CoordinatorTxs , l2Txs )
require . NoError ( t , err )
require . NoError ( t , err )
sendProofAndCheckResp ( t , ptOut )
sendProofAndCheckResp ( t , ptOut . ZKInputs )
}
}