mirror of
https://gitlab.com/pulsechaincom/erigon-pulse.git
synced 2024-12-23 12:07:17 +00:00
a49d409457
* migrated consensus and chain config files for bsc support * migrated more files from bsc * fixed consensus crashing * updated erigon lib for parlia snapshot prefix * added staticpeers for bsc * [+] added system contracts [*] fixed bug with loading snapshot [+] enabled gas bailout [+] added fix to prevent syncing more than 1000 headers (for testing only) [*] fixed bug with crashing sender recover sometimes * migrated system contract calls * [*] fixed bug with returning mutable balance object [+] migrated lightclient contracts from bsc [*] fixed parlia consensus config param * [*] fixed tendermint deps * [+] added some logs * [+] enabled bsc forks [*] fixed syscalls from coinbase [*] more logging * Fix call sys contract gas calculation * [*] fixed executing system transactions * [*] enabled receipt hash, gas and bloom filter checks * [-] removed some logging scripts [*] set header checkpoint to 10 million blocks (for testing forks) * [*] fixed bug with commiting dirty inter block state state after system transaction execution [-] removed some extra logs and comments * [+] added chapel and rialto testnet support * [*] fixed chapel allocs * [-] removed 6 mil block limit for headers sync * Fix hardforks on chapel and other testnets * [*] fixed header sync issue after merge * [*] tiny code cleanup * [-] removed some comments * [*] increased mdbx map size to 4 TB * [*] increased max chaindata size to 6 tb * [*] bring more compatibility with origin erigon and some code cleanup * [+] added support of validator mode for BSC chain * [*] enable private key load for bsc, rialto and chapel chains * [*] fixed running BSC validator node * Fix the branch list * [*] tiny fixes for linter * [*] formatted imports for core and parlia packages * [*] fixed import rules in other files * Revert "[*] formatted imports for core and parlia packages" This reverts commit c764b58b34fedc2b14d69458583ba0dad114f227. * [*] changed import rules in more packages * [*] fixed type mismatch in hack command * [*] fixed crash on new epoch, enabled bootstrap flags * [*] fixed linter errors * [*] fixed missing err check for syscalls * [*] now BSC implementation is fully compatible with erigon original sources * Revert "Add chain config and CLI changes for Binance Smart Chain support (#3131)" This reverts commit3d048b7f1a
. * Revert "Add Parlia consensus engine for Binance Smart Chain support (#3086)" This reverts commitee99f17fbe
. * [*] fixed several issues after merge * [*] fixed integration compilation * Revert "Fix the branch list" This reverts commit 8150ca57e5f2707a84a9f6a1c5b809b7cc84547b. * [-] removed receipt repair migration * [*] fixed parlia fork numbers output * [*] bring more devel compatibility, fixed bsc address list for access list calculation * [*] fixed bug with commiting state transition for bad blocks in BSC * [*] fixed bsc changes apply for integration command and updated config print for parlia * [*] fixed bug with applying bsc forks for chapel and rialto testnet chains [*] let's use finalize and assemble for mining to let consensus know for what it's finalizing block * Fix compilation errors in hack.go * Fix lint * reset changes in erigon-snapshots to devel * Remove unrelated changes * Fix embed * Remove more unrelated changes * Remove more unrelated changes * Restore clique and aura miner config * Refactor interfaces not to use slice pointers * Refactor parlia functions to return tx and receipt instead of dealing with slices * Fix for header panic * Fix lint, restore system contract addresses * Remove more unrelated changes, unify GatherForks Co-authored-by: Dmitry Ivanov <convexman18@gmail.com> Co-authored-by: j75689 <j75689@gmail.com> Co-authored-by: Alexey Sharp <alexeysharp@Alexeys-iMac.local> Co-authored-by: Alex Sharp <alexsharp@Alexs-MacBook-Pro.local>
139 lines
4.1 KiB
Go
139 lines
4.1 KiB
Go
package lightclient
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
|
|
"github.com/tendermint/iavl"
|
|
"github.com/tendermint/tendermint/crypto/merkle"
|
|
cmn "github.com/tendermint/tendermint/libs/common"
|
|
)
|
|
|
|
// MultiStoreProof defines a collection of store proofs in a multi-store
|
|
type MultiStoreProof struct {
|
|
StoreInfos []StoreInfo
|
|
}
|
|
|
|
func NewMultiStoreProof(storeInfos []StoreInfo) *MultiStoreProof {
|
|
return &MultiStoreProof{StoreInfos: storeInfos}
|
|
}
|
|
|
|
// ComputeRootHash returns the root hash for a given multi-store proof.
|
|
func (proof *MultiStoreProof) ComputeRootHash() []byte {
|
|
ci := CommitInfo{
|
|
Version: -1, // TODO: Not needed; improve code.
|
|
StoreInfos: proof.StoreInfos,
|
|
}
|
|
return ci.Hash()
|
|
}
|
|
|
|
// RequireProof return whether proof is require for the subpath
|
|
func RequireProof(subpath string) bool {
|
|
// XXX: create a better convention.
|
|
// Currently, only when query subpath is "/store" or "/key", will proof be included in response.
|
|
// If there are some changes about proof building in iavlstore.go, we must change code here to keep consistency with iavlstore.go:212
|
|
if subpath == "/store" || subpath == "/key" {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
var _ merkle.ProofOperator = MultiStoreProofOp{}
|
|
|
|
// the multi-store proof operation constant value
|
|
const ProofOpMultiStore = "multistore"
|
|
|
|
// TODO: document
|
|
type MultiStoreProofOp struct {
|
|
// Encoded in ProofOp.Key
|
|
key []byte
|
|
|
|
// To encode in ProofOp.Data.
|
|
Proof *MultiStoreProof `json:"proof"`
|
|
}
|
|
|
|
func NewMultiStoreProofOp(key []byte, proof *MultiStoreProof) MultiStoreProofOp {
|
|
return MultiStoreProofOp{
|
|
key: key,
|
|
Proof: proof,
|
|
}
|
|
}
|
|
|
|
// MultiStoreProofOpDecoder returns a multi-store merkle proof operator from a
|
|
// given proof operation.
|
|
func MultiStoreProofOpDecoder(pop merkle.ProofOp) (merkle.ProofOperator, error) {
|
|
if pop.Type != ProofOpMultiStore {
|
|
return nil, cmn.NewError("unexpected ProofOp.Type; got %v, want %v", pop.Type, ProofOpMultiStore)
|
|
}
|
|
|
|
// XXX: a bit strange as we'll discard this, but it works
|
|
var op MultiStoreProofOp
|
|
|
|
err := Cdc.UnmarshalBinaryLengthPrefixed(pop.Data, &op)
|
|
if err != nil {
|
|
return nil, cmn.ErrorWrap(err, "decoding ProofOp.Data into MultiStoreProofOp")
|
|
}
|
|
|
|
return NewMultiStoreProofOp(pop.Key, op.Proof), nil
|
|
}
|
|
|
|
// ProofOp return a merkle proof operation from a given multi-store proof
|
|
// operation.
|
|
func (op MultiStoreProofOp) ProofOp() merkle.ProofOp {
|
|
bz := Cdc.MustMarshalBinaryLengthPrefixed(op)
|
|
return merkle.ProofOp{
|
|
Type: ProofOpMultiStore,
|
|
Key: op.key,
|
|
Data: bz,
|
|
}
|
|
}
|
|
|
|
// String implements the Stringer interface for a mult-store proof operation.
|
|
func (op MultiStoreProofOp) String() string {
|
|
return fmt.Sprintf("MultiStoreProofOp{%v}", op.GetKey())
|
|
}
|
|
|
|
// GetKey returns the key for a multi-store proof operation.
|
|
func (op MultiStoreProofOp) GetKey() []byte {
|
|
return op.key
|
|
}
|
|
|
|
// Run executes a multi-store proof operation for a given value. It returns
|
|
// the root hash if the value matches all the store's commitID's hash or an
|
|
// error otherwise.
|
|
func (op MultiStoreProofOp) Run(args [][]byte) ([][]byte, error) {
|
|
if len(args) != 1 {
|
|
return nil, cmn.NewError("Value size is not 1")
|
|
}
|
|
|
|
value := args[0]
|
|
root := op.Proof.ComputeRootHash()
|
|
|
|
for _, si := range op.Proof.StoreInfos {
|
|
if si.Name == string(op.key) {
|
|
if bytes.Equal(value, si.Core.CommitID.Hash) {
|
|
return [][]byte{root}, nil
|
|
}
|
|
|
|
return nil, cmn.NewError("hash mismatch for substore %v: %X vs %X", si.Name, si.Core.CommitID.Hash, value)
|
|
}
|
|
}
|
|
|
|
return nil, cmn.NewError("key %v not found in multistore proof", op.key)
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// XXX: This should be managed by the rootMultiStore which may want to register
|
|
// more proof ops?
|
|
func DefaultProofRuntime() (prt *merkle.ProofRuntime) {
|
|
prt = merkle.NewProofRuntime()
|
|
prt.RegisterOpDecoder(merkle.ProofOpSimpleValue, merkle.SimpleValueOpDecoder)
|
|
prt.RegisterOpDecoder(iavl.ProofOpIAVLValue, iavl.IAVLValueOpDecoder)
|
|
prt.RegisterOpDecoder(iavl.ProofOpIAVLAbsence, iavl.IAVLAbsenceOpDecoder)
|
|
prt.RegisterOpDecoder(ProofOpMultiStore, MultiStoreProofOpDecoder)
|
|
return
|
|
}
|