mirror of
https://github.com/arnaucube/hermez-node.git
synced 2026-02-06 19:06:42 +01:00
Update ZKI gen to match circuit behaviour for Exit
Currently the circuit does not use an Exit Leaf at the Exit MerkleTree when the Amount=0 & EffectiveAmount=0, but it does use an Exit Leaf when the Amount>0 but EffectiveAmount=0 (for example when tx.Amount > sender.Balance). This is a particularity of the approach of the circuit, the idea will be in the future to update the circuit and when Amount>0 but EffectiveAmount=0, to not add the Exit in the Exits MerkleTree, but for the moment the Go code is adapted to the circuit and when an Exit with Amount>0 & EffectiveAmount=0, it will be added to the Leaf of the Exit MerkleTree.
This commit is contained in:
@@ -605,7 +605,7 @@ func (tp *TxProcessor) ProcessL1Tx(exitTree *merkletree.MerkleTree, tx *common.L
|
||||
|
||||
// execute exit flow
|
||||
// coordIdxsMap is 'nil', as at L1Txs there is no L2 fees
|
||||
exitAccount, newExit, err := tp.applyExit(nil, nil, exitTree, tx.Tx())
|
||||
exitAccount, newExit, err := tp.applyExit(nil, nil, exitTree, tx.Tx(), tx.Amount)
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
return nil, nil, false, nil, tracerr.Wrap(err)
|
||||
@@ -730,7 +730,7 @@ func (tp *TxProcessor) ProcessL2Tx(coordIdxsMap map[common.TokenID]common.Idx,
|
||||
}
|
||||
case common.TxTypeExit:
|
||||
// execute exit flow
|
||||
exitAccount, newExit, err := tp.applyExit(coordIdxsMap, collectedFees, exitTree, tx.Tx())
|
||||
exitAccount, newExit, err := tp.applyExit(coordIdxsMap, collectedFees, exitTree, tx.Tx(), tx.Amount)
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
return nil, nil, false, tracerr.Wrap(err)
|
||||
@@ -1104,7 +1104,7 @@ func (tp *TxProcessor) applyCreateAccountDepositTransfer(tx *common.L1Tx) error
|
||||
// new Leaf in the ExitTree.
|
||||
func (tp *TxProcessor) applyExit(coordIdxsMap map[common.TokenID]common.Idx,
|
||||
collectedFees map[common.TokenID]*big.Int, exitTree *merkletree.MerkleTree,
|
||||
tx common.Tx) (*common.Account, bool, error) {
|
||||
tx common.Tx, originalAmount *big.Int) (*common.Account, bool, error) {
|
||||
// 0. subtract tx.Amount from current Account in StateMT
|
||||
// add the tx.Amount into the Account (tx.FromIdx) in the ExitMT
|
||||
acc, err := tp.s.GetAccount(tx.FromIdx)
|
||||
@@ -1174,7 +1174,17 @@ func (tp *TxProcessor) applyExit(coordIdxsMap map[common.TokenID]common.Idx,
|
||||
if exitTree == nil {
|
||||
return nil, false, nil
|
||||
}
|
||||
if tx.Amount.Cmp(big.NewInt(0)) == 0 { // Amount == 0
|
||||
|
||||
// Do not add the Exit when Amount=0, not EffectiveAmount=0. In
|
||||
// txprocessor.applyExit function, the tx.Amount is in reality the
|
||||
// EffectiveAmount, that's why is used here the originalAmount
|
||||
// parameter, which contains the real value of the tx.Amount (not
|
||||
// tx.EffectiveAmount). This is a particularity of the approach of the
|
||||
// circuit, the idea will be in the future to update the circuit and
|
||||
// when Amount>0 but EffectiveAmount=0, to not add the Exit in the
|
||||
// Exits MerkleTree, but for the moment the Go code is adapted to the
|
||||
// circuit.
|
||||
if originalAmount.Cmp(big.NewInt(0)) == 0 { // Amount == 0
|
||||
// if the Exit Amount==0, the Exit is not added to the ExitTree
|
||||
return nil, false, nil
|
||||
}
|
||||
@@ -1187,6 +1197,8 @@ func (tp *TxProcessor) applyExit(coordIdxsMap map[common.TokenID]common.Idx,
|
||||
exitAccount := &common.Account{
|
||||
TokenID: acc.TokenID,
|
||||
Nonce: common.Nonce(0),
|
||||
// as is a common.Tx, the Amount is already an
|
||||
// EffectiveAmount
|
||||
Balance: tx.Amount,
|
||||
BJJ: acc.BJJ,
|
||||
EthAddr: acc.EthAddr,
|
||||
@@ -1200,6 +1212,8 @@ func (tp *TxProcessor) applyExit(coordIdxsMap map[common.TokenID]common.Idx,
|
||||
tp.zki.Sign2[tp.i] = big.NewInt(1)
|
||||
}
|
||||
tp.zki.Ay2[tp.i] = accBJJY
|
||||
// as is a common.Tx, the Amount is already an
|
||||
// EffectiveAmount
|
||||
tp.zki.Balance2[tp.i] = tx.Amount
|
||||
tp.zki.EthAddr2[tp.i] = common.EthAddrToBigInt(acc.EthAddr)
|
||||
// as Leaf didn't exist in the ExitTree, set NewExit[i]=1
|
||||
|
||||
@@ -1018,22 +1018,22 @@ func TestUpdatedAccounts(t *testing.T) {
|
||||
assert.NoError(t, err)
|
||||
|
||||
set := `
|
||||
Type: Blockchain
|
||||
AddToken(1)
|
||||
CreateAccountCoordinator(0) Coord // 256
|
||||
CreateAccountCoordinator(1) Coord // 257
|
||||
> batch // 1
|
||||
CreateAccountDeposit(0) A: 50 // 258
|
||||
CreateAccountDeposit(0) B: 60 // 259
|
||||
CreateAccountDeposit(1) A: 70 // 260
|
||||
CreateAccountDeposit(1) B: 80 // 261
|
||||
> batchL1 // 2
|
||||
> batchL1 // 3
|
||||
Transfer(0) A-B: 5 (126)
|
||||
> batch // 4
|
||||
Exit(1) B: 5 (126)
|
||||
> batch // 5
|
||||
> block
|
||||
Type: Blockchain
|
||||
AddToken(1)
|
||||
CreateAccountCoordinator(0) Coord // 256
|
||||
CreateAccountCoordinator(1) Coord // 257
|
||||
> batch // 1
|
||||
CreateAccountDeposit(0) A: 50 // 258
|
||||
CreateAccountDeposit(0) B: 60 // 259
|
||||
CreateAccountDeposit(1) A: 70 // 260
|
||||
CreateAccountDeposit(1) B: 80 // 261
|
||||
> batchL1 // 2
|
||||
> batchL1 // 3
|
||||
Transfer(0) A-B: 5 (126)
|
||||
> batch // 4
|
||||
Exit(1) B: 5 (126)
|
||||
> batch // 5
|
||||
> block
|
||||
`
|
||||
|
||||
chainID := uint16(0)
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user