forked from BuildOnViction/victionchain
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #7 from trinhdn2/refactor/state-account
Move statedb.Account struct to types.StateAccount
- Loading branch information
Showing
16 changed files
with
152 additions
and
46 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
package types | ||
|
||
import ( | ||
"bytes" | ||
"math/big" | ||
|
||
"github.com/tomochain/tomochain/common" | ||
"github.com/tomochain/tomochain/rlp" | ||
) | ||
|
||
// StateAccount is the Ethereum consensus representation of accounts. | ||
// These objects are stored in the main account trie. | ||
type StateAccount struct { | ||
Nonce uint64 | ||
Balance *big.Int | ||
Root common.Hash // merkle root of the storage trie | ||
CodeHash []byte | ||
} | ||
|
||
// NewEmptyStateAccount constructs an empty state account. | ||
func NewEmptyStateAccount() *StateAccount { | ||
return &StateAccount{ | ||
Balance: new(big.Int), | ||
Root: EmptyRootHash, | ||
CodeHash: EmptyCodeHash.Bytes(), | ||
} | ||
} | ||
|
||
// Copy returns a deep-copied state account object. | ||
func (acct *StateAccount) Copy() *StateAccount { | ||
var balance *big.Int | ||
if acct.Balance != nil { | ||
balance = new(big.Int).Set(acct.Balance) | ||
} | ||
return &StateAccount{ | ||
Nonce: acct.Nonce, | ||
Balance: balance, | ||
Root: acct.Root, | ||
CodeHash: common.CopyBytes(acct.CodeHash), | ||
} | ||
} | ||
|
||
// SlimAccount is a modified version of an Account, where the root is replaced | ||
// with a byte slice. This format can be used to represent full-consensus format | ||
// or slim format which replaces the empty root and code hash as nil byte slice. | ||
type SlimAccount struct { | ||
Nonce uint64 | ||
Balance *big.Int | ||
Root []byte // Nil if root equals to types.EmptyRootHash | ||
CodeHash []byte // Nil if hash equals to types.EmptyCodeHash | ||
} | ||
|
||
// SlimAccountRLP encodes the state account in 'slim RLP' format. | ||
func SlimAccountRLP(account StateAccount) []byte { | ||
slim := SlimAccount{ | ||
Nonce: account.Nonce, | ||
Balance: account.Balance, | ||
} | ||
if account.Root != EmptyRootHash { | ||
slim.Root = account.Root[:] | ||
} | ||
if !bytes.Equal(account.CodeHash, EmptyCodeHash[:]) { | ||
slim.CodeHash = account.CodeHash | ||
} | ||
data, err := rlp.EncodeToBytes(slim) | ||
if err != nil { | ||
panic(err) | ||
} | ||
return data | ||
} | ||
|
||
// FullAccount decodes the data on the 'slim RLP' format and return | ||
// the consensus format account. | ||
func FullAccount(data []byte) (*StateAccount, error) { | ||
var slim SlimAccount | ||
if err := rlp.DecodeBytes(data, &slim); err != nil { | ||
return nil, err | ||
} | ||
var account StateAccount | ||
account.Nonce, account.Balance = slim.Nonce, slim.Balance | ||
|
||
// Interpret the storage root and code hash in slim format. | ||
if len(slim.Root) == 0 { | ||
account.Root = EmptyRootHash | ||
} else { | ||
account.Root = common.BytesToHash(slim.Root) | ||
} | ||
if len(slim.CodeHash) == 0 { | ||
account.CodeHash = EmptyCodeHash[:] | ||
} else { | ||
account.CodeHash = slim.CodeHash | ||
} | ||
return &account, nil | ||
} | ||
|
||
// FullAccountRLP converts data on the 'slim RLP' format into the full RLP-format. | ||
func FullAccountRLP(data []byte) ([]byte, error) { | ||
account, err := FullAccount(data) | ||
if err != nil { | ||
return nil, err | ||
} | ||
return rlp.EncodeToBytes(account) | ||
} |
Oops, something went wrong.