diff --git a/.github/workflows/scan.yml b/.github/workflows/scan.yml index 36a8202..05784e7 100644 --- a/.github/workflows/scan.yml +++ b/.github/workflows/scan.yml @@ -13,11 +13,11 @@ jobs: scan: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 with: ref: ${{ inputs.ref }} - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v7 with: go-version: stable check-latest: true diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2b7d657..8b28c99 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,16 +10,16 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 + - uses: actions/checkout@v7 + - uses: actions/setup-go@v7 with: - go-version: "1.25.10" + go-version-file: go.mod - name: Staticcheck run: make staticcheck - name: golangci-lint uses: golangci/golangci-lint-action@v9 with: - version: v2.9.0 + version: v2.13.0 skip-cache: true problem-matchers: true - name: Unit test diff --git a/.golangci.yml b/.golangci.yml index 0faef54..9f07ef7 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -2,8 +2,6 @@ version: "2" run: timeout: 5m - concurrency: 4 - go: "1.25" linters: default: none @@ -18,6 +16,7 @@ linters: gosec: excludes: - G115 # safe to exclude type conversion overflow checks in this repository since the integer values will always be low + - G703 formatters: enable: - gci diff --git a/go.mod b/go.mod index 5b3dda6..d067981 100644 --- a/go.mod +++ b/go.mod @@ -1,20 +1,18 @@ module github.com/hyperledger/fabric-chaincode-go/v2 -go 1.25.10 +go 1.26.7 require ( github.com/hyperledger/fabric-protos-go-apiv2 v0.3.7 - github.com/stretchr/testify v1.12.0 - google.golang.org/grpc v1.83.0 + github.com/stretchr/testify v1.12.1 + google.golang.org/grpc v1.83.1 google.golang.org/protobuf v1.36.12 ) require ( - github.com/kr/text v0.2.0 // indirect - golang.org/x/net v0.55.0 // indirect - golang.org/x/sys v0.45.0 // indirect - golang.org/x/text v0.37.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect + go.yaml.in/yaml/v3 v3.0.5 // indirect + golang.org/x/net v0.58.0 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/text v0.41.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260818201246-1b0934165a6f // indirect ) diff --git a/go.sum b/go.sum index 598927b..bb17a8b 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,5 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= @@ -13,14 +12,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hyperledger/fabric-protos-go-apiv2 v0.3.7 h1:sQ5qv8vQQfwewa1JlCiSCC8dLElmaU2/frLolpgibEY= github.com/hyperledger/fabric-protos-go-apiv2 v0.3.7/go.mod h1:bJnwzfv03oZQeCc863pdGTDgf5nmCy6Za3RAE7d2XsQ= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/stretchr/testify v1.12.0 h1:K6Mr6jO9JICuend/5xzTM03ydSV3vdNRYAdPSukj8uI= -github.com/stretchr/testify v1.12.0/go.mod h1:bOYBZb5qJ00vPzWfIqBUZPaxK8jWiXc6d3ErP4Ca9Gw= +github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE= +github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= @@ -33,22 +26,19 @@ go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRk go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA= go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= -golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= -golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= -golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= -golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= -golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= +go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= +golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= +golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= +golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.83.0 h1:JeNZEKJFbQxArAMl+hiytHauacDNqJUllNfmIMmpqnQ= -google.golang.org/grpc v1.83.0/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260818201246-1b0934165a6f h1:kMQMi+2r0XRQ/Ad2/tgd+5S7JYSBGYO4pwkLTE8F2y0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260818201246-1b0934165a6f/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.83.1 h1:HIO0+BEtBP6soyqvqC8sNUjZ7bTs+0hFQuFF+RAy++Y= +google.golang.org/grpc v1.83.1/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/cid/cid.go b/pkg/cid/cid.go index 6539ecc..573d2b8 100644 --- a/pkg/cid/cid.go +++ b/pkg/cid/cid.go @@ -12,6 +12,7 @@ import ( "encoding/pem" "fmt" "slices" + "strings" "github.com/hyperledger/fabric-chaincode-go/v2/pkg/attrmgr" "github.com/hyperledger/fabric-protos-go-apiv2/msp" @@ -216,22 +217,22 @@ func (c *ClientID) getAttributesFromIdemix() error { // which returns a DN as defined by RFC 2253. func getDN(name *pkix.Name) string { r := name.ToRDNSequence() - s := "" - for i := 0; i < len(r); i++ { + var s strings.Builder + for i := range r { rdn := r[len(r)-1-i] if i > 0 { - s += "," + s.WriteString(",") } for j, tv := range rdn { if j > 0 { - s += "+" + s.WriteString("+") } typeString := tv.Type.String() typeName, ok := attributeTypeNames[typeString] if !ok { derBytes, err := asn1.Marshal(tv.Value) if err == nil { - s += typeString + "=#" + hex.EncodeToString(derBytes) + s.WriteString(typeString + "=#" + hex.EncodeToString(derBytes)) continue // No value escaping necessary. } typeName = typeString @@ -255,10 +256,10 @@ func getDN(name *pkix.Name) string { } } escaped += valueString[begin:] - s += typeName + "=" + escaped + s.WriteString(typeName + "=" + escaped) } } - return s + return s.String() } var attributeTypeNames = map[string]string{ diff --git a/shim/handler_test.go b/shim/handler_test.go index 36a01e9..56dd6cf 100644 --- a/shim/handler_test.go +++ b/shim/handler_test.go @@ -114,7 +114,6 @@ func TestHandlerState(t *testing.T) { } for _, test := range tests { - test := test t.Run(test.name, func(t *testing.T) { t.Parallel() handler := &Handler{ @@ -191,7 +190,6 @@ func TestHandleMessage(t *testing.T) { } for _, test := range tests { - test := test t.Run(test.name, func(t *testing.T) { t.Parallel() diff --git a/shim/internal/config_test.go b/shim/internal/config_test.go index be40ad1..390a387 100644 --- a/shim/internal/config_test.go +++ b/shim/internal/config_test.go @@ -299,7 +299,6 @@ func TestLoadBase64EncodedConfig(t *testing.T) { } for _, test := range tests { - test := test t.Run(test.name, func(t *testing.T) { for k, v := range test.env { os.Setenv(k, v) //nolint:gosec @@ -566,7 +565,6 @@ func TestLoadPEMEncodedConfig(t *testing.T) { } for _, test := range tests { - test := test t.Run(test.name, func(t *testing.T) { for k, v := range test.env { os.Setenv(k, v) //nolint:gosec diff --git a/shim/shim_test.go b/shim/shim_test.go index f21b897..d95122c 100644 --- a/shim/shim_test.go +++ b/shim/shim_test.go @@ -125,7 +125,6 @@ func TestStart(t *testing.T) { } for _, test := range tests { - test := test t.Run(test.name, func(t *testing.T) { for k, v := range test.envVars { os.Setenv(k, v) //nolint:gosec @@ -186,7 +185,6 @@ func TestChaincodeServerStart(t *testing.T) { } for _, test := range tests { - test := test t.Run(test.name, func(t *testing.T) { err := test.ccsrv.Start() if test.expectedErr != "" { diff --git a/shim/stub.go b/shim/stub.go index 45729c1..7483365 100644 --- a/shim/stub.go +++ b/shim/stub.go @@ -9,6 +9,7 @@ import ( "errors" "fmt" "os" + "strings" "unicode/utf8" "github.com/hyperledger/fabric-protos-go-apiv2/common" @@ -413,7 +414,7 @@ type HistoryQueryIterator struct { // General interface for supporting different types of query results. // Actual types differ for different queries -type queryResult interface{} +type queryResult any type resultType uint8 @@ -512,14 +513,15 @@ func CreateCompositeKey(objectType string, attributes []string) (string, error) if err := validateCompositeKeyAttribute(objectType); err != nil { return "", err } - ck := compositeKeyNamespace + objectType + string(rune(minUnicodeRuneValue)) + var ck strings.Builder + ck.WriteString(compositeKeyNamespace + objectType + string(rune(minUnicodeRuneValue))) for _, att := range attributes { if err := validateCompositeKeyAttribute(att); err != nil { return "", err } - ck += att + string(rune(minUnicodeRuneValue)) + ck.WriteString(att + string(rune(minUnicodeRuneValue))) } - return ck, nil + return ck.String(), nil } func splitCompositeKey(compositeKey string) (string, []string, error) { diff --git a/shim/stub_test.go b/shim/stub_test.go index 6f9a793..ee96536 100644 --- a/shim/stub_test.go +++ b/shim/stub_test.go @@ -829,7 +829,6 @@ func TestChaincodeStubHandlers(t *testing.T) { } for _, test := range tests { - test := test t.Run(test.name, func(t *testing.T) { t.Parallel()