(VDB-68) Verify log block hash matches header block hash

- Delete header on conflict to prompt data refresh (cascade deletes all
  data associated with that block)
- Derive header hash from rpc payload rather than computing it from data
  (prevents hash mismatch between blockchain and cache)
This commit is contained in:
Rob Mulholand
2018-11-13 14:51:39 -06:00
parent 9d26c174d4
commit 82fd73ba3f
95 changed files with 557 additions and 298 deletions
+2 -3
View File
@@ -75,11 +75,10 @@ func (FlipKickConverter) ToModels(entities []interface{}) ([]interface{}, error)
end := time.Unix(endValue, 0)
urn := common.BytesToAddress(flipKickEntity.Urn[:common.AddressLength]).String()
tab := shared.BigIntToString(flipKickEntity.Tab)
rawLogJson, err := json.Marshal(flipKickEntity.Raw)
rawLog, err := json.Marshal(flipKickEntity.Raw)
if err != nil {
return nil, err
}
rawLogString := string(rawLogJson)
model := FlipKickModel{
BidId: id,
@@ -91,7 +90,7 @@ func (FlipKickConverter) ToModels(entities []interface{}) ([]interface{}, error)
Tab: tab,
TransactionIndex: flipKickEntity.TransactionIndex,
LogIndex: flipKickEntity.LogIndex,
Raw: rawLogString,
Raw: rawLog,
}
models = append(models, model)
}
+3 -6
View File
@@ -53,16 +53,13 @@ var _ = Describe("FlipKick Converter", func() {
var emptyString = ""
var emptyTime = time.Unix(0, 0)
var emptyEntity = flip_kick.FlipKickEntity{}
var emptyRawLog string
var emptyRawLog []byte
var err error
BeforeEach(func() {
emptyEntity.Id = big.NewInt(1)
var emptyRawLogJson, err = json.Marshal(types.Log{})
emptyRawLog, err = json.Marshal(types.Log{})
Expect(err).NotTo(HaveOccurred())
emptyRawLogJson, err = json.Marshal(types.Log{})
Expect(err).NotTo(HaveOccurred())
emptyRawLog = string(emptyRawLogJson)
})
It("converts an Entity to a Model", func() {
+1 -1
View File
@@ -26,5 +26,5 @@ type FlipKickModel struct {
Tab string
TransactionIndex uint `db:"tx_idx"`
LogIndex uint `db:"log_idx"`
Raw string `db:"raw_log"`
Raw []byte `db:"raw_log"`
}
+18 -11
View File
@@ -27,8 +27,8 @@ type FlipKickRepository struct {
db *postgres.DB
}
func (fkr FlipKickRepository) Create(headerId int64, models []interface{}) error {
tx, err := fkr.db.Begin()
func (repository FlipKickRepository) Create(headerID int64, models []interface{}) error {
tx, err := repository.db.Begin()
if err != nil {
return err
}
@@ -37,17 +37,24 @@ func (fkr FlipKickRepository) Create(headerId int64, models []interface{}) error
if !ok {
return fmt.Errorf("model of type %T, not %T", model, FlipKickModel{})
}
_, err := tx.Exec(
err = shared.ValidateHeaderConsistency(headerID, flipKickModel.Raw, repository.db)
if err != nil {
tx.Rollback()
return err
}
_, err = tx.Exec(
`INSERT into maker.flip_kick (header_id, bid_id, lot, bid, gal, "end", urn, tab, tx_idx, log_idx, raw_log)
VALUES($1, $2::NUMERIC, $3::NUMERIC, $4::NUMERIC, $5, $6, $7, $8::NUMERIC, $9, $10, $11)`,
headerId, flipKickModel.BidId, flipKickModel.Lot, flipKickModel.Bid, flipKickModel.Gal, flipKickModel.End, flipKickModel.Urn, flipKickModel.Tab, flipKickModel.TransactionIndex, flipKickModel.LogIndex, flipKickModel.Raw,
headerID, flipKickModel.BidId, flipKickModel.Lot, flipKickModel.Bid, flipKickModel.Gal, flipKickModel.End, flipKickModel.Urn, flipKickModel.Tab, flipKickModel.TransactionIndex, flipKickModel.LogIndex, flipKickModel.Raw,
)
if err != nil {
tx.Rollback()
return err
}
}
err = shared.MarkHeaderCheckedInTransaction(headerId, tx, constants.FlipKickChecked)
err = shared.MarkHeaderCheckedInTransaction(headerID, tx, constants.FlipKickChecked)
if err != nil {
tx.Rollback()
return err
@@ -55,14 +62,14 @@ func (fkr FlipKickRepository) Create(headerId int64, models []interface{}) error
return tx.Commit()
}
func (fkr FlipKickRepository) MarkHeaderChecked(headerId int64) error {
return shared.MarkHeaderChecked(headerId, fkr.db, constants.FlipKickChecked)
func (repository FlipKickRepository) MarkHeaderChecked(headerId int64) error {
return shared.MarkHeaderChecked(headerId, repository.db, constants.FlipKickChecked)
}
func (fkr FlipKickRepository) MissingHeaders(startingBlockNumber, endingBlockNumber int64) ([]core.Header, error) {
return shared.MissingHeaders(startingBlockNumber, endingBlockNumber, fkr.db, constants.FlipKickChecked)
func (repository FlipKickRepository) MissingHeaders(startingBlockNumber, endingBlockNumber int64) ([]core.Header, error) {
return shared.MissingHeaders(startingBlockNumber, endingBlockNumber, repository.db, constants.FlipKickChecked)
}
func (fkr *FlipKickRepository) SetDB(db *postgres.DB) {
fkr.db = db
func (repository *FlipKickRepository) SetDB(db *postgres.DB) {
repository.db = db
}