Browse Source

Merge pull request #490 from hermeznetwork/feature/pooleffectiveto

In pool l2tx, store effective in aux column
feature/sql-semaphore1
a_bennassar 3 years ago
committed by GitHub
parent
commit
1633a88a67
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 81 additions and 32 deletions
  1. +3
    -3
      db/l2db/l2db.go
  2. +44
    -0
      db/l2db/l2db_test.go
  3. +25
    -25
      db/l2db/views.go
  4. +9
    -4
      db/migrations/0001.sql

+ 3
- 3
db/l2db/l2db.go

@ -143,9 +143,9 @@ func (l2db *L2DB) AddTxTest(tx *common.PoolL2Tx) error {
} }
// selectPoolTxAPI select part of queries to get PoolL2TxRead // 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, 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, 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, tx_pool.rq_fee, tx_pool.rq_nonce, tx_pool.tx_type,

+ 44
- 0
db/l2db/l2db_test.go

@ -15,6 +15,7 @@ import (
"github.com/hermeznetwork/hermez-node/test" "github.com/hermeznetwork/hermez-node/test"
"github.com/hermeznetwork/hermez-node/test/til" "github.com/hermeznetwork/hermez-node/test/til"
"github.com/hermeznetwork/tracerr" "github.com/hermeznetwork/tracerr"
"github.com/iden3/go-iden3-crypto/babyjub"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
@ -629,3 +630,46 @@ func TestAuth(t *testing.T) {
assert.Equal(t, 0, offset) 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)
}
}

+ 25
- 25
db/l2db/views.go

@ -38,27 +38,27 @@ type PoolL2TxWrite struct {
// PoolTxAPI represents a L2 Tx pool with extra metadata used by the API // PoolTxAPI represents a L2 Tx pool with extra metadata used by the API
type PoolTxAPI struct { 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 // Extra read fileds
BatchNum *common.BatchNum `meddler:"batch_num"` BatchNum *common.BatchNum `meddler:"batch_num"`
Timestamp time.Time `meddler:"timestamp,utctime"` Timestamp time.Time `meddler:"timestamp,utctime"`
@ -81,11 +81,11 @@ func (tx PoolTxAPI) MarshalJSON() ([]byte, error) {
"id": tx.TxID, "id": tx.TxID,
"type": tx.Type, "type": tx.Type,
"fromAccountIndex": tx.FromIdx, "fromAccountIndex": tx.FromIdx,
"fromHezEthereumAddress": tx.FromEthAddr,
"fromBJJ": tx.FromBJJ,
"fromHezEthereumAddress": tx.EffectiveFromEthAddr,
"fromBJJ": tx.EffectiveFromBJJ,
"toAccountIndex": tx.ToIdx, "toAccountIndex": tx.ToIdx,
"toHezEthereumAddress": tx.ToEthAddr,
"toBjj": tx.ToBJJ,
"toHezEthereumAddress": tx.EffectiveToEthAddr,
"toBjj": tx.EffectiveToBJJ,
"amount": tx.Amount, "amount": tx.Amount,
"fee": tx.Fee, "fee": tx.Fee,
"nonce": tx.Nonce, "nonce": tx.Nonce,

+ 9
- 4
db/migrations/0001.sql

@ -593,11 +593,13 @@ CREATE TABLE wdelayer_vars (
CREATE TABLE tx_pool ( CREATE TABLE tx_pool (
tx_id BYTEA PRIMARY KEY, tx_id BYTEA PRIMARY KEY,
from_idx BIGINT NOT NULL, 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_idx BIGINT,
to_eth_addr BYTEA, to_eth_addr BYTEA,
to_bjj 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, token_id INT NOT NULL REFERENCES token (token_id) ON DELETE CASCADE,
amount BYTEA NOT NULL, amount BYTEA NOT NULL,
amount_f NUMERIC NOT NULL, amount_f NUMERIC NOT NULL,
@ -624,10 +626,13 @@ CREATE FUNCTION set_pool_tx()
AS AS
$BODY$ $BODY$
BEGIN 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} -- Set to_{eth_addr,bjj}
IF NEW.to_idx > 255 THEN 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; END IF;
RETURN NEW; RETURN NEW;
END; END;

Loading…
Cancel
Save