Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
46698d7
params: begin v1.9.15 release cycle
karalabe May 13, 2020
677724a
cmd: fix log contexts (#21077)
SatpalSandhu61 May 13, 2020
f3f1e59
accounts/abi: simplify reflection logic (#21058)
MariusVanDerWijden May 13, 2020
3666da8
console: fix unlockAccount argument count check (#21081)
fjl May 14, 2020
e0987f6
cmd/clef, signer/core: password input fixes (#20960)
holiman May 19, 2020
d5b7d1c
accounts: add blockByNumberNoLock() to avoid double-lock (#20983)
Chain-Fox May 19, 2020
0a99efa
whisper: use canonical import name of package go-ethereum (#21099)
ucwong May 20, 2020
65ce550
trie: extend range proofs with non-existence (#21000)
rjl493456442 May 20, 2020
b4a2681
les, les/lespay: implement new server pool (#20758)
zsfelfoldi May 22, 2020
48e3b95
miner: replace use of 'self' as receiver name (#21113)
ucwong May 25, 2020
4f2784b
all: fix typos in comments (#21118)
tbm May 25, 2020
25a661e
consensus/clique: remove redundant pair of parentheses (#21104)
yutianwu May 25, 2020
e868add
core/vm: improve jumpdest lookup (#21123)
holiman May 25, 2020
befecc9
consensus/ethash: fix flaky test by reading seal results (#21085)
meowsbits May 25, 2020
dbf6b8a
cmd/utils: fix default DNS discovery configuration (#21124)
fjl May 25, 2020
2f66a8d
metrics/prometheus: define TYPE once, add tests (#21068)
riptl May 26, 2020
7ddb402
ethdb/leveldb: use timer instead of time.After (#21066)
ucwong May 26, 2020
81e9cae
ethstats: avoid blocking chan when received invalid stats request (#2…
duanhao0814 May 26, 2020
070a5e1
trie: fix for range proof (#21107)
rjl493456442 May 26, 2020
4873a9d
build: upgrade to golangci lint v1.27.0 (#21127)
fjl May 26, 2020
9219e0f
eth: interrupt chain insertion on shutdown (#21114)
fjl May 26, 2020
b2c59e2
consensus/clique: make internal error private (#21132)
six-days May 27, 2020
389da6a
trie: enforce monotonic range in prover and return end marker (#21130)
rjl493456442 May 27, 2020
a5eee8d
eth/downloader: more context in errors (#21067)
holiman May 29, 2020
a35382d
metrics: replace gosigar with gopsutil (#21041)
renaynay Jun 2, 2020
cd57d5c
core/vm: EIP-2315, JUMPSUB for the EVM (#20619)
gcolvin Jun 2, 2020
723bd8c
p2p/discover: move discv4 encoding to new 'v4wire' package (#21147)
fjl Jun 2, 2020
d98c42c
rpc: send websocket ping when connection is idle (#21142)
fjl Jun 2, 2020
5f6f5e3
console: handle undefined + null in console funcs (#21160)
gballet Jun 2, 2020
3f649d4
core: collect NewTxsEvent items without holding reorg lock (#21145)
cheng762 Jun 2, 2020
4fc6785
core/vm, crypto/bls12381, params: add bls12-381 elliptic curve precom…
kilic Jun 3, 2020
890757f
cmd, core, params: inital support for yolo-v1 testnet (#21154)
holiman Jun 3, 2020
f52ff0f
cmd/geth: fix the fork orders for DAO tests
karalabe Jun 3, 2020
8b83125
Merge pull request #21162 from karalabe/daofork-order-check-fix
karalabe Jun 3, 2020
469b873
acounts/keystore, cmd/faucet: fix faucet double import, fix twitter url
karalabe Jun 4, 2020
201e345
Merge pull request #21172 from karalabe/faucet-twitter-mobile
karalabe Jun 4, 2020
b1b75f0
accounts/keystore, cmd/faucet: return old account to allow unlock
karalabe Jun 4, 2020
cefa2ab
Merge pull request #21173 from karalabe/faucet-delete-oldaccs
karalabe Jun 4, 2020
4b2ff14
go.mod: upgrade go-duktape to hide unused function warning (#21168)
ucwong Jun 4, 2020
9d93535
node: missing comma on toml tags (#21187)
mcortesi Jun 8, 2020
55f30db
core/vm, crypt/bls12381: fixed comments in bls (#21182)
MariusVanDerWijden Jun 8, 2020
88125d8
core: fix typo in comments (#21181)
evertonfraga Jun 8, 2020
0b3f3be
internal/ethapi: return revert reason for eth_call (#21083)
MariusVanDerWijden Jun 8, 2020
a5c827a
params: update CHTs for 1.9.15 release
karalabe Jun 8, 2020
6512334
Merge pull request #21188 from karalabe/cht-1.9.15
karalabe Jun 8, 2020
0f77f34
params: go-ethereum v1.9.15 stable
fjl Jun 8, 2020
2857363
Merge branch 'upgrade/go-ethereum/v1.9.14-2021211111542' into upgrade…
ricardolyn Feb 12, 2021
9d63bb7
fix: arguments to sprintf
ricardolyn Feb 12, 2021
27b70a3
fix: Fix genesis test for privacy flags: error Fatal: Failed to write…
ricardolyn Feb 12, 2021
f454b74
tidy: go.mod
ricardolyn Feb 12, 2021
934d4f0
lint: fix lint issues
ricardolyn Feb 12, 2021
900595b
Merge branch 'upgrade/go-ethereum/v1.9.14-2021211111542' into upgrade…
ricardolyn Feb 15, 2021
550c952
Merge branch 'master' into upgrade/go-ethereum/v1.9.15-2021212113514
ricardolyn Feb 15, 2021
662c1b8
Merge branch 'master' into upgrade/go-ethereum/v1.9.15-2021212113514
ricardolyn Feb 17, 2021
c595ca3
Merge branch 'master' into upgrade/go-ethereum/v1.9.15-2021212113514
ricardolyn Feb 17, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,6 @@ linters-settings:
min-occurrences: 6 # minimum number of occurrences

issues:
# Quorum - Disabling check for "S1039: unnecessary use of fmt.Sprintf (gosimple)" until we upgrade to geth 1.9.20 and have the lint fixes that also were applied in go-ethereum, as it was creating many necessary changes in geth codebase
exclude:
- S1039
# End Quorum
exclude-rules:
- path: crypto/blake2b/
linters:
Expand Down
20 changes: 0 additions & 20 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,26 +24,6 @@ jobs:
script:
- go run build/ci.go lint

- stage: build
os: linux
dist: xenial
go: 1.11.x
env:
- GO111MODULE=on
script:
- go run build/ci.go install
- go run build/ci.go test -coverage $TEST_PACKAGES

- stage: build
os: linux
dist: xenial
go: 1.12.x
env:
- GO111MODULE=on
script:
- go run build/ci.go install
- go run build/ci.go test -coverage $TEST_PACKAGES

- stage: build
os: linux
dist: xenial
Expand Down
138 changes: 22 additions & 116 deletions accounts/abi/argument.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,149 +122,55 @@ func (arguments Arguments) UnpackIntoMap(v map[string]interface{}, data []byte)
return nil
}

// unpack sets the unmarshalled value to go format.
// Note the dst here must be settable.
func unpack(t *Type, dst interface{}, src interface{}) error {
var (
dstVal = reflect.ValueOf(dst).Elem()
srcVal = reflect.ValueOf(src)
)
tuple, typ := false, t
for {
if typ.T == SliceTy || typ.T == ArrayTy {
typ = typ.Elem
continue
}
tuple = typ.T == TupleTy
break
}
if !tuple {
return set(dstVal, srcVal)
}

// Dereferences interface or pointer wrapper
dstVal = indirectInterfaceOrPtr(dstVal)

switch t.T {
case TupleTy:
if dstVal.Kind() != reflect.Struct {
return fmt.Errorf("abi: invalid dst value for unpack, want struct, got %s", dstVal.Kind())
}
fieldmap, err := mapArgNamesToStructFields(t.TupleRawNames, dstVal)
if err != nil {
return err
}
for i, elem := range t.TupleElems {
fname := fieldmap[t.TupleRawNames[i]]
field := dstVal.FieldByName(fname)
if !field.IsValid() {
return fmt.Errorf("abi: field %s can't found in the given value", t.TupleRawNames[i])
}
if err := unpack(elem, field.Addr().Interface(), srcVal.Field(i).Interface()); err != nil {
return err
}
}
return nil
case SliceTy:
if dstVal.Kind() != reflect.Slice {
return fmt.Errorf("abi: invalid dst value for unpack, want slice, got %s", dstVal.Kind())
}
slice := reflect.MakeSlice(dstVal.Type(), srcVal.Len(), srcVal.Len())
for i := 0; i < slice.Len(); i++ {
if err := unpack(t.Elem, slice.Index(i).Addr().Interface(), srcVal.Index(i).Interface()); err != nil {
return err
}
}
dstVal.Set(slice)
case ArrayTy:
if dstVal.Kind() != reflect.Array {
return fmt.Errorf("abi: invalid dst value for unpack, want array, got %s", dstVal.Kind())
}
array := reflect.New(dstVal.Type()).Elem()
for i := 0; i < array.Len(); i++ {
if err := unpack(t.Elem, array.Index(i).Addr().Interface(), srcVal.Index(i).Interface()); err != nil {
return err
}
}
dstVal.Set(array)
}
return nil
}

// unpackAtomic unpacks ( hexdata -> go ) a single value
func (arguments Arguments) unpackAtomic(v interface{}, marshalledValues interface{}) error {
nonIndexedArgs := arguments.NonIndexed()
if len(nonIndexedArgs) == 0 {
return nil
}
argument := nonIndexedArgs[0]
elem := reflect.ValueOf(v).Elem()
dst := reflect.ValueOf(v).Elem()
src := reflect.ValueOf(marshalledValues)

if elem.Kind() == reflect.Struct && argument.Type.T != TupleTy {
fieldmap, err := mapArgNamesToStructFields([]string{argument.Name}, elem)
if err != nil {
return err
}
field := elem.FieldByName(fieldmap[argument.Name])
if !field.IsValid() {
return fmt.Errorf("abi: field %s can't be found in the given value", argument.Name)
}
return unpack(&argument.Type, field.Addr().Interface(), marshalledValues)
if dst.Kind() == reflect.Struct && src.Kind() != reflect.Struct {
return set(dst.Field(0), src)
}
return unpack(&argument.Type, elem.Addr().Interface(), marshalledValues)
return set(dst, src)
}

// unpackTuple unpacks ( hexdata -> go ) a batch of values.
func (arguments Arguments) unpackTuple(v interface{}, marshalledValues []interface{}) error {
var (
value = reflect.ValueOf(v).Elem()
typ = value.Type()
kind = value.Kind()
nonIndexedArgs = arguments.NonIndexed()
)
if err := requireUnpackKind(value, len(nonIndexedArgs), arguments); err != nil {
return err
}
value := reflect.ValueOf(v).Elem()
nonIndexedArgs := arguments.NonIndexed()

// If the interface is a struct, get of abi->struct_field mapping
var abi2struct map[string]string
if kind == reflect.Struct {
switch value.Kind() {
case reflect.Struct:
argNames := make([]string, len(nonIndexedArgs))
for i, arg := range nonIndexedArgs {
argNames[i] = arg.Name
}
var err error
if abi2struct, err = mapArgNamesToStructFields(argNames, value); err != nil {
abi2struct, err := mapArgNamesToStructFields(argNames, value)
if err != nil {
return err
}
}
for i, arg := range nonIndexedArgs {
switch kind {
case reflect.Struct:
for i, arg := range nonIndexedArgs {
field := value.FieldByName(abi2struct[arg.Name])
if !field.IsValid() {
return fmt.Errorf("abi: field %s can't be found in the given value", arg.Name)
}
if err := unpack(&arg.Type, field.Addr().Interface(), marshalledValues[i]); err != nil {
if err := set(field, reflect.ValueOf(marshalledValues[i])); err != nil {
return err
}
case reflect.Slice, reflect.Array:
if value.Len() < i {
return fmt.Errorf("abi: insufficient number of arguments for unpack, want %d, got %d", len(arguments), value.Len())
}
v := value.Index(i)
if err := requireAssignable(v, reflect.ValueOf(marshalledValues[i])); err != nil {
return err
}
if err := unpack(&arg.Type, v.Addr().Interface(), marshalledValues[i]); err != nil {
}
case reflect.Slice, reflect.Array:
if value.Len() < len(marshalledValues) {
return fmt.Errorf("abi: insufficient number of arguments for unpack, want %d, got %d", len(arguments), value.Len())
}
for i := range nonIndexedArgs {
if err := set(value.Index(i), reflect.ValueOf(marshalledValues[i])); err != nil {
return err
}
default:
return fmt.Errorf("abi:[2] cannot unmarshal tuple in to %v", typ)
}
default:
return fmt.Errorf("abi:[2] cannot unmarshal tuple in to %v", value.Type())
}
return nil

}

// UnpackValues can be used to unpack ABI-encoded hexdata according to the ABI-specification,
Expand Down
65 changes: 52 additions & 13 deletions accounts/abi/bind/backends/simulated.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import (
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/common/math"
"github.com/ethereum/go-ethereum/consensus/ethash"
"github.com/ethereum/go-ethereum/core"
Expand Down Expand Up @@ -67,7 +68,7 @@ type SimulatedBackend struct {

mu sync.Mutex
pendingBlock *types.Block // Currently pending block that will be imported on request
pendingState *state.StateDB // Currently pending state that will be the active on on request
pendingState *state.StateDB // Currently pending state that will be the active on request

events *filters.EventSystem // Event system for filtering log events live

Expand Down Expand Up @@ -151,11 +152,11 @@ func (b *SimulatedBackend) stateByBlockNumber(ctx context.Context, blockNumber *
statedb, _, err := b.blockchain.State()
return statedb, err
}
block, err := b.BlockByNumber(ctx, blockNumber)
block, err := b.blockByNumberNoLock(ctx, blockNumber)
if err != nil {
return nil, err
}
statedb, _, err := b.blockchain.StateAt(block.Hash())
statedb, _, err := b.blockchain.StateAt(block.Root())
return statedb, err
}

Expand Down Expand Up @@ -263,6 +264,12 @@ func (b *SimulatedBackend) BlockByNumber(ctx context.Context, number *big.Int) (
b.mu.Lock()
defer b.mu.Unlock()

return b.blockByNumberNoLock(ctx, number)
}

// blockByNumberNoLock retrieves a block from the database by number, caching it
// (associated with its hash) if found without Lock.
func (b *SimulatedBackend) blockByNumberNoLock(ctx context.Context, number *big.Int) (*types.Block, error) {
if number == nil || number.Cmp(b.pendingBlock.Number()) == 0 {
return b.blockchain.CurrentBlock(), nil
}
Expand Down Expand Up @@ -357,6 +364,36 @@ func (b *SimulatedBackend) PendingCodeAt(ctx context.Context, contract common.Ad
return b.pendingState.GetCode(contract), nil
}

func newRevertError(result *core.ExecutionResult) *revertError {
reason, errUnpack := abi.UnpackRevert(result.Revert())
err := errors.New("execution reverted")
if errUnpack == nil {
err = fmt.Errorf("execution reverted: %v", reason)
}
return &revertError{
error: err,
reason: hexutil.Encode(result.Revert()),
}
}

// revertError is an API error that encompassas an EVM revertal with JSON error
// code and a binary data blob.
type revertError struct {
error
reason string // revert reason hex encoded
}

// ErrorCode returns the JSON error code for a revertal.
// See: https://github.com/ethereum/wiki/wiki/JSON-RPC-Error-Codes-Improvement-Proposal
func (e *revertError) ErrorCode() int {
return 3
}

// ErrorData returns the hex encoded revert reason.
func (e *revertError) ErrorData() interface{} {
return e.reason
}

// CallContract executes a contract call.
func (b *SimulatedBackend) CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) {
b.mu.Lock()
Expand All @@ -373,7 +410,11 @@ func (b *SimulatedBackend) CallContract(ctx context.Context, call ethereum.CallM
if err != nil {
return nil, err
}
return res.Return(), nil
// If the result contains a revert reason, try to unpack and return it.
if len(res.Revert()) > 0 {
return nil, newRevertError(res)
}
return res.Return(), res.Err
}

// PendingCallContract executes a contract call on the pending state.
Expand All @@ -386,7 +427,11 @@ func (b *SimulatedBackend) PendingCallContract(ctx context.Context, call ethereu
if err != nil {
return nil, err
}
return res.Return(), nil
// If the result contains a revert reason, try to unpack and return it.
if len(res.Revert()) > 0 {
return nil, newRevertError(res)
}
return res.Return(), res.Err
}

// PendingNonceAt implements PendingStateReader.PendingNonceAt, retrieving
Expand Down Expand Up @@ -485,16 +530,10 @@ func (b *SimulatedBackend) EstimateGas(ctx context.Context, call ethereum.CallMs
}
if failed {
if result != nil && result.Err != vm.ErrOutOfGas {
errMsg := fmt.Sprintf("always failing transaction (%v)", result.Err)
if len(result.Revert()) > 0 {
ret, err := abi.UnpackRevert(result.Revert())
if err != nil {
errMsg += fmt.Sprintf(" (%#x)", result.Revert())
} else {
errMsg += fmt.Sprintf(" (%s)", ret)
}
return 0, newRevertError(result)
}
return 0, errors.New(errMsg)
return 0, result.Err
}
// Otherwise, the specified gas cap is too low
return 0, fmt.Errorf("gas required exceeds allowance (%d)", cap)
Expand Down
Loading