package batchbuilder import ( "math/big" "github.com/hermeznetwork/hermez-node/common" "github.com/iden3/go-merkletree/db" ) // TODO next iteration move the methods of this file into StateDB, which Synchronizer will use in the disk DB, and BatchBuilder will use with the MemoryDB // GetBalance returns the balance for a given Idx from the DB func (bb *BatchBuilder) GetBalance(tx db.Tx, idx common.Idx) (*common.Account, error) { idxBytes := idx.Bytes() vBytes, err := tx.Get(idxBytes[:]) if err != nil { return nil, err } var b [32 * common.NLEAFELEMS]byte copy(b[:], vBytes) leaf, err := common.AccountFromBytes(b) if err != nil { return nil, err } return leaf, nil } // CreateBalance stores the Account into the Idx position in the MerkleTree, also adds db entry for the Account value func (bb *BatchBuilder) CreateBalance(tx db.Tx, idx common.Idx, leaf common.Account) error { // store at the DB the key: v, and value: leaf.Bytes() v, err := leaf.HashValue() if err != nil { return err } leafBytes, err := leaf.Bytes() if err != nil { return err } // store the Account value tx.Put(v.Bytes(), leafBytes[:]) // Add k & v into the MT err = bb.mt.Add(idx.BigInt(), v) if err != nil { return err } return nil } // UpdateBalance updates the balance of the leaf of a given Idx. // If sending==true: will substract the amount, if sending==false will add the ammount func (bb *BatchBuilder) UpdateBalance(tx db.Tx, idx common.Idx, amount *big.Int, sending bool) error { leaf, err := bb.GetBalance(tx, idx) if err != nil { return err } // TODO add checks that the numbers are correct and there is no missing value neither impossible values if sending { leaf.Balance = new(big.Int).Sub(leaf.Balance, amount) } else { leaf.Balance = new(big.Int).Add(leaf.Balance, amount) } // store at the DB the key: v, and value: leaf.Bytes() v, err := leaf.HashValue() if err != nil { return err } leafBytes, err := leaf.Bytes() if err != nil { return err } // store the Account value tx.Put(v.Bytes(), leafBytes[:]) // Add k & v into the MT _, err = bb.mt.Update(idx.BigInt(), v) if err != nil { return err } return nil }