mirror of
https://github.com/arnaucube/hermez-node.git
synced 2026-02-07 11:26:44 +01:00
Fix process L1Tx for correct ZKInputs generation
- StateDB fix process txs of type CreateAccountDepositTransfer & DepositTransfer
- Add TestZKInputs3 & TestZKInputs4 which:
- have a compatible check in js version to check Circom circuits
compatibility
- adds test of tx type of CreateAccountDepositTransfer &
DepositTransfer
This commit is contained in:
@@ -706,30 +706,11 @@ func (s *StateDB) applyCreateAccount(tx *common.L1Tx) error {
|
||||
// andTransfer parameter is set to true, the method will also apply the
|
||||
// Transfer of the L1Tx/DepositTransfer
|
||||
func (s *StateDB) applyDeposit(tx *common.L1Tx, transfer bool) error {
|
||||
// deposit the tx.EffectiveDepositAmount into the sender account
|
||||
accSender, err := s.GetAccount(tx.FromIdx)
|
||||
if err != nil {
|
||||
return tracerr.Wrap(err)
|
||||
}
|
||||
accSender.Balance = new(big.Int).Add(accSender.Balance, tx.EffectiveDepositAmount)
|
||||
|
||||
// in case that the tx is a L1Tx>DepositTransfer
|
||||
var accReceiver *common.Account
|
||||
if transfer {
|
||||
accReceiver, err = s.GetAccount(tx.ToIdx)
|
||||
if err != nil {
|
||||
return tracerr.Wrap(err)
|
||||
}
|
||||
// subtract amount to the sender
|
||||
accSender.Balance = new(big.Int).Sub(accSender.Balance, tx.EffectiveAmount)
|
||||
// add amount to the receiver
|
||||
accReceiver.Balance = new(big.Int).Add(accReceiver.Balance, tx.EffectiveAmount)
|
||||
}
|
||||
// update sender account in localStateDB
|
||||
p, err := s.UpdateAccount(tx.FromIdx, accSender)
|
||||
if err != nil {
|
||||
return tracerr.Wrap(err)
|
||||
}
|
||||
if s.zki != nil {
|
||||
s.zki.TokenID1[s.i] = accSender.TokenID.BigInt()
|
||||
s.zki.Nonce1[s.i] = accSender.Nonce.BigInt()
|
||||
@@ -739,17 +720,35 @@ func (s *StateDB) applyDeposit(tx *common.L1Tx, transfer bool) error {
|
||||
s.zki.Ay1[s.i] = accSender.PublicKey.Y
|
||||
s.zki.Balance1[s.i] = accSender.Balance
|
||||
s.zki.EthAddr1[s.i] = common.EthAddrToBigInt(accSender.EthAddr)
|
||||
}
|
||||
|
||||
// add the deposit to the sender
|
||||
accSender.Balance = new(big.Int).Add(accSender.Balance, tx.EffectiveDepositAmount)
|
||||
// subtract amount to the sender
|
||||
accSender.Balance = new(big.Int).Sub(accSender.Balance, tx.EffectiveAmount)
|
||||
|
||||
// update sender account in localStateDB
|
||||
p, err := s.UpdateAccount(tx.FromIdx, accSender)
|
||||
if err != nil {
|
||||
return tracerr.Wrap(err)
|
||||
}
|
||||
if s.zki != nil {
|
||||
s.zki.Siblings1[s.i] = siblingsToZKInputFormat(p.Siblings)
|
||||
// IsOld0_1, OldKey1, OldValue1 not needed as this is not an insert
|
||||
}
|
||||
|
||||
// this is done after updating Sender Account (depositer)
|
||||
// in case that the tx is a L1Tx>DepositTransfer
|
||||
var accReceiver *common.Account
|
||||
if transfer {
|
||||
// update receiver account in localStateDB
|
||||
p, err := s.UpdateAccount(tx.ToIdx, accReceiver)
|
||||
if tx.ToIdx == tx.FromIdx {
|
||||
accReceiver = accSender
|
||||
} else {
|
||||
accReceiver, err = s.GetAccount(tx.ToIdx)
|
||||
if err != nil {
|
||||
return tracerr.Wrap(err)
|
||||
}
|
||||
}
|
||||
|
||||
if s.zki != nil {
|
||||
s.zki.TokenID2[s.i] = accReceiver.TokenID.BigInt()
|
||||
s.zki.Nonce2[s.i] = accReceiver.Nonce.BigInt()
|
||||
@@ -759,6 +758,17 @@ func (s *StateDB) applyDeposit(tx *common.L1Tx, transfer bool) error {
|
||||
s.zki.Ay2[s.i] = accReceiver.PublicKey.Y
|
||||
s.zki.Balance2[s.i] = accReceiver.Balance
|
||||
s.zki.EthAddr2[s.i] = common.EthAddrToBigInt(accReceiver.EthAddr)
|
||||
}
|
||||
|
||||
// add amount to the receiver
|
||||
accReceiver.Balance = new(big.Int).Add(accReceiver.Balance, tx.EffectiveAmount)
|
||||
|
||||
// update receiver account in localStateDB
|
||||
p, err := s.UpdateAccount(tx.ToIdx, accReceiver)
|
||||
if err != nil {
|
||||
return tracerr.Wrap(err)
|
||||
}
|
||||
if s.zki != nil {
|
||||
s.zki.Siblings2[s.i] = siblingsToZKInputFormat(p.Siblings)
|
||||
// IsOld0_2, OldKey2, OldValue2 not needed as this is not an insert
|
||||
}
|
||||
@@ -840,7 +850,7 @@ func (s *StateDB) applyTransfer(coordIdxsMap map[common.TokenID]common.Idx,
|
||||
}
|
||||
|
||||
var accReceiver *common.Account
|
||||
if tx.FromIdx == auxToIdx {
|
||||
if auxToIdx == tx.FromIdx {
|
||||
// if Sender is the Receiver, reuse 'accSender' pointer,
|
||||
// because in the DB the account for 'auxToIdx' won't be
|
||||
// updated yet
|
||||
@@ -882,6 +892,7 @@ func (s *StateDB) applyTransfer(coordIdxsMap map[common.TokenID]common.Idx,
|
||||
// applyCreateAccountDepositTransfer, in a single tx, creates a new account,
|
||||
// makes a deposit, and performs a transfer to another account
|
||||
func (s *StateDB) applyCreateAccountDepositTransfer(tx *common.L1Tx) error {
|
||||
auxFromIdx := common.Idx(s.idx + 1)
|
||||
accSender := &common.Account{
|
||||
TokenID: tx.TokenID,
|
||||
Nonce: 0,
|
||||
@@ -889,21 +900,9 @@ func (s *StateDB) applyCreateAccountDepositTransfer(tx *common.L1Tx) error {
|
||||
PublicKey: tx.FromBJJ,
|
||||
EthAddr: tx.FromEthAddr,
|
||||
}
|
||||
accReceiver, err := s.GetAccount(tx.ToIdx)
|
||||
if err != nil {
|
||||
return tracerr.Wrap(err)
|
||||
}
|
||||
// subtract amount to the sender
|
||||
accSender.Balance = new(big.Int).Sub(accSender.Balance, tx.EffectiveAmount)
|
||||
// add amount to the receiver
|
||||
accReceiver.Balance = new(big.Int).Add(accReceiver.Balance, tx.EffectiveAmount)
|
||||
|
||||
// create Account of the Sender
|
||||
p, err := s.CreateAccount(common.Idx(s.idx+1), accSender)
|
||||
if err != nil {
|
||||
return tracerr.Wrap(err)
|
||||
}
|
||||
if s.zki != nil {
|
||||
// Set the State1 before updating the Sender leaf
|
||||
s.zki.TokenID1[s.i] = tx.TokenID.BigInt()
|
||||
s.zki.Nonce1[s.i] = big.NewInt(0)
|
||||
if babyjub.PointCoordSign(tx.FromBJJ.X) {
|
||||
@@ -912,6 +911,17 @@ func (s *StateDB) applyCreateAccountDepositTransfer(tx *common.L1Tx) error {
|
||||
s.zki.Ay1[s.i] = tx.FromBJJ.Y
|
||||
s.zki.Balance1[s.i] = tx.EffectiveDepositAmount
|
||||
s.zki.EthAddr1[s.i] = common.EthAddrToBigInt(tx.FromEthAddr)
|
||||
}
|
||||
|
||||
// subtract amount to the sender
|
||||
accSender.Balance = new(big.Int).Sub(accSender.Balance, tx.EffectiveAmount)
|
||||
|
||||
// create Account of the Sender
|
||||
p, err := s.CreateAccount(common.Idx(s.idx+1), accSender)
|
||||
if err != nil {
|
||||
return tracerr.Wrap(err)
|
||||
}
|
||||
if s.zki != nil {
|
||||
s.zki.Siblings1[s.i] = siblingsToZKInputFormat(p.Siblings)
|
||||
if p.IsOld0 {
|
||||
s.zki.IsOld0_1[s.i] = big.NewInt(1)
|
||||
@@ -921,19 +931,25 @@ func (s *StateDB) applyCreateAccountDepositTransfer(tx *common.L1Tx) error {
|
||||
|
||||
s.zki.Metadata.NewLastIdxRaw = s.idx + 1
|
||||
|
||||
s.zki.AuxFromIdx[s.i] = common.Idx(s.idx + 1).BigInt()
|
||||
s.zki.AuxFromIdx[s.i] = auxFromIdx.BigInt()
|
||||
s.zki.NewAccount[s.i] = big.NewInt(1)
|
||||
|
||||
// intermediate states
|
||||
s.zki.ISOnChain[s.i] = big.NewInt(1)
|
||||
}
|
||||
|
||||
// update receiver account in localStateDB
|
||||
p, err = s.UpdateAccount(tx.ToIdx, accReceiver)
|
||||
var accReceiver *common.Account
|
||||
if tx.ToIdx == auxFromIdx {
|
||||
accReceiver = accSender
|
||||
} else {
|
||||
accReceiver, err = s.GetAccount(tx.ToIdx)
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
return tracerr.Wrap(err)
|
||||
}
|
||||
}
|
||||
|
||||
if s.zki != nil {
|
||||
// Set the State2 before updating the Receiver leaf
|
||||
s.zki.TokenID2[s.i] = accReceiver.TokenID.BigInt()
|
||||
s.zki.Nonce2[s.i] = accReceiver.Nonce.BigInt()
|
||||
if babyjub.PointCoordSign(accReceiver.PublicKey.X) {
|
||||
@@ -942,6 +958,17 @@ func (s *StateDB) applyCreateAccountDepositTransfer(tx *common.L1Tx) error {
|
||||
s.zki.Ay2[s.i] = accReceiver.PublicKey.Y
|
||||
s.zki.Balance2[s.i] = accReceiver.Balance
|
||||
s.zki.EthAddr2[s.i] = common.EthAddrToBigInt(accReceiver.EthAddr)
|
||||
}
|
||||
|
||||
// add amount to the receiver
|
||||
accReceiver.Balance = new(big.Int).Add(accReceiver.Balance, tx.EffectiveAmount)
|
||||
|
||||
// update receiver account in localStateDB
|
||||
p, err = s.UpdateAccount(tx.ToIdx, accReceiver)
|
||||
if err != nil {
|
||||
return tracerr.Wrap(err)
|
||||
}
|
||||
if s.zki != nil {
|
||||
s.zki.Siblings2[s.i] = siblingsToZKInputFormat(p.Siblings)
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user