mirror of
https://github.com/arnaucube/hermez-node.git
synced 2026-02-06 19:06:42 +01:00
Merge pull request #490 from hermeznetwork/feature/pooleffectiveto
In pool l2tx, store effective in aux column
This commit is contained in:
@@ -143,9 +143,9 @@ func (l2db *L2DB) AddTxTest(tx *common.PoolL2Tx) error {
|
||||
}
|
||||
|
||||
// selectPoolTxAPI select part of queries to get PoolL2TxRead
|
||||
const selectPoolTxAPI = `SELECT tx_pool.tx_id, hez_idx(tx_pool.from_idx, token.symbol) AS from_idx, tx_pool.from_eth_addr,
|
||||
tx_pool.from_bjj, hez_idx(tx_pool.to_idx, token.symbol) AS to_idx, tx_pool.to_eth_addr,
|
||||
tx_pool.to_bjj, tx_pool.token_id, tx_pool.amount, tx_pool.fee, tx_pool.nonce,
|
||||
const selectPoolTxAPI = `SELECT tx_pool.tx_id, hez_idx(tx_pool.from_idx, token.symbol) AS from_idx, tx_pool.effective_from_eth_addr,
|
||||
tx_pool.effective_from_bjj, hez_idx(tx_pool.to_idx, token.symbol) AS to_idx, tx_pool.effective_to_eth_addr,
|
||||
tx_pool.effective_to_bjj, tx_pool.token_id, tx_pool.amount, tx_pool.fee, tx_pool.nonce,
|
||||
tx_pool.state, tx_pool.signature, tx_pool.timestamp, tx_pool.batch_num, hez_idx(tx_pool.rq_from_idx, token.symbol) AS rq_from_idx,
|
||||
hez_idx(tx_pool.rq_to_idx, token.symbol) AS rq_to_idx, tx_pool.rq_to_eth_addr, tx_pool.rq_to_bjj, tx_pool.rq_token_id, tx_pool.rq_amount,
|
||||
tx_pool.rq_fee, tx_pool.rq_nonce, tx_pool.tx_type,
|
||||
|
||||
@@ -15,6 +15,7 @@ import (
|
||||
"github.com/hermeznetwork/hermez-node/test"
|
||||
"github.com/hermeznetwork/hermez-node/test/til"
|
||||
"github.com/hermeznetwork/tracerr"
|
||||
"github.com/iden3/go-iden3-crypto/babyjub"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
@@ -629,3 +630,46 @@ func TestAuth(t *testing.T) {
|
||||
assert.Equal(t, 0, offset)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAddGet(t *testing.T) {
|
||||
err := prepareHistoryDB(historyDB)
|
||||
if err != nil {
|
||||
log.Error("Error prepare historyDB", err)
|
||||
}
|
||||
poolL2Txs, err := generatePoolL2Txs()
|
||||
assert.NoError(t, err)
|
||||
|
||||
// We will work with only 3 txs
|
||||
require.GreaterOrEqual(t, len(poolL2Txs), 3)
|
||||
txs := poolL2Txs[:3]
|
||||
// NOTE: By changing the tx fields, the signature will no longer be
|
||||
// valid, but we are not checking the signautre here so it's OK.
|
||||
// 0. Has ToIdx >= 256 && ToEthAddr == 0 && ToBJJ == 0
|
||||
require.GreaterOrEqual(t, int(txs[0].ToIdx), 256)
|
||||
txs[0].ToEthAddr = ethCommon.Address{}
|
||||
txs[0].ToBJJ = babyjub.PublicKeyComp{}
|
||||
// 1. Has ToIdx >= 256 && ToEthAddr != 0 && ToBJJ != 0
|
||||
require.GreaterOrEqual(t, int(txs[1].ToIdx), 256)
|
||||
require.NotEqual(t, txs[1].ToEthAddr, ethCommon.Address{})
|
||||
require.NotEqual(t, txs[1].ToBJJ, babyjub.PublicKeyComp{})
|
||||
// 2. Has ToIdx == 0 && ToEthAddr != 0 && ToBJJ != 0
|
||||
txs[2].ToIdx = 0
|
||||
require.NotEqual(t, txs[2].ToEthAddr, ethCommon.Address{})
|
||||
require.NotEqual(t, txs[2].ToBJJ, babyjub.PublicKeyComp{})
|
||||
|
||||
for i := 0; i < len(txs); i++ {
|
||||
require.NoError(t, txs[i].SetID())
|
||||
require.NoError(t, l2DB.AddTxTest(&txs[i]))
|
||||
}
|
||||
// Verify that the inserts haven't altered any field (specially
|
||||
// ToEthAddr and ToBJJ)
|
||||
for i := 0; i < len(txs); i++ {
|
||||
dbTx, err := l2DB.GetTx(txs[i].TxID)
|
||||
require.NoError(t, err)
|
||||
// Ignore Timestamp, AbsoluteFee, AbsoluteFeeUpdate
|
||||
txs[i].Timestamp = dbTx.Timestamp
|
||||
txs[i].AbsoluteFee = dbTx.AbsoluteFee
|
||||
txs[i].AbsoluteFeeUpdate = dbTx.AbsoluteFeeUpdate
|
||||
assert.Equal(t, txs[i], *dbTx)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,27 +38,27 @@ type PoolL2TxWrite struct {
|
||||
|
||||
// PoolTxAPI represents a L2 Tx pool with extra metadata used by the API
|
||||
type PoolTxAPI struct {
|
||||
TxID common.TxID `meddler:"tx_id"`
|
||||
FromIdx apitypes.HezIdx `meddler:"from_idx"`
|
||||
FromEthAddr *apitypes.HezEthAddr `meddler:"from_eth_addr"`
|
||||
FromBJJ *apitypes.HezBJJ `meddler:"from_bjj"`
|
||||
ToIdx *apitypes.HezIdx `meddler:"to_idx"`
|
||||
ToEthAddr *apitypes.HezEthAddr `meddler:"to_eth_addr"`
|
||||
ToBJJ *apitypes.HezBJJ `meddler:"to_bjj"`
|
||||
Amount apitypes.BigIntStr `meddler:"amount"`
|
||||
Fee common.FeeSelector `meddler:"fee"`
|
||||
Nonce common.Nonce `meddler:"nonce"`
|
||||
State common.PoolL2TxState `meddler:"state"`
|
||||
Signature babyjub.SignatureComp `meddler:"signature"`
|
||||
RqFromIdx *apitypes.HezIdx `meddler:"rq_from_idx"`
|
||||
RqToIdx *apitypes.HezIdx `meddler:"rq_to_idx"`
|
||||
RqToEthAddr *apitypes.HezEthAddr `meddler:"rq_to_eth_addr"`
|
||||
RqToBJJ *apitypes.HezBJJ `meddler:"rq_to_bjj"`
|
||||
RqTokenID *common.TokenID `meddler:"rq_token_id"`
|
||||
RqAmount *apitypes.BigIntStr `meddler:"rq_amount"`
|
||||
RqFee *common.FeeSelector `meddler:"rq_fee"`
|
||||
RqNonce *common.Nonce `meddler:"rq_nonce"`
|
||||
Type common.TxType `meddler:"tx_type"`
|
||||
TxID common.TxID `meddler:"tx_id"`
|
||||
FromIdx apitypes.HezIdx `meddler:"from_idx"`
|
||||
EffectiveFromEthAddr *apitypes.HezEthAddr `meddler:"effective_from_eth_addr"`
|
||||
EffectiveFromBJJ *apitypes.HezBJJ `meddler:"effective_from_bjj"`
|
||||
ToIdx *apitypes.HezIdx `meddler:"to_idx"`
|
||||
EffectiveToEthAddr *apitypes.HezEthAddr `meddler:"effective_to_eth_addr"`
|
||||
EffectiveToBJJ *apitypes.HezBJJ `meddler:"effective_to_bjj"`
|
||||
Amount apitypes.BigIntStr `meddler:"amount"`
|
||||
Fee common.FeeSelector `meddler:"fee"`
|
||||
Nonce common.Nonce `meddler:"nonce"`
|
||||
State common.PoolL2TxState `meddler:"state"`
|
||||
Signature babyjub.SignatureComp `meddler:"signature"`
|
||||
RqFromIdx *apitypes.HezIdx `meddler:"rq_from_idx"`
|
||||
RqToIdx *apitypes.HezIdx `meddler:"rq_to_idx"`
|
||||
RqToEthAddr *apitypes.HezEthAddr `meddler:"rq_to_eth_addr"`
|
||||
RqToBJJ *apitypes.HezBJJ `meddler:"rq_to_bjj"`
|
||||
RqTokenID *common.TokenID `meddler:"rq_token_id"`
|
||||
RqAmount *apitypes.BigIntStr `meddler:"rq_amount"`
|
||||
RqFee *common.FeeSelector `meddler:"rq_fee"`
|
||||
RqNonce *common.Nonce `meddler:"rq_nonce"`
|
||||
Type common.TxType `meddler:"tx_type"`
|
||||
// Extra read fileds
|
||||
BatchNum *common.BatchNum `meddler:"batch_num"`
|
||||
Timestamp time.Time `meddler:"timestamp,utctime"`
|
||||
@@ -81,11 +81,11 @@ func (tx PoolTxAPI) MarshalJSON() ([]byte, error) {
|
||||
"id": tx.TxID,
|
||||
"type": tx.Type,
|
||||
"fromAccountIndex": tx.FromIdx,
|
||||
"fromHezEthereumAddress": tx.FromEthAddr,
|
||||
"fromBJJ": tx.FromBJJ,
|
||||
"fromHezEthereumAddress": tx.EffectiveFromEthAddr,
|
||||
"fromBJJ": tx.EffectiveFromBJJ,
|
||||
"toAccountIndex": tx.ToIdx,
|
||||
"toHezEthereumAddress": tx.ToEthAddr,
|
||||
"toBjj": tx.ToBJJ,
|
||||
"toHezEthereumAddress": tx.EffectiveToEthAddr,
|
||||
"toBjj": tx.EffectiveToBJJ,
|
||||
"amount": tx.Amount,
|
||||
"fee": tx.Fee,
|
||||
"nonce": tx.Nonce,
|
||||
|
||||
@@ -593,11 +593,13 @@ CREATE TABLE wdelayer_vars (
|
||||
CREATE TABLE tx_pool (
|
||||
tx_id BYTEA PRIMARY KEY,
|
||||
from_idx BIGINT NOT NULL,
|
||||
from_eth_addr BYTEA,
|
||||
from_bjj BYTEA,
|
||||
effective_from_eth_addr BYTEA,
|
||||
effective_from_bjj BYTEA,
|
||||
to_idx BIGINT,
|
||||
to_eth_addr BYTEA,
|
||||
to_bjj BYTEA,
|
||||
effective_to_eth_addr BYTEA,
|
||||
effective_to_bjj BYTEA,
|
||||
token_id INT NOT NULL REFERENCES token (token_id) ON DELETE CASCADE,
|
||||
amount BYTEA NOT NULL,
|
||||
amount_f NUMERIC NOT NULL,
|
||||
@@ -624,10 +626,13 @@ CREATE FUNCTION set_pool_tx()
|
||||
AS
|
||||
$BODY$
|
||||
BEGIN
|
||||
SELECT INTO NEW."from_eth_addr", NEW."from_bjj" eth_addr, bjj FROM account WHERE idx = NEW."from_idx";
|
||||
SELECT INTO NEW."effective_from_eth_addr", NEW."effective_from_bjj" eth_addr, bjj FROM account WHERE idx = NEW."from_idx";
|
||||
-- Set to_{eth_addr,bjj}
|
||||
IF NEW.to_idx > 255 THEN
|
||||
SELECT INTO NEW."to_eth_addr", NEW."to_bjj" eth_addr, bjj FROM account WHERE idx = NEW."to_idx";
|
||||
SELECT INTO NEW."effective_to_eth_addr", NEW."effective_to_bjj" eth_addr, bjj FROM account WHERE idx = NEW."to_idx";
|
||||
ELSE
|
||||
NEW."effective_to_eth_addr" = NEW."to_eth_addr";
|
||||
NEW."effective_to_bjj" = NEW."to_bjj";
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
|
||||
Reference in New Issue
Block a user