From 97c3fdfaa2fd076400c4d72dd7bcf7a3ec9e62f4 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Mon, 27 Sep 2021 14:24:40 +0200 Subject: [PATCH 1/2] ci: add Makefile, use golangci-lint With this commit we add a Makefile with the goal of removing the goclean.sh script. We also use the more powerful golangci-lint linter and split the GitHub actions into multiple sections to parallelize them. --- .github/workflows/go.yml | 63 ++++++++++++++++----- .gitignore | 2 + .golangci.yml | 54 ++++++++++++++++++ Makefile | 116 +++++++++++++++++++++++++++++++++++++++ goclean.sh | 46 ---------------- test_coverage.txt | 72 ------------------------ 6 files changed, 220 insertions(+), 133 deletions(-) create mode 100644 .golangci.yml create mode 100644 Makefile delete mode 100755 goclean.sh delete mode 100644 test_coverage.txt diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index d82b525..541cc82 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -1,31 +1,64 @@ name: Build and Test on: [push, pull_request] + +env: + # go needs absolute directories, using the $HOME variable doesn't work here. + GOCACHE: /home/runner/work/go/pkg/build + GOPATH: /home/runner/work/go + GO_VERSION: 1.16.8 + jobs: build: - name: Go CI + name: Build runs-on: ubuntu-latest - strategy: - matrix: - go: [1.14, 1.15] steps: - name: Set up Go uses: actions/setup-go@v2 with: - go-version: ${{ matrix.go }} + go-version: ${{ env.GO_VERSION }} + - name: Check out source uses: actions/checkout@v2 - - name: Install Linters - run: "curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin v1.31.0" + - name: Build - env: - GO111MODULE: "on" - run: go build ./... + run: make build + + test-cover: + name: Unit coverage + runs-on: ubuntu-latest + steps: + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Check out source + uses: actions/checkout@v2 + - name: Test - env: - GO111MODULE: "on" - run: | - sh ./goclean.sh + run: make unit-cover + - name: Send btcutil coverage uses: shogo82148/actions-goveralls@v1 with: - path-to-profile: profile.cov + path-to-profile: coverage.txt + + - name: Send btcutil coverage for psbt package + uses: shogo82148/actions-goveralls@v1 + with: + path-to-profile: psbt/coverage.txt + + test-race: + name: Unit race + runs-on: ubuntu-latest + steps: + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Check out source + uses: actions/checkout@v2 + + - name: Test + run: make unit-race diff --git a/.gitignore b/.gitignore index 5b97dbb..4b0deb0 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,5 @@ _cgo_export.* _testmain.go *.exe +coverage.txt +psbt/coverage.txt diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..9ee85c4 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,54 @@ +run: + # timeout for analysis + deadline: 10m + +linters-settings: + govet: + # Don't report about shadowed variables + check-shadowing: false + gofmt: + # simplify code: gofmt with `-s` option, true by default + simplify: true + +linters: + enable-all: true + disable: + # Global variables are used in many places throughout the code base. + - gochecknoglobals + + # Some lines are over 80 characters on purpose and we don't want to make them + # even longer by marking them as 'nolint'. + - lll + + # We don't care (enough) about misaligned structs to lint that. + - maligned + + # We have long functions, especially in tests. Moving or renaming those would + # trigger funlen problems that we may not want to solve at that time. + - funlen + + # Disable for now as we haven't yet tuned the sensitivity to our codebase + # yet. Enabling by default for example, would also force new contributors to + # potentially extensively refactor code, when they want to smaller change to + # land. + - gocyclo + + # Instances of table driven tests that don't pre-allocate shouldn't trigger + # the linter. + - prealloc + + # Init functions are used by loggers throughout the codebase. + - gochecknoinits + + # Explicit types are okay. + - interfacer + +issues: + exclude-rules: + # Exclude gosec from running for tests so that tests with weak randomness + # (math/rand) will pass the linter. + - path: _test\.go + linters: + - gosec + #- errcheck + - dupl diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c627e88 --- /dev/null +++ b/Makefile @@ -0,0 +1,116 @@ +PKG := github.com/btcsuite/btcutil + +LINT_PKG := github.com/golangci/golangci-lint/cmd/golangci-lint +GOACC_PKG := github.com/ory/go-acc +GOIMPORTS_PKG := golang.org/x/tools/cmd/goimports + +GO_BIN := ${GOPATH}/bin +LINT_BIN := $(GO_BIN)/golangci-lint +GOACC_BIN := $(GO_BIN)/go-acc + +LINT_COMMIT := v1.18.0 +GOACC_COMMIT := 80342ae2e0fcf265e99e76bcc4efd022c7c3811b + +DEPGET := cd /tmp && GO111MODULE=on go get -v +GOBUILD := GO111MODULE=on go build -v +GOINSTALL := GO111MODULE=on go install -v +GOTEST := GO111MODULE=on go test + +GOFILES_NOVENDOR = $(shell find . -type f -name '*.go' -not -path "./vendor/*") + +RM := rm -f +CP := cp +MAKE := make +XARGS := xargs -L 1 + +# Linting uses a lot of memory, so keep it under control by limiting the number +# of workers if requested. +ifneq ($(workers),) +LINT_WORKERS = --concurrency=$(workers) +endif + +LINT = $(LINT_BIN) run -v $(LINT_WORKERS) + +GREEN := "\\033[0;32m" +NC := "\\033[0m" +define print + echo $(GREEN)$1$(NC) +endef + +default: build + +all: build check + +# ============ +# DEPENDENCIES +# ============ + +$(LINT_BIN): + @$(call print, "Fetching linter") + $(DEPGET) $(LINT_PKG)@$(LINT_COMMIT) + +$(GOACC_BIN): + @$(call print, "Fetching go-acc") + $(DEPGET) $(GOACC_PKG)@$(GOACC_COMMIT) + +goimports: + @$(call print, "Installing goimports.") + $(DEPGET) $(GOIMPORTS_PKG) + +# ============ +# INSTALLATION +# ============ + +build: + @$(call print, "Compiling btcutil.") + $(GOBUILD) $(PKG)/... + +# ======= +# TESTING +# ======= + +check: unit + +unit: + @$(call print, "Running unit tests.") + $(GOTEST) ./... -test.timeout=20m + cd psbt; $(GOTEST) ./... -test.timeout=20m + +unit-cover: $(GOACC_BIN) + @$(call print, "Running unit coverage tests.") + $(GOACC_BIN) ./... + cd psbt; $(GOACC_BIN) ./... + +unit-race: + @$(call print, "Running unit race tests.") + env CGO_ENABLED=1 GORACE="history_size=7 halt_on_errors=1" $(GOTEST) -race -test.timeout=20m ./... + cd psbt; env CGO_ENABLED=1 GORACE="history_size=7 halt_on_errors=1" $(GOTEST) -race -test.timeout=20m ./... + +# ========= +# UTILITIES +# ========= + +fmt: goimports + @$(call print, "Fixing imports.") + goimports -w $(GOFILES_NOVENDOR) + @$(call print, "Formatting source.") + gofmt -l -w -s $(GOFILES_NOVENDOR) + +lint: $(LINT_BIN) + @$(call print, "Linting source.") + $(LINT) + +clean: + @$(call print, "Cleaning source.$(NC)") + $(RM) coverage.txt psbt/coverage.txt + +.PHONY: all \ + default \ + build \ + check \ + unit \ + unit-cover \ + unit-race \ + fmt \ + lint \ + clean diff --git a/goclean.sh b/goclean.sh deleted file mode 100755 index a9fe858..0000000 --- a/goclean.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash -# The script does automatic checking on a Go package and its sub-packages, including: -# 1. gofmt (http://golang.org/cmd/gofmt/) -# 2. goimports (https://github.com/bradfitz/goimports) -# 3. golint (https://github.com/golang/lint) -# 4. go vet (http://golang.org/cmd/vet) -# 5. gosimple (https://github.com/dominikh/go-simple) -# 6. unconvert (https://github.com/mdempsky/unconvert) -# 7. race detector (http://blog.golang.org/race-detector) -# 8. test coverage (http://blog.golang.org/cover) -# - -set -ex - -# Automatic checks -for i in $(find . -name go.mod -type f -print); do - module=$(dirname ${i}) - echo "==> ${module}" - - MODNAME=$(echo $module | sed -E -e "s/^$ROOTPATHPATTERN//" \ - -e 's,^/,,' -e 's,/v[0-9]+$,,') - if [ -z "$MODNAME" ]; then - MODNAME=. - fi - - # run tests - (cd $MODNAME && - echo "mode: atomic" > profile.cov && \ - env GORACE=halt_on_error=1 go test -race -covermode=atomic -coverprofile=profile.tmp ./... && \ - cat profile.tmp | tail -n +2 >> profile.cov && \ - rm profile.tmp && \ - go tool cover -func profile.cov - ) - - # check linters - (cd $MODNAME && \ - go mod download && \ - golangci-lint run --deadline=10m --disable-all \ - --enable=gofmt \ - --enable=goimports \ - --enable=golint \ - --enable=govet \ - --enable=gosimple \ - --enable=unconvert - ) -done diff --git a/test_coverage.txt b/test_coverage.txt deleted file mode 100644 index e475fad..0000000 --- a/test_coverage.txt +++ /dev/null @@ -1,72 +0,0 @@ - -github.com/conformal/btcutil/base58.go Base58Decode 100.00% (20/20) -github.com/conformal/btcutil/base58.go Base58Encode 100.00% (15/15) -github.com/conformal/btcutil/block.go Block.Tx 100.00% (12/12) -github.com/conformal/btcutil/wif.go WIF.String 100.00% (11/11) -github.com/conformal/btcutil/block.go Block.Transactions 100.00% (11/11) -github.com/conformal/btcutil/amount.go AmountUnit.String 100.00% (8/8) -github.com/conformal/btcutil/tx.go NewTxFromReader 100.00% (6/6) -github.com/conformal/btcutil/block.go NewBlockFromBytes 100.00% (6/6) -github.com/conformal/btcutil/block.go NewBlockFromReader 100.00% (6/6) -github.com/conformal/btcutil/address.go encodeAddress 100.00% (6/6) -github.com/conformal/btcutil/address.go newAddressPubKeyHash 100.00% (5/5) -github.com/conformal/btcutil/address.go newAddressScriptHashFromHash 100.00% (5/5) -github.com/conformal/btcutil/tx.go Tx.Sha 100.00% (5/5) -github.com/conformal/btcutil/block.go Block.Sha 100.00% (5/5) -github.com/conformal/btcutil/amount.go NewAmount 100.00% (5/5) -github.com/conformal/btcutil/amount.go round 100.00% (3/3) -github.com/conformal/btcutil/address.go NewAddressScriptHash 100.00% (2/2) -github.com/conformal/btcutil/amount.go Amount.Format 100.00% (2/2) -github.com/conformal/btcutil/tx.go NewTxFromBytes 100.00% (2/2) -github.com/conformal/btcutil/hash160.go calcHash 100.00% (2/2) -github.com/conformal/btcutil/address.go AddressPubKeyHash.Hash160 100.00% (1/1) -github.com/conformal/btcutil/block.go OutOfRangeError.Error 100.00% (1/1) -github.com/conformal/btcutil/block.go Block.MsgBlock 100.00% (1/1) -github.com/conformal/btcutil/tx.go Tx.MsgTx 100.00% (1/1) -github.com/conformal/btcutil/hash160.go Hash160 100.00% (1/1) -github.com/conformal/btcutil/block.go NewBlockFromBlockAndBytes 100.00% (1/1) -github.com/conformal/btcutil/block.go Block.Height 100.00% (1/1) -github.com/conformal/btcutil/block.go Block.SetHeight 100.00% (1/1) -github.com/conformal/btcutil/block.go NewBlock 100.00% (1/1) -github.com/conformal/btcutil/address.go AddressPubKeyHash.IsForNet 100.00% (1/1) -github.com/conformal/btcutil/address.go AddressPubKey.EncodeAddress 100.00% (1/1) -github.com/conformal/btcutil/address.go NewAddressPubKeyHash 100.00% (1/1) -github.com/conformal/btcutil/address.go AddressPubKeyHash.EncodeAddress 100.00% (1/1) -github.com/conformal/btcutil/address.go AddressPubKeyHash.ScriptAddress 100.00% (1/1) -github.com/conformal/btcutil/address.go AddressPubKeyHash.String 100.00% (1/1) -github.com/conformal/btcutil/address.go NewAddressScriptHashFromHash 100.00% (1/1) -github.com/conformal/btcutil/address.go AddressScriptHash.EncodeAddress 100.00% (1/1) -github.com/conformal/btcutil/address.go AddressScriptHash.ScriptAddress 100.00% (1/1) -github.com/conformal/btcutil/address.go AddressScriptHash.IsForNet 100.00% (1/1) -github.com/conformal/btcutil/address.go AddressScriptHash.String 100.00% (1/1) -github.com/conformal/btcutil/address.go AddressScriptHash.Hash160 100.00% (1/1) -github.com/conformal/btcutil/address.go AddressPubKey.ScriptAddress 100.00% (1/1) -github.com/conformal/btcutil/address.go AddressPubKey.IsForNet 100.00% (1/1) -github.com/conformal/btcutil/address.go AddressPubKey.String 100.00% (1/1) -github.com/conformal/btcutil/tx.go NewTx 100.00% (1/1) -github.com/conformal/btcutil/tx.go Tx.SetIndex 100.00% (1/1) -github.com/conformal/btcutil/amount.go Amount.ToUnit 100.00% (1/1) -github.com/conformal/btcutil/tx.go Tx.Index 100.00% (1/1) -github.com/conformal/btcutil/amount.go Amount.String 100.00% (1/1) -github.com/conformal/btcutil/amount.go Amount.MulF64 100.00% (1/1) -github.com/conformal/btcutil/appdata.go appDataDir 92.00% (23/25) -github.com/conformal/btcutil/block.go Block.TxLoc 88.89% (8/9) -github.com/conformal/btcutil/block.go Block.Bytes 88.89% (8/9) -github.com/conformal/btcutil/address.go NewAddressPubKey 87.50% (7/8) -github.com/conformal/btcutil/address.go DecodeAddress 85.00% (17/20) -github.com/conformal/btcutil/wif.go DecodeWIF 85.00% (17/20) -github.com/conformal/btcutil/address.go AddressPubKey.serialize 80.00% (4/5) -github.com/conformal/btcutil/block.go Block.TxSha 75.00% (3/4) -github.com/conformal/btcutil/wif.go paddedAppend 66.67% (2/3) -github.com/conformal/btcutil/wif.go NewWIF 66.67% (2/3) -github.com/conformal/btcutil/certgen.go NewTLSCertPair 0.00% (0/54) -github.com/conformal/btcutil/wif.go WIF.SerializePubKey 0.00% (0/4) -github.com/conformal/btcutil/address.go AddressPubKey.AddressPubKeyHash 0.00% (0/3) -github.com/conformal/btcutil/address.go AddressPubKey.Format 0.00% (0/1) -github.com/conformal/btcutil/address.go AddressPubKey.PubKey 0.00% (0/1) -github.com/conformal/btcutil/address.go AddressPubKey.SetFormat 0.00% (0/1) -github.com/conformal/btcutil/wif.go WIF.IsForNet 0.00% (0/1) -github.com/conformal/btcutil/appdata.go AppDataDir 0.00% (0/1) -github.com/conformal/btcutil/net.go interfaceAddrs 0.00% (0/1) -github.com/conformal/btcutil ------------------------------- 75.88% (258/340) - From 12d7d04b3139ab8dffb23ab0e35035a94ea1c401 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Mon, 27 Sep 2021 14:27:51 +0200 Subject: [PATCH 2/2] multi: fix linter issues --- address.go | 10 +++++----- address_test.go | 2 +- base58/base58check.go | 2 +- base58/base58check_test.go | 11 +++++++---- bech32/bech32.go | 6 +++--- bloom/merkleblock.go | 2 +- certgen.go | 2 +- coinset/coins_test.go | 2 +- gcs/builder/builder.go | 4 ++-- gcs/builder/builder_test.go | 3 --- gcs/gcs.go | 6 +++--- gcs/gcs_test.go | 4 +++- gcs/gcsbench_test.go | 11 +++++++---- hash160.go | 2 +- hdkeychain/bench_test.go | 8 ++++---- hdkeychain/extendedkey.go | 6 +++--- hdkeychain/extendedkey_test.go | 2 +- wif_test.go | 4 ++++ 18 files changed, 48 insertions(+), 39 deletions(-) diff --git a/address.go b/address.go index 8672497..75503ed 100644 --- a/address.go +++ b/address.go @@ -41,7 +41,7 @@ var ( // ErrUnknownAddressType describes an error where an address can not // decoded as a specific address type due to the string encoding - // begining with an identifier byte unknown to any standard or + // beginning with an identifier byte unknown to any standard or // registered (via chaincfg.Register) network. ErrUnknownAddressType = errors.New("unknown address type") @@ -265,7 +265,7 @@ func NewAddressPubKeyHash(pkHash []byte, net *chaincfg.Params) (*AddressPubKeyHa // newAddressPubKeyHash is the internal API to create a pubkey hash address // with a known leading identifier byte for a network, rather than looking // it up through its parameters. This is useful when creating a new address -// structure from a string encoding where the identifer byte is already +// structure from a string encoding where the identifier byte is already // known. func newAddressPubKeyHash(pkHash []byte, netID byte) (*AddressPubKeyHash, error) { // Check for a valid pubkey hash length. @@ -304,7 +304,7 @@ func (a *AddressPubKeyHash) String() string { } // Hash160 returns the underlying array of the pubkey hash. This can be useful -// when an array is more appropiate than a slice (for example, when used as map +// when an array is more appropriate than a slice (for example, when used as map // keys). func (a *AddressPubKeyHash) Hash160() *[ripemd160.Size]byte { return &a.hash @@ -332,7 +332,7 @@ func NewAddressScriptHashFromHash(scriptHash []byte, net *chaincfg.Params) (*Add // newAddressScriptHashFromHash is the internal API to create a script hash // address with a known leading identifier byte for a network, rather than // looking it up through its parameters. This is useful when creating a new -// address structure from a string encoding where the identifer byte is already +// address structure from a string encoding where the identifier byte is already // known. func newAddressScriptHashFromHash(scriptHash []byte, netID byte) (*AddressScriptHash, error) { // Check for a valid script hash length. @@ -371,7 +371,7 @@ func (a *AddressScriptHash) String() string { } // Hash160 returns the underlying array of the script hash. This can be useful -// when an array is more appropiate than a slice (for example, when used as map +// when an array is more appropriate than a slice (for example, when used as map // keys). func (a *AddressScriptHash) Hash160() *[ripemd160.Size]byte { return &a.hash diff --git a/address_test.go b/address_test.go index b6a990d..bbca3de 100644 --- a/address_test.go +++ b/address_test.go @@ -766,7 +766,7 @@ func TestAddresses(t *testing.T) { // Encode again and compare against the original. encoded := decoded.EncodeAddress() if test.encoded != encoded { - t.Errorf("%v: decoding and encoding produced different addressess: %v != %v", + t.Errorf("%v: decoding and encoding produced different addresses: %v != %v", test.name, test.encoded, encoded) return } diff --git a/base58/base58check.go b/base58/base58check.go index 7cdafee..402c323 100644 --- a/base58/base58check.go +++ b/base58/base58check.go @@ -28,7 +28,7 @@ func checksum(input []byte) (cksum [4]byte) { func CheckEncode(input []byte, version byte) string { b := make([]byte, 0, 1+len(input)+4) b = append(b, version) - b = append(b, input[:]...) + b = append(b, input...) cksum := checksum(b) b = append(b, cksum[:]...) return Encode(b) diff --git a/base58/base58check_test.go b/base58/base58check_test.go index 7c6350b..20a4177 100644 --- a/base58/base58check_test.go +++ b/base58/base58check_test.go @@ -37,11 +37,14 @@ func TestBase58Check(t *testing.T) { // test decoding res, version, err := base58.CheckDecode(test.out) - if err != nil { + switch { + case err != nil: t.Errorf("CheckDecode test #%d failed with err: %v", x, err) - } else if version != test.version { + + case version != test.version: t.Errorf("CheckDecode test #%d failed: got version: %d want: %d", x, version, test.version) - } else if string(res) != test.in { + + case string(res) != test.in: t.Errorf("CheckDecode test #%d failed: got: %s want: %s", x, res, test.in) } } @@ -56,7 +59,7 @@ func TestBase58Check(t *testing.T) { // bytes are missing). testString := "" for len := 0; len < 4; len++ { - testString = testString + "x" + testString += "x" _, _, err = base58.CheckDecode(testString) if err != base58.ErrInvalidFormat { t.Error("Checkdecode test failed, expected ErrInvalidFormat") diff --git a/bech32/bech32.go b/bech32/bech32.go index 1bc75a3..c1e0010 100644 --- a/bech32/bech32.go +++ b/bech32/bech32.go @@ -362,7 +362,7 @@ func ConvertBits(data []byte, fromBits, toBits uint8, pad bool) ([]byte, error) for _, b := range data { // Discard unused bits. - b = b << (8 - fromBits) + b <<= 8 - fromBits // How many bits remaining to extract from the input data. remFromBits := fromBits @@ -383,7 +383,7 @@ func ConvertBits(data []byte, fromBits, toBits uint8, pad bool) ([]byte, error) // Discard the bits we just extracted and get ready for // next iteration. - b = b << toExtract + b <<= toExtract remFromBits -= toExtract filledBits += toExtract @@ -399,7 +399,7 @@ func ConvertBits(data []byte, fromBits, toBits uint8, pad bool) ([]byte, error) // We pad any unfinished group if specified. if pad && filledBits > 0 { - nextByte = nextByte << (toBits - filledBits) + nextByte <<= toBits - filledBits regrouped = append(regrouped, nextByte) filledBits = 0 nextByte = 0 diff --git a/bloom/merkleblock.go b/bloom/merkleblock.go index d6796ba..b1da716 100644 --- a/bloom/merkleblock.go +++ b/bloom/merkleblock.go @@ -116,7 +116,7 @@ func NewMerkleBlock(block *btcutil.Block, filter *Filter) (*wire.MsgMerkleBlock, Flags: make([]byte, (len(mBlock.bits)+7)/8), } for _, hash := range mBlock.finalHashes { - msgMerkleBlock.AddTxHash(hash) + _ = msgMerkleBlock.AddTxHash(hash) } for i := uint32(0); i < uint32(len(mBlock.bits)); i++ { msgMerkleBlock.Flags[i/8] |= mBlock.bits[i] << (i % 8) diff --git a/certgen.go b/certgen.go index bbc45a4..52e2d9c 100644 --- a/certgen.go +++ b/certgen.go @@ -61,7 +61,7 @@ func NewTLSCertPair(organization string, validUntil time.Time, extraHosts []stri addIP := func(ipAddr net.IP) { for _, ip := range ipAddresses { - if bytes.Equal(ip, ipAddr) { + if ip.Equal(ipAddr) { return } } diff --git a/coinset/coins_test.go b/coinset/coins_test.go index d8ca496..dc02d9f 100644 --- a/coinset/coins_test.go +++ b/coinset/coins_test.go @@ -33,7 +33,7 @@ func (c *TestCoin) ValueAge() int64 { return int64(c.TxValue) * c.TxNumCon func NewCoin(index int64, value btcutil.Amount, numConfs int64) coinset.Coin { h := sha256.New() - h.Write([]byte(fmt.Sprintf("%d", index))) + _, _ = h.Write([]byte(fmt.Sprintf("%d", index))) hash, _ := chainhash.NewHash(h.Sum(nil)) c := &TestCoin{ TxHash: hash, diff --git a/gcs/builder/builder.go b/gcs/builder/builder.go index adef5c9..8b45d78 100644 --- a/gcs/builder/builder.go +++ b/gcs/builder/builder.go @@ -54,7 +54,7 @@ func RandomKey() ([gcs.KeySize]byte, error) { } // Copy the byte slice to a [gcs.KeySize]byte array and return it. - copy(key[:], randKey[:]) + copy(key[:], randKey) return key, nil } @@ -62,7 +62,7 @@ func RandomKey() ([gcs.KeySize]byte, error) { // truncating the bytes of the hash to the appopriate key size. func DeriveKey(keyHash *chainhash.Hash) [gcs.KeySize]byte { var key [gcs.KeySize]byte - copy(key[:], keyHash.CloneBytes()[:]) + copy(key[:], keyHash.CloneBytes()) return key } diff --git a/gcs/builder/builder_test.go b/gcs/builder/builder_test.go index 8e9566f..de04421 100644 --- a/gcs/builder/builder_test.go +++ b/gcs/builder/builder_test.go @@ -19,9 +19,6 @@ import ( ) var ( - // No need to allocate an err variable in every test - err error - // List of values for building a filter contents = [][]byte{ []byte("Alex"), diff --git a/gcs/gcs.go b/gcs/gcs.go index cfe215c..fbffb06 100644 --- a/gcs/gcs.go +++ b/gcs/gcs.go @@ -91,7 +91,7 @@ type Filter struct { // BuildGCSFilter builds a new GCS filter with the collision probability of // `1/(2**P)`, key `key`, and including every `[]byte` in `data` as a member of // the set. -func BuildGCSFilter(P uint8, M uint64, key [KeySize]byte, data [][]byte) (*Filter, error) { +func BuildGCSFilter(P uint8, M uint64, key [KeySize]byte, data [][]byte) (*Filter, error) { // nolint:gocritic // Some initial parameter checks: make sure we have data from which to // build the filter, and make sure our parameters will fit the hash // function we're using. @@ -174,7 +174,7 @@ func BuildGCSFilter(P uint8, M uint64, key [KeySize]byte, data [][]byte) (*Filte // FromBytes deserializes a GCS filter from a known N, P, and serialized filter // as returned by Bytes(). -func FromBytes(N uint32, P uint8, M uint64, d []byte) (*Filter, error) { +func FromBytes(N uint32, P uint8, M uint64, d []byte) (*Filter, error) { // nolint:gocritic // Basic sanity check. if P > 32 { return nil, ErrPTooBig @@ -200,7 +200,7 @@ func FromBytes(N uint32, P uint8, M uint64, d []byte) (*Filter, error) { // FromNBytes deserializes a GCS filter from a known P, and serialized N and // filter as returned by NBytes(). -func FromNBytes(P uint8, M uint64, d []byte) (*Filter, error) { +func FromNBytes(P uint8, M uint64, d []byte) (*Filter, error) { // nolint:gocritic buffer := bytes.NewBuffer(d) N, err := wire.ReadVarInt(buffer, varIntProtoVer) if err != nil { diff --git a/gcs/gcs_test.go b/gcs/gcs_test.go index 369b773..bb4d550 100644 --- a/gcs/gcs_test.go +++ b/gcs/gcs_test.go @@ -27,7 +27,7 @@ var ( // Filters are conserved between tests but we must define with an // interface which functions we're testing because the gcsFilter type // isn't exported - filter, filter2, filter3, filter4, filter5 *gcs.Filter + filter, filter2, filter3 *gcs.Filter // We need to use the same key for building and querying the filters key [gcs.KeySize]byte @@ -328,6 +328,8 @@ func TestGCSFilterMatchAnySuite(t *testing.T) { } for _, test := range funcs { + test := test + t.Run(test.name, func(t *testing.T) { contentsCopy := make([][]byte, len(contents2)) copy(contentsCopy, contents2) diff --git a/gcs/gcsbench_test.go b/gcs/gcsbench_test.go index 58795eb..ffb2599 100644 --- a/gcs/gcsbench_test.go +++ b/gcs/gcsbench_test.go @@ -28,7 +28,6 @@ func genRandFilterElements(numElements uint) ([][]byte, error) { var ( generatedFilter *gcs.Filter - filterErr error ) // BenchmarkGCSFilterBuild benchmarks building a filter. @@ -101,7 +100,7 @@ func BenchmarkGCSFilterMatch(b *testing.B) { var localMatch bool for i := 0; i < b.N; i++ { - localMatch, err = filter.Match(key, []byte("Nate")) + _, err = filter.Match(key, []byte("Nate")) if err != nil { b.Fatalf("unable to match filter: %v", err) } @@ -115,8 +114,6 @@ func BenchmarkGCSFilterMatch(b *testing.B) { } var ( - randElems1, _ = genRandFilterElements(1) - randElems10, _ = genRandFilterElements(10) randElems100, _ = genRandFilterElements(100) randElems1000, _ = genRandFilterElements(1000) randElems10000, _ = genRandFilterElements(10000) @@ -164,6 +161,8 @@ var matchAnyBenchmarks = []struct { // BenchmarkGCSFilterMatchAny benchmarks the sort-and-zip MatchAny impl. func BenchmarkGCSFilterZipMatchAny(b *testing.B) { for _, test := range matchAnyBenchmarks { + test := test + b.Run(test.name, func(b *testing.B) { b.ReportAllocs() @@ -188,6 +187,8 @@ func BenchmarkGCSFilterZipMatchAny(b *testing.B) { // BenchmarkGCSFilterMatchAny benchmarks the hash-join MatchAny impl. func BenchmarkGCSFilterHashMatchAny(b *testing.B) { for _, test := range matchAnyBenchmarks { + test := test + b.Run(test.name, func(b *testing.B) { b.ReportAllocs() @@ -212,6 +213,8 @@ func BenchmarkGCSFilterHashMatchAny(b *testing.B) { // BenchmarkGCSFilterMatchAny benchmarks the hybrid MatchAny impl. func BenchmarkGCSFilterMatchAny(b *testing.B) { for _, test := range matchAnyBenchmarks { + test := test + b.Run(test.name, func(b *testing.B) { b.ReportAllocs() diff --git a/hash160.go b/hash160.go index 599a0fe..fa26e09 100644 --- a/hash160.go +++ b/hash160.go @@ -13,7 +13,7 @@ import ( // Calculate the hash of hasher over buf. func calcHash(buf []byte, hasher hash.Hash) []byte { - hasher.Write(buf) + _, _ = hasher.Write(buf) return hasher.Sum(nil) } diff --git a/hdkeychain/bench_test.go b/hdkeychain/bench_test.go index 583eef0..7c86ca9 100644 --- a/hdkeychain/bench_test.go +++ b/hdkeychain/bench_test.go @@ -26,7 +26,7 @@ func BenchmarkDeriveHardened(b *testing.B) { b.StartTimer() for i := 0; i < b.N; i++ { - masterKey.Derive(hdkeychain.HardenedKeyStart) + _, _ = masterKey.Derive(hdkeychain.HardenedKeyStart) } } @@ -41,7 +41,7 @@ func BenchmarkDeriveNormal(b *testing.B) { b.StartTimer() for i := 0; i < b.N; i++ { - masterKey.Derive(0) + _, _ = masterKey.Derive(0) } } @@ -56,7 +56,7 @@ func BenchmarkPrivToPub(b *testing.B) { b.StartTimer() for i := 0; i < b.N; i++ { - masterKey.Neuter() + _, _ = masterKey.Neuter() } } @@ -64,7 +64,7 @@ func BenchmarkPrivToPub(b *testing.B) { // extended key. func BenchmarkDeserialize(b *testing.B) { for i := 0; i < b.N; i++ { - hdkeychain.NewKeyFromString(bip0032MasterPriv1) + _, _ = hdkeychain.NewKeyFromString(bip0032MasterPriv1) } } diff --git a/hdkeychain/extendedkey.go b/hdkeychain/extendedkey.go index a0c5e7b..929fe99 100644 --- a/hdkeychain/extendedkey.go +++ b/hdkeychain/extendedkey.go @@ -277,7 +277,7 @@ func (k *ExtendedKey) Derive(i uint32) (*ExtendedKey, error) { // data: // I = HMAC-SHA512(Key = chainCode, Data = data) hmac512 := hmac.New(sha512.New, k.chainCode) - hmac512.Write(data) + _, _ = hmac512.Write(data) ilr := hmac512.Sum(nil) // Split "I" into two 32-byte sequences Il and Ir where: @@ -380,7 +380,7 @@ func (k *ExtendedKey) DeriveNonStandard(i uint32) (*ExtendedKey, error) { binary.BigEndian.PutUint32(data[keyLen:], i) hmac512 := hmac.New(sha512.New, k.chainCode) - hmac512.Write(data) + _, _ = hmac512.Write(data) ilr := hmac512.Sum(nil) il := ilr[:len(ilr)/2] @@ -610,7 +610,7 @@ func NewMaster(seed []byte, net *chaincfg.Params) (*ExtendedKey, error) { // First take the HMAC-SHA512 of the master key and the seed data: // I = HMAC-SHA512(Key = "Bitcoin seed", Data = S) hmac512 := hmac.New(sha512.New, masterKey) - hmac512.Write(seed) + _, _ = hmac512.Write(seed) lr := hmac512.Sum(nil) // Split "I" into two 32-byte sequences Il and Ir where: diff --git a/hdkeychain/extendedkey_test.go b/hdkeychain/extendedkey_test.go index 37a42fa..dd6deb5 100644 --- a/hdkeychain/extendedkey_test.go +++ b/hdkeychain/extendedkey_test.go @@ -983,7 +983,7 @@ func TestZero(t *testing.T) { wantAddr := "1HT7xU2Ngenf7D4yocz2SAcnNLW7rK8d4E" addr, err := key.Address(&chaincfg.MainNetParams) if err != nil { - t.Errorf("Addres s #%d (%s): unexpected error: %v", i, + t.Errorf("Address #%d (%s): unexpected error: %v", i, testName, err) return false } diff --git a/wif_test.go b/wif_test.go index dec6dd6..589f2ac 100644 --- a/wif_test.go +++ b/wif_test.go @@ -64,6 +64,8 @@ func TestEncodeDecodeWIF(t *testing.T) { } for _, validCase := range validEncodeCases { + validCase := validCase + t.Run(validCase.name, func(t *testing.T) { priv, _ := btcec.PrivKeyFromBytes(btcec.S256(), validCase.privateKey) wif, err := NewWIF(priv, validCase.net, validCase.compress) @@ -122,6 +124,8 @@ func TestEncodeDecodeWIF(t *testing.T) { } for _, invalidCase := range invalidDecodeCases { + invalidCase := invalidCase + t.Run(invalidCase.name, func(t *testing.T) { decodedWif, err := DecodeWIF(invalidCase.wif) if decodedWif != nil {