Explorar o código

尝试修复区块同步失败问题

skyfffire %!s(int64=2) %!d(string=hai) anos
pai
achega
e8f6a0769a
Modificáronse 2 ficheiros con 18 adicións e 6 borrados
  1. 5 5
      consensus/satoshi/satoshi.go
  2. 13 1
      internal/ethapi/public_block_chain_api.go

+ 5 - 5
consensus/satoshi/satoshi.go

@@ -1068,7 +1068,7 @@ func (p *Satoshi) getCurrentValidators(blockHash common.Hash) ([]common.Address,
 	msgData := (hexutil.Bytes)(data)
 	toAddress := common.HexToAddress(systemcontracts.ValidatorContract)
 	gas := (hexutil.Uint64)(uint64(math.MaxUint64 / 2))
-	_, err = p.ethAPI.Call(ctx, ethapi.CallArgs{
+	result, err := p.ethAPI.Call(ctx, ethapi.CallArgs{
 		Gas:  &gas,
 		To:   &toAddress,
 		Data: &msgData,
@@ -1080,11 +1080,11 @@ func (p *Satoshi) getCurrentValidators(blockHash common.Hash) ([]common.Address,
 	var (
 		ret0 = new([]common.Address)
 	)
-	//out := ret0
+	out := ret0
 
-	//if err := p.validatorSetABI.UnpackIntoInterface(out, method, result.Return()); err != nil {
-	//	return nil, err
-	//}
+	if err := p.validatorSetABI.UnpackIntoInterface(out, method, result); err != nil {
+		return nil, err
+	}
 
 	valz := make([]common.Address, len(*ret0))
 	for i, a := range *ret0 {

+ 13 - 1
internal/ethapi/public_block_chain_api.go

@@ -35,7 +35,19 @@ func NewPublicBlockChainAPI(b Backend) *PublicBlockChainAPI {
 //
 // Note, this function doesn't make and changes in the state/blockchain and is
 // useful to execute and retrieve values.
-func (s *PublicBlockChainAPI) Call(ctx context.Context, args CallArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *StateOverride) (CallResult, error) {
+func (s *PublicBlockChainAPI) Call(ctx context.Context, args CallArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *StateOverride) (hexutil.Bytes, error) {
+	result, err := DoCall(ctx, s.b, args, blockNrOrHash, overrides, vm.Config{}, 5*time.Second, s.b.RPCGasCap())
+	if err != nil {
+		return nil, err
+	}
+	// If the result contains a revert reason, try to unpack and return it.
+	if len(result.Revert()) > 0 {
+		return nil, newRevertError(result)
+	}
+	return result.Return(), result.Err
+}
+
+func (s *PublicBlockChainAPI) NewCall(ctx context.Context, args CallArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *StateOverride) (CallResult, error) {
 	result, err := DoCall(ctx, s.b, args, blockNrOrHash, overrides, vm.Config{}, 5*time.Second, s.b.RPCGasCap())
 	if err != nil {
 		return CallResult{Success: false, Msg: err.Error()}, nil