From 14bb51c630b9064aece5c3e807fdde9d28b612fe Mon Sep 17 00:00:00 2001 From: vedhavyas Date: Thu, 11 Mar 2021 19:47:55 +0100 Subject: [PATCH] make field length optional for maps --- .travis.yml | 11 +++-- Gopkg.lock | 98 ------------------------------------------- Gopkg.toml | 43 ------------------- examples/wasm/main.go | 6 ++- go.mod | 16 +++++++ go.sum | 21 ++++++++++ proofs/flatten.go | 40 ++++++++++++++++-- proofs/property.go | 3 +- 8 files changed, 85 insertions(+), 153 deletions(-) delete mode 100644 Gopkg.lock delete mode 100644 Gopkg.toml create mode 100644 go.mod create mode 100644 go.sum diff --git a/.travis.yml b/.travis.yml index 4918a14..a071eea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,15 @@ language: go go_import_path: github.com/centrifuge/precise-proofs go: - - 1.11.x - - tip + - 1.15.x + +env: + matrix: + - GO111MODULE=on install: - - go get -u github.com/golang/dep/... - - dep ensure + - go mod tidy + - go mod vendor script: - go test -race -coverprofile=coverage.txt -covermode=atomic -v ./proofs diff --git a/Gopkg.lock b/Gopkg.lock deleted file mode 100644 index 1342b01..0000000 --- a/Gopkg.lock +++ /dev/null @@ -1,98 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - digest = "1:a2c1d0e43bd3baaa071d1b9ed72c27d78169b2b269f71c105ac4ba34b1be4a39" - name = "github.com/davecgh/go-spew" - packages = ["spew"] - pruneopts = "UT" - revision = "346938d642f2ec3594ed81d874461961cd0faa76" - version = "v1.1.0" - -[[projects]] - digest = "1:4c7d888a6e8a1dedccc2bafa0febdbbfaa010d8e73ed7f2561c0ccd73b0243cb" - name = "github.com/golang/protobuf" - packages = [ - "descriptor", - "jsonpb", - "proto", - "protoc-gen-go/descriptor", - "protoc-gen-go/generator", - "protoc-gen-go/generator/internal/remap", - "protoc-gen-go/plugin", - "ptypes", - "ptypes/any", - "ptypes/duration", - "ptypes/struct", - "ptypes/timestamp", - ] - pruneopts = "UT" - revision = "b5d812f8a3706043e23a9cd5babf2e5423744d30" - version = "v1.3.1" - -[[projects]] - digest = "1:40e195917a951a8bf867cd05de2a46aaf1806c50cf92eebf4c16f78cd196f747" - name = "github.com/pkg/errors" - packages = ["."] - pruneopts = "UT" - revision = "645ef00459ed84a119197bfb8d8205042c6df63d" - version = "v0.8.0" - -[[projects]] - digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" - name = "github.com/pmezard/go-difflib" - packages = ["difflib"] - pruneopts = "UT" - revision = "792786c7400a136282c1664665ae0a8db921c6c2" - version = "v1.0.0" - -[[projects]] - digest = "1:18752d0b95816a1b777505a97f71c7467a8445b8ffb55631a7bf779f6ba4fa83" - name = "github.com/stretchr/testify" - packages = ["assert"] - pruneopts = "UT" - revision = "f35b8ab0b5a2cef36673838d662e249dd9c94686" - version = "v1.2.2" - -[[projects]] - digest = "1:2833602d8454c0f7dac4f73c1a1c0fc1a52dcc738e3ad87d4a64f6446966510d" - name = "github.com/xsleonard/go-merkle" - packages = ["."] - pruneopts = "UT" - revision = "f8894f6f7351abae156c2365b31354d4cd78a1af" - source = "github.com/centrifuge/go-merkle" - -[[projects]] - branch = "master" - digest = "1:73f9bd0a36bd49a7a46061dd5d6370fbf7c7afcd92a31dcb18661497610672aa" - name = "golang.org/x/crypto" - packages = ["blake2b"] - pruneopts = "UT" - revision = "20be4c3c3ed52bfccdb2d59a412ee1a936d175a7" - -[[projects]] - branch = "master" - digest = "1:9289797869517c73400e7b5a93beefbfc86e06f56e3ab03f38fb0d575e685277" - name = "golang.org/x/sys" - packages = ["cpu"] - pruneopts = "UT" - revision = "46560c3f3c0a091352115a3d825af45663b983d8" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - input-imports = [ - "github.com/golang/protobuf/descriptor", - "github.com/golang/protobuf/jsonpb", - "github.com/golang/protobuf/proto", - "github.com/golang/protobuf/protoc-gen-go/descriptor", - "github.com/golang/protobuf/protoc-gen-go/generator", - "github.com/golang/protobuf/ptypes", - "github.com/golang/protobuf/ptypes/timestamp", - "github.com/pkg/errors", - "github.com/stretchr/testify/assert", - "github.com/xsleonard/go-merkle", - "golang.org/x/crypto/blake2b", - ] - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml deleted file mode 100644 index f32d38f..0000000 --- a/Gopkg.toml +++ /dev/null @@ -1,43 +0,0 @@ -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" -# -# [prune] -# non-go = false -# go-tests = true -# unused-packages = true - - -[[constraint]] - name = "github.com/golang/protobuf" - version = "1.3.1" - -[[constraint]] - name = "github.com/stretchr/testify" - version = "1.2.1" - -[[constraint]] - revision = "f8894f6f7351abae156c2365b31354d4cd78a1af" - name = "github.com/xsleonard/go-merkle" - source = "github.com/centrifuge/go-merkle" - -[prune] - go-tests = true - unused-packages = true diff --git a/examples/wasm/main.go b/examples/wasm/main.go index f951227..3552da4 100644 --- a/examples/wasm/main.go +++ b/examples/wasm/main.go @@ -1,3 +1,5 @@ +// +build wasm + package main import ( @@ -7,9 +9,9 @@ import ( "strings" "syscall/js" - "github.com/centrifuge/precise-proofs/examples/documents" + documentspb "github.com/centrifuge/precise-proofs/examples/documents" "github.com/centrifuge/precise-proofs/proofs" - "github.com/centrifuge/precise-proofs/proofs/proto" + proofspb "github.com/centrifuge/precise-proofs/proofs/proto" "github.com/golang/protobuf/jsonpb" ) diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..ad4325a --- /dev/null +++ b/go.mod @@ -0,0 +1,16 @@ +module github.com/centrifuge/precise-proofs + +go 1.15 + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/golang/protobuf v1.3.1 + github.com/pkg/errors v0.8.0 + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/testify v1.2.2 + github.com/xsleonard/go-merkle v1.1.0 + golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 + golang.org/x/sys v0.0.0-20190531073156-46560c3f3c0a // indirect +) + +replace github.com/xsleonard/go-merkle v1.1.0 => github.com/centrifuge/go-merkle v0.0.0-20190727075423-0ac78bbbc01b diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..b20315d --- /dev/null +++ b/go.sum @@ -0,0 +1,21 @@ +github.com/centrifuge/go-merkle v0.0.0-20190727075423-0ac78bbbc01b h1:TPvvMcGAc3TVBVgQ4XYYEWTXxYls8YuylZ8JzrVxPzc= +github.com/centrifuge/go-merkle v0.0.0-20190727075423-0ac78bbbc01b/go.mod h1:0voJY6Qzxvr2S0LeDSFQiCnJzGq5gORg2SwCmn8602I= +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/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= +github.com/pkg/errors v0.8.0/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/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 h1:8dUaAV7K4uHsF56JQWkprecIQKdPHtR9jCHF5nB8uzc= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +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-20190531073156-46560c3f3c0a h1:ndj5BW7+tkr8XVsbkZpft/pgCRU+L76ePImF2dpCwek= +golang.org/x/sys v0.0.0-20190531073156-46560c3f3c0a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/proofs/flatten.go b/proofs/flatten.go index e81c8a7..a055e7a 100644 --- a/proofs/flatten.go +++ b/proofs/flatten.go @@ -8,7 +8,7 @@ import ( "sort" "strings" - "github.com/centrifuge/precise-proofs/proofs/proto" + proofspb "github.com/centrifuge/precise-proofs/proofs/proto" "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" godescriptor "github.com/golang/protobuf/protoc-gen-go/descriptor" @@ -254,7 +254,9 @@ func (f *messageFlattener) handleValue(prop Property, value reflect.Value, salts // Handle each value of the map for _, k := range value.MapKeys() { keyLength := getKeyLengthFrom(outerFieldDescriptor) - + if keyLength == 0 { + keyLength = fetchLengthFromInterface(k) + } elemProp, err := prop.MapElemProp(k.Interface(), keyLength) if err != nil { return errors.Wrapf(err, "failed to create elem prop for %q", k) @@ -296,6 +298,18 @@ func (f *messageFlattener) handleValue(prop Property, value reflect.Value, salts return nil } +func fetchLengthFromInterface(k reflect.Value) uint64 { + switch k.Kind() { + case reflect.Interface: + v := reflect.ValueOf(k.Interface()) + return fetchLengthFromInterface(v) + case reflect.Array, reflect.Slice, reflect.String, reflect.Chan, reflect.Map: + return uint64(k.Len()) + } + + return 0 +} + func (f *messageFlattener) appendLeaf(prop Property, value []byte, salt []byte, readablePropertyLengthSuffix string, hash []byte, hashed bool) { leaf := LeafNode{ Property: prop, @@ -429,13 +443,31 @@ func sliceToMap(value reflect.Value, mappingKey string, keyLength uint64) (refle // since we know the key length, we convert each // []byte to [keyLength]byte before using it as a key keyType = reflect.ArrayOf(int(keyLength), reflect.TypeOf(byte(0))) + + // if key length is 0 + // then we set the map type as interface{} + // individual key type will b declared based on the length of each value + if keyLength == 0 { + m := make(map[interface{}]bool) + r := reflect.TypeOf(m) + keyType = r.Key() + } + extractKeyByteSlice := extractKey extractKey = func(v reflect.Value) (reflect.Value, error) { bs, _ := extractKeyByteSlice(v) - if uint64(bs.Len()) != keyLength { + // if key length is not set or 0, + // then take the key length of key + kt := keyType + if keyLength == 0 { + kt = reflect.ArrayOf(int(uint64(bs.Len())), reflect.TypeOf(byte(0))) + } + + if keyLength != 0 && uint64(bs.Len()) != keyLength { return reflect.Value{}, errors.Errorf("could not use %x as mapping_key - does not have length %d", bs, keyLength) } - ba := reflect.New(keyType) + + ba := reflect.New(kt) reflect.Copy(ba.Elem(), bs) return ba.Elem(), nil } diff --git a/proofs/property.go b/proofs/property.go index 42f2f79..fa2ad52 100644 --- a/proofs/property.go +++ b/proofs/property.go @@ -10,9 +10,8 @@ import ( "strconv" "strings" + proofspb "github.com/centrifuge/precise-proofs/proofs/proto" "github.com/pkg/errors" - - "github.com/centrifuge/precise-proofs/proofs/proto" ) // Property uniquely identifies a LeafNode