1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- // Copyright 2019 The go-ethereum Authors
- // This file is part of the go-ethereum library.
- //
- // The go-ethereum library is free software: you can redistribute it and/or modify
- // it under the terms of the GNU Lesser General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // The go-ethereum library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU Lesser General Public License for more details.
- //
- // You should have received a copy of the GNU Lesser General Public License
- // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
- package snapshot
- import (
- "bytes"
- "math/big"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/rlp"
- )
- // Account is a modified version of a state.Account, where the root is replaced
- // with a byte slice. This format can be used to represent full-consensus format
- // or slim-snapshot format which replaces the empty root and code hash as nil
- // byte slice.
- type Account struct {
- Nonce uint64
- Balance *big.Int
- Root []byte
- CodeHash []byte
- }
- // SlimAccount converts a state.Account content into a slim snapshot account
- func SlimAccount(nonce uint64, balance *big.Int, root common.Hash, codehash []byte) Account {
- slim := Account{
- Nonce: nonce,
- Balance: balance,
- }
- if root != emptyRoot {
- slim.Root = root[:]
- }
- if !bytes.Equal(codehash, emptyCode[:]) {
- slim.CodeHash = codehash
- }
- return slim
- }
- // SlimAccountRLP converts a state.Account content into a slim snapshot
- // version RLP encoded.
- func SlimAccountRLP(nonce uint64, balance *big.Int, root common.Hash, codehash []byte) []byte {
- data, err := rlp.EncodeToBytes(SlimAccount(nonce, balance, root, codehash))
- 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) (Account, error) {
- var account Account
- if err := rlp.DecodeBytes(data, &account); err != nil {
- return Account{}, err
- }
- if len(account.Root) == 0 {
- account.Root = emptyRoot[:]
- }
- if len(account.CodeHash) == 0 {
- account.CodeHash = emptyCode[:]
- }
- 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)
- }
|