Skip to content
This repository was archived by the owner on Aug 2, 2021. It is now read-only.

Commit 2e6ef1f

Browse files
authored
Merge branch 'master' into swarm-network-rewrite
1 parent 299d65f commit 2e6ef1f

File tree

22 files changed

+1003
-318
lines changed

22 files changed

+1003
-318
lines changed

cmd/faucet/faucet.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -686,8 +686,6 @@ func authTwitter(url string) (string, string, common.Address, error) {
686686
if len(parts) < 4 || parts[len(parts)-2] != "status" {
687687
return "", "", common.Address{}, errors.New("Invalid Twitter status URL")
688688
}
689-
username := parts[len(parts)-3]
690-
691689
// Twitter's API isn't really friendly with direct links. Still, we don't
692690
// want to do ask read permissions from users, so just load the public posts and
693691
// scrape it for the Ethereum address and profile URL.
@@ -697,6 +695,13 @@ func authTwitter(url string) (string, string, common.Address, error) {
697695
}
698696
defer res.Body.Close()
699697

698+
// Resolve the username from the final redirect, no intermediate junk
699+
parts = strings.Split(res.Request.URL.String(), "/")
700+
if len(parts) < 4 || parts[len(parts)-2] != "status" {
701+
return "", "", common.Address{}, errors.New("Invalid Twitter status URL")
702+
}
703+
username := parts[len(parts)-3]
704+
700705
body, err := ioutil.ReadAll(res.Body)
701706
if err != nil {
702707
return "", "", common.Address{}, err

cmd/swarm/config.go

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"os"
2424
"reflect"
2525
"strconv"
26+
"strings"
2627
"unicode"
2728

2829
cli "gopkg.in/urfave/cli.v1"
@@ -102,10 +103,15 @@ func buildConfig(ctx *cli.Context) (config *bzzapi.Config, err error) {
102103
config = bzzapi.NewConfig()
103104
//first load settings from config file (if provided)
104105
config, err = configFileOverride(config, ctx)
106+
if err != nil {
107+
return nil, err
108+
}
105109
//override settings provided by environment variables
106110
config = envVarsOverride(config)
107111
//override settings provided by command line
108112
config = cmdLineOverride(config, ctx)
113+
//validate configuration parameters
114+
err = validateConfig(config)
109115

110116
return
111117
}
@@ -199,12 +205,16 @@ func cmdLineOverride(currentConfig *bzzapi.Config, ctx *cli.Context) *bzzapi.Con
199205
utils.Fatalf(SWARM_ERR_SWAP_SET_NO_API)
200206
}
201207

202-
//EnsApi can be set to "", so can't check for empty string, as it is allowed!
203208
if ctx.GlobalIsSet(EnsAPIFlag.Name) {
204-
currentConfig.EnsApi = ctx.GlobalString(EnsAPIFlag.Name)
209+
ensAPIs := ctx.GlobalStringSlice(EnsAPIFlag.Name)
210+
// preserve backward compatibility to disable ENS with --ens-api=""
211+
if len(ensAPIs) == 1 && ensAPIs[0] == "" {
212+
ensAPIs = nil
213+
}
214+
currentConfig.EnsAPIs = ensAPIs
205215
}
206216

207-
if ensaddr := ctx.GlobalString(EnsAddrFlag.Name); ensaddr != "" {
217+
if ensaddr := ctx.GlobalString(DeprecatedEnsAddrFlag.Name); ensaddr != "" {
208218
currentConfig.EnsRoot = common.HexToAddress(ensaddr)
209219
}
210220

@@ -291,9 +301,8 @@ func envVarsOverride(currentConfig *bzzapi.Config) (config *bzzapi.Config) {
291301
utils.Fatalf(SWARM_ERR_SWAP_SET_NO_API)
292302
}
293303

294-
//EnsApi can be set to "", so can't check for empty string, as it is allowed
295-
if ensapi, exists := os.LookupEnv(SWARM_ENV_ENS_API); exists {
296-
currentConfig.EnsApi = ensapi
304+
if ensapi := os.Getenv(SWARM_ENV_ENS_API); ensapi != "" {
305+
currentConfig.EnsAPIs = strings.Split(ensapi, ",")
297306
}
298307

299308
if ensaddr := os.Getenv(SWARM_ENV_ENS_ADDR); ensaddr != "" {
@@ -340,6 +349,43 @@ func checkDeprecated(ctx *cli.Context) {
340349
if ctx.GlobalString(DeprecatedEthAPIFlag.Name) != "" {
341350
utils.Fatalf("--ethapi is no longer a valid command line flag, please use --ens-api and/or --swap-api.")
342351
}
352+
// warn if --ens-api flag is set
353+
if ctx.GlobalString(DeprecatedEnsAddrFlag.Name) != "" {
354+
log.Warn("--ens-addr is no longer a valid command line flag, please use --ens-api to specify contract address.")
355+
}
356+
}
357+
358+
//validate configuration parameters
359+
func validateConfig(cfg *bzzapi.Config) (err error) {
360+
for _, ensAPI := range cfg.EnsAPIs {
361+
if ensAPI != "" {
362+
if err := validateEnsAPIs(ensAPI); err != nil {
363+
return fmt.Errorf("invalid format [tld:][contract-addr@]url for ENS API endpoint configuration %q: %v", ensAPI, err)
364+
}
365+
}
366+
}
367+
return nil
368+
}
369+
370+
//validate EnsAPIs configuration parameter
371+
func validateEnsAPIs(s string) (err error) {
372+
// missing contract address
373+
if strings.HasPrefix(s, "@") {
374+
return errors.New("missing contract address")
375+
}
376+
// missing url
377+
if strings.HasSuffix(s, "@") {
378+
return errors.New("missing url")
379+
}
380+
// missing tld
381+
if strings.HasPrefix(s, ":") {
382+
return errors.New("missing tld")
383+
}
384+
// missing url
385+
if strings.HasSuffix(s, ":") {
386+
return errors.New("missing url")
387+
}
388+
return nil
343389
}
344390

345391
//print a Config as string

cmd/swarm/config_test.go

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,3 +478,98 @@ func TestConfigCmdLineOverridesFile(t *testing.T) {
478478

479479
node.Shutdown()
480480
}
481+
482+
func TestValidateConfig(t *testing.T) {
483+
for _, c := range []struct {
484+
cfg *api.Config
485+
err string
486+
}{
487+
{
488+
cfg: &api.Config{EnsAPIs: []string{
489+
"/data/testnet/geth.ipc",
490+
}},
491+
},
492+
{
493+
cfg: &api.Config{EnsAPIs: []string{
494+
"http://127.0.0.1:1234",
495+
}},
496+
},
497+
{
498+
cfg: &api.Config{EnsAPIs: []string{
499+
"ws://127.0.0.1:1234",
500+
}},
501+
},
502+
{
503+
cfg: &api.Config{EnsAPIs: []string{
504+
"test:/data/testnet/geth.ipc",
505+
}},
506+
},
507+
{
508+
cfg: &api.Config{EnsAPIs: []string{
509+
"test:ws://127.0.0.1:1234",
510+
}},
511+
},
512+
{
513+
cfg: &api.Config{EnsAPIs: []string{
514+
"314159265dD8dbb310642f98f50C066173C1259b@/data/testnet/geth.ipc",
515+
}},
516+
},
517+
{
518+
cfg: &api.Config{EnsAPIs: []string{
519+
"314159265dD8dbb310642f98f50C066173C1259b@http://127.0.0.1:1234",
520+
}},
521+
},
522+
{
523+
cfg: &api.Config{EnsAPIs: []string{
524+
"314159265dD8dbb310642f98f50C066173C1259b@ws://127.0.0.1:1234",
525+
}},
526+
},
527+
{
528+
cfg: &api.Config{EnsAPIs: []string{
529+
"test:314159265dD8dbb310642f98f50C066173C1259b@/data/testnet/geth.ipc",
530+
}},
531+
},
532+
{
533+
cfg: &api.Config{EnsAPIs: []string{
534+
"eth:314159265dD8dbb310642f98f50C066173C1259b@http://127.0.0.1:1234",
535+
}},
536+
},
537+
{
538+
cfg: &api.Config{EnsAPIs: []string{
539+
"eth:314159265dD8dbb310642f98f50C066173C1259b@ws://127.0.0.1:12344",
540+
}},
541+
},
542+
{
543+
cfg: &api.Config{EnsAPIs: []string{
544+
"eth:",
545+
}},
546+
err: "invalid format [tld:][contract-addr@]url for ENS API endpoint configuration \"eth:\": missing url",
547+
},
548+
{
549+
cfg: &api.Config{EnsAPIs: []string{
550+
"314159265dD8dbb310642f98f50C066173C1259b@",
551+
}},
552+
err: "invalid format [tld:][contract-addr@]url for ENS API endpoint configuration \"314159265dD8dbb310642f98f50C066173C1259b@\": missing url",
553+
},
554+
{
555+
cfg: &api.Config{EnsAPIs: []string{
556+
":314159265dD8dbb310642f98f50C066173C1259",
557+
}},
558+
err: "invalid format [tld:][contract-addr@]url for ENS API endpoint configuration \":314159265dD8dbb310642f98f50C066173C1259\": missing tld",
559+
},
560+
{
561+
cfg: &api.Config{EnsAPIs: []string{
562+
"@/data/testnet/geth.ipc",
563+
}},
564+
err: "invalid format [tld:][contract-addr@]url for ENS API endpoint configuration \"@/data/testnet/geth.ipc\": missing contract address",
565+
},
566+
} {
567+
err := validateConfig(c.cfg)
568+
if c.err != "" && err.Error() != c.err {
569+
t.Errorf("expected error %q, got %q", c.err, err)
570+
}
571+
if c.err == "" && err != nil {
572+
t.Errorf("unexpected error %q", err)
573+
}
574+
}
575+
}

cmd/swarm/main.go

Lines changed: 8 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,22 @@
1717
package main
1818

1919
import (
20-
"context"
2120
"crypto/ecdsa"
2221
"fmt"
2322
"io/ioutil"
24-
"math/big"
2523
"os"
2624
"os/signal"
2725
"runtime"
2826
"sort"
2927
"strconv"
3028
"strings"
3129
"syscall"
32-
"time"
3330

3431
"github.com/ethereum/go-ethereum/accounts"
3532
"github.com/ethereum/go-ethereum/accounts/keystore"
3633
"github.com/ethereum/go-ethereum/cmd/utils"
3734
"github.com/ethereum/go-ethereum/common"
3835
"github.com/ethereum/go-ethereum/console"
39-
"github.com/ethereum/go-ethereum/contracts/ens"
4036
"github.com/ethereum/go-ethereum/crypto"
4137
"github.com/ethereum/go-ethereum/ethclient"
4238
"github.com/ethereum/go-ethereum/internal/debug"
@@ -45,7 +41,6 @@ import (
4541
"github.com/ethereum/go-ethereum/p2p"
4642
"github.com/ethereum/go-ethereum/p2p/discover"
4743
"github.com/ethereum/go-ethereum/params"
48-
"github.com/ethereum/go-ethereum/rpc"
4944
"github.com/ethereum/go-ethereum/swarm"
5045
bzzapi "github.com/ethereum/go-ethereum/swarm/api"
5146

@@ -110,16 +105,11 @@ var (
110105
Usage: "Swarm Syncing enabled (default true)",
111106
EnvVar: SWARM_ENV_SYNC_ENABLE,
112107
}
113-
EnsAPIFlag = cli.StringFlag{
108+
EnsAPIFlag = cli.StringSliceFlag{
114109
Name: "ens-api",
115-
Usage: "URL of the Ethereum API provider to use for ENS record lookups",
110+
Usage: "ENS API endpoint for a TLD and with contract address, can be repeated, format [tld:][contract-addr@]url",
116111
EnvVar: SWARM_ENV_ENS_API,
117112
}
118-
EnsAddrFlag = cli.StringFlag{
119-
Name: "ens-addr",
120-
Usage: "ENS contract address (default is detected as testnet or mainnet using --ens-api)",
121-
EnvVar: SWARM_ENV_ENS_ADDR,
122-
}
123113
SwarmApiFlag = cli.StringFlag{
124114
Name: "bzzapi",
125115
Usage: "Swarm HTTP endpoint",
@@ -180,6 +170,10 @@ var (
180170
Name: "ethapi",
181171
Usage: "DEPRECATED: please use --ens-api and --swap-api",
182172
}
173+
DeprecatedEnsAddrFlag = cli.StringFlag{
174+
Name: "ens-addr",
175+
Usage: "DEPRECATED: ENS contract address, please use --ens-api with contract address according to its format",
176+
}
183177
)
184178

185179
//declare a few constant error messages, useful for later error check comparisons in test
@@ -367,7 +361,6 @@ DEPRECATED: use 'swarm db clean'.
367361
// bzzd-specific flags
368362
CorsStringFlag,
369363
EnsAPIFlag,
370-
EnsAddrFlag,
371364
SwarmTomlConfigPathFlag,
372365
SwarmConfigPathFlag,
373366
SwarmSwapEnabledFlag,
@@ -394,6 +387,7 @@ DEPRECATED: use 'swarm db clean'.
394387
SwarmStoreRadius,
395388
//deprecated flags
396389
DeprecatedEthAPIFlag,
390+
DeprecatedEnsAddrFlag,
397391
}
398392
rpcFlags := []cli.Flag{
399393
utils.WSEnabledFlag,
@@ -493,38 +487,6 @@ func bzzd(ctx *cli.Context) error {
493487
return nil
494488
}
495489

496-
// detectEnsAddr determines the ENS contract address by getting both the
497-
// version and genesis hash using the client and matching them to either
498-
// mainnet or testnet addresses
499-
func detectEnsAddr(client *rpc.Client) (common.Address, error) {
500-
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
501-
defer cancel()
502-
503-
var version string
504-
if err := client.CallContext(ctx, &version, "net_version"); err != nil {
505-
return common.Address{}, err
506-
}
507-
508-
block, err := ethclient.NewClient(client).BlockByNumber(ctx, big.NewInt(0))
509-
if err != nil {
510-
return common.Address{}, err
511-
}
512-
513-
switch {
514-
515-
case version == "1" && block.Hash() == params.MainnetGenesisHash:
516-
log.Info("using Mainnet ENS contract address", "addr", ens.MainNetAddress)
517-
return ens.MainNetAddress, nil
518-
519-
case version == "3" && block.Hash() == params.TestnetGenesisHash:
520-
log.Info("using Testnet ENS contract address", "addr", ens.TestNetAddress)
521-
return ens.TestNetAddress, nil
522-
523-
default:
524-
return common.Address{}, fmt.Errorf("unknown version and genesis hash: %s %s", version, block.Hash())
525-
}
526-
}
527-
528490
func registerBzzService(bzzconfig *bzzapi.Config, ctx *cli.Context, stack *node.Node) {
529491

530492
//define the swarm service boot function
@@ -539,28 +501,8 @@ func registerBzzService(bzzconfig *bzzapi.Config, ctx *cli.Context, stack *node.
539501
}
540502
}
541503

542-
var ensClient *ethclient.Client
543-
if bzzconfig.EnsApi != "" {
544-
log.Info("connecting to ENS API", "url", bzzconfig.EnsApi)
545-
client, err := rpc.Dial(bzzconfig.EnsApi)
546-
if err != nil {
547-
return nil, fmt.Errorf("error connecting to ENS API %s: %s", bzzconfig.EnsApi, err)
548-
}
549-
ensClient = ethclient.NewClient(client)
550-
551-
//no ENS root address set yet
552-
if bzzconfig.EnsRoot == (common.Address{}) {
553-
ensAddr, err := detectEnsAddr(client)
554-
if err == nil {
555-
bzzconfig.EnsRoot = ensAddr
556-
} else {
557-
log.Warn(fmt.Sprintf("could not determine ENS contract address, using default %s", bzzconfig.EnsRoot), "err", err)
558-
}
559-
}
560-
}
561-
562504
// In production, mockStore must be always nil.
563-
return swarm.NewSwarm(ctx, swapClient, ensClient, bzzconfig, nil)
505+
return swarm.NewSwarm(ctx, swapClient, bzzconfig, nil)
564506
}
565507
//register within the ethereum node
566508
if err := stack.Register(boot); err != nil {

core/fees.go

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)