diff --git a/.circleci/config.yml b/.circleci/config.yml index 39242f496cf4..856a79507bea 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -15,6 +15,6 @@ jobs: steps: - checkout # check out source code to working directory - run: - command: make bor + command: make all - run: command: make test diff --git a/.github/workflows/dockerimage.yml b/.github/workflows/dockerimage.yml new file mode 100644 index 000000000000..a357399dfbb8 --- /dev/null +++ b/.github/workflows/dockerimage.yml @@ -0,0 +1,25 @@ +name: Bor Docker Image CI + +on: + push: + tags: + - 'v*.*.*' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build the Bor Docker image + env: + DOCKERHUB: ${{ secrets.DOCKERHUB }} + DOCKERHUB_KEY: ${{ secrets.DOCKERHUB_KEY }} + run: | + ls -l + echo "Docker login" + docker login -u $DOCKERHUB -p $DOCKERHUB_KEY + echo "running build" + docker build -t maticnetwork/bor:${GITHUB_REF/refs\/tags\//} . + echo "pushing image" + docker push maticnetwork/bor:${GITHUB_REF/refs\/tags\//} + echo "DONE!" diff --git a/.github/workflows/linuxpackage.yml b/.github/workflows/linuxpackage.yml new file mode 100644 index 000000000000..bdcb925e2f49 --- /dev/null +++ b/.github/workflows/linuxpackage.yml @@ -0,0 +1,76 @@ +name: Linux package + +on: + push: + tags: + - 'v*.*.*' +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Install Go + uses: actions/setup-go@v1 + with: + go-version: 1.13 + + - name: Set up Ruby 2.6 + uses: actions/setup-ruby@v1 + with: + ruby-version: 2.6 + + - name: Build package + run: | + set -x + + sudo apt-get -yqq install libpq-dev build-essential + gem install --no-document fpm + fpm --version + + make bor + + cat > bor.service <<- "EOF" + [Unit] + Description=bor + [Service] + WorkingDirectory=/etc/bor/ + EnvironmentFile=/etc/bor/metadata + ExecStartPre=/bin/mkdir -p /var/log/matic-logs/ + ExecStart=/bin/bash -c "/usr/bin/bor --datadir /etc/bor/dataDir --port '30303' --rpc --rpcaddr '0.0.0.0' --rpcvhosts '*' --rpccorsdomain '*' --rpcport '8545' --ipcpath /etc/bor/geth.ipc --rpcapi 'bor,db,eth,net,web3,txpool' --networkid ${NETWORK_ID} --gasprice '0' --keystore /etc/bor/dataDir/keystore --unlock ${VALIDATOR_ADDRESS} --password /etc/bor/dataDir/password.txt --allow-insecure-unlock --maxpeers 150 --mine > /var/log/matic-logs/bor.log 2>&1" + Type=simple + User=root + EOF + + cat > after_install.sh <<- "EOF" + #!/bin/bash + touch /etc/bor/metadata + EOF + + cat > metadata <<- "EOF" + NETWORK_ID= + VALIDATOR_ADDRESS= + EOF + + fpm -s dir -t deb --deb-user root --deb-group root -n matic-bor -v ${GITHUB_REF/refs\/tags\//} \ + --after-install after_install.sh \ + bor.service=/etc/systemd/system/ \ + build/bin/bor=/usr/bin/ \ + metadata=/etc/bor/ + + mkdir packages-${GITHUB_REF/refs\/tags\//} + + mv matic-bor_${GITHUB_REF/refs\/tags\//}_amd64.deb packages-${GITHUB_REF/refs\/tags\//}/ + + ls packages-${GITHUB_REF/refs\/tags\//}/ + + - uses: jakejarvis/s3-sync-action@master + with: + args: --acl public-read + env: + AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_REGION: 'us-east-1' # optional: defaults to us-east-1 + SOURCE_DIR: 'packages-${GITHUB_REF/refs\/tags\//}' + DEST_DIR: '${GITHUB_REF/refs\/tags\//}' diff --git a/Dockerfile b/Dockerfile index 0c0c7329501f..8af6ff3d5a07 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,15 @@ -# Build Geth in a stock Go builder container +# Build Bor in a stock Go builder container FROM golang:1.12-alpine as builder RUN apk add --no-cache make gcc musl-dev linux-headers git -ADD . /go-ethereum -RUN cd /go-ethereum && make geth +ADD . /bor +RUN cd /bor && make bor -# Pull Geth into a second stage deploy alpine container +# Pull Bor into a second stage deploy alpine container FROM alpine:latest RUN apk add --no-cache ca-certificates -COPY --from=builder /go-ethereum/build/bin/geth /usr/local/bin/ +COPY --from=builder /bor/build/bin/bor /usr/local/bin/ EXPOSE 8545 8546 30303 30303/udp \ No newline at end of file diff --git a/Dockerfile.alltools b/Dockerfile.alltools index a4adba9d5b99..9019ff51738e 100644 --- a/Dockerfile.alltools +++ b/Dockerfile.alltools @@ -1,15 +1,15 @@ -# Build Geth in a stock Go builder container +# Build Bor in a stock Go builder container FROM golang:1.12-alpine as builder RUN apk add --no-cache make gcc musl-dev linux-headers git -ADD . /go-ethereum -RUN cd /go-ethereum && make all +ADD . /bor +RUN cd /bor && make all # Pull all binaries into a second stage deploy alpine container FROM alpine:latest RUN apk add --no-cache ca-certificates -COPY --from=builder /go-ethereum/build/bin/* /usr/local/bin/ +COPY --from=builder /bor/build/bin/* /usr/local/bin/ EXPOSE 8545 8546 30303 30303/udp diff --git a/Makefile b/Makefile index 93a7a3ee2a11..6a9bd8ce4f9d 100644 --- a/Makefile +++ b/Makefile @@ -10,30 +10,36 @@ GOBIN = $(shell pwd)/build/bin GO ?= latest +GORUN = go run +GOPATH = $(shell go env GOPATH) bor: - build/env.sh go run build/ci.go install ./cmd/bor + $(GORUN) build/ci.go install ./cmd/bor + mkdir -p $(GOPATH)/bin/ + cp $(GOBIN)/bor $(GOPATH)/bin/ @echo "Done building." @echo "Run \"$(GOBIN)/bor\" to launch bor." all: - build/env.sh go run build/ci.go install + $(GORUN) build/ci.go install + mkdir -p $(GOPATH)/bin/ + cp $(GOBIN)/* $(GOPATH)/bin/ android: - build/env.sh go run build/ci.go aar --local + $(GORUN) build/ci.go aar --local @echo "Done building." @echo "Import \"$(GOBIN)/bor.aar\" to use the library." ios: - build/env.sh go run build/ci.go xcode --local + $(GORUN) build/ci.go xcode --local @echo "Done building." @echo "Import \"$(GOBIN)/bor.framework\" to use the library." test: bor - go test github.com/maticnetwork/bor/consensus/bor_test + go test github.com/maticnetwork/bor/consensus/bor/bor_test lint: ## Run linters. - build/env.sh go run build/ci.go lint + $(GORUN) build/ci.go lint clean: ./build/clean_go_build_cache.sh @@ -63,12 +69,12 @@ bor-linux: bor-linux-386 bor-linux-amd64 bor-linux-arm bor-linux-mips64 bor-linu @ls -ld $(GOBIN)/bor-linux-* bor-linux-386: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/386 -v ./cmd/bor + $(GORUN) build/ci.go xgo -- --go=$(GO) --targets=linux/386 -v ./cmd/bor @echo "Linux 386 cross compilation done:" @ls -ld $(GOBIN)/bor-linux-* | grep 386 bor-linux-amd64: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/amd64 -v ./cmd/bor + $(GORUN) build/ci.go xgo -- --go=$(GO) --targets=linux/amd64 -v ./cmd/bor @echo "Linux amd64 cross compilation done:" @ls -ld $(GOBIN)/bor-linux-* | grep amd64 @@ -77,42 +83,42 @@ bor-linux-arm: bor-linux-arm-5 bor-linux-arm-6 bor-linux-arm-7 bor-linux-arm64 @ls -ld $(GOBIN)/bor-linux-* | grep arm bor-linux-arm-5: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/arm-5 -v ./cmd/bor + $(GORUN) build/ci.go xgo -- --go=$(GO) --targets=linux/arm-5 -v ./cmd/bor @echo "Linux ARMv5 cross compilation done:" @ls -ld $(GOBIN)/bor-linux-* | grep arm-5 bor-linux-arm-6: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/arm-6 -v ./cmd/bor + $(GORUN) build/ci.go xgo -- --go=$(GO) --targets=linux/arm-6 -v ./cmd/bor @echo "Linux ARMv6 cross compilation done:" @ls -ld $(GOBIN)/bor-linux-* | grep arm-6 bor-linux-arm-7: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/arm-7 -v ./cmd/bor + $(GORUN) build/ci.go xgo -- --go=$(GO) --targets=linux/arm-7 -v ./cmd/bor @echo "Linux ARMv7 cross compilation done:" @ls -ld $(GOBIN)/bor-linux-* | grep arm-7 bor-linux-arm64: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/arm64 -v ./cmd/bor + $(GORUN) build/ci.go xgo -- --go=$(GO) --targets=linux/arm64 -v ./cmd/bor @echo "Linux ARM64 cross compilation done:" @ls -ld $(GOBIN)/bor-linux-* | grep arm64 bor-linux-mips: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/mips --ldflags '-extldflags "-static"' -v ./cmd/bor + $(GORUN) build/ci.go xgo -- --go=$(GO) --targets=linux/mips --ldflags '-extldflags "-static"' -v ./cmd/bor @echo "Linux MIPS cross compilation done:" @ls -ld $(GOBIN)/bor-linux-* | grep mips bor-linux-mipsle: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/mipsle --ldflags '-extldflags "-static"' -v ./cmd/bor + $(GORUN) build/ci.go xgo -- --go=$(GO) --targets=linux/mipsle --ldflags '-extldflags "-static"' -v ./cmd/bor @echo "Linux MIPSle cross compilation done:" @ls -ld $(GOBIN)/bor-linux-* | grep mipsle bor-linux-mips64: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/mips64 --ldflags '-extldflags "-static"' -v ./cmd/bor + $(GORUN) build/ci.go xgo -- --go=$(GO) --targets=linux/mips64 --ldflags '-extldflags "-static"' -v ./cmd/bor @echo "Linux MIPS64 cross compilation done:" @ls -ld $(GOBIN)/bor-linux-* | grep mips64 bor-linux-mips64le: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/mips64le --ldflags '-extldflags "-static"' -v ./cmd/bor + $(GORUN) build/ci.go xgo -- --go=$(GO) --targets=linux/mips64le --ldflags '-extldflags "-static"' -v ./cmd/bor @echo "Linux MIPS64le cross compilation done:" @ls -ld $(GOBIN)/bor-linux-* | grep mips64le @@ -121,12 +127,12 @@ bor-darwin: bor-darwin-386 bor-darwin-amd64 @ls -ld $(GOBIN)/bor-darwin-* bor-darwin-386: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=darwin/386 -v ./cmd/bor + $(GORUN) build/ci.go xgo -- --go=$(GO) --targets=darwin/386 -v ./cmd/bor @echo "Darwin 386 cross compilation done:" @ls -ld $(GOBIN)/bor-darwin-* | grep 386 bor-darwin-amd64: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=darwin/amd64 -v ./cmd/bor + $(GORUN) build/ci.go xgo -- --go=$(GO) --targets=darwin/amd64 -v ./cmd/bor @echo "Darwin amd64 cross compilation done:" @ls -ld $(GOBIN)/bor-darwin-* | grep amd64 @@ -135,11 +141,11 @@ bor-windows: bor-windows-386 bor-windows-amd64 @ls -ld $(GOBIN)/bor-windows-* bor-windows-386: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=windows/386 -v ./cmd/bor + $(GORUN) build/ci.go xgo -- --go=$(GO) --targets=windows/386 -v ./cmd/bor @echo "Windows 386 cross compilation done:" @ls -ld $(GOBIN)/bor-windows-* | grep 386 bor-windows-amd64: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=windows/amd64 -v ./cmd/bor + $(GORUN) build/ci.go xgo -- --go=$(GO) --targets=windows/amd64 -v ./cmd/bor @echo "Windows amd64 cross compilation done:" @ls -ld $(GOBIN)/bor-windows-* | grep amd64 diff --git a/accounts/abi/abi.go b/accounts/abi/abi.go index ba242b14e588..5a6cb007342e 100644 --- a/accounts/abi/abi.go +++ b/accounts/abi/abi.go @@ -114,12 +114,13 @@ func (abi ABI) UnpackIntoMap(v map[string]interface{}, name string, data []byte) // UnmarshalJSON implements json.Unmarshaler interface func (abi *ABI) UnmarshalJSON(data []byte) error { var fields []struct { - Type string - Name string - Constant bool - Anonymous bool - Inputs []Argument - Outputs []Argument + Type string + Name string + Constant bool + StateMutability string + Anonymous bool + Inputs []Argument + Outputs []Argument } if err := json.Unmarshal(data, &fields); err != nil { @@ -142,9 +143,10 @@ func (abi *ABI) UnmarshalJSON(data []byte) error { name = fmt.Sprintf("%s%d", field.Name, idx) _, ok = abi.Methods[name] } + isConst := field.Constant || field.StateMutability == "pure" || field.StateMutability == "view" abi.Methods[name] = Method{ Name: name, - Const: field.Constant, + Const: isConst, Inputs: field.Inputs, Outputs: field.Outputs, } diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index 58c2c4a44d95..a161fb0c9501 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -510,6 +510,9 @@ func (fb *filterBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEve func (fb *filterBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { return fb.bc.SubscribeLogsEvent(ch) } +func (fb *filterBackend) SubscribeStateEvent(ch chan<- core.NewStateChangeEvent) event.Subscription { + return fb.bc.SubscribeStateEvent(ch) +} func (fb *filterBackend) BloomStatus() (uint64, uint64) { return 4096, 0 } func (fb *filterBackend) ServiceFilter(ctx context.Context, ms *bloombits.MatcherSession) { diff --git a/build/ci.go b/build/ci.go index cec9b00a0aa1..6ed0bf7f6ffa 100644 --- a/build/ci.go +++ b/build/ci.go @@ -58,6 +58,7 @@ import ( "strings" "time" + "github.com/cespare/cp" "github.com/maticnetwork/bor/internal/build" "github.com/maticnetwork/bor/params" ) @@ -137,7 +138,20 @@ var ( // Note: yakkety is unsupported because it was officially deprecated on Launchpad. // Note: zesty is unsupported because it was officially deprecated on Launchpad. // Note: artful is unsupported because it was officially deprecated on Launchpad. - debDistros = []string{"trusty", "xenial", "bionic", "cosmic", "disco"} + // Note: cosmic is unsupported because it was officially deprecated on Launchpad. + debDistroGoBoots = map[string]string{ + "trusty": "golang-1.11", + "xenial": "golang-go", + "bionic": "golang-go", + "disco": "golang-go", + "eoan": "golang-go", + "focal": "golang-go", + } + + debGoBootPaths = map[string]string{ + "golang-1.11": "/usr/lib/go-1.11", + "golang-go": "/usr/lib/go", + } ) var GOBIN, _ = filepath.Abs(filepath.Join("build", "bin")) @@ -201,9 +215,9 @@ func doInstall(cmdline []string) { var minor int fmt.Sscanf(strings.TrimPrefix(runtime.Version(), "go1."), "%d", &minor) - if minor < 9 { + if minor < 11 { log.Println("You have Go version", runtime.Version()) - log.Println("go-ethereum requires at least Go version 1.9 and cannot") + log.Println("go-ethereum requires at least Go version 1.11 and cannot") log.Println("be compiled with an earlier version. Please upgrade your Go installation.") os.Exit(1) } @@ -213,22 +227,18 @@ func doInstall(cmdline []string) { if flag.NArg() > 0 { packages = flag.Args() } - packages = build.ExpandPackagesNoVendor(packages) if *arch == "" || *arch == runtime.GOARCH { goinstall := goTool("install", buildFlags(env)...) + if runtime.GOARCH == "arm64" { + goinstall.Args = append(goinstall.Args, "-p", "1") + } goinstall.Args = append(goinstall.Args, "-v") goinstall.Args = append(goinstall.Args, packages...) build.MustRun(goinstall) return } - // If we are cross compiling to ARMv5 ARMv6 or ARMv7, clean any previous builds - if *arch == "arm" { - os.RemoveAll(filepath.Join(runtime.GOROOT(), "pkg", runtime.GOOS+"_arm")) - for _, path := range filepath.SplitList(build.GOPATH()) { - os.RemoveAll(filepath.Join(path, "pkg", runtime.GOOS+"_arm")) - } - } + // Seems we are cross compiling, work around forbidden GOBIN goinstall := goToolArch(*arch, *cc, "install", buildFlags(env)...) goinstall.Args = append(goinstall.Args, "-v") @@ -278,7 +288,6 @@ func goTool(subcmd string, args ...string) *exec.Cmd { func goToolArch(arch string, cc string, subcmd string, args ...string) *exec.Cmd { cmd := build.GoTool(subcmd, args...) - cmd.Env = []string{"GOPATH=" + build.GOPATH()} if arch == "" || arch == runtime.GOARCH { cmd.Env = append(cmd.Env, "GOBIN="+GOBIN) } else { @@ -289,7 +298,7 @@ func goToolArch(arch string, cc string, subcmd string, args ...string) *exec.Cmd cmd.Env = append(cmd.Env, "CC="+cc) } for _, e := range os.Environ() { - if strings.HasPrefix(e, "GOPATH=") || strings.HasPrefix(e, "GOBIN=") { + if strings.HasPrefix(e, "GOBIN=") { continue } cmd.Env = append(cmd.Env, e) @@ -303,6 +312,7 @@ func goToolArch(arch string, cc string, subcmd string, args ...string) *exec.Cmd func doTest(cmdline []string) { coverage := flag.Bool("coverage", false, "Whether to record code coverage") + verbose := flag.Bool("v", false, "Whether to log verbosely") flag.CommandLine.Parse(cmdline) env := build.Env() @@ -310,7 +320,6 @@ func doTest(cmdline []string) { if len(flag.CommandLine.Args()) > 0 { packages = flag.CommandLine.Args() } - packages = build.ExpandPackagesNoVendor(packages) // Run the actual tests. // Test a single package at a time. CI builders are slow @@ -320,44 +329,46 @@ func doTest(cmdline []string) { if *coverage { gotest.Args = append(gotest.Args, "-covermode=atomic", "-cover") } + if *verbose { + gotest.Args = append(gotest.Args, "-v") + } gotest.Args = append(gotest.Args, packages...) build.MustRun(gotest) } -// runs gometalinter on requested packages +// doLint runs golangci-lint on requested packages. func doLint(cmdline []string) { + var ( + cachedir = flag.String("cachedir", "./build/cache", "directory for caching golangci-lint binary.") + ) flag.CommandLine.Parse(cmdline) - packages := []string{"./..."} if len(flag.CommandLine.Args()) > 0 { packages = flag.CommandLine.Args() } - // Get metalinter and install all supported linters - build.MustRun(goTool("get", "gopkg.in/alecthomas/gometalinter.v2")) - build.MustRunCommand(filepath.Join(GOBIN, "gometalinter.v2"), "--install") - - // Run fast linters batched together - configs := []string{ - "--vendor", - "--tests", - "--deadline=2m", - "--disable-all", - "--enable=goimports", - "--enable=varcheck", - "--enable=vet", - "--enable=gofmt", - "--enable=misspell", - "--enable=goconst", - "--min-occurrences=6", // for goconst - } - build.MustRunCommand(filepath.Join(GOBIN, "gometalinter.v2"), append(configs, packages...)...) - - // Run slow linters one by one - for _, linter := range []string{"unconvert", "gosimple"} { - configs = []string{"--vendor", "--tests", "--deadline=10m", "--disable-all", "--enable=" + linter} - build.MustRunCommand(filepath.Join(GOBIN, "gometalinter.v2"), append(configs, packages...)...) + + linter := downloadLinter(*cachedir) + lflags := []string{"run", "--config", ".golangci.yml"} + build.MustRunCommand(linter, append(lflags, packages...)...) + fmt.Println("You have achieved perfection.") +} + +// downloadLinter downloads and unpacks golangci-lint. +func downloadLinter(cachedir string) string { + const version = "1.22.2" + + csdb := build.MustLoadChecksums("build/checksums.txt") + base := fmt.Sprintf("golangci-lint-%s-%s-%s", version, runtime.GOOS, runtime.GOARCH) + url := fmt.Sprintf("https://github.com/golangci/golangci-lint/releases/download/v%s/%s.tar.gz", version, base) + archivePath := filepath.Join(cachedir, base+".tar.gz") + if err := csdb.DownloadFile(url, archivePath); err != nil { + log.Fatal(err) } + if err := build.ExtractTarballArchive(archivePath, cachedir); err != nil { + log.Fatal(err) + } + return filepath.Join(cachedir, base, "golangci-lint") } // Release Packaging @@ -460,11 +471,13 @@ func maybeSkipArchive(env build.Environment) { // Debian Packaging func doDebianSource(cmdline []string) { var ( - signer = flag.String("signer", "", `Signing key name, also used as package author`) - upload = flag.String("upload", "", `Where to upload the source package (usually "ethereum/ethereum")`) - sshUser = flag.String("sftp-user", "", `Username for SFTP upload (usually "geth-ci")`) - workdir = flag.String("workdir", "", `Output directory for packages (uses temp dir if unset)`) - now = time.Now() + goversion = flag.String("goversion", "", `Go version to build with (will be included in the source package)`) + cachedir = flag.String("cachedir", "./build/cache", `Filesystem path to cache the downloaded Go bundles at`) + signer = flag.String("signer", "", `Signing key name, also used as package author`) + upload = flag.String("upload", "", `Where to upload the source package (usually "ethereum/ethereum")`) + sshUser = flag.String("sftp-user", "", `Username for SFTP upload (usually "geth-ci")`) + workdir = flag.String("workdir", "", `Output directory for packages (uses temp dir if unset)`) + now = time.Now() ) flag.CommandLine.Parse(cmdline) *workdir = makeWorkdir(*workdir) @@ -478,12 +491,39 @@ func doDebianSource(cmdline []string) { build.MustRun(gpg) } - // Create Debian packages and upload them + // Download and verify the Go source package. + gobundle := downloadGoSources(*goversion, *cachedir) + + // Download all the dependencies needed to build the sources and run the ci script + srcdepfetch := goTool("install", "-n", "./...") + srcdepfetch.Env = append(os.Environ(), "GOPATH="+filepath.Join(*workdir, "modgopath")) + build.MustRun(srcdepfetch) + + cidepfetch := goTool("run", "./build/ci.go") + cidepfetch.Env = append(os.Environ(), "GOPATH="+filepath.Join(*workdir, "modgopath")) + cidepfetch.Run() // Command fails, don't care, we only need the deps to start it + + // Create Debian packages and upload them. for _, pkg := range debPackages { - for _, distro := range debDistros { - meta := newDebMetadata(distro, *signer, env, now, pkg.Name, pkg.Version, pkg.Executables) + for distro, goboot := range debDistroGoBoots { + // Prepare the debian package with the go-ethereum sources. + meta := newDebMetadata(distro, goboot, *signer, env, now, pkg.Name, pkg.Version, pkg.Executables) pkgdir := stageDebianSource(*workdir, meta) - debuild := exec.Command("debuild", "-S", "-sa", "-us", "-uc", "-d", "-Zxz") + + // Add Go source code + if err := build.ExtractTarballArchive(gobundle, pkgdir); err != nil { + log.Fatalf("Failed to extract Go sources: %v", err) + } + if err := os.Rename(filepath.Join(pkgdir, "go"), filepath.Join(pkgdir, ".go")); err != nil { + log.Fatalf("Failed to rename Go source folder: %v", err) + } + // Add all dependency modules in compressed form + os.MkdirAll(filepath.Join(pkgdir, ".mod", "cache"), 0755) + if err := cp.CopyAll(filepath.Join(pkgdir, ".mod", "cache", "download"), filepath.Join(*workdir, "modgopath", "pkg", "mod", "cache", "download")); err != nil { + log.Fatalf("Failed to copy Go module dependencies: %v", err) + } + // Run the packaging and upload to the PPA + debuild := exec.Command("debuild", "-S", "-sa", "-us", "-uc", "-d", "-Zxz", "-nc") debuild.Dir = pkgdir build.MustRun(debuild) @@ -503,6 +543,17 @@ func doDebianSource(cmdline []string) { } } +func downloadGoSources(version string, cachedir string) string { + csdb := build.MustLoadChecksums("build/checksums.txt") + file := fmt.Sprintf("go%s.src.tar.gz", version) + url := "https://dl.google.com/go/" + file + dst := filepath.Join(cachedir, file) + if err := csdb.DownloadFile(url, dst); err != nil { + log.Fatal(err) + } + return dst +} + func ppaUpload(workdir, ppa, sshUser string, files []string) { p := strings.Split(ppa, "/") if len(p) != 2 { @@ -562,7 +613,9 @@ type debPackage struct { } type debMetadata struct { - Env build.Environment + Env build.Environment + GoBootPackage string + GoBootPath string PackageName string @@ -591,19 +644,21 @@ func (d debExecutable) Package() string { return d.BinaryName } -func newDebMetadata(distro, author string, env build.Environment, t time.Time, name string, version string, exes []debExecutable) debMetadata { +func newDebMetadata(distro, goboot, author string, env build.Environment, t time.Time, name string, version string, exes []debExecutable) debMetadata { if author == "" { // No signing key, use default author. author = "Ethereum Builds " } return debMetadata{ - PackageName: name, - Env: env, - Author: author, - Distro: distro, - Version: version, - Time: t.Format(time.RFC1123Z), - Executables: exes, + GoBootPackage: goboot, + GoBootPath: debGoBootPaths[goboot], + PackageName: name, + Env: env, + Author: author, + Distro: distro, + Version: version, + Time: t.Format(time.RFC1123Z), + Executables: exes, } } @@ -668,7 +723,6 @@ func stageDebianSource(tmpdir string, meta debMetadata) (pkgdir string) { if err := os.Mkdir(pkgdir, 0755); err != nil { log.Fatal(err) } - // Copy the source code. build.MustRunCommand("git", "checkout-index", "-a", "--prefix", pkgdir+string(filepath.Separator)) @@ -686,7 +740,6 @@ func stageDebianSource(tmpdir string, meta debMetadata) (pkgdir string) { build.Render("build/deb/"+meta.PackageName+"/deb.install", install, 0644, exe) build.Render("build/deb/"+meta.PackageName+"/deb.docs", docs, 0644, exe) } - return pkgdir } @@ -715,7 +768,7 @@ func doWindowsInstaller(cmdline []string) { continue } allTools = append(allTools, filepath.Base(file)) - if filepath.Base(file) == "geth.exe" { + if filepath.Base(file) == "bor.exe" { gethTool = file } else { devTools = append(devTools, file) @@ -729,14 +782,17 @@ func doWindowsInstaller(cmdline []string) { "Geth": gethTool, "DevTools": devTools, } - build.Render("build/nsis.geth.nsi", filepath.Join(*workdir, "geth.nsi"), 0644, nil) + build.Render("build/nsis.bor.nsi", filepath.Join(*workdir, "bor.nsi"), 0644, nil) build.Render("build/nsis.install.nsh", filepath.Join(*workdir, "install.nsh"), 0644, templateData) build.Render("build/nsis.uninstall.nsh", filepath.Join(*workdir, "uninstall.nsh"), 0644, allTools) build.Render("build/nsis.pathupdate.nsh", filepath.Join(*workdir, "PathUpdate.nsh"), 0644, nil) build.Render("build/nsis.envvarupdate.nsh", filepath.Join(*workdir, "EnvVarUpdate.nsh"), 0644, nil) - build.CopyFile(filepath.Join(*workdir, "SimpleFC.dll"), "build/nsis.simplefc.dll", 0755) - build.CopyFile(filepath.Join(*workdir, "COPYING"), "COPYING", 0755) - + if err := cp.CopyFile(filepath.Join(*workdir, "SimpleFC.dll"), "build/nsis.simplefc.dll"); err != nil { + log.Fatal("Failed to copy SimpleFC.dll: %v", err) + } + if err := cp.CopyFile(filepath.Join(*workdir, "COPYING"), "COPYING"); err != nil { + log.Fatal("Failed to copy copyright note: %v", err) + } // Build the installer. This assumes that all the needed files have been previously // built (don't mix building and packaging to keep cross compilation complexity to a // minimum). @@ -744,16 +800,15 @@ func doWindowsInstaller(cmdline []string) { if env.Commit != "" { version[2] += "-" + env.Commit[:8] } - installer, _ := filepath.Abs("geth-" + archiveBasename(*arch, params.ArchiveVersion(env.Commit)) + ".exe") + installer, _ := filepath.Abs("bor-" + archiveBasename(*arch, params.ArchiveVersion(env.Commit)) + ".exe") build.MustRunCommand("makensis.exe", "/DOUTPUTFILE="+installer, "/DMAJORVERSION="+version[0], "/DMINORVERSION="+version[1], "/DBUILDVERSION="+version[2], "/DARCH="+*arch, - filepath.Join(*workdir, "geth.nsi"), + filepath.Join(*workdir, "bor.nsi"), ) - // Sign and publish installer. if err := archiveUpload(installer, *upload, *signer); err != nil { log.Fatal(err) @@ -826,7 +881,6 @@ func gomobileTool(subcmd string, args ...string) *exec.Cmd { cmd := exec.Command(filepath.Join(GOBIN, "gomobile"), subcmd) cmd.Args = append(cmd.Args, args...) cmd.Env = []string{ - "GOPATH=" + build.GOPATH(), "PATH=" + GOBIN + string(os.PathListSeparator) + os.Getenv("PATH"), } for _, e := range os.Environ() { @@ -899,7 +953,7 @@ func doXCodeFramework(cmdline []string) { // Build the iOS XCode framework build.MustRun(goTool("get", "golang.org/x/mobile/cmd/gomobile", "golang.org/x/mobile/cmd/gobind")) build.MustRun(gomobileTool("init")) - bind := gomobileTool("bind", "-ldflags", "-s -w", "--target", "ios", "--tags", "ios", "-v", "github.com/maticnetwork/bor/mobile") + bind := gomobileTool("bind", "-ldflags", "-s -w", "--target", "ios", "-v", "github.com/maticnetwork/bor/mobile") if *local { // If we're building locally, use the build folder and stop afterwards @@ -907,7 +961,7 @@ func doXCodeFramework(cmdline []string) { build.MustRun(bind) return } - archive := "geth-" + archiveBasename("ios", params.ArchiveVersion(env.Commit)) + archive := "bor-" + archiveBasename("ios", params.ArchiveVersion(env.Commit)) if err := os.Mkdir(archive, os.ModePerm); err != nil { log.Fatal(err) } @@ -1014,16 +1068,10 @@ func doXgo(cmdline []string) { func xgoTool(args []string) *exec.Cmd { cmd := exec.Command(filepath.Join(GOBIN, "xgo"), args...) - cmd.Env = []string{ - "GOPATH=" + build.GOPATH(), + cmd.Env = os.Environ() + cmd.Env = append(cmd.Env, []string{ "GOBIN=" + GOBIN, - } - for _, e := range os.Environ() { - if strings.HasPrefix(e, "GOPATH=") || strings.HasPrefix(e, "GOBIN=") { - continue - } - cmd.Env = append(cmd.Env, e) - } + }...) return cmd } diff --git a/build/env.sh b/build/env.sh deleted file mode 100755 index acbc70c57638..000000000000 --- a/build/env.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh - -set -e - -if [ ! -f "build/env.sh" ]; then - echo "$0 must be run from the root of the repository." - exit 2 -fi - -# Create fake Go workspace if it doesn't exist yet. -workspace="$PWD/build/_workspace" -root="$PWD" -ethdir="$workspace/src/github.com/maticnetwork" -if [ ! -L "$ethdir/bor" ]; then - mkdir -p "$ethdir" - cd "$ethdir" - ln -s ../../../../../. bor - cd "$root" -fi - -# Set up the environment to use the workspace. -GOPATH="$workspace" -export GOPATH - -# Run the command inside the workspace. -cd "$ethdir/bor" -PWD="$ethdir/bor" - -# Launch the arguments with the configured environment. -exec "$@" diff --git a/cmd/bor/chaincmd.go b/cmd/bor/chaincmd.go index 0f7c71a175a7..bbb8792a16e8 100644 --- a/cmd/bor/chaincmd.go +++ b/cmd/bor/chaincmd.go @@ -61,7 +61,7 @@ It expects the genesis file as argument.`, Action: utils.MigrateFlags(importChain), Name: "import", Usage: "Import a blockchain file", - ArgsUsage: " ( ... ) ", + ArgsUsage: " ( ... ) ", Flags: []cli.Flag{ utils.DataDirFlag, utils.CacheFlag, @@ -228,8 +228,8 @@ func initGenesis(ctx *cli.Context) error { } func importChain(ctx *cli.Context) error { - if len(ctx.Args()) < 1 { - utils.Fatalf("This command requires an argument.") + if len(ctx.Args()) < 2 { + utils.Fatalf("This command requires atleast 2 arguments.") } stack := makeFullNode(ctx) defer stack.Close() @@ -255,12 +255,13 @@ func importChain(ctx *cli.Context) error { // Import the chain start := time.Now() - if len(ctx.Args()) == 1 { + // ArgsUsage: " ( ... ) ", + if len(ctx.Args()) == 2 { if err := utils.ImportChain(chain, ctx.Args().First()); err != nil { log.Error("Import error", "err", err) } } else { - for _, arg := range ctx.Args() { + for _, arg := range ctx.Args()[:len(ctx.Args())-1] { if err := utils.ImportChain(chain, arg); err != nil { log.Error("Import error", "file", arg, "err", err) } diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 920071cf736d..94f79edc6605 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -19,6 +19,7 @@ package utils import ( "crypto/ecdsa" + "encoding/json" "errors" "fmt" "io/ioutil" @@ -34,6 +35,7 @@ import ( "github.com/maticnetwork/bor/common" "github.com/maticnetwork/bor/common/fdlimit" "github.com/maticnetwork/bor/consensus" + "github.com/maticnetwork/bor/consensus/bor" "github.com/maticnetwork/bor/consensus/clique" "github.com/maticnetwork/bor/consensus/ethash" @@ -47,6 +49,8 @@ import ( "github.com/maticnetwork/bor/ethdb" "github.com/maticnetwork/bor/ethstats" "github.com/maticnetwork/bor/graphql" + + pcsclite "github.com/gballet/go-libpcsclite" "github.com/maticnetwork/bor/les" "github.com/maticnetwork/bor/log" "github.com/maticnetwork/bor/metrics" @@ -61,7 +65,6 @@ import ( "github.com/maticnetwork/bor/params" "github.com/maticnetwork/bor/rpc" whisper "github.com/maticnetwork/bor/whisper/whisperv6" - pcsclite "github.com/gballet/go-libpcsclite" cli "gopkg.in/urfave/cli.v1" ) @@ -1658,19 +1661,63 @@ func MakeGenesis(ctx *cli.Context) *core.Genesis { return genesis } +func getGenesis(genesisPath string) *core.Genesis { + log.Info("Reading genesis at ", "file", genesisPath) + file, _ := os.Open(genesisPath) + defer file.Close() + + genesis := new(core.Genesis) + json.NewDecoder(file).Decode(genesis) + return genesis +} + // MakeChain creates a chain manager from set command line flags. func MakeChain(ctx *cli.Context, stack *node.Node) (chain *core.BlockChain, chainDb ethdb.Database) { + // expecting the last argument to be the genesis file + genesis := getGenesis(ctx.Args().Get(len(ctx.Args()) - 1)) + var err error chainDb = MakeChainDatabase(ctx, stack) - config, _, err := core.SetupGenesisBlock(chainDb, MakeGenesis(ctx)) + config, _, err := core.SetupGenesisBlock(chainDb, genesis) if err != nil { Fatalf("%v", err) } + var engine consensus.Engine + var ethereum *eth.Ethereum if config.Clique != nil { engine = clique.New(config.Clique, chainDb) } else if config.Bor != nil { - engine = bor.New(config, chainDb, nil) + cfg := ð.Config{Genesis: genesis} + workspace, err := ioutil.TempDir("", "console-tester-") + if err != nil { + Fatalf("failed to create temporary keystore: %v", err) + } + + // Create a networkless protocol stack and start an Ethereum service within + stack, err := node.New(&node.Config{DataDir: workspace, UseLightweightKDF: true, Name: "console-tester"}) + if err != nil { + Fatalf("failed to create node: %v", err) + } + err = stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { + s, err := eth.New(ctx, cfg) + return s, err + }) + if err != nil { + Fatalf("failed to register Ethereum protocol: %v", err) + } + + // Start the node and assemble the JavaScript console around it + if err = stack.Start(); err != nil { + Fatalf("failed to start test stack: %v", err) + } + _, err = stack.Attach() + if err != nil { + Fatalf("failed to attach to node: %v", err) + } + + stack.Service(ðereum) + engine = ethereum.Engine().(*bor.Bor) } else { engine = ethash.NewFaker() if !ctx.GlobalBool(FakePoWFlag.Name) { @@ -1702,6 +1749,9 @@ func MakeChain(ctx *cli.Context, stack *node.Node) (chain *core.BlockChain, chai } vmcfg := vm.Config{EnablePreimageRecording: ctx.GlobalBool(VMEnableDebugFlag.Name)} chain, err = core.NewBlockChain(chainDb, cache, config, engine, vmcfg, nil) + if ethereum != nil { + ethereum.SetBlockchain(chain) + } if err != nil { Fatalf("Can't create BlockChain: %v", err) } diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index d84288d42900..bd55a745e7c9 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -30,6 +30,7 @@ import ( "github.com/maticnetwork/bor/core/vm" "github.com/maticnetwork/bor/crypto" "github.com/maticnetwork/bor/ethdb" + "github.com/maticnetwork/bor/event" "github.com/maticnetwork/bor/internal/ethapi" "github.com/maticnetwork/bor/log" "github.com/maticnetwork/bor/params" @@ -245,6 +246,8 @@ type Bor struct { stateReceiverABI abi.ABI HeimdallClient IHeimdallClient + stateDataFeed event.Feed + scope event.SubscriptionScope // The fields below are for testing only fakeDiff bool // Skip difficulty verifications } @@ -1201,6 +1204,16 @@ func (c *Bor) CommitStates( "txHash", eventRecord.TxHash, "chainID", eventRecord.ChainID, ) + stateData := types.StateData{ + Did: eventRecord.ID, + Contract: eventRecord.Contract, + Data: hex.EncodeToString(eventRecord.Data), + TxHash: eventRecord.TxHash, + } + + go func() { + c.stateDataFeed.Send(core.NewStateChangeEvent{StateData: &stateData}) + }() recordBytes, err := rlp.EncodeToBytes(eventRecord) if err != nil { @@ -1226,6 +1239,11 @@ func (c *Bor) CommitStates( return nil } +// SubscribeStateEvent registers a subscription of ChainSideEvent. +func (c *Bor) SubscribeStateEvent(ch chan<- core.NewStateChangeEvent) event.Subscription { + return c.scope.Track(c.stateDataFeed.Subscribe(ch)) +} + func (c *Bor) SetHeimdallClient(h IHeimdallClient) { c.HeimdallClient = h } @@ -1253,6 +1271,10 @@ func (c *Bor) IsValidatorAction(chain consensus.ChainReader, from common.Address func isProposeSpanAction(tx *types.Transaction, validatorContract string) bool { // keccak256('proposeSpan()').slice(0, 4) proposeSpanSig, _ := hex.DecodeString("4b0e4d17") + if tx.Data() == nil || len(tx.Data()) < 4 { + return false + } + return bytes.Compare(proposeSpanSig, tx.Data()[:4]) == 0 && tx.To().String() == validatorContract } @@ -1260,6 +1282,10 @@ func isProposeSpanAction(tx *types.Transaction, validatorContract string) bool { func isProposeStateAction(tx *types.Transaction, stateReceiverContract string) bool { // keccak256('proposeState(uint256)').slice(0, 4) proposeStateSig, _ := hex.DecodeString("ede01f17") + if tx.Data() == nil || len(tx.Data()) < 4 { + return false + } + return bytes.Compare(proposeStateSig, tx.Data()[:4]) == 0 && tx.To().String() == stateReceiverContract } diff --git a/consensus/bor_test/bor_test.go b/consensus/bor/bor_test/bor_test.go similarity index 51% rename from consensus/bor_test/bor_test.go rename to consensus/bor/bor_test/bor_test.go index 88eb9245b556..ce1585f6f2f8 100644 --- a/consensus/bor_test/bor_test.go +++ b/consensus/bor/bor_test/bor_test.go @@ -1,41 +1,20 @@ -package bor_test +package bortest import ( "encoding/hex" - "encoding/json" - "io/ioutil" "math/big" "testing" "github.com/maticnetwork/bor/common" "github.com/maticnetwork/bor/consensus/bor" - "github.com/maticnetwork/bor/core" "github.com/maticnetwork/bor/core/rawdb" - "github.com/maticnetwork/bor/core/state" - "github.com/maticnetwork/bor/crypto/secp256k1" "github.com/stretchr/testify/assert" "github.com/maticnetwork/bor/core/types" - "github.com/maticnetwork/bor/crypto" - "github.com/maticnetwork/bor/eth" - "github.com/maticnetwork/bor/ethdb" "github.com/maticnetwork/bor/mocks" - "github.com/maticnetwork/bor/node" ) -var ( - extraSeal = 65 // Fixed number of extra-data suffix bytes reserved for signer seal - privKey = "b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291" - key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - addr = crypto.PubkeyToAddress(key.PublicKey) // 0x71562b71999873DB5b286dF957af199Ec94617F7 -) - -type initializeData struct { - genesis *core.Genesis - ethereum *eth.Ethereum -} - func TestCommitSpan(t *testing.T) { init := buildEthereumInstance(t, rawdb.NewMemoryDatabase()) chain := init.ethereum.BlockChain() @@ -150,104 +129,3 @@ func TestIsValidatorAction(t *testing.T) { assert.True(t, _bor.IsValidatorAction(chain, _addr, tx)) } } - -func buildEthereumInstance(t *testing.T, db ethdb.Database) *initializeData { - genesisData, err := ioutil.ReadFile("genesis.json") - if err != nil { - t.Fatalf("%s", err) - } - gen := &core.Genesis{} - if err := json.Unmarshal(genesisData, gen); err != nil { - t.Fatalf("%s", err) - } - ethConf := ð.Config{ - Genesis: gen, - } - ethConf.Genesis.MustCommit(db) - - // Create a temporary storage for the node keys and initialize it - workspace, err := ioutil.TempDir("", "console-tester-") - if err != nil { - t.Fatalf("failed to create temporary keystore: %v", err) - } - - // Create a networkless protocol stack and start an Ethereum service within - stack, err := node.New(&node.Config{DataDir: workspace, UseLightweightKDF: true, Name: "console-tester"}) - if err != nil { - t.Fatalf("failed to create node: %v", err) - } - err = stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { - s, err := eth.New(ctx, ethConf) - return s, err - }) - if err != nil { - t.Fatalf("failed to register Ethereum protocol: %v", err) - } - - // Start the node and assemble the JavaScript console around it - if err = stack.Start(); err != nil { - t.Fatalf("failed to start test stack: %v", err) - } - _, err = stack.Attach() - if err != nil { - t.Fatalf("failed to attach to node: %v", err) - } - - var ethereum *eth.Ethereum - stack.Service(ðereum) - ethConf.Genesis.MustCommit(ethereum.ChainDb()) - return &initializeData{ - genesis: gen, - ethereum: ethereum, - } -} - -func insertNewBlock(t *testing.T, _bor *bor.Bor, chain *core.BlockChain, header *types.Header, statedb *state.StateDB, privKey []byte) { - _, err := _bor.FinalizeAndAssemble(chain, header, statedb, nil, nil, nil) - if err != nil { - t.Fatalf("%s", err) - } - - sig, err := secp256k1.Sign(crypto.Keccak256(bor.BorRLP(header)), privKey) - if err != nil { - t.Fatalf("%s", err) - } - copy(header.Extra[len(header.Extra)-extraSeal:], sig) - - block := types.NewBlockWithHeader(header) - if _, err := chain.InsertChain([]*types.Block{block}); err != nil { - t.Fatalf("%s", err) - } -} - -func buildMinimalNextHeader(t *testing.T, block *types.Block, period uint64) *types.Header { - header := block.Header() - header.Number.Add(header.Number, big.NewInt(1)) - header.ParentHash = block.Hash() - header.Time += (period + 1) - header.Extra = make([]byte, 97) // vanity (32) + extraSeal (65) - _key, _ := hex.DecodeString(privKey) - sig, err := secp256k1.Sign(crypto.Keccak256(bor.BorRLP(header)), _key) - if err != nil { - t.Fatalf("%s", err) - } - copy(header.Extra[len(header.Extra)-extraSeal:], sig) - return header -} - -func loadSpanFromFile(t *testing.T) (*bor.ResponseWithHeight, *bor.HeimdallSpan) { - spanData, err := ioutil.ReadFile("span.json") - if err != nil { - t.Fatalf("%s", err) - } - res := &bor.ResponseWithHeight{} - if err := json.Unmarshal(spanData, res); err != nil { - t.Fatalf("%s", err) - } - - heimdallSpan := &bor.HeimdallSpan{} - if err := json.Unmarshal(res.Result, heimdallSpan); err != nil { - t.Fatalf("%s", err) - } - return res, heimdallSpan -} diff --git a/consensus/bor_test/genesis.json b/consensus/bor/bor_test/genesis.json similarity index 100% rename from consensus/bor_test/genesis.json rename to consensus/bor/bor_test/genesis.json diff --git a/consensus/bor/bor_test/helper.go b/consensus/bor/bor_test/helper.go new file mode 100644 index 000000000000..54ab949983a9 --- /dev/null +++ b/consensus/bor/bor_test/helper.go @@ -0,0 +1,132 @@ +package bortest + +import ( + "encoding/hex" + "encoding/json" + "io/ioutil" + "math/big" + "testing" + + "github.com/maticnetwork/bor/consensus/bor" + "github.com/maticnetwork/bor/core" + "github.com/maticnetwork/bor/core/state" + "github.com/maticnetwork/bor/core/types" + "github.com/maticnetwork/bor/crypto" + "github.com/maticnetwork/bor/crypto/secp256k1" + "github.com/maticnetwork/bor/eth" + "github.com/maticnetwork/bor/ethdb" + "github.com/maticnetwork/bor/node" +) + +var ( + extraSeal = 65 // Fixed number of extra-data suffix bytes reserved for signer seal + privKey = "b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291" + key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + addr = crypto.PubkeyToAddress(key.PublicKey) // 0x71562b71999873DB5b286dF957af199Ec94617F7 +) + +type initializeData struct { + genesis *core.Genesis + ethereum *eth.Ethereum +} + +func buildEthereumInstance(t *testing.T, db ethdb.Database) *initializeData { + genesisData, err := ioutil.ReadFile("genesis.json") + if err != nil { + t.Fatalf("%s", err) + } + gen := &core.Genesis{} + if err := json.Unmarshal(genesisData, gen); err != nil { + t.Fatalf("%s", err) + } + ethConf := ð.Config{ + Genesis: gen, + } + ethConf.Genesis.MustCommit(db) + + // Create a temporary storage for the node keys and initialize it + workspace, err := ioutil.TempDir("", "console-tester-") + if err != nil { + t.Fatalf("failed to create temporary keystore: %v", err) + } + + // Create a networkless protocol stack and start an Ethereum service within + stack, err := node.New(&node.Config{DataDir: workspace, UseLightweightKDF: true, Name: "console-tester"}) + if err != nil { + t.Fatalf("failed to create node: %v", err) + } + err = stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { + s, err := eth.New(ctx, ethConf) + return s, err + }) + if err != nil { + t.Fatalf("failed to register Ethereum protocol: %v", err) + } + + // Start the node and assemble the JavaScript console around it + if err = stack.Start(); err != nil { + t.Fatalf("failed to start test stack: %v", err) + } + _, err = stack.Attach() + if err != nil { + t.Fatalf("failed to attach to node: %v", err) + } + + var ethereum *eth.Ethereum + stack.Service(ðereum) + ethConf.Genesis.MustCommit(ethereum.ChainDb()) + return &initializeData{ + genesis: gen, + ethereum: ethereum, + } +} + +func insertNewBlock(t *testing.T, _bor *bor.Bor, chain *core.BlockChain, header *types.Header, statedb *state.StateDB, privKey []byte) { + _, err := _bor.FinalizeAndAssemble(chain, header, statedb, nil, nil, nil) + if err != nil { + t.Fatalf("%s", err) + } + + sig, err := secp256k1.Sign(crypto.Keccak256(bor.BorRLP(header)), privKey) + if err != nil { + t.Fatalf("%s", err) + } + copy(header.Extra[len(header.Extra)-extraSeal:], sig) + + block := types.NewBlockWithHeader(header) + if _, err := chain.InsertChain([]*types.Block{block}); err != nil { + t.Fatalf("%s", err) + } +} + +func buildMinimalNextHeader(t *testing.T, block *types.Block, period uint64) *types.Header { + header := block.Header() + header.Number.Add(header.Number, big.NewInt(1)) + header.ParentHash = block.Hash() + header.Time += (period + 1) + header.Extra = make([]byte, 97) // vanity (32) + extraSeal (65) + _key, _ := hex.DecodeString(privKey) + sig, err := secp256k1.Sign(crypto.Keccak256(bor.BorRLP(header)), _key) + if err != nil { + t.Fatalf("%s", err) + } + copy(header.Extra[len(header.Extra)-extraSeal:], sig) + return header +} + +func loadSpanFromFile(t *testing.T) (*bor.ResponseWithHeight, *bor.HeimdallSpan) { + spanData, err := ioutil.ReadFile("span.json") + if err != nil { + t.Fatalf("%s", err) + } + res := &bor.ResponseWithHeight{} + if err := json.Unmarshal(spanData, res); err != nil { + t.Fatalf("%s", err) + } + + heimdallSpan := &bor.HeimdallSpan{} + if err := json.Unmarshal(res.Result, heimdallSpan); err != nil { + t.Fatalf("%s", err) + } + return res, heimdallSpan +} diff --git a/consensus/bor_test/span.json b/consensus/bor/bor_test/span.json similarity index 100% rename from consensus/bor_test/span.json rename to consensus/bor/bor_test/span.json diff --git a/consensus/bor/rest.go b/consensus/bor/rest.go index 6129037fc38d..9c525d6df6c5 100644 --- a/consensus/bor/rest.go +++ b/consensus/bor/rest.go @@ -25,18 +25,13 @@ type IHeimdallClient interface { } type HeimdallClient struct { - u *url.URL - client http.Client + urlString string + client http.Client } func NewHeimdallClient(urlString string) (*HeimdallClient, error) { - u, err := url.Parse(urlString) - if err != nil { - return nil, err - } - h := &HeimdallClient{ - u: u, + urlString: urlString, client: http.Client{ Timeout: time.Duration(5 * time.Second), }, @@ -45,35 +40,46 @@ func NewHeimdallClient(urlString string) (*HeimdallClient, error) { } func (h *HeimdallClient) Fetch(paths ...string) (*ResponseWithHeight, error) { + u, err := url.Parse(h.urlString) + if err != nil { + return nil, err + } + for _, e := range paths { if e != "" { - h.u.Path = path.Join(h.u.Path, e) + u.Path = path.Join(u.Path, e) } } - return h.internalFetch() + + return h.internalFetch(u) } // FetchWithRetry returns data from heimdall with retry func (h *HeimdallClient) FetchWithRetry(paths ...string) (*ResponseWithHeight, error) { + u, err := url.Parse(h.urlString) + if err != nil { + return nil, err + } + for _, e := range paths { if e != "" { - h.u.Path = path.Join(h.u.Path, e) + u.Path = path.Join(u.Path, e) } } for { - res, err := h.internalFetch() + res, err := h.internalFetch(u) if err == nil && res != nil { return res, nil } - log.Info("Retrying again in 5 seconds for next Heimdall span", "path", h.u.Path) + log.Info("Retrying again in 5 seconds for next Heimdall span", "path", u.Path) time.Sleep(5 * time.Second) } } // internal fetch method -func (h *HeimdallClient) internalFetch() (*ResponseWithHeight, error) { - res, err := h.client.Get(h.u.String()) +func (h *HeimdallClient) internalFetch(u *url.URL) (*ResponseWithHeight, error) { + res, err := h.client.Get(u.String()) if err != nil { return nil, err } diff --git a/core/blockchain.go b/core/blockchain.go index 34bbd400efde..e90ffbb30eac 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -27,6 +27,7 @@ import ( "sync/atomic" "time" + "github.com/hashicorp/golang-lru" "github.com/maticnetwork/bor/common" "github.com/maticnetwork/bor/common/mclock" "github.com/maticnetwork/bor/common/prque" @@ -42,7 +43,6 @@ import ( "github.com/maticnetwork/bor/params" "github.com/maticnetwork/bor/rlp" "github.com/maticnetwork/bor/trie" - "github.com/hashicorp/golang-lru" ) var ( @@ -142,6 +142,7 @@ type BlockChain struct { chainHeadFeed event.Feed logsFeed event.Feed blockProcFeed event.Feed + stateDataFeed event.Feed scope event.SubscriptionScope genesisBlock *types.Block @@ -2177,6 +2178,11 @@ func (bc *BlockChain) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscript return bc.scope.Track(bc.logsFeed.Subscribe(ch)) } +// SubscribeStateEvent registers a subscription of ChainSideEvent. +func (bc *BlockChain) SubscribeStateEvent(ch chan<- NewStateChangeEvent) event.Subscription { + return bc.scope.Track(bc.stateDataFeed.Subscribe(ch)) +} + // SubscribeBlockProcessingEvent registers a subscription of bool where true means // block processing has started while false means it has stopped. func (bc *BlockChain) SubscribeBlockProcessingEvent(ch chan<- bool) event.Subscription { diff --git a/core/events.go b/core/events.go index ba12738fa169..71a23100393b 100644 --- a/core/events.go +++ b/core/events.go @@ -41,6 +41,10 @@ type ChainEvent struct { Logs []*types.Log } +type NewStateChangeEvent struct { + StateData *types.StateData +} + type ChainSideEvent struct { Block *types.Block } diff --git a/core/types/transaction.go b/core/types/transaction.go index b19901c8ec2a..1481229b5ca2 100644 --- a/core/types/transaction.go +++ b/core/types/transaction.go @@ -60,6 +60,14 @@ type txdata struct { Hash *common.Hash `json:"hash" rlp:"-"` } +// State represents state received from Ethereum Blockchain +type StateData struct { + Did uint64 + Contract common.Address + Data string + TxHash common.Hash +} + type txdataMarshaling struct { AccountNonce hexutil.Uint64 Price *hexutil.Big diff --git a/eth/api_backend.go b/eth/api_backend.go index dbb57207d6b7..ff03d1a91e05 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -24,6 +24,7 @@ import ( "github.com/maticnetwork/bor/accounts" "github.com/maticnetwork/bor/common" "github.com/maticnetwork/bor/common/math" + "github.com/maticnetwork/bor/consensus/bor" "github.com/maticnetwork/bor/core" "github.com/maticnetwork/bor/core/bloombits" "github.com/maticnetwork/bor/core/rawdb" @@ -155,6 +156,11 @@ func (b *EthAPIBackend) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) e return b.eth.BlockChain().SubscribeChainSideEvent(ch) } +func (b *EthAPIBackend) SubscribeStateEvent(ch chan<- core.NewStateChangeEvent) event.Subscription { + engine := b.eth.Engine() + return engine.(*bor.Bor).SubscribeStateEvent(ch) +} + func (b *EthAPIBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { return b.eth.BlockChain().SubscribeLogsEvent(ch) } diff --git a/eth/backend.go b/eth/backend.go index ac5b3ba9aa3c..edb253111f2b 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -231,6 +231,10 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { return eth, nil } +func (s *Ethereum) SetBlockchain(blockchain *core.BlockChain) { + s.blockchain = blockchain +} + func makeExtraData(extra []byte) []byte { if len(extra) == 0 { // create default extradata diff --git a/eth/filters/api.go b/eth/filters/api.go index addbece2aa51..d7d382d9e8a8 100644 --- a/eth/filters/api.go +++ b/eth/filters/api.go @@ -17,6 +17,7 @@ package filters import ( + "bytes" "context" "encoding/json" "errors" @@ -215,7 +216,6 @@ func (api *PublicFilterAPI) NewHeads(ctx context.Context) (*rpc.Subscription, er go func() { headers := make(chan *types.Header) headersSub := api.events.SubscribeNewHeads(headers) - for { select { case h := <-headers: @@ -233,6 +233,38 @@ func (api *PublicFilterAPI) NewHeads(ctx context.Context) (*rpc.Subscription, er return rpcSub, nil } +// NewDeposits send a notification each time a new deposit received from bridge. +func (api *PublicFilterAPI) NewDeposits(ctx context.Context, crit ethereum.FilterState) (*rpc.Subscription, error) { + notifier, supported := rpc.NotifierFromContext(ctx) + if !supported { + return &rpc.Subscription{}, rpc.ErrNotificationsUnsupported + } + + rpcSub := notifier.CreateSubscription() + go func() { + stateData := make(chan *types.StateData) + stateDataSub := api.events.SubscribeNewDeposits(stateData) + + for { + select { + case h := <-stateData: + if crit.Did == h.Did || bytes.Compare(crit.Contract.Bytes(), h.Contract.Bytes()) == 0 || + (crit.Did == 0 && crit.Contract == common.Address{}) { + notifier.Notify(rpcSub.ID, h) + } + case <-rpcSub.Err(): + stateDataSub.Unsubscribe() + return + case <-notifier.Closed(): + stateDataSub.Unsubscribe() + return + } + } + }() + + return rpcSub, nil +} + // Logs creates a subscription that fires for all new log that match the given filter criteria. func (api *PublicFilterAPI) Logs(ctx context.Context, crit FilterCriteria) (*rpc.Subscription, error) { notifier, supported := rpc.NotifierFromContext(ctx) diff --git a/eth/filters/filter.go b/eth/filters/filter.go index a32a902bd0a5..547040eb3575 100644 --- a/eth/filters/filter.go +++ b/eth/filters/filter.go @@ -40,6 +40,7 @@ type Backend interface { SubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription + SubscribeStateEvent(ch chan<- core.NewStateChangeEvent) event.Subscription SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription diff --git a/eth/filters/filter_system.go b/eth/filters/filter_system.go index fd947eb0dce1..deff4faea078 100644 --- a/eth/filters/filter_system.go +++ b/eth/filters/filter_system.go @@ -53,6 +53,10 @@ const ( PendingTransactionsSubscription // BlocksSubscription queries hashes for blocks that are imported BlocksSubscription + + //StateSubscription to listen main chain state + StateSubscription + // LastSubscription keeps track of the last index LastIndexSubscription ) @@ -68,6 +72,8 @@ const ( logsChanSize = 10 // chainEvChanSize is the size of channel listening to ChainEvent. chainEvChanSize = 10 + // stateEvChanSize is the size of channel listening to ChainEvent. + stateEvChanSize = 10 ) var ( @@ -82,6 +88,7 @@ type subscription struct { logs chan []*types.Log hashes chan []common.Hash headers chan *types.Header + stateData chan *types.StateData installed chan struct{} // closed when the filter is installed err chan error // closed when the filter is uninstalled } @@ -99,15 +106,18 @@ type EventSystem struct { logsSub event.Subscription // Subscription for new log event rmLogsSub event.Subscription // Subscription for removed log event chainSub event.Subscription // Subscription for new chain event + stateSub event.Subscription // Subscription for new state change event pendingLogSub *event.TypeMuxSubscription // Subscription for pending log event // Channels - install chan *subscription // install filter for event notification - uninstall chan *subscription // remove filter for event notification - txsCh chan core.NewTxsEvent // Channel to receive new transactions event - logsCh chan []*types.Log // Channel to receive new log event - rmLogsCh chan core.RemovedLogsEvent // Channel to receive removed log event - chainCh chan core.ChainEvent // Channel to receive new chain event + install chan *subscription // install filter for event notification + uninstall chan *subscription // remove filter for event notification + txsCh chan core.NewTxsEvent // Channel to receive new transactions event + logsCh chan []*types.Log // Channel to receive new log event + rmLogsCh chan core.RemovedLogsEvent // Channel to receive removed log event + chainCh chan core.ChainEvent // Channel to receive new chain event + stateCh chan core.NewStateChangeEvent // Channel to receive deposit state change event + } // NewEventSystem creates a new manager that listens for event on the given mux, @@ -127,6 +137,7 @@ func NewEventSystem(mux *event.TypeMux, backend Backend, lightMode bool) *EventS logsCh: make(chan []*types.Log, logsChanSize), rmLogsCh: make(chan core.RemovedLogsEvent, rmLogsChanSize), chainCh: make(chan core.ChainEvent, chainEvChanSize), + stateCh: make(chan core.NewStateChangeEvent, stateEvChanSize), } // Subscribe events @@ -134,12 +145,13 @@ func NewEventSystem(mux *event.TypeMux, backend Backend, lightMode bool) *EventS m.logsSub = m.backend.SubscribeLogsEvent(m.logsCh) m.rmLogsSub = m.backend.SubscribeRemovedLogsEvent(m.rmLogsCh) m.chainSub = m.backend.SubscribeChainEvent(m.chainCh) + m.stateSub = m.backend.SubscribeStateEvent(m.stateCh) // TODO(rjl493456442): use feed to subscribe pending log event m.pendingLogSub = m.mux.Subscribe(core.PendingLogsEvent{}) // Make sure none of the subscriptions are empty if m.txsSub == nil || m.logsSub == nil || m.rmLogsSub == nil || m.chainSub == nil || - m.pendingLogSub.Closed() { + m.stateSub == nil || m.pendingLogSub.Closed() { log.Crit("Subscribe for event system failed") } @@ -292,6 +304,23 @@ func (es *EventSystem) SubscribeNewHeads(headers chan *types.Header) *Subscripti logs: make(chan []*types.Log), hashes: make(chan []common.Hash), headers: headers, + stateData: make(chan *types.StateData), + installed: make(chan struct{}), + err: make(chan error), + } + return es.subscribe(sub) +} + +// SubscribeNewDeposits creates a subscription that writes details about the new state sync events (from mainchain to Bor) +func (es *EventSystem) SubscribeNewDeposits(stateData chan *types.StateData) *Subscription { + sub := &subscription{ + id: rpc.NewID(), + typ: StateSubscription, + created: time.Now(), + logs: make(chan []*types.Log), + hashes: make(chan []common.Hash), + headers: make(chan *types.Header), + stateData: stateData, installed: make(chan struct{}), err: make(chan error), } @@ -355,6 +384,10 @@ func (es *EventSystem) broadcast(filters filterIndex, ev interface{}) { for _, f := range filters[PendingTransactionsSubscription] { f.hashes <- hashes } + case core.NewStateChangeEvent: + for _, f := range filters[StateSubscription] { + f.stateData <- e.StateData + } case core.ChainEvent: for _, f := range filters[BlocksSubscription] { f.headers <- e.Block.Header() @@ -471,6 +504,8 @@ func (es *EventSystem) eventLoop() { es.broadcast(index, ev) case ev := <-es.chainCh: es.broadcast(index, ev) + case ev := <-es.stateCh: + es.broadcast(index, ev) case ev, active := <-es.pendingLogSub.Chan(): if !active { // system stopped return diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go index ad8acaafa2d6..5d349a289b86 100644 --- a/ethclient/ethclient.go +++ b/ethclient/ethclient.go @@ -24,7 +24,7 @@ import ( "fmt" "math/big" - "github.com/maticnetwork/bor" + ethereum "github.com/maticnetwork/bor" "github.com/maticnetwork/bor/common" "github.com/maticnetwork/bor/common/hexutil" "github.com/maticnetwork/bor/core/types" @@ -324,6 +324,11 @@ func (ec *Client) SubscribeNewHead(ctx context.Context, ch chan<- *types.Header) return ec.c.EthSubscribe(ctx, ch, "newHeads") } +// SubscribeNewDeposit subscribes to new state sync events +func (ec *Client) SubscribeNewDeposit(ctx context.Context, ch chan<- *types.StateData) (ethereum.Subscription, error) { + return ec.c.EthSubscribe(ctx, ch, "newDeposits", nil) +} + // State Access // NetworkID returns the network ID (also known as the chain ID) for this chain. diff --git a/ethclient/ethclient_test.go b/ethclient/ethclient_test.go index c9364e2d8c43..504a77a9706a 100644 --- a/ethclient/ethclient_test.go +++ b/ethclient/ethclient_test.go @@ -25,7 +25,7 @@ import ( "testing" "time" - "github.com/maticnetwork/bor" + bor "github.com/maticnetwork/bor" "github.com/maticnetwork/bor/common" "github.com/maticnetwork/bor/consensus/ethash" "github.com/maticnetwork/bor/core" @@ -39,17 +39,17 @@ import ( // Verify that Client implements the ethereum interfaces. var ( - _ = ethereum.ChainReader(&Client{}) - _ = ethereum.TransactionReader(&Client{}) - _ = ethereum.ChainStateReader(&Client{}) - _ = ethereum.ChainSyncReader(&Client{}) - _ = ethereum.ContractCaller(&Client{}) - _ = ethereum.GasEstimator(&Client{}) - _ = ethereum.GasPricer(&Client{}) - _ = ethereum.LogFilterer(&Client{}) - _ = ethereum.PendingStateReader(&Client{}) - // _ = ethereum.PendingStateEventer(&Client{}) - _ = ethereum.PendingContractCaller(&Client{}) + _ = bor.ChainReader(&Client{}) + _ = bor.TransactionReader(&Client{}) + _ = bor.ChainStateReader(&Client{}) + _ = bor.ChainSyncReader(&Client{}) + _ = bor.ContractCaller(&Client{}) + _ = bor.GasEstimator(&Client{}) + _ = bor.GasPricer(&Client{}) + _ = bor.LogFilterer(&Client{}) + _ = bor.PendingStateReader(&Client{}) + // _ = bor.PendingStateEventer(&Client{}) + _ = bor.PendingContractCaller(&Client{}) ) func TestToFilterArg(t *testing.T) { @@ -63,13 +63,13 @@ func TestToFilterArg(t *testing.T) { for _, testCase := range []struct { name string - input ethereum.FilterQuery + input bor.FilterQuery output interface{} err error }{ { "without BlockHash", - ethereum.FilterQuery{ + bor.FilterQuery{ Addresses: addresses, FromBlock: big.NewInt(1), ToBlock: big.NewInt(2), @@ -85,7 +85,7 @@ func TestToFilterArg(t *testing.T) { }, { "with nil fromBlock and nil toBlock", - ethereum.FilterQuery{ + bor.FilterQuery{ Addresses: addresses, Topics: [][]common.Hash{}, }, @@ -99,7 +99,7 @@ func TestToFilterArg(t *testing.T) { }, { "with blockhash", - ethereum.FilterQuery{ + bor.FilterQuery{ Addresses: addresses, BlockHash: &blockHash, Topics: [][]common.Hash{}, @@ -113,7 +113,7 @@ func TestToFilterArg(t *testing.T) { }, { "with blockhash and from block", - ethereum.FilterQuery{ + bor.FilterQuery{ Addresses: addresses, BlockHash: &blockHash, FromBlock: big.NewInt(1), @@ -124,7 +124,7 @@ func TestToFilterArg(t *testing.T) { }, { "with blockhash and to block", - ethereum.FilterQuery{ + bor.FilterQuery{ Addresses: addresses, BlockHash: &blockHash, ToBlock: big.NewInt(1), @@ -135,7 +135,7 @@ func TestToFilterArg(t *testing.T) { }, { "with blockhash and both from / to block", - ethereum.FilterQuery{ + bor.FilterQuery{ Addresses: addresses, BlockHash: &blockHash, FromBlock: big.NewInt(1), diff --git a/go.mod b/go.mod index b9b765a52cea..ca433a71c6e8 100644 --- a/go.mod +++ b/go.mod @@ -3,11 +3,12 @@ module github.com/maticnetwork/bor go 1.13 require ( - github.com/Azure/azure-pipeline-go v0.0.0-20180607212504-7571e8eb0876 // indirect - github.com/Azure/azure-storage-blob-go v0.0.0-20180712005634-eaae161d9d5e + github.com/Azure/azure-pipeline-go v0.2.2 // indirect + github.com/Azure/azure-storage-blob-go v0.7.0 + github.com/Azure/go-autorest/autorest/adal v0.8.0 // indirect github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 - github.com/apilayer/freegeoip v3.5.1-0.20180702111401-3f942d1392f6+incompatible + github.com/apilayer/freegeoip v3.5.0+incompatible github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847 github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6 github.com/cespare/cp v0.1.0 @@ -21,49 +22,52 @@ require ( github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff github.com/go-ole/go-ole v1.2.1 // indirect github.com/go-stack/stack v1.8.0 - github.com/golang/protobuf v1.3.2-0.20190517061210-b285ee9cfc6c + github.com/golang/protobuf v1.3.5 github.com/golang/snappy v0.0.1 - github.com/google/go-cmp v0.4.0 // indirect - github.com/graph-gophers/graphql-go v0.0.0-20200309224638-dae41bde9ef9 + github.com/google/go-cmp v0.3.1 // indirect + github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277 github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad - github.com/howeyc/fsnotify v0.9.1-0.20151003194602-f0c08ee9c607 // indirect + github.com/howeyc/fsnotify v0.9.0 // indirect github.com/huin/goupnp v0.0.0-20161224104101-679507af18f3 github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883 github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458 github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21 - github.com/karalabe/usb v0.0.0-20191104083709-911d15fe12a9 + github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 + github.com/kr/pretty v0.1.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/mattn/go-colorable v0.1.0 github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035 + github.com/mattn/go-runewidth v0.0.4 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 github.com/naoina/go-stringutil v0.1.0 // indirect github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c - github.com/oschwald/maxminddb-golang v1.3.1-0.20180819230143-277d39ecb83e // indirect + github.com/onsi/ginkgo v1.10.3 // indirect + github.com/onsi/gomega v1.7.1 // indirect + github.com/oschwald/maxminddb-golang v1.6.0 // indirect github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222 github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 - github.com/pkg/errors v0.8.1-0.20171216070316-e881fd58d78e // indirect + github.com/pkg/errors v0.8.1 // indirect github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150 github.com/rjeczalik/notify v0.9.1 - github.com/robertkrimen/otto v0.0.0-20170205013659-6a77b7cbc37d + github.com/robertkrimen/otto v0.0.0-20191219234010-c382bd3c16ff github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00 github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521 // indirect github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3 // indirect - github.com/stretchr/objx v0.2.0 // indirect - github.com/stretchr/testify v1.3.0 - github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965 + github.com/stretchr/testify v1.4.0 + github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 - golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 - golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 - golang.org/x/sync v0.0.0-20181108010431-42b317875d0f - golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a - golang.org/x/text v0.3.1-0.20190405145017-31e7599a6c37 - gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405 + golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4 + golang.org/x/net v0.0.0-20200301022130-244492dfa37a + golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e + golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 + golang.org/x/text v0.3.2 + gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce - gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190213234257-ec84240a7772 + gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200316214253-d7b0ff38cac9 gopkg.in/sourcemap.v1 v1.0.5 // indirect gopkg.in/urfave/cli.v1 v1.20.0 gotest.tools v2.2.0+incompatible // indirect diff --git a/go.sum b/go.sum index c946c411bc40..c51ed2d8e957 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,24 @@ -github.com/Azure/azure-pipeline-go v0.0.0-20180607212504-7571e8eb0876 h1:3c3mGlhASTJh6H6Ba9EHv2FDSmEUyJuJHR6UD7b+YuE= -github.com/Azure/azure-pipeline-go v0.0.0-20180607212504-7571e8eb0876/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= -github.com/Azure/azure-storage-blob-go v0.0.0-20180712005634-eaae161d9d5e h1:Ix5oKbq0MlolI+T4EPCL9sddfEw6LgRMpC+qx0Kz5/E= -github.com/Azure/azure-storage-blob-go v0.0.0-20180712005634-eaae161d9d5e/go.mod h1:x2mtS6O3mnMEZOJp7d7oldh8IvatBrMfReiyQ+cKgKY= +github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-pipeline-go v0.2.2 h1:6oiIS9yaG6XCCzhgAgKFfIWyo4LLCiDhZot6ltoThhY= +github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-storage-blob-go v0.7.0 h1:MuueVOYkufCxJw5YZzF842DY2MBsp+hLuh2apKY0mck= +github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= +github.com/Azure/go-autorest/autorest v0.9.0 h1:MRvx8gncNaXJqOoLmhNjUAKh33JJF8LyxPhomEtOsjs= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0 h1:CxTzQrySOxDnKpLjFJeZAS5Qrv/qFPkgLjx5bOAi//I= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= @@ -9,8 +26,8 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/apilayer/freegeoip v3.5.1-0.20180702111401-3f942d1392f6+incompatible h1:Zwy9nfhT7doqRUFGg9Qj+mgsXu8509CBKWO6t9IjfQs= -github.com/apilayer/freegeoip v3.5.1-0.20180702111401-3f942d1392f6+incompatible/go.mod h1:CUfFqErhFhXneJendyQ/rRcuA8kH8JxHvYnbOozmlCU= +github.com/apilayer/freegeoip v3.5.0+incompatible h1:z1u2gv0/rsSi/HqMDB436AiUROXXim7st5DOg4Ikl4A= +github.com/apilayer/freegeoip v3.5.0+incompatible/go.mod h1:CUfFqErhFhXneJendyQ/rRcuA8kH8JxHvYnbOozmlCU= github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847 h1:rtI0fD4oG/8eVokGVPYJEW1F88p1ZNgXiEIs9thEE4A= github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -18,12 +35,15 @@ github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6 h1:Eey/GGQ/E5Xp1P2Ly github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea h1:j4317fAZh7X6GqbFowYdYdI0L9bwxL07jyPZIdepyZ0= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf h1:sh8rkQZavChcmakYiSlqu2425CHyFXLZZnvm7PDpU8M= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= @@ -49,18 +69,18 @@ github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2-0.20190517061210-b285ee9cfc6c h1:zqAKixg3cTcIasAMJV+EcfVbWwLpOZ7LeoWJvcuD/5Q= -github.com/golang/protobuf v1.3.2-0.20190517061210-b285ee9cfc6c/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/graph-gophers/graphql-go v0.0.0-20200309224638-dae41bde9ef9 h1:kLnsdud6Fl1/7ZX/5oD23cqYAzBfuZBhNkGr2NvuEsU= -github.com/graph-gophers/graphql-go v0.0.0-20200309224638-dae41bde9ef9/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277 h1:E0whKxgp2ojts0FDgUA8dl62bmH0LxKanMoBr6MDTDM= +github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad h1:eMxs9EL0PvIGS9TTtxg4R+JxuPGav82J8rA+GFnY7po= github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/howeyc/fsnotify v0.9.1-0.20151003194602-f0c08ee9c607 h1:pYACEr/iXEWeTFnOxHXJZW8h90zbA62XMBUqb3VLrno= -github.com/howeyc/fsnotify v0.9.1-0.20151003194602-f0c08ee9c607/go.mod h1:41HzSPxBGeFRQKEEwgh49TRw/nKBsYZ2cF1OzPjSJsA= +github.com/howeyc/fsnotify v0.9.0 h1:0gtV5JmOKH4A8SsFxG2BczSeXWWPvcMT0euZt5gDAxY= +github.com/howeyc/fsnotify v0.9.0/go.mod h1:41HzSPxBGeFRQKEEwgh49TRw/nKBsYZ2cF1OzPjSJsA= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v0.0.0-20161224104101-679507af18f3 h1:DqD8eigqlUm0+znmx7zhL0xvTW3+e1jCekJMfBUADWI= @@ -71,18 +91,27 @@ github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458 h1:6OvNmYgJye github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21 h1:F/iKcka0K2LgnKy/fgSBf235AETtm1n1TvBzqu40LE0= github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/karalabe/usb v0.0.0-20191104083709-911d15fe12a9 h1:ZHuwnjpP8LsVsUYqTqeVAI+GfDfJ6UNPrExZF+vX/DQ= -github.com/karalabe/usb v0.0.0-20191104083709-911d15fe12a9/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 h1:I/yrLt2WilKxlQKCM52clh5rGzTKpVctGT1lH4Dc8Jw= +github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/mattn/go-colorable v0.1.0 h1:v2XXALHHh6zHfYTJ+cSkwtyffnaOyR1MXaA91mTrb8o= github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d h1:oNAwILwmgWKFpuU+dXvI6dl9jG2mAWAZLX3r9s0PPiw= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035 h1:USWjF42jDCSEeikX/G1g40ZWnsPXN5WkZ4jMHZWyBK4= github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= @@ -96,19 +125,23 @@ github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c/go.mod h1 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3 h1:OoxbjfXVZyod1fmWYhI7SEyaD8B00ynP3T+D5GiyHOY= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1 h1:K0jcRCwNQM3vFGh1ppMtDh/+7ApJrjldlX8fA0jDTLQ= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/oschwald/maxminddb-golang v1.3.1-0.20180819230143-277d39ecb83e h1:ywJ45unyDYFmUwjfH/Ho08+CSPxDamN554H9MFGL2v4= -github.com/oschwald/maxminddb-golang v1.3.1-0.20180819230143-277d39ecb83e/go.mod h1:3jhIUymTJ5VREKyIhWm66LJiQt04F0UCDdodShpjWsY= +github.com/oschwald/maxminddb-golang v1.6.0 h1:KAJSjdHQ8Kv45nFIbtoLGrGWqHFajOIm7skTyz/+Dls= +github.com/oschwald/maxminddb-golang v1.6.0/go.mod h1:DUJFucBg2cvqx42YmDa/+xHvb0elJtOm3o4aFQ/nb/w= github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222 h1:goeTyGkArOZIVOMA0dQbyuPWGNQJZGPwPu/QS9GlpnA= github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171216070316-e881fd58d78e h1:osn9cOzd93npXpRuTFR/MPjiTvTSNHA7pqbXkPyLqQ4= -github.com/pkg/errors v0.8.1-0.20171216070316-e881fd58d78e/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -119,8 +152,8 @@ github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150 h1:ZeU+auZj1iNzN github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/robertkrimen/otto v0.0.0-20170205013659-6a77b7cbc37d h1:ouzpe+YhpIfnjR40gSkJHWsvXmB6TiPKqMtMpfyU9DE= -github.com/robertkrimen/otto v0.0.0-20170205013659-6a77b7cbc37d/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY= +github.com/robertkrimen/otto v0.0.0-20191219234010-c382bd3c16ff h1:+6NUiITWwE5q1KO6SAfUX918c+Tab0+tGAM/mtdlUyA= +github.com/robertkrimen/otto v0.0.0-20191219234010-c382bd3c16ff/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY= github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00 h1:8DPul/X0IT/1TNMIxoKLwdemEOBBHDC/K4EB16Cw5WE= github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521 h1:3hxavr+IHMsQBrYUPQM5v0CgENFktkkbg1sfpgM3h20= @@ -132,54 +165,62 @@ github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 h1:gIlAHnH1 github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3 h1:njlZPzLwU639dk2kqnCPPv+wNjq7Xb6EfUxe/oX0/NM= github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= +github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965 h1:1oFLiOyVl+W7bnBzGhf7BbIv9loSFQcieWWYIjLqcAw= -github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d h1:gZZadD8H+fF+n9CmNhYL1Y0dJB+kLOmKd7FbPJLeGHs= +github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 h1:1cngl9mPEoITZG8s8cVcUy5CeIBYhEESkOB7m6Gmkrk= github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4 h1:QmwruyY+bKbDDL0BaglrbZABEali68eoMFhTZpCjYVA= +golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191224085550-c709ea063b76/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20190405145017-31e7599a6c37 h1:GyWqpHjbqJPzmv9GUT0BJbxVkiMfYpHH+D/1FkwOlWA= -golang.org/x/text v0.3.1-0.20190405145017-31e7599a6c37/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e h1:FDhOuMEY4JVRztM/gsbk+IKUQ8kj74bxZrgw87eMMVc= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405 h1:829vOVxxusYHC+IqBtkX5mbKtsY9fheQiQn0MZRVLfQ= -gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190213234257-ec84240a7772 h1:hhsSf/5z74Ck/DJYc+R8zpq8KGm7uJvpdLRQED/IedA= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190213234257-ec84240a7772/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= +gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200316214253-d7b0ff38cac9 h1:ITeyKbRetrVzqR3U1eY+ywgp7IBspGd1U/bkwd1gWu4= +gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200316214253-d7b0ff38cac9/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI= gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= -gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= diff --git a/interfaces.go b/interfaces.go index 3aaed80b8807..4c8ce56d9dfb 100644 --- a/interfaces.go +++ b/interfaces.go @@ -150,6 +150,11 @@ type FilterQuery struct { Topics [][]common.Hash } +type FilterState struct { + Did uint64 + Contract common.Address +} + // LogFilterer provides access to contract log events using a one-off query or continuous // event subscription. // diff --git a/internal/build/archive.go b/internal/build/archive.go index ac680ba63de8..a00258d99903 100644 --- a/internal/build/archive.go +++ b/internal/build/archive.go @@ -183,3 +183,48 @@ func (a *TarballArchive) Close() error { } return a.file.Close() } + +func ExtractTarballArchive(archive string, dest string) error { + // We're only interested in gzipped archives, wrap the reader now + ar, err := os.Open(archive) + if err != nil { + return err + } + defer ar.Close() + + gzr, err := gzip.NewReader(ar) + if err != nil { + return err + } + defer gzr.Close() + + // Iterate over all the files in the tarball + tr := tar.NewReader(gzr) + for { + // Fetch the next tarball header and abort if needed + header, err := tr.Next() + if err != nil { + if err == io.EOF { + return nil + } + return err + } + // Figure out the target and create it + target := filepath.Join(dest, header.Name) + + switch header.Typeflag { + case tar.TypeReg: + if err := os.MkdirAll(filepath.Dir(target), 0755); err != nil { + return err + } + file, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode)) + if err != nil { + return err + } + if _, err := io.Copy(file, tr); err != nil { + return err + } + file.Close() + } + } +} diff --git a/internal/build/azure.go b/internal/build/azure.go index 086dff2c4a8a..786284265082 100644 --- a/internal/build/azure.go +++ b/internal/build/azure.go @@ -22,7 +22,7 @@ import ( "net/url" "os" - "github.com/Azure/azure-storage-blob-go/2018-03-28/azblob" + "github.com/Azure/azure-storage-blob-go/azblob" ) // AzureBlobstoreConfig is an authentication and configuration struct containing @@ -45,7 +45,11 @@ func AzureBlobstoreUpload(path string, name string, config AzureBlobstoreConfig) return nil } // Create an authenticated client against the Azure cloud - credential := azblob.NewSharedKeyCredential(config.Account, config.Token) + credential, err := azblob.NewSharedKeyCredential(config.Account, config.Token) + if err != nil { + return err + } + pipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{}) u, _ := url.Parse(fmt.Sprintf("https://%s.blob.core.windows.net", config.Account)) @@ -67,7 +71,11 @@ func AzureBlobstoreUpload(path string, name string, config AzureBlobstoreConfig) // AzureBlobstoreList lists all the files contained within an azure blobstore. func AzureBlobstoreList(config AzureBlobstoreConfig) ([]azblob.BlobItem, error) { - credential := azblob.NewSharedKeyCredential(config.Account, config.Token) + credential, err := azblob.NewSharedKeyCredential(config.Account, config.Token) + if err != nil { + return nil, err + } + pipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{}) u, _ := url.Parse(fmt.Sprintf("https://%s.blob.core.windows.net", config.Account)) @@ -95,7 +103,11 @@ func AzureBlobstoreDelete(config AzureBlobstoreConfig, blobs []azblob.BlobItem) return nil } // Create an authenticated client against the Azure cloud - credential := azblob.NewSharedKeyCredential(config.Account, config.Token) + credential, err := azblob.NewSharedKeyCredential(config.Account, config.Token) + if err != nil { + return err + } + pipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{}) u, _ := url.Parse(fmt.Sprintf("https://%s.blob.core.windows.net", config.Account)) diff --git a/internal/build/download.go b/internal/build/download.go new file mode 100644 index 000000000000..0ed0b5e130d1 --- /dev/null +++ b/internal/build/download.go @@ -0,0 +1,151 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package build + +import ( + "bufio" + "crypto/sha256" + "encoding/hex" + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "os" + "path/filepath" + "strings" +) + +// ChecksumDB keeps file checksums. +type ChecksumDB struct { + allChecksums []string +} + +// MustLoadChecksums loads a file containing checksums. +func MustLoadChecksums(file string) *ChecksumDB { + content, err := ioutil.ReadFile(file) + if err != nil { + log.Fatal("can't load checksum file: " + err.Error()) + } + return &ChecksumDB{strings.Split(string(content), "\n")} +} + +// Verify checks whether the given file is valid according to the checksum database. +func (db *ChecksumDB) Verify(path string) error { + fd, err := os.Open(path) + if err != nil { + return err + } + defer fd.Close() + + h := sha256.New() + if _, err := io.Copy(h, bufio.NewReader(fd)); err != nil { + return err + } + fileHash := hex.EncodeToString(h.Sum(nil)) + if !db.findHash(filepath.Base(path), fileHash) { + return fmt.Errorf("invalid file hash %s", fileHash) + } + return nil +} + +func (db *ChecksumDB) findHash(basename, hash string) bool { + want := hash + " " + basename + for _, line := range db.allChecksums { + if strings.TrimSpace(line) == want { + return true + } + } + return false +} + +// DownloadFile downloads a file and verifies its checksum. +func (db *ChecksumDB) DownloadFile(url, dstPath string) error { + if err := db.Verify(dstPath); err == nil { + fmt.Printf("%s is up-to-date\n", dstPath) + return nil + } + fmt.Printf("%s is stale\n", dstPath) + fmt.Printf("downloading from %s\n", url) + + resp, err := http.Get(url) + if err != nil { + return fmt.Errorf("download error: %v", err) + } else if resp.StatusCode != http.StatusOK { + return fmt.Errorf("download error: status %d", resp.StatusCode) + } + defer resp.Body.Close() + if err := os.MkdirAll(filepath.Dir(dstPath), 0755); err != nil { + return err + } + fd, err := os.OpenFile(dstPath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) + if err != nil { + return err + } + dst := newDownloadWriter(fd, resp.ContentLength) + _, err = io.Copy(dst, resp.Body) + dst.Close() + if err != nil { + return err + } + + return db.Verify(dstPath) +} + +type downloadWriter struct { + file *os.File + dstBuf *bufio.Writer + size int64 + written int64 + lastpct int64 +} + +func newDownloadWriter(dst *os.File, size int64) *downloadWriter { + return &downloadWriter{ + file: dst, + dstBuf: bufio.NewWriter(dst), + size: size, + } +} + +func (w *downloadWriter) Write(buf []byte) (int, error) { + n, err := w.dstBuf.Write(buf) + + // Report progress. + w.written += int64(n) + pct := w.written * 10 / w.size * 10 + if pct != w.lastpct { + if w.lastpct != 0 { + fmt.Print("...") + } + fmt.Print(pct, "%") + w.lastpct = pct + } + return n, err +} + +func (w *downloadWriter) Close() error { + if w.lastpct > 0 { + fmt.Println() // Finish the progress line. + } + flushErr := w.dstBuf.Flush() + closeErr := w.file.Close() + if flushErr != nil { + return flushErr + } + return closeErr +} diff --git a/internal/ethapi/backend.go b/internal/ethapi/backend.go index 986912b16386..e0deeab81fdb 100644 --- a/internal/ethapi/backend.go +++ b/internal/ethapi/backend.go @@ -59,6 +59,7 @@ type Backend interface { GetTd(blockHash common.Hash) *big.Int GetEVM(ctx context.Context, msg core.Message, state *state.StateDB, header *types.Header) (*vm.EVM, func() error, error) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription + SubscribeStateEvent(ch chan<- core.NewStateChangeEvent) event.Subscription SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription diff --git a/les/api_backend.go b/les/api_backend.go index 8333fdd8c37f..5c8ec82d8812 100644 --- a/les/api_backend.go +++ b/les/api_backend.go @@ -24,6 +24,7 @@ import ( "github.com/maticnetwork/bor/accounts" "github.com/maticnetwork/bor/common" "github.com/maticnetwork/bor/common/math" + "github.com/maticnetwork/bor/consensus/bor" "github.com/maticnetwork/bor/core" "github.com/maticnetwork/bor/core/bloombits" "github.com/maticnetwork/bor/core/rawdb" @@ -164,6 +165,11 @@ func (b *LesApiBackend) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) e return b.eth.blockchain.SubscribeChainSideEvent(ch) } +func (b *LesApiBackend) SubscribeStateEvent(ch chan<- core.NewStateChangeEvent) event.Subscription { + engine := b.eth.Engine() + return engine.(*bor.Bor).SubscribeStateEvent(ch) +} + func (b *LesApiBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { return b.eth.blockchain.SubscribeLogsEvent(ch) } diff --git a/les/backend.go b/les/backend.go index 4481bd676ebf..fc995dd58fc4 100644 --- a/les/backend.go +++ b/les/backend.go @@ -28,6 +28,7 @@ import ( "github.com/maticnetwork/bor/common/hexutil" "github.com/maticnetwork/bor/common/mclock" "github.com/maticnetwork/bor/consensus" + "github.com/maticnetwork/bor/consensus/bor" "github.com/maticnetwork/bor/core" "github.com/maticnetwork/bor/core/bloombits" "github.com/maticnetwork/bor/core/rawdb" @@ -59,6 +60,7 @@ type LightEthereum struct { peers *peerSet txPool *light.TxPool blockchain *light.LightChain + bor *bor.Bor serverPool *serverPool reqDist *requestDistributor retriever *retrieveManager