From 5dcf534b2cd9d4031168fdd19933767ea41eb353 Mon Sep 17 00:00:00 2001 From: Ian Norden Date: Thu, 4 Apr 2019 15:21:39 -0500 Subject: [PATCH] review fixes --- db/migrations/00001_create_blocks_table.sql | 10 +++++----- ...02_create_full_sync_transactions_table.sql | 4 ++-- db/migrations/00022_create_headers_table.sql | 7 ++----- ...5_create_light_sync_transactions_table.sql | 4 ++-- db/migrations/00026_create_uncles_table.sql | 6 +----- ...27_update_block_and_uncle_reward_types.sql | 9 --------- pkg/core/block.go | 6 +++--- pkg/core/transaction.go | 4 ++-- pkg/core/uncle.go | 1 - .../postgres/repositories/block_repository.go | 20 +++++++++---------- .../repositories/block_repository_test.go | 8 ++++---- .../repositories/contract_repository.go | 4 ++-- .../repositories/header_repository.go | 2 +- .../repositories/header_repository_test.go | 4 ++-- pkg/fakes/data.go | 1 - pkg/fakes/mock_blockchain.go | 10 +++------- pkg/geth/converters/common/block_converter.go | 9 +-------- pkg/geth/converters/common/block_rewards.go | 14 ++++++++++++- 18 files changed, 53 insertions(+), 70 deletions(-) delete mode 100644 db/migrations/00027_update_block_and_uncle_reward_types.sql diff --git a/db/migrations/00001_create_blocks_table.sql b/db/migrations/00001_create_blocks_table.sql index 9f787381..c11cf1de 100644 --- a/db/migrations/00001_create_blocks_table.sql +++ b/db/migrations/00001_create_blocks_table.sql @@ -3,15 +3,15 @@ CREATE TABLE public.blocks ( id SERIAL PRIMARY KEY, difficulty BIGINT, extra_data VARCHAR, - gaslimit BIGINT, - gasused BIGINT, + gas_limit BIGINT, + gas_used BIGINT, hash VARCHAR(66), miner VARCHAR(42), nonce VARCHAR(20), "number" BIGINT, - parenthash VARCHAR(66), - reward DOUBLE PRECISION, - uncles_reward DOUBLE PRECISION, + parent_hash VARCHAR(66), + reward NUMERIC, + uncles_reward NUMERIC, "size" VARCHAR, "time" BIGINT, is_final BOOLEAN, diff --git a/db/migrations/00002_create_full_sync_transactions_table.sql b/db/migrations/00002_create_full_sync_transactions_table.sql index dc42a7c7..72548c95 100644 --- a/db/migrations/00002_create_full_sync_transactions_table.sql +++ b/db/migrations/00002_create_full_sync_transactions_table.sql @@ -2,8 +2,8 @@ CREATE TABLE full_sync_transactions ( id SERIAL PRIMARY KEY, block_id INTEGER NOT NULL REFERENCES blocks(id) ON DELETE CASCADE, - gaslimit NUMERIC, - gasprice NUMERIC, + gas_limit NUMERIC, + gas_price NUMERIC, hash VARCHAR(66), input_data BYTEA, nonce NUMERIC, diff --git a/db/migrations/00022_create_headers_table.sql b/db/migrations/00022_create_headers_table.sql index 1867044f..925c202b 100644 --- a/db/migrations/00022_create_headers_table.sql +++ b/db/migrations/00022_create_headers_table.sql @@ -5,11 +5,8 @@ CREATE TABLE public.headers ( block_number BIGINT, raw JSONB, block_timestamp NUMERIC, - eth_node_id INTEGER, - eth_node_fingerprint VARCHAR(128), - CONSTRAINT eth_nodes_fk FOREIGN KEY (eth_node_id) - REFERENCES eth_nodes (id) - ON DELETE CASCADE + eth_node_id INTEGER NOT NULL REFERENCES eth_nodes (id) ON DELETE CASCADE, + eth_node_fingerprint VARCHAR(128) ); -- Index is removed when table is diff --git a/db/migrations/00025_create_light_sync_transactions_table.sql b/db/migrations/00025_create_light_sync_transactions_table.sql index 6773c1e3..ab37c996 100644 --- a/db/migrations/00025_create_light_sync_transactions_table.sql +++ b/db/migrations/00025_create_light_sync_transactions_table.sql @@ -3,8 +3,8 @@ CREATE TABLE light_sync_transactions ( id SERIAL PRIMARY KEY, header_id INTEGER NOT NULL REFERENCES headers(id) ON DELETE CASCADE, hash TEXT, - gaslimit NUMERIC, - gasprice NUMERIC, + gas_limit NUMERIC, + gas_price NUMERIC, input_data BYTEA, nonce NUMERIC, raw BYTEA, diff --git a/db/migrations/00026_create_uncles_table.sql b/db/migrations/00026_create_uncles_table.sql index 524c1f4b..9ec0ffa7 100644 --- a/db/migrations/00026_create_uncles_table.sql +++ b/db/migrations/00026_create_uncles_table.sql @@ -3,16 +3,12 @@ CREATE TABLE public.uncles ( id SERIAL PRIMARY KEY, hash VARCHAR(66) NOT NULL, block_id INTEGER NOT NULL REFERENCES blocks (id) ON DELETE CASCADE, - block_hash VARCHAR(66) NOT NULL, reward NUMERIC NOT NULL, miner VARCHAR(42) NOT NULL, raw JSONB, block_timestamp NUMERIC, - eth_node_id INTEGER, + eth_node_id INTEGER NOT NULL REFERENCES eth_nodes (id) ON DELETE CASCADE, eth_node_fingerprint VARCHAR(128), - CONSTRAINT eth_nodes_fk FOREIGN KEY (eth_node_id) - REFERENCES eth_nodes (id) - ON DELETE CASCADE, UNIQUE (block_id, hash) ); diff --git a/db/migrations/00027_update_block_and_uncle_reward_types.sql b/db/migrations/00027_update_block_and_uncle_reward_types.sql deleted file mode 100644 index 8bca0604..00000000 --- a/db/migrations/00027_update_block_and_uncle_reward_types.sql +++ /dev/null @@ -1,9 +0,0 @@ --- +goose Up -ALTER TABLE blocks - ALTER COLUMN uncles_reward TYPE NUMERIC USING uncles_reward::NUMERIC, - ALTER COLUMN reward TYPE NUMERIC USING reward::NUMERIC; - --- +goose Down -ALTER TABLE blocks - ALTER COLUMN uncles_reward TYPE DOUBLE PRECISION USING uncles_reward::DOUBLE PRECISION, - ALTER COLUMN reward TYPE DOUBLE PRECISION USING reward::DOUBLE PRECISION; diff --git a/pkg/core/block.go b/pkg/core/block.go index f878df98..e877f80d 100644 --- a/pkg/core/block.go +++ b/pkg/core/block.go @@ -20,14 +20,14 @@ type Block struct { Reward string `db:"reward"` Difficulty int64 `db:"difficulty"` ExtraData string `db:"extra_data"` - GasLimit uint64 `db:"gaslimit"` - GasUsed uint64 `db:"gasused"` + GasLimit uint64 `db:"gas_limit"` + GasUsed uint64 `db:"gas_used"` Hash string `db:"hash"` IsFinal bool `db:"is_final"` Miner string `db:"miner"` Nonce string `db:"nonce"` Number int64 `db:"number"` - ParentHash string `db:"parenthash"` + ParentHash string `db:"parent_hash"` Size string `db:"size"` Time int64 `db:"time"` Transactions []TransactionModel diff --git a/pkg/core/transaction.go b/pkg/core/transaction.go index c5198cf7..92d18edc 100644 --- a/pkg/core/transaction.go +++ b/pkg/core/transaction.go @@ -19,8 +19,8 @@ package core type TransactionModel struct { Data []byte `db:"input_data"` From string `db:"tx_from"` - GasLimit uint64 - GasPrice int64 + GasLimit uint64 `db:"gas_limit"` + GasPrice int64 `db:"gas_price"` Hash string Nonce uint64 Raw []byte diff --git a/pkg/core/uncle.go b/pkg/core/uncle.go index 018d5924..dfece8e7 100644 --- a/pkg/core/uncle.go +++ b/pkg/core/uncle.go @@ -19,7 +19,6 @@ package core type Uncle struct { Id int64 Miner string - BlockHash string `db:"block_hash"` Reward string Hash string Timestamp string `db:"block_timestamp"` diff --git a/pkg/datastore/postgres/repositories/block_repository.go b/pkg/datastore/postgres/repositories/block_repository.go index 80affa11..82fd0960 100644 --- a/pkg/datastore/postgres/repositories/block_repository.go +++ b/pkg/datastore/postgres/repositories/block_repository.go @@ -90,13 +90,13 @@ func (blockRepository BlockRepository) GetBlock(blockNumber int64) (core.Block, blockRows := blockRepository.database.QueryRowx( `SELECT id, number, - gaslimit, - gasused, + gas_limit, + gas_used, time, difficulty, hash, nonce, - parenthash, + parent_hash, size, uncle_hash, is_final, @@ -127,7 +127,7 @@ func (blockRepository BlockRepository) insertBlock(block core.Block) (int64, err } insertBlockErr := tx.QueryRow( `INSERT INTO blocks - (eth_node_id, number, gaslimit, gasused, time, difficulty, hash, nonce, parenthash, size, uncle_hash, is_final, miner, extra_data, reward, uncles_reward, eth_node_fingerprint) + (eth_node_id, number, gas_limit, gas_used, time, difficulty, hash, nonce, parent_hash, size, uncle_hash, is_final, miner, extra_data, reward, uncles_reward, eth_node_fingerprint) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17) RETURNING id `, blockRepository.database.NodeID, @@ -196,10 +196,10 @@ func (blockRepository BlockRepository) createUncles(tx *sqlx.Tx, blockId int64, func (blockRepository BlockRepository) createUncle(tx *sqlx.Tx, blockId int64, uncle core.Uncle) error { _, err := tx.Exec( `INSERT INTO uncles - (hash, block_id, block_hash, reward, miner, raw, block_timestamp, eth_node_id, eth_node_fingerprint) - VALUES ($1, $2, $3, $4, $5, $6, $7::NUMERIC, $8, $9) + (hash, block_id, reward, miner, raw, block_timestamp, eth_node_id, eth_node_fingerprint) + VALUES ($1, $2, $3, $4, $5, $6, $7::NUMERIC, $8) RETURNING id`, - uncle.Hash, blockId, uncle.BlockHash, utilities.NullToZero(uncle.Reward), uncle.Miner, uncle.Raw, uncle.Timestamp, blockRepository.database.NodeID, blockRepository.database.Node.ID) + uncle.Hash, blockId, utilities.NullToZero(uncle.Reward), uncle.Miner, uncle.Raw, uncle.Timestamp, blockRepository.database.NodeID, blockRepository.database.Node.ID) return err } @@ -226,7 +226,7 @@ func nullStringToZero(s string) string { func (blockRepository BlockRepository) createTransaction(tx *sqlx.Tx, blockId int64, transaction core.TransactionModel) error { _, err := tx.Exec( `INSERT INTO full_sync_transactions - (block_id, gaslimit, gasprice, hash, input_data, nonce, raw, tx_from, tx_index, tx_to, "value") + (block_id, gas_limit, gas_price, hash, input_data, nonce, raw, tx_from, tx_index, tx_to, "value") VALUES ($1, $2::NUMERIC, $3::NUMERIC, $4, $5, $6::NUMERIC, $7, $8, $9::NUMERIC, $10, $11::NUMERIC) RETURNING id`, blockId, transaction.GasLimit, transaction.GasPrice, transaction.Hash, transaction.Data, transaction.Nonce, transaction.Raw, transaction.From, transaction.TxIndex, transaction.To, nullStringToZero(transaction.Value)) @@ -325,8 +325,8 @@ func (blockRepository BlockRepository) loadBlock(blockRows *sqlx.Row) (core.Bloc } transactionRows, err := blockRepository.database.Queryx(` SELECT hash, - gaslimit, - gasprice, + gas_limit, + gas_price, input_data, nonce, raw, diff --git a/pkg/datastore/postgres/repositories/block_repository_test.go b/pkg/datastore/postgres/repositories/block_repository_test.go index 2d355667..39d2c9df 100644 --- a/pkg/datastore/postgres/repositories/block_repository_test.go +++ b/pkg/datastore/postgres/repositories/block_repository_test.go @@ -176,7 +176,7 @@ var _ = Describe("Saving blocks", func() { Expect(savedBlock.UnclesReward).To(Equal(big.NewInt(0).Div(big.NewInt(5000000000000000000), big.NewInt(32)).String())) var uncleModel core.Uncle - err := db.Get(&uncleModel, `SELECT hash, block_hash, reward, miner, raw, block_timestamp FROM uncles + err := db.Get(&uncleModel, `SELECT hash, reward, miner, raw, block_timestamp FROM uncles WHERE block_id = $1 AND hash = $2`, id, common.BytesToHash([]byte{1, 2, 3}).Hex()) Expect(err).ToNot(HaveOccurred()) Expect(uncleModel.Hash).To(Equal(common.BytesToHash([]byte{1, 2, 3}).Hex())) @@ -185,7 +185,7 @@ var _ = Describe("Saving blocks", func() { Expect(uncleModel.Timestamp).To(Equal("111111111")) }) - It("saves one uncle associated to the block", func() { + It("saves two uncles associated to the block", func() { block := core.Block{ Hash: fakes.FakeHash.String(), Number: 123, @@ -207,7 +207,7 @@ var _ = Describe("Saving blocks", func() { Expect(savedBlock.UnclesReward).To(Equal(big.NewInt(0).Div(b, big.NewInt(32)).String())) var uncleModel core.Uncle - err := db.Get(&uncleModel, `SELECT hash, block_hash, reward, miner, raw, block_timestamp FROM uncles + err := db.Get(&uncleModel, `SELECT hash, reward, miner, raw, block_timestamp FROM uncles WHERE block_id = $1 AND hash = $2`, id, common.BytesToHash([]byte{1, 2, 3}).Hex()) Expect(err).ToNot(HaveOccurred()) Expect(uncleModel.Hash).To(Equal(common.BytesToHash([]byte{1, 2, 3}).Hex())) @@ -215,7 +215,7 @@ var _ = Describe("Saving blocks", func() { Expect(uncleModel.Miner).To(Equal(fakes.FakeAddress.Hex())) Expect(uncleModel.Timestamp).To(Equal("111111111")) - err = db.Get(&uncleModel, `SELECT hash, block_hash, reward, miner, raw, block_timestamp FROM uncles + err = db.Get(&uncleModel, `SELECT hash, reward, miner, raw, block_timestamp FROM uncles WHERE block_id = $1 AND hash = $2`, id, common.BytesToHash([]byte{3, 2, 1}).Hex()) Expect(err).ToNot(HaveOccurred()) Expect(uncleModel.Hash).To(Equal(common.BytesToHash([]byte{3, 2, 1}).Hex())) diff --git a/pkg/datastore/postgres/repositories/contract_repository.go b/pkg/datastore/postgres/repositories/contract_repository.go index fc68f510..d198ecae 100644 --- a/pkg/datastore/postgres/repositories/contract_repository.go +++ b/pkg/datastore/postgres/repositories/contract_repository.go @@ -82,8 +82,8 @@ func (contractRepository ContractRepository) addTransactions(contract core.Contr nonce, tx_to, tx_from, - gaslimit, - gasprice, + gas_limit, + gas_price, value, input_data FROM full_sync_transactions diff --git a/pkg/datastore/postgres/repositories/header_repository.go b/pkg/datastore/postgres/repositories/header_repository.go index 6ee990f8..52b32c9d 100644 --- a/pkg/datastore/postgres/repositories/header_repository.go +++ b/pkg/datastore/postgres/repositories/header_repository.go @@ -52,7 +52,7 @@ func (repository HeaderRepository) CreateOrUpdateHeader(header core.Header) (int func (repository HeaderRepository) CreateTransactions(headerID int64, transactions []core.TransactionModel) error { for _, transaction := range transactions { _, err := repository.database.Exec(`INSERT INTO public.light_sync_transactions - (header_id, hash, gaslimit, gasprice, input_data, nonce, raw, tx_from, tx_index, tx_to, "value") + (header_id, hash, gas_limit, gas_price, input_data, nonce, raw, tx_from, tx_index, tx_to, "value") VALUES ($1, $2, $3::NUMERIC, $4::NUMERIC, $5, $6::NUMERIC, $7, $8, $9::NUMERIC, $10, $11::NUMERIC) ON CONFLICT DO NOTHING`, headerID, transaction.Hash, transaction.GasLimit, transaction.GasPrice, transaction.Data, transaction.Nonce, transaction.Raw, transaction.From, transaction.TxIndex, transaction.To, diff --git a/pkg/datastore/postgres/repositories/header_repository_test.go b/pkg/datastore/postgres/repositories/header_repository_test.go index a22f6131..ce861857 100644 --- a/pkg/datastore/postgres/repositories/header_repository_test.go +++ b/pkg/datastore/postgres/repositories/header_repository_test.go @@ -226,7 +226,7 @@ var _ = Describe("Block header repository", func() { It("adds transactions", func() { var dbTransactions []core.TransactionModel err = db.Select(&dbTransactions, - `SELECT hash, gaslimit, gasprice, input_data, nonce, raw, tx_from, tx_index, tx_to, "value" + `SELECT hash, gas_limit, gas_price, input_data, nonce, raw, tx_from, tx_index, tx_to, "value" FROM public.light_sync_transactions WHERE header_id = $1`, headerID) Expect(err).NotTo(HaveOccurred()) Expect(dbTransactions).To(ConsistOf(transactions)) @@ -238,7 +238,7 @@ var _ = Describe("Block header repository", func() { var dbTransactions []core.TransactionModel err = db.Select(&dbTransactions, - `SELECT hash, gaslimit, gasprice, input_data, nonce, raw, tx_from, tx_index, tx_to, "value" + `SELECT hash, gas_limit, gas_price, input_data, nonce, raw, tx_from, tx_index, tx_to, "value" FROM public.light_sync_transactions WHERE header_id = $1`, headerID) Expect(err).NotTo(HaveOccurred()) Expect(len(dbTransactions)).To(Equal(2)) diff --git a/pkg/fakes/data.go b/pkg/fakes/data.go index 6d2829fa..8b8b45a7 100644 --- a/pkg/fakes/data.go +++ b/pkg/fakes/data.go @@ -94,7 +94,6 @@ func GetFakeUncle(hash, reward string) core.Uncle { return core.Uncle{ Miner: FakeAddress.String(), Hash: hash, - BlockHash: FakeHash.String(), Reward: reward, Raw: rawFakeHeader, Timestamp: strconv.FormatInt(fakeTimestamp, 10), diff --git a/pkg/fakes/mock_blockchain.go b/pkg/fakes/mock_blockchain.go index 7083b1ac..d09a91b3 100644 --- a/pkg/fakes/mock_blockchain.go +++ b/pkg/fakes/mock_blockchain.go @@ -45,9 +45,7 @@ type MockBlockChain struct { lastBlock *big.Int node core.Node Transactions []core.TransactionModel - passedAccountAddress common.Address - passedBlockNumer *big.Int - passedAccountBalance *big.Int + accountBalanceReturnValue *big.Int getAccountBalanceErr error } @@ -151,11 +149,9 @@ func (blockChain *MockBlockChain) SetGetAccountBalanceErr(err error) { } func (blockChain *MockBlockChain) SetGetAccountBalance(balance *big.Int) { - blockChain.passedAccountBalance = balance + blockChain.accountBalanceReturnValue = balance } func (blockChain *MockBlockChain) GetAccountBalance(address common.Address, blockNumber *big.Int) (*big.Int, error) { - blockChain.passedAccountAddress = address - blockChain.passedBlockNumer = blockNumber - return blockChain.passedAccountBalance, blockChain.getAccountBalanceErr + return blockChain.accountBalanceReturnValue, blockChain.getAccountBalanceErr } diff --git a/pkg/geth/converters/common/block_converter.go b/pkg/geth/converters/common/block_converter.go index e53d18a2..b813223d 100644 --- a/pkg/geth/converters/common/block_converter.go +++ b/pkg/geth/converters/common/block_converter.go @@ -74,17 +74,10 @@ func (bc BlockConverter) ToCoreUncle(block core.Block, uncles []*types.Header) ( totalUncleRewards := new(big.Int) coreUncles := make([]core.Uncle, 0, len(uncles)) for _, uncle := range uncles { - staticBlockReward := staticRewardByBlockNumber(block.Number) - rewardDiv8 := staticBlockReward.Div(staticBlockReward, big.NewInt(8)) - mainBlock := big.NewInt(block.Number) - uncleBlock := big.NewInt(uncle.Number.Int64()) - uncleBlockPlus8 := uncleBlock.Add(uncleBlock, big.NewInt(8)) - uncleBlockPlus8MinusMainBlock := uncleBlockPlus8.Sub(uncleBlockPlus8, mainBlock) - thisUncleReward := rewardDiv8.Mul(rewardDiv8, uncleBlockPlus8MinusMainBlock) + thisUncleReward := calcUncleMinerReward(block.Number, uncle.Number.Int64()) raw, _ := json.Marshal(uncle) coreUncle := core.Uncle{ Miner: uncle.Coinbase.Hex(), - BlockHash: block.Hash, Hash: uncle.Hash().Hex(), Raw: raw, Reward: thisUncleReward.String(), diff --git a/pkg/geth/converters/common/block_rewards.go b/pkg/geth/converters/common/block_rewards.go index ce26cadc..c0f6aae6 100644 --- a/pkg/geth/converters/common/block_rewards.go +++ b/pkg/geth/converters/common/block_rewards.go @@ -31,6 +31,16 @@ func CalcBlockReward(block core.Block, uncles []*types.Header) *big.Int { return tmp.Add(tmp, staticBlockReward) } +func calcUncleMinerReward(blockNumber, uncleBlockNumber int64) *big.Int { + staticBlockReward := staticRewardByBlockNumber(blockNumber) + rewardDiv8 := staticBlockReward.Div(staticBlockReward, big.NewInt(8)) + mainBlock := big.NewInt(blockNumber) + uncleBlock := big.NewInt(uncleBlockNumber) + uncleBlockPlus8 := uncleBlock.Add(uncleBlock, big.NewInt(8)) + uncleBlockPlus8MinusMainBlock := uncleBlockPlus8.Sub(uncleBlockPlus8, mainBlock) + return rewardDiv8.Mul(rewardDiv8, uncleBlockPlus8MinusMainBlock) +} + func calcTransactionFees(block core.Block) *big.Int { transactionFees := new(big.Int) for _, transaction := range block.Transactions { @@ -56,7 +66,9 @@ func calcUncleInclusionRewards(block core.Block, uncles []*types.Header) *big.In func staticRewardByBlockNumber(blockNumber int64) *big.Int { staticBlockReward := new(big.Int) //https://blog.ethereum.org/2017/10/12/byzantium-hf-announcement/ - if blockNumber >= 4370000 { + if blockNumber >= 7280000 { + staticBlockReward.SetString("2000000000000000000", 10) + } else if blockNumber >= 4370000 { staticBlockReward.SetString("3000000000000000000", 10) } else { staticBlockReward.SetString("5000000000000000000", 10)