diff options
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/bootnode/main.go | 3 | ||||
-rw-r--r-- | cmd/clef/README.md | 1 | ||||
-rw-r--r-- | cmd/clef/docs/qubes/clef_qubes_http.png | bin | 14302 -> 12237 bytes | |||
-rw-r--r-- | cmd/clef/docs/qubes/clef_qubes_qrexec.png | bin | 20261 -> 17443 bytes | |||
-rw-r--r-- | cmd/clef/docs/qubes/qrexec-example.png | bin | 19109 -> 16166 bytes | |||
-rw-r--r-- | cmd/clef/docs/qubes/qubes_newaccount-1.png | bin | 25142 -> 22348 bytes | |||
-rw-r--r-- | cmd/clef/docs/qubes/qubes_newaccount-2.png | bin | 42747 -> 37250 bytes | |||
-rw-r--r-- | cmd/clef/extapi_changelog.md | 7 | ||||
-rw-r--r-- | cmd/clef/main.go | 10 | ||||
-rw-r--r-- | cmd/clef/sign_flow.png | bin | 36397 -> 20753 bytes | |||
-rw-r--r-- | cmd/clef/tutorial.md | 93 | ||||
-rw-r--r-- | cmd/evm/runner.go | 25 | ||||
-rw-r--r-- | cmd/faucet/faucet.go | 120 | ||||
-rw-r--r-- | cmd/geth/chaincmd.go | 4 | ||||
-rw-r--r-- | cmd/geth/main.go | 2 | ||||
-rw-r--r-- | cmd/geth/usage.go | 2 | ||||
-rw-r--r-- | cmd/p2psim/main.go | 4 | ||||
-rw-r--r-- | cmd/puppeth/wizard_dashboard.go | 2 | ||||
-rw-r--r-- | cmd/swarm/main.go | 6 | ||||
-rw-r--r-- | cmd/swarm/run_test.go | 13 | ||||
-rw-r--r-- | cmd/utils/flags.go | 27 | ||||
-rw-r--r-- | cmd/wnode/main.go | 10 |
22 files changed, 206 insertions, 123 deletions
diff --git a/cmd/bootnode/main.go b/cmd/bootnode/main.go index 2e93cc04d..845900865 100644 --- a/cmd/bootnode/main.go +++ b/cmd/bootnode/main.go @@ -29,6 +29,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p/discover" "github.com/ethereum/go-ethereum/p2p/discv5" + "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/nat" "github.com/ethereum/go-ethereum/p2p/netutil" ) @@ -85,7 +86,7 @@ func main() { } if *writeAddr { - fmt.Printf("%v\n", discover.PubkeyID(&nodeKey.PublicKey)) + fmt.Printf("%v\n", enode.PubkeyToIDV4(&nodeKey.PublicKey)) os.Exit(0) } diff --git a/cmd/clef/README.md b/cmd/clef/README.md index 027c22c98..c02ac44d8 100644 --- a/cmd/clef/README.md +++ b/cmd/clef/README.md @@ -875,3 +875,4 @@ There are a couple of implementation for a UI. We'll try to keep this list up to | QtSigner| https://github.com/holiman/qtsigner/| Python3/QT-based| :+1:| :+1:| :+1:| :+1:| :+1:| :x: | :+1: (partially)| | GtkSigner| https://github.com/holiman/gtksigner| Python3/GTK-based| :+1:| :x:| :x:| :+1:| :+1:| :x: | :x: | | Frame | https://github.com/floating/frame/commits/go-signer| Electron-based| :x:| :x:| :x:| :x:| ?| :x: | :x: | +| Clef UI| https://github.com/kyokan/clef-ui| Golang/QT-based| :+1:| :+1:| :x:| :+1:| :+1:| :x: | :+1: (approve tx only)| diff --git a/cmd/clef/docs/qubes/clef_qubes_http.png b/cmd/clef/docs/qubes/clef_qubes_http.png Binary files differindex a641e1987..e95ad8da4 100644 --- a/cmd/clef/docs/qubes/clef_qubes_http.png +++ b/cmd/clef/docs/qubes/clef_qubes_http.png diff --git a/cmd/clef/docs/qubes/clef_qubes_qrexec.png b/cmd/clef/docs/qubes/clef_qubes_qrexec.png Binary files differindex f57fc8933..b1814e7c3 100644 --- a/cmd/clef/docs/qubes/clef_qubes_qrexec.png +++ b/cmd/clef/docs/qubes/clef_qubes_qrexec.png diff --git a/cmd/clef/docs/qubes/qrexec-example.png b/cmd/clef/docs/qubes/qrexec-example.png Binary files differindex 0d86fde19..fc5d57725 100644 --- a/cmd/clef/docs/qubes/qrexec-example.png +++ b/cmd/clef/docs/qubes/qrexec-example.png diff --git a/cmd/clef/docs/qubes/qubes_newaccount-1.png b/cmd/clef/docs/qubes/qubes_newaccount-1.png Binary files differindex 598dbbee7..3bfc8b5b7 100644 --- a/cmd/clef/docs/qubes/qubes_newaccount-1.png +++ b/cmd/clef/docs/qubes/qubes_newaccount-1.png diff --git a/cmd/clef/docs/qubes/qubes_newaccount-2.png b/cmd/clef/docs/qubes/qubes_newaccount-2.png Binary files differindex cd762a193..c6dbd535d 100644 --- a/cmd/clef/docs/qubes/qubes_newaccount-2.png +++ b/cmd/clef/docs/qubes/qubes_newaccount-2.png diff --git a/cmd/clef/extapi_changelog.md b/cmd/clef/extapi_changelog.md index 2014e90ae..6c2c3e819 100644 --- a/cmd/clef/extapi_changelog.md +++ b/cmd/clef/extapi_changelog.md @@ -1,6 +1,13 @@ ### Changelog for external API +#### 4.0.0 +* The external `account_Ecrecover`-method was removed. +* The external `account_Import`-method was removed. + +#### 3.0.0 + +* The external `account_List`-method was changed to not expose `url`, which contained info about the local filesystem. It now returns only a list of addresses. #### 2.0.0 diff --git a/cmd/clef/main.go b/cmd/clef/main.go index f363a86f2..c060285be 100644 --- a/cmd/clef/main.go +++ b/cmd/clef/main.go @@ -48,7 +48,7 @@ import ( ) // ExternalAPIVersion -- see extapi_changelog.md -const ExternalAPIVersion = "2.0.0" +const ExternalAPIVersion = "3.0.0" // InternalAPIVersion -- see intapi_changelog.md const InternalAPIVersion = "2.0.0" @@ -70,6 +70,10 @@ var ( Value: 4, Usage: "log level to emit to the screen", } + advancedMode = cli.BoolFlag{ + Name: "advanced", + Usage: "If enabled, issues warnings instead of rejections for suspicious requests. Default off", + } keystoreFlag = cli.StringFlag{ Name: "keystore", Value: filepath.Join(node.DefaultDataDir(), "keystore"), @@ -191,6 +195,7 @@ func init() { ruleFlag, stdiouiFlag, testFlag, + advancedMode, } app.Action = signer app.Commands = []cli.Command{initCommand, attestCommand, addCredentialCommand} @@ -384,7 +389,8 @@ func signer(c *cli.Context) error { c.String(keystoreFlag.Name), c.Bool(utils.NoUSBFlag.Name), ui, db, - c.Bool(utils.LightKDFFlag.Name)) + c.Bool(utils.LightKDFFlag.Name), + c.Bool(advancedMode.Name)) api = apiImpl diff --git a/cmd/clef/sign_flow.png b/cmd/clef/sign_flow.png Binary files differindex 9c0f3cc5d..93ef81a32 100644 --- a/cmd/clef/sign_flow.png +++ b/cmd/clef/sign_flow.png diff --git a/cmd/clef/tutorial.md b/cmd/clef/tutorial.md index d59e08ac7..dfb31ba4e 100644 --- a/cmd/clef/tutorial.md +++ b/cmd/clef/tutorial.md @@ -31,43 +31,51 @@ NOTE: This file does not contain your accounts. Those need to be backed up separ ## Creating rules -Now, you can create a rule-file. +Now, you can create a rule-file. Note that it is not mandatory to use predefined rules, but it's really handy. ```javascript function ApproveListing(){ return "Approve" } ``` -Get the `sha256` hash.... + +Get the `sha256` hash. If you have openssl, you can do `openssl sha256 rules.js`... ```text #sha256sum rules.js 6c21d1737429d6d4f2e55146da0797782f3c0a0355227f19d702df377c165d72 rules.js ``` -...And then `attest` the file: +...now `attest` the file... ```text #./signer attest 6c21d1737429d6d4f2e55146da0797782f3c0a0355227f19d702df377c165d72 INFO [02-21|12:14:38] Ruleset attestation updated sha256=6c21d1737429d6d4f2e55146da0797782f3c0a0355227f19d702df377c165d72 ``` -At this point, we then start the signer with the rule-file: +...and (this is required only for non-production versions) load a mock-up `4byte.json` by copying the file from the source to your current working directory: ```text -#./signer --rules rules.json - -INFO [02-21|12:15:18] Using CLI as UI-channel -INFO [02-21|12:15:18] Loaded 4byte db signatures=5509 file=./4byte.json -INFO [02-21|12:15:18] Could not load rulefile, rules not enabled file=rulefile -DEBUG[02-21|12:15:18] FS scan times list=35.335µs set=5.536µs diff=5.073µs -DEBUG[02-21|12:15:18] Ledger support enabled -DEBUG[02-21|12:15:18] Trezor support enabled -INFO [02-21|12:15:18] Audit logs configured file=audit.log -INFO [02-21|12:15:18] HTTP endpoint opened url=http://localhost:8550 +#cp $GOPATH/src/github.com/ethereum/go-ethereum/cmd/clef/4byte.json $PWD +``` + +At this point, we can start the signer with the rule-file: +```text +#./signer --rules rules.js --rpc + +INFO [09-25|20:28:11.866] Using CLI as UI-channel +INFO [09-25|20:28:11.876] Loaded 4byte db signatures=5509 file=./4byte.json +INFO [09-25|20:28:11.877] Rule engine configured file=./rules.js +DEBUG[09-25|20:28:11.877] FS scan times list=100.781µs set=13.253µs diff=5.761µs +DEBUG[09-25|20:28:11.884] Ledger support enabled +DEBUG[09-25|20:28:11.888] Trezor support enabled +INFO [09-25|20:28:11.888] Audit logs configured file=audit.log +DEBUG[09-25|20:28:11.888] HTTP registered namespace=account +INFO [09-25|20:28:11.890] HTTP endpoint opened url=http://localhost:8550 +DEBUG[09-25|20:28:11.890] IPC registered namespace=account +INFO [09-25|20:28:11.890] IPC endpoint opened url=<nil> ------- Signer info ------- +* extapi_version : 2.0.0 +* intapi_version : 2.0.0 * extapi_http : http://localhost:8550 * extapi_ipc : <nil> -* extapi_version : 2.0.0 -* intapi_version : 1.2.0 - ``` Any list-requests will now be auto-approved by our rule-file. @@ -107,16 +115,16 @@ The `master_seed` was then used to derive a few other things: ## Adding credentials -In order to make more useful rules; sign transactions, the signer needs access to the passwords needed to unlock keystores. +In order to make more useful rules like signing transactions, the signer needs access to the passwords needed to unlock keystores. ```text -#./signer addpw 0x694267f14675d7e1b9494fd8d72fefe1755710fa test +#./signer addpw "0x694267f14675d7e1b9494fd8d72fefe1755710fa" "test_password" INFO [02-21|13:43:21] Credential store updated key=0x694267f14675d7e1b9494fd8d72fefe1755710fa ``` ## More advanced rules -Now let's update the rules to make use of credentials +Now let's update the rules to make use of credentials: ```javascript function ApproveListing(){ @@ -134,13 +142,15 @@ function ApproveSignData(r){ } ``` -In this example, -* any requests to sign data with the account `0x694...` will be - * auto-approved if the message contains with `bazonk`, - * and auto-rejected if it does not. - * Any other signing-requests will be passed along for manual approve/reject. +In this example: +* Any requests to sign data with the account `0x694...` will be + * auto-approved if the message contains with `bazonk` + * auto-rejected if it does not. +* Any other signing-requests will be passed along for manual approve/reject. + +_Note: make sure that `0x694...` is an account you have access to. You can create it either via the clef or the traditional account cli tool. If the latter was chosen, make sure both clef and geth use the same keystore by specifing `--keystore path/to/your/keystore` when running clef._ -..attest the new file +Attest the new file... ```text #sha256sum rules.js 2a0cb661dacfc804b6e95d935d813fd17c0997a7170e4092ffbc34ca976acd9f rules.js @@ -153,23 +163,26 @@ INFO [02-21|14:36:30] Ruleset attestation updated sha256=2a0cb661da And start the signer: ``` -#./signer --rules rules.js - -INFO [02-21|14:41:56] Using CLI as UI-channel -INFO [02-21|14:41:56] Loaded 4byte db signatures=5509 file=./4byte.json -INFO [02-21|14:41:56] Rule engine configured file=rules.js -DEBUG[02-21|14:41:56] FS scan times list=34.607µs set=4.509µs diff=4.87µs -DEBUG[02-21|14:41:56] Ledger support enabled -DEBUG[02-21|14:41:56] Trezor support enabled -INFO [02-21|14:41:56] Audit logs configured file=audit.log -INFO [02-21|14:41:56] HTTP endpoint opened url=http://localhost:8550 +#./signer --rules rules.js --rpc + +INFO [09-25|21:02:16.450] Using CLI as UI-channel +INFO [09-25|21:02:16.466] Loaded 4byte db signatures=5509 file=./4byte.json +INFO [09-25|21:02:16.467] Rule engine configured file=./rules.js +DEBUG[09-25|21:02:16.468] FS scan times list=1.45262ms set=21.926µs diff=6.944µs +DEBUG[09-25|21:02:16.473] Ledger support enabled +DEBUG[09-25|21:02:16.475] Trezor support enabled +INFO [09-25|21:02:16.476] Audit logs configured file=audit.log +DEBUG[09-25|21:02:16.476] HTTP registered namespace=account +INFO [09-25|21:02:16.478] HTTP endpoint opened url=http://localhost:8550 +DEBUG[09-25|21:02:16.478] IPC registered namespace=account +INFO [09-25|21:02:16.478] IPC endpoint opened url=<nil> ------- Signer info ------- * extapi_version : 2.0.0 -* intapi_version : 1.2.0 +* intapi_version : 2.0.0 * extapi_http : http://localhost:8550 * extapi_ipc : <nil> -INFO [02-21|14:41:56] error occurred during execution error="ReferenceError: 'OnSignerStartup' is not defined" ``` + And then test signing, once with `bazonk` and once without: ``` @@ -190,9 +203,9 @@ INFO [02-21|14:42:56] Op rejected The signer also stores all traffic over the external API in a log file. The last 4 lines shows the two requests and their responses: ```text -#tail audit.log -n 4 +#tail -n 4 audit.log t=2018-02-21T14:42:41+0100 lvl=info msg=Sign api=signer type=request metadata="{\"remote\":\"127.0.0.1:49706\",\"local\":\"localhost:8550\",\"scheme\":\"HTTP/1.1\"}" addr="0x694267f14675d7e1b9494fd8d72fefe1755710fa [chksum INVALID]" data=202062617a6f6e6b2062617a2067617a0a t=2018-02-21T14:42:42+0100 lvl=info msg=Sign api=signer type=response data=93e6161840c3ae1efc26dc68dedab6e8fc233bb3fefa1b4645dbf6609b93dace160572ea4ab33240256bb6d3dadb60dcd9c515d6374d3cf614ee897408d41d541c error=nil t=2018-02-21T14:42:56+0100 lvl=info msg=Sign api=signer type=request metadata="{\"remote\":\"127.0.0.1:49708\",\"local\":\"localhost:8550\",\"scheme\":\"HTTP/1.1\"}" addr="0x694267f14675d7e1b9494fd8d72fefe1755710fa [chksum INVALID]" data=2020626f6e6b2062617a2067617a0a t=2018-02-21T14:42:56+0100 lvl=info msg=Sign api=signer type=response data= error="Request denied" -``` +```
\ No newline at end of file diff --git a/cmd/evm/runner.go b/cmd/evm/runner.go index 7138a9ddd..962fc021d 100644 --- a/cmd/evm/runner.go +++ b/cmd/evm/runner.go @@ -80,13 +80,13 @@ func runCmd(ctx *cli.Context) error { } var ( - tracer vm.Tracer - debugLogger *vm.StructLogger - statedb *state.StateDB - chainConfig *params.ChainConfig - sender = common.BytesToAddress([]byte("sender")) - receiver = common.BytesToAddress([]byte("receiver")) - blockNumber uint64 + tracer vm.Tracer + debugLogger *vm.StructLogger + statedb *state.StateDB + chainConfig *params.ChainConfig + sender = common.BytesToAddress([]byte("sender")) + receiver = common.BytesToAddress([]byte("receiver")) + genesisConfig *core.Genesis ) if ctx.GlobalBool(MachineFlag.Name) { tracer = NewJSONLogger(logconfig, os.Stdout) @@ -98,13 +98,14 @@ func runCmd(ctx *cli.Context) error { } if ctx.GlobalString(GenesisFlag.Name) != "" { gen := readGenesis(ctx.GlobalString(GenesisFlag.Name)) + genesisConfig = gen db := ethdb.NewMemDatabase() genesis := gen.ToBlock(db) statedb, _ = state.New(genesis.Root(), state.NewDatabase(db)) chainConfig = gen.Config - blockNumber = gen.Number } else { statedb, _ = state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + genesisConfig = new(core.Genesis) } if ctx.GlobalString(SenderFlag.Name) != "" { sender = common.HexToAddress(ctx.GlobalString(SenderFlag.Name)) @@ -156,13 +157,19 @@ func runCmd(ctx *cli.Context) error { } initialGas := ctx.GlobalUint64(GasFlag.Name) + if genesisConfig.GasLimit != 0 { + initialGas = genesisConfig.GasLimit + } runtimeConfig := runtime.Config{ Origin: sender, State: statedb, GasLimit: initialGas, GasPrice: utils.GlobalBig(ctx, PriceFlag.Name), Value: utils.GlobalBig(ctx, ValueFlag.Name), - BlockNumber: new(big.Int).SetUint64(blockNumber), + Difficulty: genesisConfig.Difficulty, + Time: new(big.Int).SetUint64(genesisConfig.Timestamp), + Coinbase: genesisConfig.Coinbase, + BlockNumber: new(big.Int).SetUint64(genesisConfig.Number), EVMConfig: vm.Config{ Tracer: tracer, Debug: ctx.GlobalBool(DebugFlag.Name) || ctx.GlobalBool(MachineFlag.Name), diff --git a/cmd/faucet/faucet.go b/cmd/faucet/faucet.go index cfe4e45f1..2ffe12276 100644 --- a/cmd/faucet/faucet.go +++ b/cmd/faucet/faucet.go @@ -54,8 +54,8 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/discover" "github.com/ethereum/go-ethereum/p2p/discv5" + "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/nat" "github.com/ethereum/go-ethereum/params" "golang.org/x/net/websocket" @@ -199,6 +199,8 @@ type faucet struct { keystore *keystore.KeyStore // Keystore containing the single signer account accounts.Account // Account funding user faucet requests + head *types.Header // Current head header of the faucet + balance *big.Int // Current balance of the faucet nonce uint64 // Current pending nonce of the faucet price *big.Int // Current gas price to issue funds with @@ -253,8 +255,10 @@ func newFaucet(genesis *core.Genesis, port int, enodes []*discv5.Node, network u return nil, err } for _, boot := range enodes { - old, _ := discover.ParseNode(boot.String()) - stack.Server().AddPeer(old) + old, err := enode.ParseV4(boot.String()) + if err != nil { + stack.Server().AddPeer(old) + } } // Attach to the client and retrieve and interesting metadatas api, err := stack.Attach() @@ -324,33 +328,30 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { nonce uint64 err error ) - for { - // Attempt to retrieve the stats, may error on no faucet connectivity - ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) - head, err = f.client.HeaderByNumber(ctx, nil) - if err == nil { - balance, err = f.client.BalanceAt(ctx, f.account.Address, head.Number) - if err == nil { - nonce, err = f.client.NonceAt(ctx, f.account.Address, nil) - } + for head == nil || balance == nil { + // Retrieve the current stats cached by the faucet + f.lock.RLock() + if f.head != nil { + head = types.CopyHeader(f.head) } - cancel() + if f.balance != nil { + balance = new(big.Int).Set(f.balance) + } + nonce = f.nonce + f.lock.RUnlock() - // If stats retrieval failed, wait a bit and retry - if err != nil { - if err = sendError(conn, errors.New("Faucet offline: "+err.Error())); err != nil { + if head == nil || balance == nil { + // Report the faucet offline until initial stats are ready + if err = sendError(conn, errors.New("Faucet offline")); err != nil { log.Warn("Failed to send faucet error to client", "err", err) return } time.Sleep(3 * time.Second) - continue } - // Initial stats reported successfully, proceed with user interaction - break } // Send over the initial stats and the latest header if err = send(conn, map[string]interface{}{ - "funds": balance.Div(balance, ether), + "funds": new(big.Int).Div(balance, ether), "funded": nonce, "peers": f.stack.Server().PeerCount(), "requests": f.reqs, @@ -520,6 +521,47 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { } } +// refresh attempts to retrieve the latest header from the chain and extract the +// associated faucet balance and nonce for connectivity caching. +func (f *faucet) refresh(head *types.Header) error { + // Ensure a state update does not run for too long + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + // If no header was specified, use the current chain head + var err error + if head == nil { + if head, err = f.client.HeaderByNumber(ctx, nil); err != nil { + return err + } + } + // Retrieve the balance, nonce and gas price from the current head + var ( + balance *big.Int + nonce uint64 + price *big.Int + ) + if balance, err = f.client.BalanceAt(ctx, f.account.Address, head.Number); err != nil { + return err + } + if nonce, err = f.client.NonceAt(ctx, f.account.Address, head.Number); err != nil { + return err + } + if price, err = f.client.SuggestGasPrice(ctx); err != nil { + return err + } + // Everything succeeded, update the cached stats and eject old requests + f.lock.Lock() + f.head, f.balance = head, balance + f.price, f.nonce = price, nonce + for len(f.reqs) > 0 && f.reqs[0].Tx.Nonce() < f.nonce { + f.reqs = f.reqs[1:] + } + f.lock.Unlock() + + return nil +} + // loop keeps waiting for interesting events and pushes them out to connected // websockets. func (f *faucet) loop() { @@ -537,45 +579,27 @@ func (f *faucet) loop() { go func() { for head := range update { // New chain head arrived, query the current stats and stream to clients - var ( - balance *big.Int - nonce uint64 - price *big.Int - err error - ) - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - balance, err = f.client.BalanceAt(ctx, f.account.Address, head.Number) - if err == nil { - nonce, err = f.client.NonceAt(ctx, f.account.Address, nil) - if err == nil { - price, err = f.client.SuggestGasPrice(ctx) - } + timestamp := time.Unix(head.Time.Int64(), 0) + if time.Since(timestamp) > time.Hour { + log.Warn("Skipping faucet refresh, head too old", "number", head.Number, "hash", head.Hash(), "age", common.PrettyAge(timestamp)) + continue } - cancel() - - // If querying the data failed, try for the next block - if err != nil { + if err := f.refresh(head); err != nil { log.Warn("Failed to update faucet state", "block", head.Number, "hash", head.Hash(), "err", err) continue - } else { - log.Info("Updated faucet state", "block", head.Number, "hash", head.Hash(), "balance", balance, "nonce", nonce, "price", price) } // Faucet state retrieved, update locally and send to clients - balance = new(big.Int).Div(balance, ether) + f.lock.RLock() + log.Info("Updated faucet state", "number", head.Number, "hash", head.Hash(), "age", common.PrettyAge(timestamp), "balance", f.balance, "nonce", f.nonce, "price", f.price) - f.lock.Lock() - f.price, f.nonce = price, nonce - for len(f.reqs) > 0 && f.reqs[0].Tx.Nonce() < f.nonce { - f.reqs = f.reqs[1:] - } - f.lock.Unlock() + balance := new(big.Int).Div(f.balance, ether) + peers := f.stack.Server().PeerCount() - f.lock.RLock() for _, conn := range f.conns { if err := send(conn, map[string]interface{}{ "funds": balance, "funded": f.nonce, - "peers": f.stack.Server().PeerCount(), + "peers": peers, "requests": f.reqs, }, time.Second); err != nil { log.Warn("Failed to send stats to client", "err", err) diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go index 87548865b..562c7e0de 100644 --- a/cmd/geth/chaincmd.go +++ b/cmd/geth/chaincmd.go @@ -340,9 +340,9 @@ func importPreimages(ctx *cli.Context) error { start := time.Now() if err := utils.ImportPreimages(diskdb, ctx.Args().First()); err != nil { - utils.Fatalf("Export error: %v\n", err) + utils.Fatalf("Import error: %v\n", err) } - fmt.Printf("Export done in %v\n", time.Since(start)) + fmt.Printf("Import done in %v\n", time.Since(start)) return nil } diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 134d5a4c0..fae4b5718 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -130,6 +130,8 @@ var ( utils.NoCompactionFlag, utils.GpoBlocksFlag, utils.GpoPercentileFlag, + utils.EWASMInterpreterFlag, + utils.EVMInterpreterFlag, configFileFlag, } diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go index a674eca4f..8b0491ce3 100644 --- a/cmd/geth/usage.go +++ b/cmd/geth/usage.go @@ -207,6 +207,8 @@ var AppHelpFlagGroups = []flagGroup{ Name: "VIRTUAL MACHINE", Flags: []cli.Flag{ utils.VMEnableDebugFlag, + utils.EVMInterpreterFlag, + utils.EWASMInterpreterFlag, }, }, { diff --git a/cmd/p2psim/main.go b/cmd/p2psim/main.go index 6604b671f..f2c1bf970 100644 --- a/cmd/p2psim/main.go +++ b/cmd/p2psim/main.go @@ -47,7 +47,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/simulations" "github.com/ethereum/go-ethereum/p2p/simulations/adapters" "github.com/ethereum/go-ethereum/rpc" @@ -285,7 +285,7 @@ func createNode(ctx *cli.Context) error { if err != nil { return err } - config.ID = discover.PubkeyID(&privKey.PublicKey) + config.ID = enode.PubkeyToIDV4(&privKey.PublicKey) config.PrivateKey = privKey } if services := ctx.String("services"); services != "" { diff --git a/cmd/puppeth/wizard_dashboard.go b/cmd/puppeth/wizard_dashboard.go index 5f781c415..1a01631ff 100644 --- a/cmd/puppeth/wizard_dashboard.go +++ b/cmd/puppeth/wizard_dashboard.go @@ -92,7 +92,7 @@ func (w *wizard) deployDashboard() { pages = append(pages, page) } } - // Promt the user to chose one, enter manually or simply not list this service + // Prompt the user to chose one, enter manually or simply not list this service defLabel, defChoice := "don't list", len(pages)+2 if len(pages) > 0 { defLabel, defChoice = pages[0], 1 diff --git a/cmd/swarm/main.go b/cmd/swarm/main.go index c93344c42..4c9ce931e 100644 --- a/cmd/swarm/main.go +++ b/cmd/swarm/main.go @@ -38,7 +38,7 @@ import ( "github.com/ethereum/go-ethereum/internal/debug" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/swarm" bzzapi "github.com/ethereum/go-ethereum/swarm/api" swarmmetrics "github.com/ethereum/go-ethereum/swarm/metrics" @@ -788,10 +788,10 @@ func setSwarmBootstrapNodes(ctx *cli.Context, cfg *node.Config) { return } - cfg.P2P.BootstrapNodes = []*discover.Node{} + cfg.P2P.BootstrapNodes = []*enode.Node{} for _, url := range SwarmBootnodes { - node, err := discover.ParseNode(url) + node, err := enode.ParseV4(url) if err != nil { log.Error("Bootstrap URL invalid", "enode", url, "err", err) } diff --git a/cmd/swarm/run_test.go b/cmd/swarm/run_test.go index 3e766dc10..e2f54c8ff 100644 --- a/cmd/swarm/run_test.go +++ b/cmd/swarm/run_test.go @@ -234,6 +234,7 @@ func existingTestNode(t *testing.T, dir string, bzzaccount string) *testNode { // start the node node.Cmd = runSwarm(t, "--port", p2pPort, + "--nat", "extip:127.0.0.1", "--nodiscover", "--datadir", dir, "--ipcpath", conf.IPCPath, @@ -241,7 +242,7 @@ func existingTestNode(t *testing.T, dir string, bzzaccount string) *testNode { "--bzzaccount", bzzaccount, "--bzznetworkid", "321", "--bzzport", httpPort, - "--verbosity", "6", + "--verbosity", "3", ) node.Cmd.InputLine(testPassphrase) defer func() { @@ -284,8 +285,8 @@ func existingTestNode(t *testing.T, dir string, bzzaccount string) *testNode { if err := node.Client.Call(&nodeInfo, "admin_nodeInfo"); err != nil { t.Fatal(err) } - node.Enode = fmt.Sprintf("enode://%s@127.0.0.1:%s", nodeInfo.ID, p2pPort) - + node.Enode = nodeInfo.Enode + node.IpcPath = conf.IPCPath return node } @@ -309,6 +310,7 @@ func newTestNode(t *testing.T, dir string) *testNode { // start the node node.Cmd = runSwarm(t, "--port", p2pPort, + "--nat", "extip:127.0.0.1", "--nodiscover", "--datadir", dir, "--ipcpath", conf.IPCPath, @@ -316,7 +318,7 @@ func newTestNode(t *testing.T, dir string) *testNode { "--bzzaccount", account.Address.String(), "--bzznetworkid", "321", "--bzzport", httpPort, - "--verbosity", "6", + "--verbosity", "3", ) node.Cmd.InputLine(testPassphrase) defer func() { @@ -359,9 +361,8 @@ func newTestNode(t *testing.T, dir string) *testNode { if err := node.Client.Call(&nodeInfo, "admin_nodeInfo"); err != nil { t.Fatal(err) } - node.Enode = fmt.Sprintf("enode://%s@127.0.0.1:%s", nodeInfo.ID, p2pPort) + node.Enode = nodeInfo.Enode node.IpcPath = conf.IPCPath - return node } diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 0fecae9aa..b48f37177 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -51,8 +51,8 @@ import ( "github.com/ethereum/go-ethereum/metrics/influxdb" "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/discover" "github.com/ethereum/go-ethereum/p2p/discv5" + "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/nat" "github.com/ethereum/go-ethereum/p2p/netutil" "github.com/ethereum/go-ethereum/params" @@ -610,6 +610,17 @@ var ( Usage: "InfluxDB `host` tag attached to all measurements", Value: "localhost", } + + EWASMInterpreterFlag = cli.StringFlag{ + Name: "vm.ewasm", + Usage: "External ewasm configuration (default = built-in interpreter)", + Value: "", + } + EVMInterpreterFlag = cli.StringFlag{ + Name: "vm.evm", + Usage: "External EVM configuration (default = built-in interpreter)", + Value: "", + } ) // MakeDataDir retrieves the currently requested data directory, terminating @@ -681,9 +692,9 @@ func setBootstrapNodes(ctx *cli.Context, cfg *p2p.Config) { return // already set, don't apply defaults. } - cfg.BootstrapNodes = make([]*discover.Node, 0, len(urls)) + cfg.BootstrapNodes = make([]*enode.Node, 0, len(urls)) for _, url := range urls { - node, err := discover.ParseNode(url) + node, err := enode.ParseV4(url) if err != nil { log.Crit("Bootstrap URL invalid", "enode", url, "err", err) } @@ -1184,6 +1195,14 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { cfg.EnablePreimageRecording = ctx.GlobalBool(VMEnableDebugFlag.Name) } + if ctx.GlobalIsSet(EWASMInterpreterFlag.Name) { + cfg.EWASMInterpreter = ctx.GlobalString(EWASMInterpreterFlag.Name) + } + + if ctx.GlobalIsSet(EVMInterpreterFlag.Name) { + cfg.EVMInterpreter = ctx.GlobalString(EVMInterpreterFlag.Name) + } + // Override any default configs for hard coded networks. switch { case ctx.GlobalBool(TestnetFlag.Name): @@ -1379,7 +1398,7 @@ func MakeChain(ctx *cli.Context, stack *node.Node) (chain *core.BlockChain, chai cache.TrieNodeLimit = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheGCFlag.Name) / 100 } vmcfg := vm.Config{EnablePreimageRecording: ctx.GlobalBool(VMEnableDebugFlag.Name)} - chain, err = core.NewBlockChain(chainDb, cache, config, engine, vmcfg) + chain, err = core.NewBlockChain(chainDb, cache, config, engine, vmcfg, nil) if err != nil { Fatalf("Can't create BlockChain: %v", err) } diff --git a/cmd/wnode/main.go b/cmd/wnode/main.go index ae79841f6..97e585201 100644 --- a/cmd/wnode/main.go +++ b/cmd/wnode/main.go @@ -41,7 +41,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/nat" "github.com/ethereum/go-ethereum/whisper/mailserver" whisper "github.com/ethereum/go-ethereum/whisper/whisperv6" @@ -175,7 +175,7 @@ func initialize() { log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*argVerbosity), log.StreamHandler(os.Stderr, log.TerminalFormat(false)))) done = make(chan struct{}) - var peers []*discover.Node + var peers []*enode.Node var err error if *generateKey { @@ -203,7 +203,7 @@ func initialize() { if len(*argEnode) == 0 { argEnode = scanLineA("Please enter the peer's enode: ") } - peer := discover.MustParseNode(*argEnode) + peer := enode.MustParseV4(*argEnode) peers = append(peers, peer) } @@ -747,11 +747,11 @@ func requestExpiredMessagesLoop() { } func extractIDFromEnode(s string) []byte { - n, err := discover.ParseNode(s) + n, err := enode.ParseV4(s) if err != nil { utils.Fatalf("Failed to parse enode: %s", err) } - return n.ID[:] + return n.ID().Bytes() } // obfuscateBloom adds 16 random bits to the bloom |