forked from cerc-io/ipld-eth-server
Merge pull request #37 from 8thlight/add-block-id-to-transactions
Associate saved transactions to their block
This commit is contained in:
commit
963cc83299
@ -10,18 +10,24 @@ type BlockchainDBObserver struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (observer BlockchainDBObserver) NotifyBlockAdded(block Block) {
|
func (observer BlockchainDBObserver) NotifyBlockAdded(block Block) {
|
||||||
observer.Db.MustExec("Insert INTO blocks "+
|
insertedBlockId := saveBlock(observer, block)
|
||||||
"(block_number, block_gaslimit, block_gasused, block_time) "+
|
saveTransactions(insertedBlockId, block.Transactions, observer)
|
||||||
"VALUES ($1, $2, $3, $4)",
|
}
|
||||||
block.Number.Int64(), block.GasLimit.Int64(), block.GasUsed.Int64(), block.Time.Int64())
|
|
||||||
|
|
||||||
for _, transaction := range block.Transactions {
|
func saveBlock(observer BlockchainDBObserver, block Block) int64 {
|
||||||
observer.saveTransaction(transaction)
|
insertedBlock := observer.Db.QueryRow("Insert INTO blocks "+
|
||||||
|
"(block_number, block_gaslimit, block_gasused, block_time) "+
|
||||||
|
"VALUES ($1, $2, $3, $4) RETURNING id",
|
||||||
|
block.Number.Int64(), block.GasLimit.Int64(), block.GasUsed.Int64(), block.Time.Int64())
|
||||||
|
var blockId int64
|
||||||
|
insertedBlock.Scan(&blockId)
|
||||||
|
return blockId
|
||||||
|
}
|
||||||
|
|
||||||
|
func saveTransactions(blockId int64, transactions []Transaction, observer BlockchainDBObserver) {
|
||||||
|
for _, transaction := range transactions {
|
||||||
|
observer.Db.MustExec("Insert INTO transactions "+
|
||||||
|
"(block_id, tx_hash, tx_nonce, tx_to, tx_gaslimit, tx_gasprice, tx_value) VALUES ($1, $2, $3, $4, $5, $6, $7)",
|
||||||
|
blockId, transaction.Hash, transaction.Nonce, transaction.To, transaction.GasLimit, transaction.GasPrice, transaction.Value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (observer BlockchainDBObserver) saveTransaction(transaction Transaction) {
|
|
||||||
observer.Db.MustExec("Insert INTO transactions "+
|
|
||||||
"(tx_hash, tx_nonce, tx_to, tx_gaslimit, tx_gasprice, tx_value) VALUES ($1, $2, $3, $4, $5, $6)",
|
|
||||||
transaction.Hash, transaction.Nonce, transaction.To, transaction.GasLimit, transaction.GasPrice, transaction.Value)
|
|
||||||
}
|
|
||||||
|
@ -30,8 +30,8 @@ var _ = Describe("Saving blocks to the database", func() {
|
|||||||
|
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
db, err = sqlx.Connect("postgres", pgConfig)
|
db, err = sqlx.Connect("postgres", pgConfig)
|
||||||
db.MustExec("DELETE FROM blocks")
|
|
||||||
db.MustExec("DELETE FROM transactions")
|
db.MustExec("DELETE FROM transactions")
|
||||||
|
db.MustExec("DELETE FROM blocks")
|
||||||
})
|
})
|
||||||
|
|
||||||
It("implements the observer interface", func() {
|
It("implements the observer interface", func() {
|
||||||
@ -146,6 +146,49 @@ var _ = Describe("Saving blocks to the database", func() {
|
|||||||
Expect(savedTransaction.GasPrice).To(Equal(gasPrice))
|
Expect(savedTransaction.GasPrice).To(Equal(gasPrice))
|
||||||
Expect(savedTransaction.Value).To(Equal(value))
|
Expect(savedTransaction.Value).To(Equal(value))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("associates the transaction with the block", func() {
|
||||||
|
gasLimit := int64(5000)
|
||||||
|
|
||||||
|
txRecord := core.Transaction{}
|
||||||
|
blockNumber := big.NewInt(1)
|
||||||
|
gasUsed := big.NewInt(10)
|
||||||
|
blockTime := big.NewInt(1508981640)
|
||||||
|
block := core.Block{
|
||||||
|
Number: blockNumber,
|
||||||
|
GasLimit: big.NewInt(gasLimit),
|
||||||
|
GasUsed: gasUsed,
|
||||||
|
Time: blockTime,
|
||||||
|
Transactions: []core.Transaction{txRecord},
|
||||||
|
}
|
||||||
|
|
||||||
|
observer := core.BlockchainDBObserver{Db: db}
|
||||||
|
observer.NotifyBlockAdded(block)
|
||||||
|
|
||||||
|
blockRows, err := db.Query("SELECT id FROM blocks")
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
|
||||||
|
var actualBlockIds []int64
|
||||||
|
for blockRows.Next() {
|
||||||
|
var actualBlockId int64
|
||||||
|
blockRows.Scan(&actualBlockId)
|
||||||
|
actualBlockIds = append(actualBlockIds, actualBlockId)
|
||||||
|
}
|
||||||
|
|
||||||
|
transactionRows, err := db.Query("SELECT block_id FROM transactions")
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
|
||||||
|
var transactionBlockIds []int64
|
||||||
|
for transactionRows.Next() {
|
||||||
|
var transactionBlockId int64
|
||||||
|
transactionRows.Scan(&transactionBlockId)
|
||||||
|
transactionBlockIds = append(transactionBlockIds, transactionBlockId)
|
||||||
|
}
|
||||||
|
|
||||||
|
Expect(len(actualBlockIds)).To(Equal(1))
|
||||||
|
Expect(len(transactionBlockIds)).To(Equal(1))
|
||||||
|
Expect(transactionBlockIds[0]).To(Equal(actualBlockIds[0]))
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
})
|
})
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
ALTER TABLE transactions
|
||||||
|
DROP COLUMN block_id
|
@ -0,0 +1,5 @@
|
|||||||
|
ALTER TABLE transactions
|
||||||
|
ADD COLUMN block_id INTEGER NOT NULL,
|
||||||
|
ADD CONSTRAINT fk_test
|
||||||
|
FOREIGN KEY (block_id)
|
||||||
|
REFERENCES blocks (id)
|
@ -87,7 +87,8 @@ CREATE TABLE transactions (
|
|||||||
tx_to character varying(66),
|
tx_to character varying(66),
|
||||||
tx_gaslimit numeric,
|
tx_gaslimit numeric,
|
||||||
tx_gasprice numeric,
|
tx_gasprice numeric,
|
||||||
tx_value numeric
|
tx_value numeric,
|
||||||
|
block_id integer NOT NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@ -148,6 +149,15 @@ ALTER TABLE ONLY transactions
|
|||||||
ADD CONSTRAINT transactions_pkey PRIMARY KEY (id);
|
ADD CONSTRAINT transactions_pkey PRIMARY KEY (id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: transactions fk_test; Type: FK CONSTRAINT; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY transactions
|
||||||
|
ADD CONSTRAINT fk_test FOREIGN KEY (block_id) REFERENCES blocks(id);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- PostgreSQL database dump complete
|
-- PostgreSQL database dump complete
|
||||||
--
|
--
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user