diff --git a/accountmanager/accountmanager.go b/accountmanager/accountmanager.go index c9304ff4..4b724e15 100644 --- a/accountmanager/accountmanager.go +++ b/accountmanager/accountmanager.go @@ -60,7 +60,7 @@ type CreateAccountAction struct { Description string `json:"description,omitempty"` } -type UpdateAccountAction struct { +type UpdataAccountAction struct { Founder common.Name `json:"founder,omitempty"` } @@ -392,7 +392,7 @@ func (am *AccountManager) CreateAccount(fromName common.Name, accountName common // } //UpdateAccount update the pubkey of the account -func (am *AccountManager) UpdateAccount(accountName common.Name, accountAction *UpdateAccountAction) error { +func (am *AccountManager) UpdateAccount(accountName common.Name, accountAction *UpdataAccountAction) error { acct, err := am.GetAccountByName(accountName) if acct == nil { return ErrAccountNotExist @@ -1397,7 +1397,7 @@ func (am *AccountManager) process(accountManagerContext *types.AccountManagerCon internalActions = append(internalActions, internalAction) } case types.UpdateAccount: - var acct UpdateAccountAction + var acct UpdataAccountAction err := rlp.DecodeBytes(action.Data(), &acct) if err != nil { return nil, err diff --git a/accountmanager/accountmanager_test.go b/accountmanager/accountmanager_test.go index 34c7b2d0..8d5172e2 100644 --- a/accountmanager/accountmanager_test.go +++ b/accountmanager/accountmanager_test.go @@ -1569,7 +1569,7 @@ func TestAccountManager_Process(t *testing.T) { if err != nil { panic("rlp payload err") } - aa1 := &UpdateAccountAction{ + aa1 := &UpdataAccountAction{ Founder: common.Name(""), } diff --git a/blockchain/blockchain.go b/blockchain/blockchain.go index 207abfd5..029d4b2a 100644 --- a/blockchain/blockchain.go +++ b/blockchain/blockchain.go @@ -1175,11 +1175,17 @@ func (bc *BlockChain) GetHeaderByNumber(number uint64) *types.Header { // Config retrieves the blockchain's chain configuration. func (bc *BlockChain) Config() *params.ChainConfig { return bc.chainConfig } -// ForkUpdate . +// ForkUpdate update fork status. func (bc *BlockChain) ForkUpdate(block *types.Block, statedb *state.StateDB) error { return bc.fcontroller.update(block, statedb, bc.GetHeaderByNumber) } +// ForkStatus returns current fork status. +func (bc *BlockChain) ForkStatus(statedb *state.StateDB) (*ForkConfig, ForkInfo, error) { + info, err := bc.fcontroller.getForkInfo(statedb) + return bc.fcontroller.cfg, info, err +} + // Export writes the active chain to the given writer. func (bc *BlockChain) Export(w io.Writer) error { return bc.ExportN(w, uint64(0), bc.CurrentBlock().NumberU64()) diff --git a/blockchain/forkcontroller.go b/blockchain/forkcontroller.go index f5f99799..a111b385 100644 --- a/blockchain/forkcontroller.go +++ b/blockchain/forkcontroller.go @@ -165,7 +165,7 @@ func (fc *ForkController) checkForkID(header *types.Header, state *state.StateDB if curForkID, _, err := fc.currentForkID(state); err != nil { return err } else if header.CurForkID() != curForkID || header.NextForkID() < curForkID { - return fmt.Errorf("invild header curForkID: %v, header nextForkID: %v,actual curForkID %v, header hash: %v, header number: %v", + return fmt.Errorf("invalid header curForkID: %v, header nextForkID: %v,actual curForkID %v, header hash: %v, header number: %v", header.CurForkID(), header.NextForkID(), curForkID, header.Hash().Hex(), header.Number.Uint64()) } return nil diff --git a/ftservice/apibackend.go b/ftservice/apibackend.go index e0387065..aa75581e 100644 --- a/ftservice/apibackend.go +++ b/ftservice/apibackend.go @@ -22,6 +22,7 @@ import ( "github.com/ethereum/go-ethereum/common/math" "github.com/fractalplatform/fractal/accountmanager" + "github.com/fractalplatform/fractal/blockchain" "github.com/fractalplatform/fractal/common" "github.com/fractalplatform/fractal/consensus" "github.com/fractalplatform/fractal/feemanager" @@ -39,7 +40,7 @@ import ( "github.com/fractalplatform/fractal/utils/fdb" ) -// APIBackend implements ftserviceapi.Backend for full nodes +// APIBackend implements ftservice api.Backend for full nodes type APIBackend struct { ftservice *FtService gpo *gasprice.Oracle @@ -236,18 +237,21 @@ func (b *APIBackend) GetEVM(ctx context.Context, account *accountmanager.Account account.AddAccountBalanceByID(from, assetID, math.MaxBig256) vmError := func() error { return nil } - evmcontext := &processor.EvmContext{ + evmContext := &processor.EvmContext{ ChainContext: b.ftservice.BlockChain(), EngineContext: b.ftservice.Engine(), } - context := processor.NewEVMContext(from, to, assetID, gasPrice, header, evmcontext, nil) + context := processor.NewEVMContext(from, to, assetID, gasPrice, header, evmContext, nil) return vm.NewEVM(context, account, state, b.ChainConfig(), vmCfg), vmError, nil } func (b *APIBackend) SetGasPrice(gasPrice *big.Int) bool { - b.ftservice.SetGasPrice(gasPrice) - return true + return b.ftservice.SetGasPrice(gasPrice) +} + +func (b *APIBackend) ForkStatus(statedb *state.StateDB) (*blockchain.ForkConfig, blockchain.ForkInfo, error) { + return b.ftservice.BlockChain().ForkStatus(statedb) } func (b *APIBackend) GetAccountManager() (*accountmanager.AccountManager, error) { diff --git a/rpcapi/account.go b/rpcapi/account.go index 0f5ed0d7..98b18405 100644 --- a/rpcapi/account.go +++ b/rpcapi/account.go @@ -208,9 +208,7 @@ func (api *AccountAPI) GetNonce(accountName common.Name) (uint64, error) { if err != nil { return 0, err } - return acct.GetNonce(accountName) - } //GetAssetInfoByName diff --git a/rpcapi/backend.go b/rpcapi/backend.go index 9a1d208c..0d926eb0 100644 --- a/rpcapi/backend.go +++ b/rpcapi/backend.go @@ -23,6 +23,7 @@ import ( "math/big" "github.com/fractalplatform/fractal/accountmanager" + "github.com/fractalplatform/fractal/blockchain" "github.com/fractalplatform/fractal/common" "github.com/fractalplatform/fractal/consensus" "github.com/fractalplatform/fractal/debug" @@ -59,6 +60,7 @@ type Backend interface { GetDetailTxByFilter(ctx context.Context, filterFn func(common.Name) bool, blockNr, lookbackNum uint64) []*types.DetailTx GetTxsByFilter(ctx context.Context, filterFn func(common.Name) bool, blockNr, lookbackNum uint64) *types.AccountTxs GetBadBlocks(ctx context.Context) ([]*types.Block, error) + ForkStatus(statedb *state.StateDB) (*blockchain.ForkConfig, blockchain.ForkInfo, error) SetStatePruning(enable bool) (bool, uint64) // TxPool diff --git a/rpcapi/blockchain.go b/rpcapi/blockchain.go index 16e503a1..f0b00e7b 100644 --- a/rpcapi/blockchain.go +++ b/rpcapi/blockchain.go @@ -387,3 +387,29 @@ func (s *PrivateBlockChainAPI) SetStatePruning(enable bool) types.BlockState { prestatus, number := s.b.SetStatePruning(enable) return types.BlockState{PreStatePruning: prestatus, CurrentNumber: number} } + +type RPCForkStatus struct { + Count uint64 `json:"count"` + Percentage uint64 `json:"percentage"` + CurID uint64 `json:"curID"` + NexID uint64 `json:"nextID"` + CurIDBlockCount uint64 `json:"curIDBlockCount"` + NextIDBlockCount uint64 `json:"nextIDBlockCount"` +} + +func (s *PrivateBlockChainAPI) ForkStatus(ctx context.Context) (*RPCForkStatus, error) { + state, _, err := s.b.StateAndHeaderByNumber(ctx, rpc.LatestBlockNumber) + if state == nil || err != nil { + return nil, err + } + cfg, status, err := s.b.ForkStatus(state) + if err != nil { + return nil, err + } + return &RPCForkStatus{Count: cfg.ForkBlockNum, + Percentage: cfg.Forkpercentage, + CurID: status.CurForkID, + NexID: status.NextForkID, + CurIDBlockCount: status.CurForkIDBlockNum, + NextIDBlockCount: status.NextForkIDBlockNum}, nil +} diff --git a/sdk/account.go b/sdk/account.go index a50734cb..b1e51061 100644 --- a/sdk/account.go +++ b/sdk/account.go @@ -125,7 +125,7 @@ func (acc *Account) CreateAccount(to common.Name, value *big.Int, id uint64, gas } // UpdateAccount update accout -func (acc *Account) UpdateAccount(to common.Name, value *big.Int, id uint64, gas uint64, newacct *accountmanager.UpdateAccountAction) (hash common.Hash, err error) { +func (acc *Account) UpdateAccount(to common.Name, value *big.Int, id uint64, gas uint64, newacct *accountmanager.UpdataAccountAction) (hash common.Hash, err error) { nonce := acc.nonce if nonce == math.MaxUint64 { nonce, err = acc.api.AccountNonce(acc.name.String()) diff --git a/sdk/account_test.go b/sdk/account_test.go index 2bf86b4b..f0e88f07 100644 --- a/sdk/account_test.go +++ b/sdk/account_test.go @@ -87,7 +87,7 @@ func TestCreateAccount(t *testing.T) { func TestUpdateAccount(t *testing.T) { Convey("UpdateAccount", t, func() { act := NewAccount(api, common.StrToName(name), priv, chainCfg.SysTokenID, math.MaxUint64, true, chainCfg.ChainID) - hash, err := act.UpdateAccount(common.StrToName(chainCfg.AccountName), big.NewInt(0), chainCfg.SysTokenID, gas, &accountmanager.UpdateAccountAction{ + hash, err := act.UpdateAccount(common.StrToName(chainCfg.AccountName), big.NewInt(0), chainCfg.SysTokenID, gas, &accountmanager.UpdataAccountAction{ Founder: common.StrToName(name), }) So(err, ShouldBeNil) diff --git a/sdk/test/sample.go b/sdk/test/sample.go index 152e9f3c..d4b7015a 100644 --- a/sdk/test/sample.go +++ b/sdk/test/sample.go @@ -179,7 +179,7 @@ func sampleIncreaseAsset() *TTX { AssetID: chainCfg.SysTokenID, Value: big.NewInt(0), Payload: &accountmanager.IncAsset{ - AssetId: 1, + AssetID: 1, Amount: new(big.Int).Mul(big.NewInt(100000000000), big.NewInt(1e18)), To: "sampleact", },