forked from cerc-io/laconicd-deprecated
simplified sig verification, started handler tests
This commit is contained in:
parent
c1e6f3ea94
commit
e114ec508e
128
Gopkg.lock
generated
128
Gopkg.lock
generated
@ -3,29 +3,22 @@
|
|||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
digest = "1:fcdf62d2d7e43c2565d6f8707ab4eae54dac702ed4bafb194b85139f0508929f"
|
|
||||||
name = "github.com/aristanetworks/goarista"
|
name = "github.com/aristanetworks/goarista"
|
||||||
packages = ["monotime"]
|
packages = ["monotime"]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "b2d71c282dc706f4b4f6c15b65810e1202ecd53f"
|
revision = "b2d71c282dc706f4b4f6c15b65810e1202ecd53f"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
digest = "1:d4d66abd43dbb9b5f5e6a176c5ed279c289f8db734904c047d95113a04aa2e60"
|
|
||||||
name = "github.com/btcsuite/btcd"
|
name = "github.com/btcsuite/btcd"
|
||||||
packages = ["btcec"]
|
packages = ["btcec"]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "cf05f92c3f815bbd5091ed6c73eff51f7b1945e8"
|
revision = "cf05f92c3f815bbd5091ed6c73eff51f7b1945e8"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:d0d998526cfb68788229a31c16a557fdf1fbbb510654be6b3732c2758e06b533"
|
|
||||||
name = "github.com/btcsuite/btcutil"
|
name = "github.com/btcsuite/btcutil"
|
||||||
packages = ["bech32"]
|
packages = ["bech32"]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "d4cc87b860166d00d6b5b9e0d3b3d71d6088d4d4"
|
revision = "d4cc87b860166d00d6b5b9e0d3b3d71d6088d4d4"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:36773b598dec105de46a87978ae14e64c8d2c45aa556b8e0ddfc62d6abc7c47e"
|
|
||||||
name = "github.com/cosmos/cosmos-sdk"
|
name = "github.com/cosmos/cosmos-sdk"
|
||||||
packages = [
|
packages = [
|
||||||
"baseapp",
|
"baseapp",
|
||||||
@ -33,30 +26,24 @@
|
|||||||
"types",
|
"types",
|
||||||
"version",
|
"version",
|
||||||
"wire",
|
"wire",
|
||||||
"x/auth",
|
"x/auth"
|
||||||
]
|
]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "23e3d5ac12145c02fcb4b4767d7dfccad782aee5"
|
revision = "23e3d5ac12145c02fcb4b4767d7dfccad782aee5"
|
||||||
version = "v0.23.1"
|
version = "v0.23.1"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:52f195ad0e20a92d8604c1ba3cd246c61644c03eaa454b5acd41be89841e0d10"
|
|
||||||
name = "github.com/davecgh/go-spew"
|
name = "github.com/davecgh/go-spew"
|
||||||
packages = ["spew"]
|
packages = ["spew"]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "346938d642f2ec3594ed81d874461961cd0faa76"
|
revision = "346938d642f2ec3594ed81d874461961cd0faa76"
|
||||||
version = "v1.1.0"
|
version = "v1.1.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
digest = "1:67d0b50be0549e610017cb91e0b0b745ec0cad7c613bc8e18ff2d1c1fc8825a7"
|
|
||||||
name = "github.com/edsrzf/mmap-go"
|
name = "github.com/edsrzf/mmap-go"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "0bce6a6887123b67a60366d2c9fe2dfb74289d2e"
|
revision = "0bce6a6887123b67a60366d2c9fe2dfb74289d2e"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:3238a0c355a81640974751f7d3bab21bf91035165f75c2c457959425c0422a4b"
|
|
||||||
name = "github.com/ethereum/go-ethereum"
|
name = "github.com/ethereum/go-ethereum"
|
||||||
packages = [
|
packages = [
|
||||||
"common",
|
"common",
|
||||||
@ -86,42 +73,34 @@
|
|||||||
"params",
|
"params",
|
||||||
"rlp",
|
"rlp",
|
||||||
"rpc",
|
"rpc",
|
||||||
"trie",
|
"trie"
|
||||||
]
|
]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "dea1ce052a10cd7d401a5c04f83f371a06fe293c"
|
revision = "dea1ce052a10cd7d401a5c04f83f371a06fe293c"
|
||||||
version = "v1.8.11"
|
version = "v1.8.11"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:0b9c3ad6c948d57a379da9c4e1cdd989b1c73ddc5ec8673f52a9539ce60a109b"
|
|
||||||
name = "github.com/go-kit/kit"
|
name = "github.com/go-kit/kit"
|
||||||
packages = [
|
packages = [
|
||||||
"log",
|
"log",
|
||||||
"log/level",
|
"log/level",
|
||||||
"log/term",
|
"log/term"
|
||||||
]
|
]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "4dc7be5d2d12881735283bcab7352178e190fc71"
|
revision = "4dc7be5d2d12881735283bcab7352178e190fc71"
|
||||||
version = "v0.6.0"
|
version = "v0.6.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:31a18dae27a29aa074515e43a443abfd2ba6deb6d69309d8d7ce789c45f34659"
|
|
||||||
name = "github.com/go-logfmt/logfmt"
|
name = "github.com/go-logfmt/logfmt"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "390ab7935ee28ec6b286364bba9b4dd6410cb3d5"
|
revision = "390ab7935ee28ec6b286364bba9b4dd6410cb3d5"
|
||||||
version = "v0.3.0"
|
version = "v0.3.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:c4a2528ccbcabf90f9f3c464a5fc9e302d592861bbfd0b7135a7de8a943d0406"
|
|
||||||
name = "github.com/go-stack/stack"
|
name = "github.com/go-stack/stack"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "259ab82a6cad3992b4e21ff5cac294ccb06474bc"
|
revision = "259ab82a6cad3992b4e21ff5cac294ccb06474bc"
|
||||||
version = "v1.7.0"
|
version = "v1.7.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:da39f4a22829ca95e63566208e0ea42d6f055f41dff1b14fdab88d88f62df653"
|
|
||||||
name = "github.com/gogo/protobuf"
|
name = "github.com/gogo/protobuf"
|
||||||
packages = [
|
packages = [
|
||||||
"gogoproto",
|
"gogoproto",
|
||||||
@ -129,122 +108,96 @@
|
|||||||
"proto",
|
"proto",
|
||||||
"protoc-gen-gogo/descriptor",
|
"protoc-gen-gogo/descriptor",
|
||||||
"sortkeys",
|
"sortkeys",
|
||||||
"types",
|
"types"
|
||||||
]
|
]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "636bf0302bc95575d69441b25a2603156ffdddf1"
|
revision = "636bf0302bc95575d69441b25a2603156ffdddf1"
|
||||||
version = "v1.1.1"
|
version = "v1.1.1"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:832e17df5ff8bbe0e0693d2fb46c5e53f96c662ee804049ce3ab6557df74e3ab"
|
|
||||||
name = "github.com/golang/protobuf"
|
name = "github.com/golang/protobuf"
|
||||||
packages = [
|
packages = [
|
||||||
"proto",
|
"proto",
|
||||||
"ptypes",
|
"ptypes",
|
||||||
"ptypes/any",
|
"ptypes/any",
|
||||||
"ptypes/duration",
|
"ptypes/duration",
|
||||||
"ptypes/timestamp",
|
"ptypes/timestamp"
|
||||||
]
|
]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265"
|
revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265"
|
||||||
version = "v1.1.0"
|
version = "v1.1.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
digest = "1:6027b20c168728321bd99ad01f35118eded457b01c03e647a84833ab331f2f5b"
|
|
||||||
name = "github.com/golang/snappy"
|
name = "github.com/golang/snappy"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "2e65f85255dbc3072edf28d6b5b8efc472979f5a"
|
revision = "2e65f85255dbc3072edf28d6b5b8efc472979f5a"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:cf296baa185baae04a9a7004efee8511d08e2f5f51d4cbe5375da89722d681db"
|
|
||||||
name = "github.com/hashicorp/golang-lru"
|
name = "github.com/hashicorp/golang-lru"
|
||||||
packages = [
|
packages = [
|
||||||
".",
|
".",
|
||||||
"simplelru",
|
"simplelru"
|
||||||
]
|
]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "0fb14efe8c47ae851c0034ed7a448854d3d34cf3"
|
revision = "0fb14efe8c47ae851c0034ed7a448854d3d34cf3"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be"
|
|
||||||
name = "github.com/inconshreveable/mousetrap"
|
name = "github.com/inconshreveable/mousetrap"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75"
|
revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75"
|
||||||
version = "v1.0"
|
version = "v1.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
digest = "1:dc6b1a6801b3055e9bd3da4cd1e568606eb48118cc6f28e947783aa5d998ad74"
|
|
||||||
name = "github.com/jmhodges/levigo"
|
name = "github.com/jmhodges/levigo"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "c42d9e0ca023e2198120196f842701bb4c55d7b9"
|
revision = "c42d9e0ca023e2198120196f842701bb4c55d7b9"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
digest = "1:a64e323dc06b73892e5bb5d040ced475c4645d456038333883f58934abbf6f72"
|
|
||||||
name = "github.com/kr/logfmt"
|
name = "github.com/kr/logfmt"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "b84e30acd515aadc4b783ad4ff83aff3299bdfe0"
|
revision = "b84e30acd515aadc4b783ad4ff83aff3299bdfe0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:40e195917a951a8bf867cd05de2a46aaf1806c50cf92eebf4c16f78cd196f747"
|
|
||||||
name = "github.com/pkg/errors"
|
name = "github.com/pkg/errors"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "645ef00459ed84a119197bfb8d8205042c6df63d"
|
revision = "645ef00459ed84a119197bfb8d8205042c6df63d"
|
||||||
version = "v0.8.0"
|
version = "v0.8.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:22aa691fe0213cb5c07d103f9effebcb7ad04bee45a0ce5fe5369d0ca2ec3a1f"
|
|
||||||
name = "github.com/pmezard/go-difflib"
|
name = "github.com/pmezard/go-difflib"
|
||||||
packages = ["difflib"]
|
packages = ["difflib"]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "792786c7400a136282c1664665ae0a8db921c6c2"
|
revision = "792786c7400a136282c1664665ae0a8db921c6c2"
|
||||||
version = "v1.0.0"
|
version = "v1.0.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:6cae6970d70fc5fe75bf83c48ee33e9c4c561a62d0b033254bee8dd5942b815a"
|
|
||||||
name = "github.com/rs/cors"
|
name = "github.com/rs/cors"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "3fb1b69b103a84de38a19c3c6ec073dd6caa4d3f"
|
revision = "3fb1b69b103a84de38a19c3c6ec073dd6caa4d3f"
|
||||||
version = "v1.5.0"
|
version = "v1.5.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:8be8b3743fc9795ec21bbd3e0fc28ff6234018e1a269b0a7064184be95ac13e0"
|
|
||||||
name = "github.com/spf13/cobra"
|
name = "github.com/spf13/cobra"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "ef82de70bb3f60c65fb8eebacbb2d122ef517385"
|
revision = "ef82de70bb3f60c65fb8eebacbb2d122ef517385"
|
||||||
version = "v0.0.3"
|
version = "v0.0.3"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:6de2f73eb31e80d74f84ce1c861e4c0c8f00ca5fb41a25901f987e63a0647c28"
|
|
||||||
name = "github.com/spf13/pflag"
|
name = "github.com/spf13/pflag"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "583c0c0531f06d5278b7d917446061adc344b5cd"
|
revision = "583c0c0531f06d5278b7d917446061adc344b5cd"
|
||||||
version = "v1.0.1"
|
version = "v1.0.1"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:e95496462101745805bd4e041a5b841e108c7cf761264d53648246308de2761e"
|
|
||||||
name = "github.com/stretchr/testify"
|
name = "github.com/stretchr/testify"
|
||||||
packages = [
|
packages = [
|
||||||
"assert",
|
"assert",
|
||||||
"require",
|
"require"
|
||||||
]
|
]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "f35b8ab0b5a2cef36673838d662e249dd9c94686"
|
revision = "f35b8ab0b5a2cef36673838d662e249dd9c94686"
|
||||||
version = "v1.2.2"
|
version = "v1.2.2"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
digest = "1:7d44c4d11eb65cfdc78c76040f37ef305b16474c019c98a8a7cf188fece2d574"
|
|
||||||
name = "github.com/syndtr/goleveldb"
|
name = "github.com/syndtr/goleveldb"
|
||||||
packages = [
|
packages = [
|
||||||
"leveldb",
|
"leveldb",
|
||||||
@ -258,41 +211,33 @@
|
|||||||
"leveldb/opt",
|
"leveldb/opt",
|
||||||
"leveldb/storage",
|
"leveldb/storage",
|
||||||
"leveldb/table",
|
"leveldb/table",
|
||||||
"leveldb/util",
|
"leveldb/util"
|
||||||
]
|
]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "c4c61651e9e37fa117f53c5a906d3b63090d8445"
|
revision = "c4c61651e9e37fa117f53c5a906d3b63090d8445"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
digest = "1:2b15c0442dc80b581ce7028b2e43029d2f3f985da43cb1d55f7bcdeca785bda0"
|
|
||||||
name = "github.com/tendermint/ed25519"
|
name = "github.com/tendermint/ed25519"
|
||||||
packages = [
|
packages = [
|
||||||
".",
|
".",
|
||||||
"edwards25519",
|
"edwards25519",
|
||||||
"extra25519",
|
"extra25519"
|
||||||
]
|
]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "d8387025d2b9d158cf4efb07e7ebf814bcce2057"
|
revision = "d8387025d2b9d158cf4efb07e7ebf814bcce2057"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:0e2addab3f64ece97ca434b2bf2d4e8cb54a4509904a03be8c81da3fc2ddb245"
|
|
||||||
name = "github.com/tendermint/go-amino"
|
name = "github.com/tendermint/go-amino"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "2106ca61d91029c931fd54968c2bb02dc96b1412"
|
revision = "2106ca61d91029c931fd54968c2bb02dc96b1412"
|
||||||
version = "0.10.1"
|
version = "0.10.1"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:bf042d2f7d1252b9dcae8e694e2f0a9b5294cb357c086fd86dc540d2f32c9fdf"
|
|
||||||
name = "github.com/tendermint/iavl"
|
name = "github.com/tendermint/iavl"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "35f66e53d9b01e83b30de68b931f54b2477a94c9"
|
revision = "35f66e53d9b01e83b30de68b931f54b2477a94c9"
|
||||||
version = "v0.9.2"
|
version = "v0.9.2"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:9f6704ae2aedbadf616e5850375c504909d46b6ea57d4679de2b7cbc715f08e1"
|
|
||||||
name = "github.com/tendermint/tendermint"
|
name = "github.com/tendermint/tendermint"
|
||||||
packages = [
|
packages = [
|
||||||
"abci/server",
|
"abci/server",
|
||||||
@ -309,22 +254,18 @@
|
|||||||
"libs/log",
|
"libs/log",
|
||||||
"libs/pubsub",
|
"libs/pubsub",
|
||||||
"libs/pubsub/query",
|
"libs/pubsub/query",
|
||||||
"types",
|
"types"
|
||||||
]
|
]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "d542d2c3945116697f60451e6a407082c41c3cc9"
|
revision = "d542d2c3945116697f60451e6a407082c41c3cc9"
|
||||||
version = "v0.22.8"
|
version = "v0.22.8"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
digest = "1:2cbe8758697d867fcebf73bcc69dff8e8abaa7fd65e5704e0744e522ccff4e6a"
|
|
||||||
name = "golang.org/x/crypto"
|
name = "golang.org/x/crypto"
|
||||||
packages = ["ripemd160"]
|
packages = ["ripemd160"]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "f027049dab0ad238e394a753dba2d14753473a04"
|
revision = "f027049dab0ad238e394a753dba2d14753473a04"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:5fdc7adede42f80d6201258355d478d856778e21d735f14972abd8ff793fdbf7"
|
|
||||||
name = "golang.org/x/net"
|
name = "golang.org/x/net"
|
||||||
packages = [
|
packages = [
|
||||||
"context",
|
"context",
|
||||||
@ -334,13 +275,11 @@
|
|||||||
"idna",
|
"idna",
|
||||||
"internal/timeseries",
|
"internal/timeseries",
|
||||||
"trace",
|
"trace",
|
||||||
"websocket",
|
"websocket"
|
||||||
]
|
]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "292b43bbf7cb8d35ddf40f8d5100ef3837cced3f"
|
revision = "292b43bbf7cb8d35ddf40f8d5100ef3837cced3f"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:6164911cb5e94e8d8d5131d646613ff82c14f5a8ce869de2f6d80d9889df8c5a"
|
|
||||||
name = "golang.org/x/text"
|
name = "golang.org/x/text"
|
||||||
packages = [
|
packages = [
|
||||||
"collate",
|
"collate",
|
||||||
@ -356,21 +295,17 @@
|
|||||||
"unicode/bidi",
|
"unicode/bidi",
|
||||||
"unicode/cldr",
|
"unicode/cldr",
|
||||||
"unicode/norm",
|
"unicode/norm",
|
||||||
"unicode/rangetable",
|
"unicode/rangetable"
|
||||||
]
|
]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0"
|
revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0"
|
||||||
version = "v0.3.0"
|
version = "v0.3.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:8cfa91d1b7f6b66fa9b1a738a4bc1325837b861e63fb9a2919931d68871bb770"
|
|
||||||
name = "google.golang.org/genproto"
|
name = "google.golang.org/genproto"
|
||||||
packages = ["googleapis/rpc/status"]
|
packages = ["googleapis/rpc/status"]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "7fd901a49ba6a7f87732eb344f6e3c5b19d1b200"
|
revision = "7fd901a49ba6a7f87732eb344f6e3c5b19d1b200"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:adafc60b1d4688759f3fc8f9089e71dd17abd123f4729de6b913bf08c9143770"
|
|
||||||
name = "google.golang.org/grpc"
|
name = "google.golang.org/grpc"
|
||||||
packages = [
|
packages = [
|
||||||
".",
|
".",
|
||||||
@ -397,67 +332,32 @@
|
|||||||
"stats",
|
"stats",
|
||||||
"status",
|
"status",
|
||||||
"tap",
|
"tap",
|
||||||
"transport",
|
"transport"
|
||||||
]
|
]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
revision = "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
version = "v1.13.0"
|
version = "v1.13.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:3ccd10c863188cfe0d936fcfe6a055c95362e43af8e7039e33baade846928e74"
|
|
||||||
name = "gopkg.in/fatih/set.v0"
|
name = "gopkg.in/fatih/set.v0"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "57907de300222151a123d29255ed17f5ed43fad3"
|
revision = "57907de300222151a123d29255ed17f5ed43fad3"
|
||||||
version = "v0.1.0"
|
version = "v0.1.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "v2"
|
branch = "v2"
|
||||||
digest = "1:dae137be246befa42ce4b48c0feff2c5796b8a5027139a283f31a21173744410"
|
|
||||||
name = "gopkg.in/karalabe/cookiejar.v2"
|
name = "gopkg.in/karalabe/cookiejar.v2"
|
||||||
packages = ["collections/prque"]
|
packages = ["collections/prque"]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "8dcd6a7f4951f6ff3ee9cbb919a06d8925822e57"
|
revision = "8dcd6a7f4951f6ff3ee9cbb919a06d8925822e57"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "v2"
|
branch = "v2"
|
||||||
digest = "1:3d3f9391ab615be8655ae0d686a1564f3fec413979bb1aaf018bac1ec1bb1cc7"
|
|
||||||
name = "gopkg.in/natefinch/npipe.v2"
|
name = "gopkg.in/natefinch/npipe.v2"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
pruneopts = "T"
|
|
||||||
revision = "c1b8fa8bdccecb0b8db834ee0b92fdbcfa606dd6"
|
revision = "c1b8fa8bdccecb0b8db834ee0b92fdbcfa606dd6"
|
||||||
|
|
||||||
[solve-meta]
|
[solve-meta]
|
||||||
analyzer-name = "dep"
|
analyzer-name = "dep"
|
||||||
analyzer-version = 1
|
analyzer-version = 1
|
||||||
input-imports = [
|
inputs-digest = "560c44b5e8f495ae409bc13b0e32cf36e3281f0d02b68b15e987faa2cda1e91c"
|
||||||
"github.com/cosmos/cosmos-sdk/baseapp",
|
|
||||||
"github.com/cosmos/cosmos-sdk/store",
|
|
||||||
"github.com/cosmos/cosmos-sdk/types",
|
|
||||||
"github.com/cosmos/cosmos-sdk/wire",
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/auth",
|
|
||||||
"github.com/ethereum/go-ethereum/common",
|
|
||||||
"github.com/ethereum/go-ethereum/common/math",
|
|
||||||
"github.com/ethereum/go-ethereum/consensus",
|
|
||||||
"github.com/ethereum/go-ethereum/consensus/ethash",
|
|
||||||
"github.com/ethereum/go-ethereum/consensus/misc",
|
|
||||||
"github.com/ethereum/go-ethereum/core",
|
|
||||||
"github.com/ethereum/go-ethereum/core/state",
|
|
||||||
"github.com/ethereum/go-ethereum/core/types",
|
|
||||||
"github.com/ethereum/go-ethereum/core/vm",
|
|
||||||
"github.com/ethereum/go-ethereum/crypto",
|
|
||||||
"github.com/ethereum/go-ethereum/crypto/sha3",
|
|
||||||
"github.com/ethereum/go-ethereum/ethdb",
|
|
||||||
"github.com/ethereum/go-ethereum/params",
|
|
||||||
"github.com/ethereum/go-ethereum/rlp",
|
|
||||||
"github.com/ethereum/go-ethereum/rpc",
|
|
||||||
"github.com/ethereum/go-ethereum/trie",
|
|
||||||
"github.com/hashicorp/golang-lru",
|
|
||||||
"github.com/pkg/errors",
|
|
||||||
"github.com/stretchr/testify/require",
|
|
||||||
"github.com/tendermint/tendermint/libs/common",
|
|
||||||
"github.com/tendermint/tendermint/libs/db",
|
|
||||||
"github.com/tendermint/tendermint/libs/log",
|
|
||||||
]
|
|
||||||
solver-name = "gps-cdcl"
|
solver-name = "gps-cdcl"
|
||||||
solver-version = 1
|
solver-version = 1
|
||||||
|
@ -9,8 +9,6 @@ import (
|
|||||||
|
|
||||||
"github.com/cosmos/ethermint/types"
|
"github.com/cosmos/ethermint/types"
|
||||||
ethcmn "github.com/ethereum/go-ethereum/common"
|
ethcmn "github.com/ethereum/go-ethereum/common"
|
||||||
|
|
||||||
ethtypes "github.com/ethereum/go-ethereum/core/types"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -93,10 +91,9 @@ func handleEthTx(sdkCtx sdk.Context, tx sdk.Tx, am auth.AccountMapper) (sdk.Cont
|
|||||||
}
|
}
|
||||||
|
|
||||||
// validate signature
|
// validate signature
|
||||||
gethTx := ethTx.ConvertTx(chainID)
|
sdkCtx.GasMeter().ConsumeGas(verifySigCost, "ante verify")
|
||||||
signer := ethtypes.NewEIP155Signer(chainID)
|
_, err := ethTx.VerifySig(chainID)
|
||||||
|
|
||||||
_, err := signer.Sender(&gethTx)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return sdkCtx, sdk.ErrUnauthorized("signature verification failed").Result(), true
|
return sdkCtx, sdk.ErrUnauthorized("signature verification failed").Result(), true
|
||||||
}
|
}
|
||||||
@ -125,7 +122,7 @@ func handleEmbeddedTx(sdkCtx sdk.Context, tx sdk.Tx, am auth.AccountMapper) (sdk
|
|||||||
|
|
||||||
signerAcc, err := validateSignature(sdkCtx, etx, signer, sig, am)
|
signerAcc, err := validateSignature(sdkCtx, etx, signer, sig, am)
|
||||||
if err.Code() != sdk.CodeOK {
|
if err.Code() != sdk.CodeOK {
|
||||||
return sdkCtx, err.Result(), false
|
return sdkCtx, err.Result(), true
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Fees!
|
// TODO: Fees!
|
||||||
|
70
handlers/ante_test.go
Normal file
70
handlers/ante_test.go
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
package handlers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"math/big"
|
||||||
|
"crypto/ecdsa"
|
||||||
|
|
||||||
|
"github.com/cosmos/ethermint/types"
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/auth"
|
||||||
|
abci "github.com/tendermint/tendermint/abci/types"
|
||||||
|
|
||||||
|
ethcmn "github.com/ethereum/go-ethereum/common"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestBadSig(t *testing.T) {
|
||||||
|
tx := types.NewTestEthTxs(types.TestChainID, []*ecdsa.PrivateKey{types.TestPrivKey1}, []ethcmn.Address{types.TestAddr1})[0]
|
||||||
|
|
||||||
|
tx.Data.Signature = types.NewEthSignature(new(big.Int), new(big.Int), new(big.Int))
|
||||||
|
|
||||||
|
ms, key := SetupMultiStore()
|
||||||
|
ctx := sdk.NewContext(ms, abci.Header{ChainID: types.TestChainID.String()}, false, nil)
|
||||||
|
|
||||||
|
accountMapper := auth.NewAccountMapper(types.NewTestCodec(), key, auth.ProtoBaseAccount)
|
||||||
|
handler := AnteHandler(accountMapper)
|
||||||
|
|
||||||
|
_, res, abort := handler(ctx, tx)
|
||||||
|
|
||||||
|
require.True(t, abort, "Antehandler did not abort")
|
||||||
|
require.Equal(t, sdk.ABCICodeType(0x10004), res.Code, "Result is OK on bad tx")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestInsufficientGas(t *testing.T) {
|
||||||
|
tx := types.NewTestEthTxs(types.TestChainID, []*ecdsa.PrivateKey{types.TestPrivKey1}, []ethcmn.Address{types.TestAddr1})[0]
|
||||||
|
|
||||||
|
tx.Data.GasLimit = 0
|
||||||
|
|
||||||
|
ms, key := SetupMultiStore()
|
||||||
|
ctx := sdk.NewContext(ms, abci.Header{ChainID: types.TestChainID.String()}, false, nil)
|
||||||
|
|
||||||
|
accountMapper := auth.NewAccountMapper(types.NewTestCodec(), key, auth.ProtoBaseAccount)
|
||||||
|
handler := AnteHandler(accountMapper)
|
||||||
|
|
||||||
|
_, res, abort := handler(ctx, tx)
|
||||||
|
|
||||||
|
require.True(t, abort, "Antehandler did not abort")
|
||||||
|
require.Equal(t, sdk.ABCICodeType(0x1000c), res.Code, "Result is OK on bad tx")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWrongNonce(t *testing.T) {
|
||||||
|
tx := types.NewTestEthTxs(types.TestChainID, []*ecdsa.PrivateKey{types.TestPrivKey1}, []ethcmn.Address{types.TestAddr1})[0]
|
||||||
|
|
||||||
|
tx.Data.AccountNonce = 12
|
||||||
|
|
||||||
|
ms, key := SetupMultiStore()
|
||||||
|
ctx := sdk.NewContext(ms, abci.Header{ChainID: types.TestChainID.String()}, false, nil)
|
||||||
|
|
||||||
|
accountMapper := auth.NewAccountMapper(types.NewTestCodec(), key, auth.ProtoBaseAccount)
|
||||||
|
handler := AnteHandler(accountMapper)
|
||||||
|
|
||||||
|
_, res, abort := handler(ctx, tx)
|
||||||
|
|
||||||
|
require.True(t, abort, "Antehandler did not abort")
|
||||||
|
require.Equal(t, sdk.ABCICodeType(0x10004), res.Code, "Result is OK on bad tx")
|
||||||
|
|
||||||
|
}
|
16
handlers/test_common.go
Normal file
16
handlers/test_common.go
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package handlers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/cosmos/cosmos-sdk/store"
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
dbm "github.com/tendermint/tendermint/libs/db"
|
||||||
|
)
|
||||||
|
|
||||||
|
func SetupMultiStore() (sdk.MultiStore, *sdk.KVStoreKey) {
|
||||||
|
db := dbm.NewMemDB()
|
||||||
|
capKey := sdk.NewKVStoreKey("capkey")
|
||||||
|
ms := store.NewCommitMultiStore(db)
|
||||||
|
ms.MountStoreWithDB(capKey, sdk.StoreTypeIAVL, db)
|
||||||
|
ms.LoadLatestVersion()
|
||||||
|
return ms, capKey
|
||||||
|
}
|
122
types/test_common.go
Normal file
122
types/test_common.go
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/ecdsa"
|
||||||
|
"math/big"
|
||||||
|
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/wire"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/auth"
|
||||||
|
|
||||||
|
ethcrypto "github.com/ethereum/go-ethereum/crypto"
|
||||||
|
ethtypes "github.com/ethereum/go-ethereum/core/types"
|
||||||
|
ethcmn "github.com/ethereum/go-ethereum/common"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
TestChainID = sdk.NewInt(3)
|
||||||
|
|
||||||
|
TestPrivKey1, _ = ethcrypto.GenerateKey()
|
||||||
|
TestPrivKey2, _ = ethcrypto.GenerateKey()
|
||||||
|
|
||||||
|
TestAddr1 = PrivKeyToEthAddress(TestPrivKey1)
|
||||||
|
TestAddr2 = PrivKeyToEthAddress(TestPrivKey2)
|
||||||
|
|
||||||
|
TestSDKAddress = GenerateEthAddress()
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewTestCodec() *wire.Codec {
|
||||||
|
codec := wire.NewCodec()
|
||||||
|
|
||||||
|
RegisterWire(codec)
|
||||||
|
codec.RegisterConcrete(&sdk.TestMsg{}, "test/TestMsg", nil)
|
||||||
|
|
||||||
|
return codec
|
||||||
|
}
|
||||||
|
|
||||||
|
func newStdFee() auth.StdFee {
|
||||||
|
return auth.NewStdFee(5000, sdk.NewCoin("photon", 150))
|
||||||
|
}
|
||||||
|
|
||||||
|
func newTestEmbeddedTx(
|
||||||
|
chainID sdk.Int, msgs []sdk.Msg, pKeys []*ecdsa.PrivateKey,
|
||||||
|
accNums []int64, seqs []int64, fee auth.StdFee,
|
||||||
|
) sdk.Tx {
|
||||||
|
|
||||||
|
sigs := make([][]byte, len(pKeys))
|
||||||
|
|
||||||
|
for i, priv := range pKeys {
|
||||||
|
signEtx := EmbeddedTxSign{chainID.String(), accNums[i], seqs[i], msgs, newStdFee()}
|
||||||
|
|
||||||
|
signBytes, err := signEtx.Bytes()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
sig, err := ethcrypto.Sign(signBytes, priv)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
sigs[i] = sig
|
||||||
|
}
|
||||||
|
|
||||||
|
return EmbeddedTx{msgs, fee, sigs}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewTestGethTxs(chainID sdk.Int, pKeys []*ecdsa.PrivateKey, addrs []ethcmn.Address) []ethtypes.Transaction {
|
||||||
|
txs := make([]ethtypes.Transaction, len(pKeys))
|
||||||
|
|
||||||
|
for i, priv := range pKeys {
|
||||||
|
ethTx := ethtypes.NewTransaction(
|
||||||
|
uint64(i), addrs[i], big.NewInt(10), 100, big.NewInt(100), nil,
|
||||||
|
)
|
||||||
|
|
||||||
|
signer := ethtypes.NewEIP155Signer(chainID.BigInt())
|
||||||
|
ethTx, _ = ethtypes.SignTx(ethTx, signer, priv)
|
||||||
|
|
||||||
|
txs[i] = *ethTx
|
||||||
|
}
|
||||||
|
|
||||||
|
return txs
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewTestEthTxs(chainID sdk.Int, pKeys []*ecdsa.PrivateKey, addrs []ethcmn.Address) []Transaction {
|
||||||
|
txs := make([]Transaction, len(pKeys))
|
||||||
|
|
||||||
|
for i, priv := range pKeys {
|
||||||
|
emintTx := NewTransaction(
|
||||||
|
uint64(i), addrs[i], sdk.NewInt(10), 100, sdk.NewInt(100), nil,
|
||||||
|
)
|
||||||
|
|
||||||
|
emintTx.Sign(chainID, priv)
|
||||||
|
|
||||||
|
txs[i] = emintTx
|
||||||
|
}
|
||||||
|
|
||||||
|
return txs
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewTestSDKTxs(
|
||||||
|
codec *wire.Codec, chainID sdk.Int, msgs []sdk.Msg, pKeys []*ecdsa.PrivateKey,
|
||||||
|
accNums []int64, seqs []int64, fee auth.StdFee,
|
||||||
|
) []Transaction {
|
||||||
|
|
||||||
|
txs := make([]Transaction, len(pKeys))
|
||||||
|
etx := newTestEmbeddedTx(chainID, msgs, pKeys, accNums, seqs, fee)
|
||||||
|
|
||||||
|
for i, priv := range pKeys {
|
||||||
|
payload := codec.MustMarshalBinary(etx)
|
||||||
|
|
||||||
|
emintTx := NewTransaction(
|
||||||
|
uint64(i), TestSDKAddress, sdk.NewInt(10), 100,
|
||||||
|
sdk.NewInt(100), payload,
|
||||||
|
)
|
||||||
|
|
||||||
|
emintTx.Sign(TestChainID, priv)
|
||||||
|
|
||||||
|
txs[i] = emintTx
|
||||||
|
}
|
||||||
|
|
||||||
|
return txs
|
||||||
|
}
|
78
types/tx.go
78
types/tx.go
@ -68,6 +68,13 @@ type (
|
|||||||
EthSignature struct {
|
EthSignature struct {
|
||||||
v, r, s *big.Int
|
v, r, s *big.Int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sigCache is used to cache the derived sender and contains
|
||||||
|
// the signer used to derive it.
|
||||||
|
sigCache struct {
|
||||||
|
signer ethtypes.Signer
|
||||||
|
from ethcmn.Address
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewEthSignature returns a new instantiated Ethereum signature.
|
// NewEthSignature returns a new instantiated Ethereum signature.
|
||||||
@ -164,6 +171,56 @@ func (tx *Transaction) Sign(chainID sdk.Int, priv *ecdsa.PrivateKey) {
|
|||||||
tx.Data.Signature.s = s
|
tx.Data.Signature.s = s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (tx Transaction) VerifySig(chainID *big.Int) (ethcmn.Address, error) {
|
||||||
|
if sc := tx.from.Load(); sc != nil {
|
||||||
|
sigCache := sc.(sigCache)
|
||||||
|
// If the signer used to derive from in a previous
|
||||||
|
// call is not the same as used current, invalidate
|
||||||
|
// the cache.
|
||||||
|
if sigCache.signer.Equal(ethtypes.NewEIP155Signer(chainID)) {
|
||||||
|
return sigCache.from, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var signBytes ethcmn.Hash
|
||||||
|
if tx.Data.Signature.v.BitLen() < 8 {
|
||||||
|
v := tx.Data.Signature.v.Uint64()
|
||||||
|
if v == 27 || v == 28 {
|
||||||
|
// Unprotected tx has no cross-chain replay protection
|
||||||
|
signBytes = rlpHash([]interface{}{
|
||||||
|
tx.Data.AccountNonce,
|
||||||
|
tx.Data.Price,
|
||||||
|
tx.Data.GasLimit,
|
||||||
|
tx.Data.Recipient,
|
||||||
|
tx.Data.Amount,
|
||||||
|
tx.Data.Payload,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
signBytes = rlpHash([]interface{}{
|
||||||
|
tx.Data.AccountNonce,
|
||||||
|
tx.Data.Price,
|
||||||
|
tx.Data.GasLimit,
|
||||||
|
tx.Data.Recipient,
|
||||||
|
tx.Data.Amount,
|
||||||
|
tx.Data.Payload,
|
||||||
|
chainID, uint(0), uint(0),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
sig := recoverEthSig(tx.Data.Signature, chainID)
|
||||||
|
|
||||||
|
pub, err := ethcrypto.Ecrecover(signBytes[:], sig)
|
||||||
|
if err != nil {
|
||||||
|
return ethcmn.Address{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var addr ethcmn.Address
|
||||||
|
copy(addr[:], ethcrypto.Keccak256(pub[1:])[12:])
|
||||||
|
return addr, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Type implements the sdk.Msg interface. It returns the type of the
|
// Type implements the sdk.Msg interface. It returns the type of the
|
||||||
// Transaction.
|
// Transaction.
|
||||||
func (tx Transaction) Type() string {
|
func (tx Transaction) Type() string {
|
||||||
@ -200,27 +257,6 @@ func (tx Transaction) GetMsgs() []sdk.Msg {
|
|||||||
return []sdk.Msg{tx}
|
return []sdk.Msg{tx}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConvertTx attempts to converts a Transaction to a new Ethereum transaction
|
|
||||||
// with the signature set. The signature if first recovered and then a new
|
|
||||||
// Transaction is created with that signature. If setting the signature fails,
|
|
||||||
// a panic will be triggered.
|
|
||||||
func (tx Transaction) ConvertTx(chainID *big.Int) ethtypes.Transaction {
|
|
||||||
gethTx := ethtypes.NewTransaction(
|
|
||||||
tx.Data.AccountNonce, *tx.Data.Recipient, tx.Data.Amount.BigInt(),
|
|
||||||
tx.Data.GasLimit, tx.Data.Price.BigInt(), tx.Data.Payload,
|
|
||||||
)
|
|
||||||
|
|
||||||
sig := recoverEthSig(tx.Data.Signature, chainID)
|
|
||||||
signer := ethtypes.NewEIP155Signer(chainID)
|
|
||||||
|
|
||||||
gethTx, err := gethTx.WithSignature(signer, sig)
|
|
||||||
if err != nil {
|
|
||||||
panic(errors.Wrap(err, "failed to convert transaction with a given signature"))
|
|
||||||
}
|
|
||||||
|
|
||||||
return *gethTx
|
|
||||||
}
|
|
||||||
|
|
||||||
// HasEmbeddedTx returns a boolean reflecting if the transaction contains an
|
// HasEmbeddedTx returns a boolean reflecting if the transaction contains an
|
||||||
// SDK transaction or not based on the recipient address.
|
// SDK transaction or not based on the recipient address.
|
||||||
func (tx Transaction) HasEmbeddedTx(addr ethcmn.Address) bool {
|
func (tx Transaction) HasEmbeddedTx(addr ethcmn.Address) bool {
|
||||||
|
228
types/tx_test.go
228
types/tx_test.go
@ -3,164 +3,18 @@ package types
|
|||||||
import (
|
import (
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/big"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
"github.com/cosmos/cosmos-sdk/wire"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/auth"
|
|
||||||
ethcmn "github.com/ethereum/go-ethereum/common"
|
ethcmn "github.com/ethereum/go-ethereum/common"
|
||||||
ethtypes "github.com/ethereum/go-ethereum/core/types"
|
|
||||||
ethcrypto "github.com/ethereum/go-ethereum/crypto"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
testChainID = sdk.NewInt(3)
|
|
||||||
|
|
||||||
testPrivKey1, _ = ethcrypto.GenerateKey()
|
|
||||||
testPrivKey2, _ = ethcrypto.GenerateKey()
|
|
||||||
|
|
||||||
testAddr1 = PrivKeyToEthAddress(testPrivKey1)
|
|
||||||
testAddr2 = PrivKeyToEthAddress(testPrivKey2)
|
|
||||||
|
|
||||||
testSDKAddress = GenerateEthAddress()
|
|
||||||
)
|
|
||||||
|
|
||||||
func newTestCodec() *wire.Codec {
|
|
||||||
codec := wire.NewCodec()
|
|
||||||
|
|
||||||
RegisterWire(codec)
|
|
||||||
codec.RegisterConcrete(&sdk.TestMsg{}, "test/TestMsg", nil)
|
|
||||||
|
|
||||||
return codec
|
|
||||||
}
|
|
||||||
|
|
||||||
func newStdFee() auth.StdFee {
|
|
||||||
return auth.NewStdFee(5000, sdk.NewCoin("photon", 150))
|
|
||||||
}
|
|
||||||
|
|
||||||
func newTestEmbeddedTx(
|
|
||||||
chainID sdk.Int, msgs []sdk.Msg, pKeys []*ecdsa.PrivateKey,
|
|
||||||
accNums []int64, seqs []int64, fee auth.StdFee,
|
|
||||||
) sdk.Tx {
|
|
||||||
|
|
||||||
sigs := make([][]byte, len(pKeys))
|
|
||||||
|
|
||||||
for i, priv := range pKeys {
|
|
||||||
signEtx := EmbeddedTxSign{chainID.String(), accNums[i], seqs[i], msgs, newStdFee()}
|
|
||||||
|
|
||||||
signBytes, err := signEtx.Bytes()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
sig, err := ethcrypto.Sign(signBytes, priv)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
sigs[i] = sig
|
|
||||||
}
|
|
||||||
|
|
||||||
return EmbeddedTx{msgs, fee, sigs}
|
|
||||||
}
|
|
||||||
|
|
||||||
func newTestGethTxs(chainID sdk.Int, pKeys []*ecdsa.PrivateKey, addrs []ethcmn.Address) []ethtypes.Transaction {
|
|
||||||
txs := make([]ethtypes.Transaction, len(pKeys))
|
|
||||||
|
|
||||||
for i, priv := range pKeys {
|
|
||||||
ethTx := ethtypes.NewTransaction(
|
|
||||||
uint64(i), addrs[i], big.NewInt(10), 100, big.NewInt(100), nil,
|
|
||||||
)
|
|
||||||
|
|
||||||
signer := ethtypes.NewEIP155Signer(chainID.BigInt())
|
|
||||||
ethTx, _ = ethtypes.SignTx(ethTx, signer, priv)
|
|
||||||
|
|
||||||
txs[i] = *ethTx
|
|
||||||
}
|
|
||||||
|
|
||||||
return txs
|
|
||||||
}
|
|
||||||
|
|
||||||
func newTestEthTxs(chainID sdk.Int, pKeys []*ecdsa.PrivateKey, addrs []ethcmn.Address) []Transaction {
|
|
||||||
txs := make([]Transaction, len(pKeys))
|
|
||||||
|
|
||||||
for i, priv := range pKeys {
|
|
||||||
emintTx := NewTransaction(
|
|
||||||
uint64(i), addrs[i], sdk.NewInt(10), 100, sdk.NewInt(100), nil,
|
|
||||||
)
|
|
||||||
|
|
||||||
emintTx.Sign(chainID, priv)
|
|
||||||
|
|
||||||
txs[i] = emintTx
|
|
||||||
}
|
|
||||||
|
|
||||||
return txs
|
|
||||||
}
|
|
||||||
|
|
||||||
func newTestSDKTxs(
|
|
||||||
codec *wire.Codec, chainID sdk.Int, msgs []sdk.Msg, pKeys []*ecdsa.PrivateKey,
|
|
||||||
accNums []int64, seqs []int64, fee auth.StdFee,
|
|
||||||
) []Transaction {
|
|
||||||
|
|
||||||
txs := make([]Transaction, len(pKeys))
|
|
||||||
etx := newTestEmbeddedTx(chainID, msgs, pKeys, accNums, seqs, fee)
|
|
||||||
|
|
||||||
for i, priv := range pKeys {
|
|
||||||
payload := codec.MustMarshalBinary(etx)
|
|
||||||
|
|
||||||
emintTx := NewTransaction(
|
|
||||||
uint64(i), testSDKAddress, sdk.NewInt(10), 100,
|
|
||||||
sdk.NewInt(100), payload,
|
|
||||||
)
|
|
||||||
|
|
||||||
emintTx.Sign(testChainID, priv)
|
|
||||||
|
|
||||||
txs[i] = emintTx
|
|
||||||
}
|
|
||||||
|
|
||||||
return txs
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestConvertTx(t *testing.T) {
|
|
||||||
gethTxs := newTestGethTxs(
|
|
||||||
testChainID,
|
|
||||||
[]*ecdsa.PrivateKey{testPrivKey1, testPrivKey2},
|
|
||||||
[]ethcmn.Address{testAddr1, testAddr2},
|
|
||||||
)
|
|
||||||
ethTxs := newTestEthTxs(
|
|
||||||
testChainID,
|
|
||||||
[]*ecdsa.PrivateKey{testPrivKey1, testPrivKey2},
|
|
||||||
[]ethcmn.Address{testAddr1, testAddr2},
|
|
||||||
)
|
|
||||||
|
|
||||||
testCases := []struct {
|
|
||||||
ethTx ethtypes.Transaction
|
|
||||||
emintTx Transaction
|
|
||||||
expectedEq bool
|
|
||||||
}{
|
|
||||||
{gethTxs[0], ethTxs[0], true},
|
|
||||||
{gethTxs[0], ethTxs[1], false},
|
|
||||||
{gethTxs[1], ethTxs[0], false},
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, tc := range testCases {
|
|
||||||
convertedTx := tc.emintTx.ConvertTx(testChainID.BigInt())
|
|
||||||
|
|
||||||
if tc.expectedEq {
|
|
||||||
require.Equal(t, tc.ethTx, convertedTx, fmt.Sprintf("unexpected result: test case #%d", i))
|
|
||||||
} else {
|
|
||||||
require.NotEqual(t, tc.ethTx, convertedTx, fmt.Sprintf("unexpected result: test case #%d", i))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestValidation(t *testing.T) {
|
func TestValidation(t *testing.T) {
|
||||||
ethTxs := newTestEthTxs(
|
ethTxs := NewTestEthTxs(
|
||||||
testChainID,
|
TestChainID,
|
||||||
[]*ecdsa.PrivateKey{testPrivKey1},
|
[]*ecdsa.PrivateKey{TestPrivKey1},
|
||||||
[]ethcmn.Address{testAddr1},
|
[]ethcmn.Address{TestAddr1},
|
||||||
)
|
)
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
@ -194,34 +48,34 @@ func TestValidation(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestHasEmbeddedTx(t *testing.T) {
|
func TestHasEmbeddedTx(t *testing.T) {
|
||||||
testCodec := newTestCodec()
|
testCodec := NewTestCodec()
|
||||||
msgs := []sdk.Msg{sdk.NewTestMsg(sdk.AccAddress(testAddr1.Bytes()))}
|
msgs := []sdk.Msg{sdk.NewTestMsg(sdk.AccAddress(TestAddr1.Bytes()))}
|
||||||
|
|
||||||
sdkTxs := newTestSDKTxs(
|
sdkTxs := NewTestSDKTxs(
|
||||||
testCodec, testChainID, msgs, []*ecdsa.PrivateKey{testPrivKey1},
|
testCodec, TestChainID, msgs, []*ecdsa.PrivateKey{TestPrivKey1},
|
||||||
[]int64{0}, []int64{0}, newStdFee(),
|
[]int64{0}, []int64{0}, newStdFee(),
|
||||||
)
|
)
|
||||||
require.True(t, sdkTxs[0].HasEmbeddedTx(testSDKAddress))
|
require.True(t, sdkTxs[0].HasEmbeddedTx(TestSDKAddress))
|
||||||
|
|
||||||
ethTxs := newTestEthTxs(
|
ethTxs := NewTestEthTxs(
|
||||||
testChainID,
|
TestChainID,
|
||||||
[]*ecdsa.PrivateKey{testPrivKey1},
|
[]*ecdsa.PrivateKey{TestPrivKey1},
|
||||||
[]ethcmn.Address{testAddr1},
|
[]ethcmn.Address{TestAddr1},
|
||||||
)
|
)
|
||||||
require.False(t, ethTxs[0].HasEmbeddedTx(testSDKAddress))
|
require.False(t, ethTxs[0].HasEmbeddedTx(TestSDKAddress))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetEmbeddedTx(t *testing.T) {
|
func TestGetEmbeddedTx(t *testing.T) {
|
||||||
testCodec := newTestCodec()
|
testCodec := NewTestCodec()
|
||||||
msgs := []sdk.Msg{sdk.NewTestMsg(sdk.AccAddress(testAddr1.Bytes()))}
|
msgs := []sdk.Msg{sdk.NewTestMsg(sdk.AccAddress(TestAddr1.Bytes()))}
|
||||||
|
|
||||||
ethTxs := newTestEthTxs(
|
ethTxs := NewTestEthTxs(
|
||||||
testChainID,
|
TestChainID,
|
||||||
[]*ecdsa.PrivateKey{testPrivKey1},
|
[]*ecdsa.PrivateKey{TestPrivKey1},
|
||||||
[]ethcmn.Address{testAddr1},
|
[]ethcmn.Address{TestAddr1},
|
||||||
)
|
)
|
||||||
sdkTxs := newTestSDKTxs(
|
sdkTxs := NewTestSDKTxs(
|
||||||
testCodec, testChainID, msgs, []*ecdsa.PrivateKey{testPrivKey1},
|
testCodec, TestChainID, msgs, []*ecdsa.PrivateKey{TestPrivKey1},
|
||||||
[]int64{0}, []int64{0}, newStdFee(),
|
[]int64{0}, []int64{0}, newStdFee(),
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -235,19 +89,19 @@ func TestGetEmbeddedTx(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestTransactionGetMsgs(t *testing.T) {
|
func TestTransactionGetMsgs(t *testing.T) {
|
||||||
ethTxs := newTestEthTxs(
|
ethTxs := NewTestEthTxs(
|
||||||
testChainID,
|
TestChainID,
|
||||||
[]*ecdsa.PrivateKey{testPrivKey1},
|
[]*ecdsa.PrivateKey{TestPrivKey1},
|
||||||
[]ethcmn.Address{testAddr1},
|
[]ethcmn.Address{TestAddr1},
|
||||||
)
|
)
|
||||||
|
|
||||||
msgs := ethTxs[0].GetMsgs()
|
msgs := ethTxs[0].GetMsgs()
|
||||||
require.Len(t, msgs, 1)
|
require.Len(t, msgs, 1)
|
||||||
require.Equal(t, ethTxs[0], msgs[0])
|
require.Equal(t, ethTxs[0], msgs[0])
|
||||||
|
|
||||||
expectedMsgs := []sdk.Msg{sdk.NewTestMsg(sdk.AccAddress(testAddr1.Bytes()))}
|
expectedMsgs := []sdk.Msg{sdk.NewTestMsg(sdk.AccAddress(TestAddr1.Bytes()))}
|
||||||
etx := newTestEmbeddedTx(
|
etx := newTestEmbeddedTx(
|
||||||
testChainID, expectedMsgs, []*ecdsa.PrivateKey{testPrivKey1},
|
TestChainID, expectedMsgs, []*ecdsa.PrivateKey{TestPrivKey1},
|
||||||
[]int64{0}, []int64{0}, newStdFee(),
|
[]int64{0}, []int64{0}, newStdFee(),
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -257,26 +111,26 @@ func TestTransactionGetMsgs(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGetRequiredSigners(t *testing.T) {
|
func TestGetRequiredSigners(t *testing.T) {
|
||||||
msgs := []sdk.Msg{sdk.NewTestMsg(sdk.AccAddress(testAddr1.Bytes()))}
|
msgs := []sdk.Msg{sdk.NewTestMsg(sdk.AccAddress(TestAddr1.Bytes()))}
|
||||||
etx := newTestEmbeddedTx(
|
etx := newTestEmbeddedTx(
|
||||||
testChainID, msgs, []*ecdsa.PrivateKey{testPrivKey1},
|
TestChainID, msgs, []*ecdsa.PrivateKey{TestPrivKey1},
|
||||||
[]int64{0}, []int64{0}, newStdFee(),
|
[]int64{0}, []int64{0}, newStdFee(),
|
||||||
)
|
)
|
||||||
|
|
||||||
signers := etx.(EmbeddedTx).GetRequiredSigners()
|
signers := etx.(EmbeddedTx).GetRequiredSigners()
|
||||||
require.Equal(t, []sdk.AccAddress{sdk.AccAddress(testAddr1.Bytes())}, signers)
|
require.Equal(t, []sdk.AccAddress{sdk.AccAddress(TestAddr1.Bytes())}, signers)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTxDecoder(t *testing.T) {
|
func TestTxDecoder(t *testing.T) {
|
||||||
testCodec := newTestCodec()
|
testCodec := NewTestCodec()
|
||||||
txDecoder := TxDecoder(testCodec, testSDKAddress)
|
txDecoder := TxDecoder(testCodec, TestSDKAddress)
|
||||||
msgs := []sdk.Msg{sdk.NewTestMsg(sdk.AccAddress(testAddr1.Bytes()))}
|
msgs := []sdk.Msg{sdk.NewTestMsg(sdk.AccAddress(TestAddr1.Bytes()))}
|
||||||
|
|
||||||
// create a non-SDK Ethereum transaction
|
// create a non-SDK Ethereum transaction
|
||||||
emintTx := NewTransaction(
|
emintTx := NewTransaction(
|
||||||
uint64(0), testAddr1, sdk.NewInt(10), 100, sdk.NewInt(100), nil,
|
uint64(0), TestAddr1, sdk.NewInt(10), 100, sdk.NewInt(100), nil,
|
||||||
)
|
)
|
||||||
emintTx.Sign(testChainID, testPrivKey1)
|
emintTx.Sign(TestChainID, TestPrivKey1)
|
||||||
|
|
||||||
// require the transaction to properly decode into a Transaction
|
// require the transaction to properly decode into a Transaction
|
||||||
txBytes := testCodec.MustMarshalBinary(emintTx)
|
txBytes := testCodec.MustMarshalBinary(emintTx)
|
||||||
@ -286,7 +140,7 @@ func TestTxDecoder(t *testing.T) {
|
|||||||
|
|
||||||
// create embedded transaction and encode
|
// create embedded transaction and encode
|
||||||
etx := newTestEmbeddedTx(
|
etx := newTestEmbeddedTx(
|
||||||
testChainID, msgs, []*ecdsa.PrivateKey{testPrivKey1},
|
TestChainID, msgs, []*ecdsa.PrivateKey{TestPrivKey1},
|
||||||
[]int64{0}, []int64{0}, newStdFee(),
|
[]int64{0}, []int64{0}, newStdFee(),
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -296,10 +150,10 @@ func TestTxDecoder(t *testing.T) {
|
|||||||
testCodec.UnmarshalBinary(payload, &expectedEtx)
|
testCodec.UnmarshalBinary(payload, &expectedEtx)
|
||||||
|
|
||||||
emintTx = NewTransaction(
|
emintTx = NewTransaction(
|
||||||
uint64(0), testSDKAddress, sdk.NewInt(10), 100,
|
uint64(0), TestSDKAddress, sdk.NewInt(10), 100,
|
||||||
sdk.NewInt(100), payload,
|
sdk.NewInt(100), payload,
|
||||||
)
|
)
|
||||||
emintTx.Sign(testChainID, testPrivKey1)
|
emintTx.Sign(TestChainID, TestPrivKey1)
|
||||||
|
|
||||||
// require the transaction to properly decode into a Transaction
|
// require the transaction to properly decode into a Transaction
|
||||||
txBytes = testCodec.MustMarshalBinary(emintTx)
|
txBytes = testCodec.MustMarshalBinary(emintTx)
|
||||||
@ -314,9 +168,9 @@ func TestTxDecoder(t *testing.T) {
|
|||||||
|
|
||||||
// create a non-SDK Ethereum transaction with an SDK address and garbage payload
|
// create a non-SDK Ethereum transaction with an SDK address and garbage payload
|
||||||
emintTx = NewTransaction(
|
emintTx = NewTransaction(
|
||||||
uint64(0), testSDKAddress, sdk.NewInt(10), 100, sdk.NewInt(100), []byte("garbage"),
|
uint64(0), TestSDKAddress, sdk.NewInt(10), 100, sdk.NewInt(100), []byte("garbage"),
|
||||||
)
|
)
|
||||||
emintTx.Sign(testChainID, testPrivKey1)
|
emintTx.Sign(TestChainID, TestPrivKey1)
|
||||||
|
|
||||||
// require the transaction to fail decoding as the payload is invalid
|
// require the transaction to fail decoding as the payload is invalid
|
||||||
txBytes = testCodec.MustMarshalBinary(emintTx)
|
txBytes = testCodec.MustMarshalBinary(emintTx)
|
||||||
|
@ -10,27 +10,27 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestValidateSigner(t *testing.T) {
|
func TestValidateSigner(t *testing.T) {
|
||||||
msgs := []sdk.Msg{sdk.NewTestMsg(sdk.AccAddress(testAddr1.Bytes()))}
|
msgs := []sdk.Msg{sdk.NewTestMsg(sdk.AccAddress(TestAddr1.Bytes()))}
|
||||||
|
|
||||||
// create message signing structure
|
// create message signing structure
|
||||||
signEtx := EmbeddedTxSign{testChainID.String(), 0, 0, msgs, newStdFee()}
|
signEtx := EmbeddedTxSign{TestChainID.String(), 0, 0, msgs, newStdFee()}
|
||||||
|
|
||||||
// create signing bytes and sign
|
// create signing bytes and sign
|
||||||
signBytes, err := signEtx.Bytes()
|
signBytes, err := signEtx.Bytes()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// require signing not to fail
|
// require signing not to fail
|
||||||
sig, err := ethcrypto.Sign(signBytes, testPrivKey1)
|
sig, err := ethcrypto.Sign(signBytes, TestPrivKey1)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// require signature to be valid
|
// require signature to be valid
|
||||||
err = ValidateSigner(signBytes, sig, testAddr1)
|
err = ValidateSigner(signBytes, sig, TestAddr1)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
sig, err = ethcrypto.Sign(signBytes, testPrivKey2)
|
sig, err = ethcrypto.Sign(signBytes, TestPrivKey2)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// require signature to be invalid
|
// require signature to be invalid
|
||||||
err = ValidateSigner(signBytes, sig, testAddr1)
|
err = ValidateSigner(signBytes, sig, TestAddr1)
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user