mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-18 09:53:48 +00:00
to and from balances supported
This commit is contained in:
parent
f25f21603d
commit
8c39e40d24
1 changed files with 63 additions and 13 deletions
|
|
@ -102,17 +102,67 @@ func WriteTransactions(db *leveldb.DB, tx *types.Transaction, blockHash common.H
|
||||||
return tx.Hash().String()
|
return tx.Hash().String()
|
||||||
}
|
}
|
||||||
|
|
||||||
//func WriteAccountBalances(db *leveldb.DB, tx *types.Transaction) {
|
func WriteFromBalance(db *leveldb.DB, tx *types.Transaction) {
|
||||||
// fromKey := append([]byte("acc-")[:], tx.From().Hash().Bytes()[:]...)
|
key := append([]byte("acc-")[:], tx.From().Hash().Bytes()[:]...)
|
||||||
// //toKey := append([]byte("acc-")[:], tx.To().Hash().Bytes()[:]...)
|
// The from (sender) addr must have balance. If it fails to retrieve there is a bigger issue.
|
||||||
// fromData, err := db.Get(fromKey, nil)
|
retrievedData, err := db.Get(key, nil)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// // Assume this is the first entry
|
log.Crit("From MUST have eth and no record found", "err", err)
|
||||||
// firstEntry, entryErr := db.Put()
|
}
|
||||||
// log.Crit("Could not retrieve TX", "err", err)
|
var decodedData ShyftAccountEntry
|
||||||
// }
|
d := gob.NewDecoder(bytes.NewBuffer(retrievedData))
|
||||||
// fmt.Println(fromData)
|
if err := d.Decode(&decodedData); err != nil {
|
||||||
//}
|
log.Crit("Failed to decode From data:", "err", err)
|
||||||
|
}
|
||||||
|
decodedData.Balance.Sub(decodedData.Balance, tx.Value())
|
||||||
|
decodedData.Txs = append(decodedData.Txs, tx.Hash().String())
|
||||||
|
// Encode updated data
|
||||||
|
var encodedData bytes.Buffer
|
||||||
|
encoder := gob.NewEncoder(&encodedData)
|
||||||
|
if err := encoder.Encode(decodedData); err != nil {
|
||||||
|
log.Crit("Faild to encode From Account data", "err", err)
|
||||||
|
}
|
||||||
|
if err := db.Put(key, encodedData.Bytes(), nil); err != nil {
|
||||||
|
log.Crit("Could not write the From account data", "err", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WriteToBalance(db *leveldb.DB, tx *types.Transaction) {
|
||||||
|
key := append([]byte("acc-")[:], tx.To().Hash().Bytes()[:]...)
|
||||||
|
var txs []string
|
||||||
|
|
||||||
|
retrievedData, err := db.Get(key, nil)
|
||||||
|
if err != nil {
|
||||||
|
accData := ShyftAccountEntry{
|
||||||
|
Balance: tx.Value(),
|
||||||
|
Txs: append(txs, tx.Hash().String()),
|
||||||
|
}
|
||||||
|
var encodedData bytes.Buffer
|
||||||
|
encoder := gob.NewEncoder(&encodedData)
|
||||||
|
if err := encoder.Encode(accData); err != nil {
|
||||||
|
log.Crit("Faild to encode To Account data", "err", err)
|
||||||
|
}
|
||||||
|
if err := db.Put(key, encodedData.Bytes(), nil); err != nil {
|
||||||
|
log.Crit("Could not write the TO account's first tx", "err", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var decodedData ShyftAccountEntry
|
||||||
|
d := gob.NewDecoder(bytes.NewBuffer(retrievedData))
|
||||||
|
if err := d.Decode(&decodedData); err != nil {
|
||||||
|
log.Crit("Failed to decode To account data:", "err", err)
|
||||||
|
}
|
||||||
|
decodedData.Balance.Add(decodedData.Balance, tx.Value())
|
||||||
|
decodedData.Txs = append(decodedData.Txs, tx.Hash().String())
|
||||||
|
// Encode updated data
|
||||||
|
var encodedData bytes.Buffer
|
||||||
|
encoder := gob.NewEncoder(&encodedData)
|
||||||
|
if err := encoder.Encode(decodedData); err != nil {
|
||||||
|
log.Crit("Faild to encode To Account data", "err", err)
|
||||||
|
}
|
||||||
|
if err := db.Put(key, encodedData.Bytes(), nil); err != nil {
|
||||||
|
log.Crit("Could not write the To account data", "err", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// @NOTE: This function is extremely complex and requires heavy testing and knowdlege of edge cases:
|
// @NOTE: This function is extremely complex and requires heavy testing and knowdlege of edge cases:
|
||||||
// uncle blocks, account balance updates based on reorgs, diverges that get dropped.
|
// uncle blocks, account balance updates based on reorgs, diverges that get dropped.
|
||||||
|
|
@ -127,7 +177,7 @@ func WriteMinerReward(db *leveldb.DB, block *types.Block) {
|
||||||
for _, tx := range block.Transactions() {
|
for _, tx := range block.Transactions() {
|
||||||
totalGas.Add(totalGas, new(big.Int).Mul(tx.GasPrice(), new(big.Int).SetUint64(tx.Gas())))
|
totalGas.Add(totalGas, new(big.Int).Mul(tx.GasPrice(), new(big.Int).SetUint64(tx.Gas())))
|
||||||
}
|
}
|
||||||
retreivedData, err := db.Get(key, nil)
|
retrievedData, err := db.Get(key, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Assume time this account has had a tx
|
// Assume time this account has had a tx
|
||||||
// Balacne is exclusively minerreward + total gas from the block b/c no prior evm activity
|
// Balacne is exclusively minerreward + total gas from the block b/c no prior evm activity
|
||||||
|
|
@ -151,7 +201,7 @@ func WriteMinerReward(db *leveldb.DB, block *types.Block) {
|
||||||
// The account has already have previous data stored due to activity in the EVM
|
// The account has already have previous data stored due to activity in the EVM
|
||||||
// Decode the data to update balance
|
// Decode the data to update balance
|
||||||
var decodedData ShyftAccountEntry
|
var decodedData ShyftAccountEntry
|
||||||
d := gob.NewDecoder(bytes.NewBuffer(retreivedData))
|
d := gob.NewDecoder(bytes.NewBuffer(retrievedData))
|
||||||
if err := d.Decode(&decodedData); err != nil {
|
if err := d.Decode(&decodedData); err != nil {
|
||||||
log.Crit("Failed to decode miner data:", "err", err)
|
log.Crit("Failed to decode miner data:", "err", err)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue