diff --git a/Gopkg.lock b/Gopkg.lock index ca2041e69..537e8e980 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -2,58 +2,75 @@ [[projects]] + digest = "1:e92f5581902c345eb4ceffdcd4a854fb8f73cf436d47d837d1ec98ef1fe0a214" name = "github.com/StackExchange/wmi" packages = ["."] + pruneopts = "UT" revision = "5d049714c4a64225c3c79a7cf7d02f7fb5b96338" version = "1.0.0" [[projects]] branch = "master" + digest = "1:7736fc6da04620727f8f3aa2ced8d77be8e074a302820937aa5993848c769b27" name = "github.com/ZondaX/hid-go" packages = ["."] + pruneopts = "UT" revision = "48b08affede2cea076a3cf13b2e3f72ed262b743" [[projects]] branch = "master" + digest = "1:4cf11742b199ab3aacf26b00187e72f7ff8ba2145f363b74f295d54f098f79e4" name = "github.com/agl/ed25519" packages = [ ".", "edwards25519", - "extra25519" + "extra25519", ] + pruneopts = "UT" revision = "5312a61534124124185d41f09206b9fef1d88403" [[projects]] branch = "master" + digest = "1:09a7f74eb6bb3c0f14d8926610c87f569c5cff68e978d30e9a3540aeb626fdf0" name = "github.com/bartekn/go-bip39" packages = ["."] + pruneopts = "UT" revision = "a05967ea095d81c8fe4833776774cfaff8e5036c" [[projects]] branch = "master" + digest = "1:d6afaeed1502aa28e80a4ed0981d570ad91b2579193404256ce672ed0a609e0d" name = "github.com/beorn7/perks" packages = ["quantile"] + pruneopts = "UT" revision = "3a771d992973f24aa725d07868b467d1ddfceafb" [[projects]] + digest = "1:1343a2963481a305ca4d051e84bc2abd16b601ee22ed324f8d605de1adb291b0" name = "github.com/bgentry/speakeasy" packages = ["."] + pruneopts = "UT" revision = "4aabc24848ce5fd31929f7d1e4ea74d3709c14cd" version = "v0.1.0" [[projects]] branch = "master" + digest = "1:c0decf632843204d2b8781de7b26e7038584e2dcccc7e2f401e88ae85b1df2b7" name = "github.com/btcsuite/btcd" packages = ["btcec"] + pruneopts = "UT" revision = "67e573d211ace594f1366b4ce9d39726c4b19bd0" [[projects]] + digest = "1:386de157f7d19259a7f9c81f26ce011223ce0f090353c1152ffdf730d7d10ac2" name = "github.com/btcsuite/btcutil" packages = ["bech32"] + pruneopts = "UT" revision = "d4cc87b860166d00d6b5b9e0d3b3d71d6088d4d4" [[projects]] branch = "irisnet/v0.26.0-iris" + digest = "1:dc540b2f062c26d69b7821a1324ab7afaf04b8920da500e3378300d10e6db324" name = "github.com/cosmos/cosmos-sdk" packages = [ "baseapp", @@ -94,35 +111,45 @@ "x/stake/keeper", "x/stake/querier", "x/stake/tags", - "x/stake/types" + "x/stake/types", ] - revision = "6a94c0fe852604b5d2cb1f0dddb3bd2cd778f2f5" + pruneopts = "UT" + revision = "b352686dab3f9976be1347a860c7aba28c22abe0" source = "https://github.com/irisnet/cosmos-sdk.git" [[projects]] + digest = "1:e8a3550c8786316675ff54ad6f09d265d129c9d986919af7f541afba50d87ce2" name = "github.com/cosmos/go-bip39" packages = ["."] + pruneopts = "UT" revision = "52158e4697b87de16ed390e1bdaf813e581008fa" [[projects]] + digest = "1:a2c1d0e43bd3baaa071d1b9ed72c27d78169b2b269f71c105ac4ba34b1be4a39" name = "github.com/davecgh/go-spew" packages = ["spew"] + pruneopts = "UT" revision = "346938d642f2ec3594ed81d874461961cd0faa76" version = "v1.1.0" [[projects]] + digest = "1:50272737989a0ecdc6529d90e0cdf7dd2378220f1f8fce9870b410ad04d064b7" name = "github.com/emicklei/proto" packages = ["."] + pruneopts = "UT" revision = "31ca1a37608053a92355be293b13f08fe25e526e" version = "v1.6.5" [[projects]] + digest = "1:abeb38ade3f32a92943e5be54f55ed6d6e3b6602761d74b4aab4c9dd45c18abd" name = "github.com/fsnotify/fsnotify" packages = ["."] + pruneopts = "UT" revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" version = "v1.4.7" [[projects]] + digest = "1:fdf5169073fb0ad6dc12a70c249145e30f4058647bea25f0abd48b6d9f228a11" name = "github.com/go-kit/kit" packages = [ "log", @@ -131,33 +158,41 @@ "metrics", "metrics/discard", "metrics/internal/lv", - "metrics/prometheus" + "metrics/prometheus", ] + pruneopts = "UT" revision = "4dc7be5d2d12881735283bcab7352178e190fc71" version = "v0.6.0" [[projects]] + digest = "1:31a18dae27a29aa074515e43a443abfd2ba6deb6d69309d8d7ce789c45f34659" name = "github.com/go-logfmt/logfmt" packages = ["."] + pruneopts = "UT" revision = "390ab7935ee28ec6b286364bba9b4dd6410cb3d5" version = "v0.3.0" [[projects]] + digest = "1:64a5a67c69b70c2420e607a8545d674a23778ed9c3e80607bfd17b77c6c87f6a" name = "github.com/go-ole/go-ole" packages = [ ".", - "oleutil" + "oleutil", ] + pruneopts = "UT" revision = "a41e3c4b706f6ae8dfbff342b06e40fa4d2d0506" version = "v1.2.1" [[projects]] + digest = "1:586ea76dbd0374d6fb649a91d70d652b7fe0ccffb8910a77468e7702e7901f3d" name = "github.com/go-stack/stack" packages = ["."] + pruneopts = "UT" revision = "2fee6af1a9795aafbe0253a0cfbdf668e1fb8a9a" version = "v1.8.0" [[projects]] + digest = "1:35621fe20f140f05a0c4ef662c26c0ab4ee50bca78aa30fe87d33120bd28165e" name = "github.com/gogo/protobuf" packages = [ "gogoproto", @@ -165,54 +200,68 @@ "proto", "protoc-gen-gogo/descriptor", "sortkeys", - "types" + "types", ] + pruneopts = "UT" revision = "636bf0302bc95575d69441b25a2603156ffdddf1" version = "v1.1.1" [[projects]] + digest = "1:17fe264ee908afc795734e8c4e63db2accabaf57326dbf21763a7d6b86096260" name = "github.com/golang/protobuf" packages = [ "proto", "ptypes", "ptypes/any", "ptypes/duration", - "ptypes/timestamp" + "ptypes/timestamp", ] + pruneopts = "UT" revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265" version = "v1.1.0" [[projects]] branch = "master" + digest = "1:4a0c6bb4805508a6287675fac876be2ac1182539ca8a32468d8128882e9d5009" name = "github.com/golang/snappy" packages = ["."] + pruneopts = "UT" revision = "2e65f85255dbc3072edf28d6b5b8efc472979f5a" [[projects]] + digest = "1:c79fb010be38a59d657c48c6ba1d003a8aa651fa56b579d959d74573b7dff8e1" name = "github.com/gorilla/context" packages = ["."] + pruneopts = "UT" revision = "08b5f424b9271eedf6f9f0ce86cb9396ed337a42" version = "v1.1.1" [[projects]] + digest = "1:e73f5b0152105f18bc131fba127d9949305c8693f8a762588a82a48f61756f5f" name = "github.com/gorilla/mux" packages = ["."] + pruneopts = "UT" revision = "e3702bed27f0d39777b0b37b664b6280e8ef8fbf" version = "v1.6.2" [[projects]] + digest = "1:43dd08a10854b2056e615d1b1d22ac94559d822e1f8b6fcc92c1a1057e85188e" name = "github.com/gorilla/websocket" packages = ["."] + pruneopts = "UT" revision = "ea4d1f681babbce9545c9c5f3d5194a789c89f5b" version = "v1.2.0" [[projects]] branch = "master" + digest = "1:e3ddd1f59d3c84917c99ecb1c3420aa6899f6df7495ba9414c13732b2e9568dd" name = "github.com/gxed/hashland" packages = ["keccakpg"] + pruneopts = "UT" revision = "d9f6b97f8db22dd1e090fd0bbbe98f09cc7dd0a8" [[projects]] + digest = "1:ea40c24cdbacd054a6ae9de03e62c5f252479b96c716375aace5c120d68647c8" name = "github.com/hashicorp/hcl" packages = [ ".", @@ -223,211 +272,275 @@ "hcl/token", "json/parser", "json/scanner", - "json/token" + "json/token", ] + pruneopts = "UT" revision = "8cb6e5b959231cc1119e43259c4a608f9c51a241" version = "v1.0.0" [[projects]] + digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be" name = "github.com/inconshreveable/mousetrap" packages = ["."] + pruneopts = "UT" revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" version = "v1.0" [[projects]] + digest = "1:0b9cab5474015038cc258d2af017ebaa01f2fb387ca2ab7eb78516f46669954c" name = "github.com/ipfs/go-ipfs-api" packages = ["."] + pruneopts = "UT" revision = "c26fc48ff114bc48b2cc357f8d12484397f5738d" version = "v1.3.5" [[projects]] + digest = "1:960df862bef266ca070f8ed90aeb274edc89e9fd8fa2e12472e59845c77a4dab" name = "github.com/ipfs/go-ipfs-cmdkit" packages = ["files"] + pruneopts = "UT" revision = "23a066ae3c5d2db34e61ce8c75d71a4d99ee4864" version = "v1.1.3" [[projects]] branch = "master" + digest = "1:39b27d1381a30421f9813967a5866fba35dc1d4df43a6eefe3b7a5444cb07214" name = "github.com/jmhodges/levigo" packages = ["."] + pruneopts = "UT" revision = "c42d9e0ca023e2198120196f842701bb4c55d7b9" [[projects]] branch = "master" + digest = "1:a64e323dc06b73892e5bb5d040ced475c4645d456038333883f58934abbf6f72" name = "github.com/kr/logfmt" packages = ["."] + pruneopts = "UT" revision = "b84e30acd515aadc4b783ad4ff83aff3299bdfe0" [[projects]] + digest = "1:19f2d2506cc0f9a233c9c0753e8c3fd5afa88afb43ff7b795cbba3629d0e96b5" name = "github.com/libp2p/go-flow-metrics" packages = ["."] + pruneopts = "UT" revision = "cc546389dcf06b4bcbf6b8594069588e5c8a1451" version = "v0.2.0" [[projects]] + digest = "1:4ff86c6d6dd8df23a58e6b6060fea5f150d1a502cdfe8a3e9efd5d25339196c6" name = "github.com/libp2p/go-libp2p-crypto" packages = [ ".", - "pb" + "pb", ] + pruneopts = "UT" revision = "274de1bb6c27780863df6b230c91324ab481dab2" version = "v2.0.1" [[projects]] + digest = "1:e01814b1390e3abc93ca170141d457fab1dcc0c532cdfdd269be58fb2cd6a9f4" name = "github.com/libp2p/go-libp2p-metrics" packages = ["."] + pruneopts = "UT" revision = "20c0e3fed14ddf84ac8192038accfd393610ed82" version = "v2.1.7" [[projects]] + digest = "1:d59d3f32a53e3d1ef4f19f92c8f4cbccabfae6c965760577958b2fb937fede98" name = "github.com/libp2p/go-libp2p-peer" packages = ["."] + pruneopts = "UT" revision = "dd9b45c0649b38aebe65f98cb460676b4214a42c" version = "v2.4.0" [[projects]] + digest = "1:99c29233479cb14a63c7cb6b49927a60ae9d6b4b36d74deb12cc45ce503ddeb5" name = "github.com/libp2p/go-libp2p-protocol" packages = ["."] + pruneopts = "UT" revision = "e34f0d7468b3519bf9bf4e43c1d028ce651eab51" version = "v1.0.0" [[projects]] + digest = "1:0c84c529a410cea768ebeaf3ea70632f2d8df41662003204045ff1a32cd79cda" name = "github.com/libp2p/go-libp2p-pubsub" packages = ["pb"] + pruneopts = "UT" revision = "3d408775deaf28da57cc356d37f2b8bf9c57db64" version = "v0.10.2" [[projects]] + digest = "1:c568d7727aa262c32bdf8a3f7db83614f7af0ed661474b24588de635c20024c7" name = "github.com/magiconair/properties" packages = ["."] + pruneopts = "UT" revision = "c2353362d570a7bfa228149c62842019201cfb71" version = "v1.8.0" [[projects]] + digest = "1:0981502f9816113c9c8c4ac301583841855c8cf4da8c72f696b3ebedf6d0e4e5" name = "github.com/mattn/go-isatty" packages = ["."] + pruneopts = "UT" revision = "6ca4dbf54d38eea1a992b3c722a76a5d1c4cb25c" version = "v0.0.4" [[projects]] + digest = "1:ff5ebae34cfbf047d505ee150de27e60570e8c394b3b8fdbb720ff6ac71985fc" name = "github.com/matttproud/golang_protobuf_extensions" packages = ["pbutil"] + pruneopts = "UT" revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" version = "v1.0.1" [[projects]] branch = "master" + digest = "1:130cefe87d7eeefc824978dcb78e35672d4c49a11f25c153fbf0cfd952756fa3" name = "github.com/minio/blake2b-simd" packages = ["."] + pruneopts = "UT" revision = "3f5f724cb5b182a5c278d6d3d55b40e7f8c2efb4" [[projects]] branch = "master" + digest = "1:445210ef1e723060b3ebeb691648b5090f154992ee35f7065b70a6a5a96a3bb8" name = "github.com/minio/sha256-simd" packages = ["."] + pruneopts = "UT" revision = "51976451ce1942acbb55707a983ed232fa027110" [[projects]] + digest = "1:78bbb1ba5b7c3f2ed0ea1eab57bdd3859aec7e177811563edc41198a760b06af" name = "github.com/mitchellh/go-homedir" packages = ["."] + pruneopts = "UT" revision = "ae18d6b8b3205b561c79e8e5f69bff09736185f4" version = "v1.0.0" [[projects]] + digest = "1:53bc4cd4914cd7cd52139990d5170d6dc99067ae31c56530621b18b35fc30318" name = "github.com/mitchellh/mapstructure" packages = ["."] + pruneopts = "UT" revision = "3536a929edddb9a5b34bd6861dc4a9647cb459fe" version = "v1.1.2" [[projects]] + digest = "1:cf5b7fbff2c87cff6c0e11f87b30edc21abc6592e6a76f41003ca6d5a712cf48" name = "github.com/mr-tron/base58" packages = ["base58"] + pruneopts = "UT" revision = "89529c6904fcd077434931b4eac8b4b2f0991baf" version = "v1.1.0" [[projects]] + digest = "1:e54be212eca970f4d5d39899666aef429c437969783e360a0cab075ba1423a80" name = "github.com/multiformats/go-multiaddr" packages = ["."] + pruneopts = "UT" revision = "2b4e098f3e0aa2c8bc960f0e4bdc3247efc3749c" version = "v1.3.0" [[projects]] + digest = "1:d395f9e8e637fe576f096f6cc65862dc6617236316828032b5a26b42bc9a62a0" name = "github.com/multiformats/go-multiaddr-net" packages = ["."] + pruneopts = "UT" revision = "cba4f9fea8613343eb7ecc4ddadd8e7298a00c39" version = "v1.6.3" [[projects]] + digest = "1:c0ea71365e7d0e63a2e8f48e6fc2ba92f2f2b739bbeb3cdabdcd719037e175c2" name = "github.com/multiformats/go-multihash" packages = ["."] + pruneopts = "UT" revision = "8be2a682ab9f254311de1375145a2f78a809b07d" version = "v1.0.8" [[projects]] + digest = "1:95741de3af260a92cc5c7f3f3061e85273f5a81b5db20d4bd68da74bd521675e" name = "github.com/pelletier/go-toml" packages = ["."] + pruneopts = "UT" revision = "c01d1270ff3e442a8a57cddc1c92dc1138598194" version = "v1.2.0" [[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:c1a04665f9613e082e1209cf288bf64f4068dcd6c87a64bf1c4ff006ad422ba0" name = "github.com/prometheus/client_golang" packages = [ "prometheus", - "prometheus/promhttp" + "prometheus/promhttp", ] + pruneopts = "UT" revision = "ae27198cdd90bf12cd134ad79d1366a6cf49f632" [[projects]] branch = "master" + digest = "1:2d5cd61daa5565187e1d96bae64dbbc6080dacf741448e9629c64fd93203b0d4" name = "github.com/prometheus/client_model" packages = ["go"] + pruneopts = "UT" revision = "5c3871d89910bfb32f5fcab2aa4b9ec68e65a99f" [[projects]] branch = "master" + digest = "1:db712fde5d12d6cdbdf14b777f0c230f4ff5ab0be8e35b239fc319953ed577a4" name = "github.com/prometheus/common" packages = [ "expfmt", "internal/bitbucket.org/ww/goautoneg", - "model" + "model", ] + pruneopts = "UT" revision = "7e9e6cabbd393fc208072eedef99188d0ce788b6" [[projects]] branch = "master" + digest = "1:ef74914912f99c79434d9c09658274678bc85080ebe3ab32bec3940ebce5e1fc" name = "github.com/prometheus/procfs" packages = [ ".", "internal/util", "nfs", - "xfs" + "xfs", ] + pruneopts = "UT" revision = "185b4288413d2a0dd0806f78c90dde719829e5ae" [[projects]] + digest = "1:ea0700160aca4ef099f4e06686a665a87691f4248dddd40796925eda2e46bd64" name = "github.com/rakyll/statik" packages = ["fs"] + pruneopts = "UT" revision = "aa8a7b1baecd0f31a436bf7956fcdcc609a83035" version = "v0.1.4" [[projects]] + digest = "1:c4556a44e350b50a490544d9b06e9fba9c286c21d6c0e47f54f3a9214597298c" name = "github.com/rcrowley/go-metrics" packages = ["."] + pruneopts = "UT" revision = "e2704e165165ec55d062f5919b4b29494e9fa790" [[projects]] + digest = "1:3fb45284d554f369d08136a0fd4d01f50897f6f79469358c41fb5a30a6379dfe" name = "github.com/shirou/gopsutil" packages = [ "cpu", @@ -436,72 +549,92 @@ "internal/common", "mem", "net", - "process" + "process", ] + pruneopts = "UT" revision = "3ec50d2876a36047b2ca39f955ba88fb7a455e92" version = "v2.18.10" [[projects]] branch = "master" + digest = "1:99c6a6dab47067c9b898e8c8b13d130c6ab4ffbcc4b7cc6236c2cd0b1e344f5b" name = "github.com/shirou/w32" packages = ["."] + pruneopts = "UT" revision = "bb4de0191aa41b5507caa14b0650cdbddcd9280b" [[projects]] + digest = "1:919bb3aa6d9d0b67648c219fa4925312bc3c2872da19e818fa769e9c97a2b643" name = "github.com/spaolacci/murmur3" packages = ["."] + pruneopts = "UT" revision = "9f5d223c60793748f04a9d5b4b4eacddfc1f755d" version = "v1.1" [[projects]] + digest = "1:6a4a11ba764a56d2758899ec6f3848d24698d48442ebce85ee7a3f63284526cd" name = "github.com/spf13/afero" packages = [ ".", - "mem" + "mem", ] + pruneopts = "UT" revision = "d40851caa0d747393da1ffb28f7f9d8b4eeffebd" version = "v1.1.2" [[projects]] + digest = "1:08d65904057412fc0270fc4812a1c90c594186819243160dc779a402d4b6d0bc" name = "github.com/spf13/cast" packages = ["."] + pruneopts = "UT" revision = "8c9545af88b134710ab1cd196795e7f2388358d7" version = "v1.3.0" [[projects]] + digest = "1:7ffc0983035bc7e297da3688d9fe19d60a420e9c38bef23f845c53788ed6a05e" name = "github.com/spf13/cobra" packages = ["."] + pruneopts = "UT" revision = "7b2c5ac9fc04fc5efafb60700713d4fa609b777b" version = "v0.0.1" [[projects]] + digest = "1:68ea4e23713989dc20b1bded5d9da2c5f9be14ff9885beef481848edd18c26cb" name = "github.com/spf13/jwalterweatherman" packages = ["."] + pruneopts = "UT" revision = "4a4406e478ca629068e7768fc33f3f044173c0a6" version = "v1.0.0" [[projects]] + digest = "1:c1b1102241e7f645bc8e0c22ae352e8f0dc6484b6cb4d132fa9f24174e0119e2" name = "github.com/spf13/pflag" packages = ["."] + pruneopts = "UT" revision = "298182f68c66c05229eb03ac171abe6e309ee79a" version = "v1.0.3" [[projects]] + digest = "1:f8e1a678a2571e265f4bf91a3e5e32aa6b1474a55cb0ea849750cc177b664d96" name = "github.com/spf13/viper" packages = ["."] + pruneopts = "UT" revision = "25b30aa063fc18e48662b86996252eabdcf2f0c7" version = "v1.0.0" [[projects]] + digest = "1:7e8d267900c7fa7f35129a2a37596e38ed0f11ca746d6d9ba727980ee138f9f6" name = "github.com/stretchr/testify" packages = [ "assert", - "require" + "require", ] + pruneopts = "UT" revision = "12b6f73e6084dad08a7c6e575284b177ecafbc71" version = "v1.2.1" [[projects]] + digest = "1:b3cfb8d82b1601a846417c3f31c03a7961862cb2c98dcf0959c473843e6d9a2b" name = "github.com/syndtr/goleveldb" packages = [ "leveldb", @@ -515,29 +648,37 @@ "leveldb/opt", "leveldb/storage", "leveldb/table", - "leveldb/util" + "leveldb/util", ] + pruneopts = "UT" revision = "c4c61651e9e37fa117f53c5a906d3b63090d8445" [[projects]] + digest = "1:605b6546f3f43745695298ec2d342d3e952b6d91cdf9f349bea9315f677d759f" name = "github.com/tendermint/btcd" packages = ["btcec"] + pruneopts = "UT" revision = "e5840949ff4fff0c56f9b6a541e22b63581ea9df" [[projects]] + digest = "1:10b3a599325740c84a7c81f3f3cb2e1fdb70b3ea01b7fa28495567a2519df431" name = "github.com/tendermint/go-amino" packages = ["."] + pruneopts = "UT" revision = "6dcc6ddc143e116455c94b25c1004c99e0d0ca12" version = "v0.14.0" [[projects]] + digest = "1:9f8c4c93658315a795ffd3e0c943d39f78067dd8382b8d7bcfaf6686b92f3978" name = "github.com/tendermint/iavl" packages = ["."] + pruneopts = "UT" revision = "fa74114f764f9827c4ad5573f990ed25bf8c4bac" version = "v0.11.1" [[projects]] branch = "irisnet/v0.26.1-rc0-iris" + digest = "1:83882681ddd65a2de8c1be7eae0f48075601077d85cc37050f343d00ab862bac" name = "github.com/tendermint/tendermint" packages = [ "abci/client", @@ -600,30 +741,38 @@ "state/txindex/null", "types", "types/time", - "version" + "version", ] + pruneopts = "UT" revision = "164fd2a7e53bf2c47b447dfb1335ac1c1d443e42" source = "https://github.com/irisnet/tendermint.git" [[projects]] + digest = "1:bf6d9a827ea3cad964c2f863302e4f6823170d0b5ed16f72cf1184a7c615067e" name = "github.com/tendermint/tmlibs" packages = ["cli"] + pruneopts = "UT" revision = "49596e0a1f48866603813df843c9409fc19805c6" version = "v0.9.0" [[projects]] branch = "master" + digest = "1:e2599924072678810fe41b00dead8e11e95fa55be2dbc01b5309c4bf04f2209c" name = "github.com/whyrusleeping/tar-utils" packages = ["."] + pruneopts = "UT" revision = "8c6c8ba81d5c71fd69c0f48dbde4b2fb422b6dfc" [[projects]] + digest = "1:7886f86064faff6f8d08a3eb0e8c773648ff5a2e27730831e2bfbf07467f6666" name = "github.com/zondax/ledger-goclient" packages = ["."] + pruneopts = "UT" revision = "58598458c11bc0ad1c1b8dac3dc3e11eaf270b79" version = "v0.1.0" [[projects]] + digest = "1:466100a50f42240378e484936fc7273b41ba7d9da1eec61c4b31156a7b118dd1" name = "golang.org/x/crypto" packages = [ "bcrypt", @@ -644,12 +793,14 @@ "poly1305", "ripemd160", "salsa20/salsa", - "sha3" + "sha3", ] + pruneopts = "UT" revision = "3764759f34a542a3aef74d6b02e35be7ab893bba" source = "https://github.com/tendermint/crypto" [[projects]] + digest = "1:d36f55a999540d29b6ea3c2ea29d71c76b1d9853fdcd3e5c5cb4836f2ba118f1" name = "golang.org/x/net" packages = [ "context", @@ -659,21 +810,25 @@ "idna", "internal/timeseries", "netutil", - "trace" + "trace", ] + pruneopts = "UT" revision = "292b43bbf7cb8d35ddf40f8d5100ef3837cced3f" [[projects]] branch = "master" + digest = "1:7e2cb6c95ac3f1ff730a61ec4ce423a1857c7c6c28abafd8fabae25d80ccb667" name = "golang.org/x/sys" packages = [ "cpu", "unix", - "windows" + "windows", ] + pruneopts = "UT" revision = "9b800f95dbbc54abff0acf7ee32d88ba4e328c89" [[projects]] + digest = "1:a2ab62866c75542dd18d2b069fec854577a20211d7c0ea6ae746072a1dccdd18" name = "golang.org/x/text" packages = [ "collate", @@ -689,17 +844,21 @@ "unicode/bidi", "unicode/cldr", "unicode/norm", - "unicode/rangetable" + "unicode/rangetable", ] + pruneopts = "UT" revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" version = "v0.3.0" [[projects]] + digest = "1:077c1c599507b3b3e9156d17d36e1e61928ee9b53a5b420f10f28ebd4a0b275c" name = "google.golang.org/genproto" packages = ["googleapis/rpc/status"] + pruneopts = "UT" revision = "383e8b2c3b9e36c4076b235b32537292176bae20" [[projects]] + digest = "1:2dab32a43451e320e49608ff4542fdfc653c95dcc35d0065ec9c6c3dd540ed74" name = "google.golang.org/grpc" packages = [ ".", @@ -726,20 +885,105 @@ "stats", "status", "tap", - "transport" + "transport", ] + pruneopts = "UT" revision = "168a6198bcb0ef175f7dacec0b8691fc141dc9b8" version = "v1.13.0" [[projects]] + digest = "1:342378ac4dcb378a5448dd723f0784ae519383532f5e70ade24132c4c8693202" name = "gopkg.in/yaml.v2" packages = ["."] + pruneopts = "UT" revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183" version = "v2.2.1" [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "1834e1dfc8c5f1011a21674f2a0f2f932c7a0b0749d835006fca5dd7b28827cb" + input-imports = [ + "github.com/bgentry/speakeasy", + "github.com/cosmos/cosmos-sdk/baseapp", + "github.com/cosmos/cosmos-sdk/client", + "github.com/cosmos/cosmos-sdk/client/keys", + "github.com/cosmos/cosmos-sdk/client/rpc", + "github.com/cosmos/cosmos-sdk/client/tx", + "github.com/cosmos/cosmos-sdk/codec", + "github.com/cosmos/cosmos-sdk/crypto", + "github.com/cosmos/cosmos-sdk/crypto/keys", + "github.com/cosmos/cosmos-sdk/crypto/keys/keyerror", + "github.com/cosmos/cosmos-sdk/server", + "github.com/cosmos/cosmos-sdk/server/mock", + "github.com/cosmos/cosmos-sdk/store", + "github.com/cosmos/cosmos-sdk/tests", + "github.com/cosmos/cosmos-sdk/types", + "github.com/cosmos/cosmos-sdk/x/auth", + "github.com/cosmos/cosmos-sdk/x/auth/client/cli", + "github.com/cosmos/cosmos-sdk/x/auth/client/txbuilder", + "github.com/cosmos/cosmos-sdk/x/bank", + "github.com/cosmos/cosmos-sdk/x/distribution", + "github.com/cosmos/cosmos-sdk/x/distribution/types", + "github.com/cosmos/cosmos-sdk/x/ibc", + "github.com/cosmos/cosmos-sdk/x/mint", + "github.com/cosmos/cosmos-sdk/x/params", + "github.com/cosmos/cosmos-sdk/x/slashing", + "github.com/cosmos/cosmos-sdk/x/stake", + "github.com/cosmos/cosmos-sdk/x/stake/client/rest", + "github.com/cosmos/cosmos-sdk/x/stake/tags", + "github.com/cosmos/cosmos-sdk/x/stake/types", + "github.com/emicklei/proto", + "github.com/go-kit/kit/metrics", + "github.com/go-kit/kit/metrics/prometheus", + "github.com/gorilla/mux", + "github.com/ipfs/go-ipfs-api", + "github.com/mattn/go-isatty", + "github.com/mitchellh/go-homedir", + "github.com/pelletier/go-toml", + "github.com/pkg/errors", + "github.com/prometheus/client_golang/prometheus", + "github.com/prometheus/client_golang/prometheus/promhttp", + "github.com/rakyll/statik/fs", + "github.com/shirou/gopsutil/cpu", + "github.com/shirou/gopsutil/disk", + "github.com/shirou/gopsutil/mem", + "github.com/shirou/gopsutil/process", + "github.com/spf13/cobra", + "github.com/spf13/pflag", + "github.com/spf13/viper", + "github.com/stretchr/testify/assert", + "github.com/stretchr/testify/require", + "github.com/tendermint/go-amino", + "github.com/tendermint/tendermint/abci/server", + "github.com/tendermint/tendermint/abci/types", + "github.com/tendermint/tendermint/blockchain", + "github.com/tendermint/tendermint/cmd/tendermint/commands", + "github.com/tendermint/tendermint/config", + "github.com/tendermint/tendermint/consensus", + "github.com/tendermint/tendermint/crypto", + "github.com/tendermint/tendermint/crypto/ed25519", + "github.com/tendermint/tendermint/crypto/merkle", + "github.com/tendermint/tendermint/crypto/secp256k1", + "github.com/tendermint/tendermint/crypto/tmhash", + "github.com/tendermint/tendermint/libs/cli", + "github.com/tendermint/tendermint/libs/common", + "github.com/tendermint/tendermint/libs/db", + "github.com/tendermint/tendermint/libs/log", + "github.com/tendermint/tendermint/lite", + "github.com/tendermint/tendermint/lite/errors", + "github.com/tendermint/tendermint/lite/proxy", + "github.com/tendermint/tendermint/mempool", + "github.com/tendermint/tendermint/node", + "github.com/tendermint/tendermint/p2p", + "github.com/tendermint/tendermint/privval", + "github.com/tendermint/tendermint/proxy", + "github.com/tendermint/tendermint/rpc/client", + "github.com/tendermint/tendermint/rpc/core/types", + "github.com/tendermint/tendermint/rpc/lib/server", + "github.com/tendermint/tendermint/state", + "github.com/tendermint/tendermint/types", + "github.com/tendermint/tendermint/types/time", + "github.com/tendermint/tmlibs/cli", + ] solver-name = "gps-cdcl" solver-version = 1 diff --git a/app/app.go b/app/app.go index 0bb72ceae..08f170286 100644 --- a/app/app.go +++ b/app/app.go @@ -247,7 +247,7 @@ func NewIrisApp(logger log.Logger, db dbm.DB, traceStore io.Writer, baseAppOptio iparam.SetParamReadWriter(app.paramsKeeper.Subspace(iparam.SignalParamspace).WithTypeTable( params.NewTypeTable( - upgradeparams.CurrentUpgradeProposalIdParameter.GetStoreKey(), int64((0)), + upgradeparams.CurrentUpgradeProposalIdParameter.GetStoreKey(), uint64((0)), upgradeparams.ProposalAcceptHeightParameter.GetStoreKey(), int64(0), upgradeparams.SwitchPeriodParameter.GetStoreKey(), int64(0), )), @@ -382,7 +382,6 @@ func (app *IrisApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci validators = app.stakeKeeper.ApplyAndReturnValidatorSetUpdates(ctx) } - app.slashingKeeper.AddValidators(ctx, validators) // sanity check if len(req.Validators) > 0 { @@ -426,6 +425,7 @@ func (app *IrisApp) ExportAppStateAndValidators() (appState json.RawMessage, val mint.ExportGenesis(ctx, app.mintKeeper), distr.ExportGenesis(ctx, app.distrKeeper), gov.ExportGenesis(ctx, app.govKeeper), + upgrade.WriteGenesis(ctx, app.upgradeKeeper), slashing.ExportGenesis(ctx, app.slashingKeeper), ) appState, err = codec.MarshalJSONIndent(app.cdc, genState) diff --git a/app/genesis.go b/app/genesis.go index ea6c7165a..3ad0e3a72 100644 --- a/app/genesis.go +++ b/app/genesis.go @@ -9,6 +9,7 @@ import ( "path/filepath" "sort" "strings" + "time" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server" @@ -19,14 +20,15 @@ import ( "github.com/cosmos/cosmos-sdk/x/slashing" "github.com/cosmos/cosmos-sdk/x/stake" "github.com/irisnet/irishub/modules/gov" + "github.com/irisnet/irishub/modules/iservice" "github.com/irisnet/irishub/modules/upgrade" "github.com/irisnet/irishub/types" - "time" - "github.com/irisnet/irishub/modules/iservice" + tmtypes "github.com/tendermint/tendermint/types" ) var ( Denom = "iris" + StakeDenom = Denom + "-" + types.Atto FeeAmt = int64(100) IrisCt = types.NewDefaultCoinType(Denom) FreeFermionVal, _ = IrisCt.ConvertToMinCoin(fmt.Sprintf("%d%s", FeeAmt, Denom)) @@ -42,6 +44,7 @@ const ( // State to Unmarshal type GenesisState struct { Accounts []GenesisAccount `json:"accounts"` + AuthData auth.GenesisState `json:"auth"` StakeData stake.GenesisState `json:"stake"` MintData mint.GenesisState `json:"mint"` DistrData distr.GenesisState `json:"distr"` @@ -52,11 +55,12 @@ type GenesisState struct { GenTxs []json.RawMessage `json:"gentxs"` } -func NewGenesisState(accounts []GenesisAccount, stakeData stake.GenesisState, mintData mint.GenesisState, +func NewGenesisState(accounts []GenesisAccount, authData auth.GenesisState, stakeData stake.GenesisState, mintData mint.GenesisState, distrData distr.GenesisState, govData gov.GenesisState, upgradeData upgrade.GenesisState, slashingData slashing.GenesisState) GenesisState { return GenesisState{ Accounts: accounts, + AuthData: authData, StakeData: stakeData, MintData: mintData, DistrData: distrData, @@ -68,29 +72,51 @@ func NewGenesisState(accounts []GenesisAccount, stakeData stake.GenesisState, mi // GenesisAccount doesn't need pubkey or sequence type GenesisAccount struct { - Address sdk.AccAddress `json:"address"` - Coins sdk.Coins `json:"coins"` + Address sdk.AccAddress `json:"address"` + Coins sdk.Coins `json:"coins"` + Sequence int64 `json:"sequence_number"` + AccountNumber int64 `json:"account_number"` } func NewGenesisAccount(acc *auth.BaseAccount) GenesisAccount { return GenesisAccount{ - Address: acc.Address, - Coins: acc.Coins, + Address: acc.Address, + Coins: acc.Coins, + AccountNumber: acc.AccountNumber, + Sequence: acc.Sequence, } } func NewGenesisAccountI(acc auth.Account) GenesisAccount { return GenesisAccount{ - Address: acc.GetAddress(), - Coins: acc.GetCoins(), + Address: acc.GetAddress(), + Coins: acc.GetCoins(), + AccountNumber: acc.GetAccountNumber(), + Sequence: acc.GetSequence(), } } // convert GenesisAccount to auth.BaseAccount func (ga *GenesisAccount) ToAccount() (acc *auth.BaseAccount) { return &auth.BaseAccount{ - Address: ga.Address, - Coins: ga.Coins.Sort(), + Address: ga.Address, + Coins: ga.Coins.Sort(), + AccountNumber: ga.AccountNumber, + Sequence: ga.Sequence, + } +} + +// NewDefaultGenesisState generates the default state for gaia. +func NewDefaultGenesisState() GenesisState { + return GenesisState{ + Accounts: nil, + StakeData: createStakeGenesisState(), + MintData: createMintGenesisState(), + DistrData: distr.DefaultGenesisState(), + GovData: gov.DefaultGenesisState(), + UpgradeData: upgrade.DefaultGenesisState(), + SlashingData: slashing.DefaultGenesisState(), + GenTxs: nil, } } @@ -103,65 +129,53 @@ func IrisAppInit() server.AppInit { // Create the core parameters for genesis initialization for iris // note that the pubkey input is this machines pubkey -func IrisAppGenState(cdc *codec.Codec, appGenTxs []json.RawMessage) (genesisState GenesisState, err error) { - if len(appGenTxs) == 0 { - err = errors.New("must provide at least genesis transaction") - return +func IrisAppGenState(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTxs []json.RawMessage) ( + genesisState GenesisState, err error) { + if err = cdc.UnmarshalJSON(genDoc.AppState, &genesisState); err != nil { + return genesisState, err } - // start with the default staking genesis state - stakeData := createGenesisState() - slashingData := slashing.DefaultGenesisState() - - // get genesis flag account information - genaccs := make([]GenesisAccount, len(appGenTxs)) + // if there are no gen txs to be processed, return the default empty state + if len(appGenTxs) == 0 { + return genesisState, errors.New("there must be at least one genesis tx") + } - for i, appGenTx := range appGenTxs { + stakeData := genesisState.StakeData + for i, genTx := range appGenTxs { var tx auth.StdTx - err = cdc.UnmarshalJSON(appGenTx, &tx) - if err != nil { - return + if err := cdc.UnmarshalJSON(genTx, &tx); err != nil { + return genesisState, err } msgs := tx.GetMsgs() if len(msgs) != 1 { - err = errors.New("must provide genesis StdTx with exactly 1 CreateValidator message") - return + return genesisState, errors.New( + "must provide genesis StdTx with exactly 1 CreateValidator message") + } + if _, ok := msgs[0].(stake.MsgCreateValidator); !ok { + return genesisState, fmt.Errorf( + "Genesis transaction %v does not contain a MsgCreateValidator", i) } - msg := msgs[0].(stake.MsgCreateValidator) - - // create the genesis account, give'm few iris token and a buncha token with there name - genaccs[i] = genesisAccountFromMsgCreateValidator(msg, FreeFermionAcc.Amount) - stakeData.Pool.LooseTokens = stakeData.Pool.LooseTokens.Add(sdk.NewDecFromInt(FreeFermionAcc.Amount)) // increase the supply } - // create the final app state - genesisState = GenesisState{ - Accounts: genaccs, - StakeData: stakeData, - MintData: mint.GenesisState{ - Minter: mint.InitialMinter(), - Params: mint.Params{ - MintDenom: "iris-atto", - InflationRateChange: sdk.NewDecWithPrec(13, 2), - InflationMax: sdk.NewDecWithPrec(20, 2), - InflationMin: sdk.NewDecWithPrec(7, 2), - GoalBonded: sdk.NewDecWithPrec(67, 2), - }, - }, - DistrData: distr.DefaultGenesisState(), - GovData: gov.DefaultGenesisState(), - UpgradeData: upgrade.DefaultGenesisState(), - SlashingData: slashingData, - IserviceData: iservice.DefaultGenesisState(), - GenTxs: appGenTxs, + for _, acc := range genesisState.Accounts { + // create the genesis account, give'm few iris-atto and a buncha token with there name + for _, coin := range acc.Coins { + if coin.Denom == StakeDenom { + stakeData.Pool.LooseTokens = stakeData.Pool.LooseTokens. + Add(sdk.NewDecFromInt(coin.Amount)) // increase the supply + } + } } - return + genesisState.StakeData = stakeData + genesisState.GenTxs = appGenTxs + genesisState.UpgradeData = genesisState.UpgradeData + return genesisState, nil } func genesisAccountFromMsgCreateValidator(msg stake.MsgCreateValidator, amount sdk.Int) GenesisAccount { accAuth := auth.NewBaseAccountWithAddress(sdk.AccAddress(msg.ValidatorAddr)) accAuth.Coins = []sdk.Coin{ - {"iris-atto", amount}, + {StakeDenom, amount}, } return NewGenesisAccount(&accAuth) } @@ -197,10 +211,11 @@ func validateGenesisStateAccounts(accs []GenesisAccount) (err error) { } // IrisAppGenState but with JSON -func IrisAppGenStateJSON(cdc *codec.Codec, appGenTxs []json.RawMessage) (appState json.RawMessage, err error) { +func IrisAppGenStateJSON(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTxs []json.RawMessage) ( + appState json.RawMessage, err error) { // create the final app state - genesisState, err := IrisAppGenState(cdc, appGenTxs) + genesisState, err := IrisAppGenState(cdc, genDoc, appGenTxs) if err != nil { return nil, err } @@ -208,17 +223,33 @@ func IrisAppGenStateJSON(cdc *codec.Codec, appGenTxs []json.RawMessage) (appStat return } -// CollectStdTxs processes and validates application's genesis StdTxs and returns the list of validators, -// appGenTxs, and persistent peers required to generate genesis.json. -func CollectStdTxs(moniker string, genTxsDir string, cdc *codec.Codec) ( +// CollectStdTxs processes and validates application's genesis StdTxs and returns +// the list of appGenTxs, and persistent peers required to generate genesis.json. +func CollectStdTxs(cdc *codec.Codec, moniker string, genTxsDir string, genDoc tmtypes.GenesisDoc) ( appGenTxs []auth.StdTx, persistentPeers string, err error) { + var fos []os.FileInfo fos, err = ioutil.ReadDir(genTxsDir) if err != nil { - return + return appGenTxs, persistentPeers, err } - var addresses []string + // prepare a map of all accounts in genesis state to then validate + // against the validators addresses + var appState GenesisState + if err := cdc.UnmarshalJSON(genDoc.AppState, &appState); err != nil { + return appGenTxs, persistentPeers, err + } + addrMap := make(map[string]GenesisAccount, len(appState.Accounts)) + for i := 0; i < len(appState.Accounts); i++ { + acc := appState.Accounts[i] + strAddr := string(acc.Address) + addrMap[strAddr] = acc + } + + // addresses and IPs (and port) validator server info + var addressesIPs []string + for _, fo := range fos { filename := filepath.Join(genTxsDir, fo.Name()) if !fo.IsDir() && (filepath.Ext(filename) != ".json") { @@ -227,41 +258,55 @@ func CollectStdTxs(moniker string, genTxsDir string, cdc *codec.Codec) ( // get the genStdTx var jsonRawTx []byte - jsonRawTx, err = ioutil.ReadFile(filename) - if err != nil { - return + if jsonRawTx, err = ioutil.ReadFile(filename); err != nil { + return appGenTxs, persistentPeers, err } var genStdTx auth.StdTx - err = cdc.UnmarshalJSON(jsonRawTx, &genStdTx) - if err != nil { - return + if err = cdc.UnmarshalJSON(jsonRawTx, &genStdTx); err != nil { + return appGenTxs, persistentPeers, err } appGenTxs = append(appGenTxs, genStdTx) - nodeAddr := genStdTx.GetMemo() - if len(nodeAddr) == 0 { - err = fmt.Errorf("couldn't find node's address in %s", fo.Name()) - return + // the memo flag is used to store + // the ip and node-id, for example this may be: + // "528fd3df22b31f4969b05652bfe8f0fe921321d5@192.168.2.37:26656" + nodeAddrIP := genStdTx.GetMemo() + if len(nodeAddrIP) == 0 { + return appGenTxs, persistentPeers, fmt.Errorf( + "couldn't find node's address and IP in %s", fo.Name()) } + // genesis transactions must be single-message msgs := genStdTx.GetMsgs() if len(msgs) != 1 { - err = errors.New("each genesis transaction must provide a single genesis message") - return + + return appGenTxs, persistentPeers, errors.New( + "each genesis transaction must provide a single genesis message") } + // validate the validator address and funds against the accounts in the state msg := msgs[0].(stake.MsgCreateValidator) + addr := string(sdk.AccAddress(msg.ValidatorAddr)) + acc, ok := addrMap[addr] + if !ok { + return appGenTxs, persistentPeers, fmt.Errorf( + "account %v not in genesis.json: %+v", addr, addrMap) + } + if acc.Coins.AmountOf(msg.Delegation.Denom).LT(msg.Delegation.Amount) { + err = fmt.Errorf("insufficient fund for the delegation: %s < %s", + acc.Coins.AmountOf(msg.Delegation.Denom), msg.Delegation.Amount) + } // exclude itself from persistent peers if msg.Description.Moniker != moniker { - addresses = append(addresses, nodeAddr) + addressesIPs = append(addressesIPs, nodeAddrIP) } } - sort.Strings(addresses) - persistentPeers = strings.Join(addresses, ",") + sort.Strings(addressesIPs) + persistentPeers = strings.Join(addressesIPs, ",") - return + return appGenTxs, persistentPeers, nil } func NewDefaultGenesisAccount(addr sdk.AccAddress) GenesisAccount { @@ -272,7 +317,7 @@ func NewDefaultGenesisAccount(addr sdk.AccAddress) GenesisAccount { return NewGenesisAccount(&accAuth) } -func createGenesisState() stake.GenesisState { +func createStakeGenesisState() stake.GenesisState { return stake.GenesisState{ Pool: stake.Pool{ LooseTokens: sdk.ZeroDec(), @@ -281,7 +326,20 @@ func createGenesisState() stake.GenesisState { Params: stake.Params{ UnbondingTime: defaultUnbondingTime, MaxValidators: 100, - BondDenom: Denom + "-" + types.Atto, + BondDenom: StakeDenom, + }, + } +} + +func createMintGenesisState() mint.GenesisState { + return mint.GenesisState{ + Minter: mint.InitialMinter(), + Params: mint.Params{ + MintDenom: StakeDenom, + InflationRateChange: sdk.NewDecWithPrec(13, 2), + InflationMax: sdk.NewDecWithPrec(20, 2), + InflationMin: sdk.NewDecWithPrec(7, 2), + GoalBonded: sdk.NewDecWithPrec(67, 2), }, } } diff --git a/client/bank/cli/sendTx.go b/client/bank/cli/sendTx.go index 9650fe05d..f4f89f76e 100644 --- a/client/bank/cli/sendTx.go +++ b/client/bank/cli/sendTx.go @@ -61,7 +61,7 @@ func SendTxCmd(cdc *codec.Codec) *cobra.Command { } // ensure account has enough coins - if !account.GetCoins().IsGTE(coins) { + if !account.GetCoins().IsAllGTE(coins) { return fmt.Errorf("Address %s doesn't have enough coins to pay for this transaction.", from) } diff --git a/client/context/context.go b/client/context/context.go index c500a7835..9c7407147 100644 --- a/client/context/context.go +++ b/client/context/context.go @@ -20,7 +20,6 @@ import ( tmlite "github.com/tendermint/tendermint/lite" tmliteProxy "github.com/tendermint/tendermint/lite/proxy" rpcclient "github.com/tendermint/tendermint/rpc/client" - "path/filepath" ) const ctxAccStoreName = "acc" @@ -111,14 +110,19 @@ func createVerifier() tmlite.Verifier { } node := rpcclient.NewHTTP(nodeURI, "/websocket") + cacheSize := 10 // TODO: determine appropriate cache size + verifier, err := tmliteProxy.NewVerifier( + chainID, home, + node, log.NewNopLogger(), cacheSize, + ) - certifier, err := tmliteProxy.NewVerifier(chainID, home, node, log.NewNopLogger()) if err != nil { - fmt.Printf("Abort!! IRISLCD encountered fatal error in creating certifier: %s", err.Error()) + fmt.Printf("Create verifier failed: %s\n", err.Error()) + fmt.Printf("Please check network connection and verify the address of the node to connect to\n") os.Exit(1) } - return certifier + return verifier } func fromFields(from string) (fromAddr types.AccAddress, fromName string) { diff --git a/client/context/query.go b/client/context/query.go index 347a288a9..9471e5cb2 100644 --- a/client/context/query.go +++ b/client/context/query.go @@ -10,7 +10,6 @@ import ( "strings" - "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/store" "github.com/irisnet/irishub/app" "github.com/irisnet/irishub/types" @@ -61,7 +60,7 @@ func (cliCtx CLIContext) QuerySubspace(subspace []byte, storeName string) (res [ return res, err } - ctx.Codec.MustUnmarshalBinaryLengthPrefixed(resRaw, &res) + cliCtx.Codec.MustUnmarshalBinaryLengthPrefixed(resRaw, &res) return } @@ -298,7 +297,7 @@ func (cliCtx CLIContext) GetCoinType(coinName string) (types.CoinType, error) { return types.CoinType{}, fmt.Errorf("unsupported coin type \"%s\"", coinName) } - if err = cliCtx.Codec.UnMarshalBinaryLengthPrefixed(bz, &coinType); err != nil { + if err = cliCtx.Codec.UnmarshalBinaryLengthPrefixed(bz, &coinType); err != nil { return coinType, err } } diff --git a/client/stake/cli/flags.go b/client/stake/cli/flags.go index d7518f6aa..c567173a3 100644 --- a/client/stake/cli/flags.go +++ b/client/stake/cli/flags.go @@ -35,11 +35,11 @@ const ( // common flagsets to add to various functions var ( - fsPk = flag.NewFlagSet("", flag.ContinueOnError) - fsAmount = flag.NewFlagSet("", flag.ContinueOnError) + FsPk = flag.NewFlagSet("", flag.ContinueOnError) + FsAmount = flag.NewFlagSet("", flag.ContinueOnError) fsShares = flag.NewFlagSet("", flag.ContinueOnError) fsDescriptionCreate = flag.NewFlagSet("", flag.ContinueOnError) - fsCommissionCreate = flag.NewFlagSet("", flag.ContinueOnError) + FsCommissionCreate = flag.NewFlagSet("", flag.ContinueOnError) fsCommissionUpdate = flag.NewFlagSet("", flag.ContinueOnError) fsDescriptionEdit = flag.NewFlagSet("", flag.ContinueOnError) fsValidator = flag.NewFlagSet("", flag.ContinueOnError) @@ -48,8 +48,8 @@ var ( ) func init() { - fsPk.String(FlagPubKey, "", "Go-Amino encoded hex PubKey of the validator. For Ed25519 the go-amino prepend hex is 1624de6220") - fsAmount.String(FlagAmount, "", "Amount of coins to bond") + FsPk.String(FlagPubKey, "", "Go-Amino encoded hex PubKey of the validator. For Ed25519 the go-amino prepend hex is 1624de6220") + FsAmount.String(FlagAmount, "", "Amount of coins to bond") fsShares.String(FlagSharesAmount, "", "Amount of source-shares to either unbond or redelegate as a positive integer or decimal") fsShares.String(FlagSharesPercent, "", "Percent of source-shares to either unbond or redelegate as a positive integer or decimal >0 and <=1") fsDescriptionCreate.String(FlagMoniker, "", "validator name") @@ -57,9 +57,9 @@ func init() { fsDescriptionCreate.String(FlagWebsite, "", "optional website") fsDescriptionCreate.String(FlagDetails, "", "optional details") fsCommissionUpdate.String(FlagCommissionRate, "", "The new commission rate percentage") - fsCommissionCreate.String(FlagCommissionRate, "", "The initial commission rate percentage") - fsCommissionCreate.String(FlagCommissionMaxRate, "", "The maximum commission rate percentage") - fsCommissionCreate.String(FlagCommissionMaxChangeRate, "", "The maximum commission change rate percentage (per day)") + FsCommissionCreate.String(FlagCommissionRate, "", "The initial commission rate percentage") + FsCommissionCreate.String(FlagCommissionMaxRate, "", "The maximum commission rate percentage") + FsCommissionCreate.String(FlagCommissionMaxChangeRate, "", "The maximum commission change rate percentage (per day)") fsDescriptionEdit.String(FlagMoniker, types.DoNotModifyDesc, "validator name") fsDescriptionEdit.String(FlagIdentity, types.DoNotModifyDesc, "optional identity signature (ex. UPort or Keybase)") fsDescriptionEdit.String(FlagWebsite, types.DoNotModifyDesc, "optional website") diff --git a/client/stake/cli/sendtx.go b/client/stake/cli/sendtx.go index fddb1305c..d08c9b70b 100644 --- a/client/stake/cli/sendtx.go +++ b/client/stake/cli/sendtx.go @@ -109,10 +109,10 @@ func GetCmdCreateValidator(cdc *codec.Codec) *cobra.Command { }, } - cmd.Flags().AddFlagSet(fsPk) - cmd.Flags().AddFlagSet(fsAmount) + cmd.Flags().AddFlagSet(FsPk) + cmd.Flags().AddFlagSet(FsAmount) cmd.Flags().AddFlagSet(fsDescriptionCreate) - cmd.Flags().AddFlagSet(fsCommissionCreate) + cmd.Flags().AddFlagSet(FsCommissionCreate) cmd.Flags().AddFlagSet(fsDelegator) cmd.Flags().Bool(FlagGenesisFormat, false, "Export the transaction in gen-tx format; it implies --generate-only") cmd.Flags().String(FlagIP, "", fmt.Sprintf("Node's public IP. It takes effect only when used in combination with --%s", FlagGenesisFormat)) @@ -216,7 +216,7 @@ func GetCmdDelegate(cdc *codec.Codec) *cobra.Command { }, } - cmd.Flags().AddFlagSet(fsAmount) + cmd.Flags().AddFlagSet(FsAmount) cmd.Flags().AddFlagSet(fsValidator) cmd.MarkFlagRequired(FlagAmount) cmd.MarkFlagRequired(FlagAddressValidator) diff --git a/client/utils/utils.go b/client/utils/utils.go index 27a419685..57131358a 100644 --- a/client/utils/utils.go +++ b/client/utils/utils.go @@ -179,7 +179,7 @@ func adjustGasEstimate(estimate int64, adjustment float64) int64 { func parseQueryResponse(cdc *amino.Codec, rawRes []byte) (int64, error) { var simulationResult sdk.Result - if err := cdc.UnMarshalBinaryLengthPrefixed(rawRes, &simulationResult); err != nil { + if err := cdc.UnmarshalBinaryLengthPrefixed(rawRes, &simulationResult); err != nil { return 0, err } return simulationResult.GasUsed, nil diff --git a/cmd/iris/main.go b/cmd/iris/main.go index 96cce0705..e06d087fd 100644 --- a/cmd/iris/main.go +++ b/cmd/iris/main.go @@ -19,10 +19,33 @@ import ( "github.com/tendermint/tendermint/libs/log" tmtypes "github.com/tendermint/tendermint/types" irisInit "github.com/irisnet/irishub/init" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +const ( + // Bech32PrefixAccAddr defines the Bech32 prefix of an account's address + bech32PrefixAccAddr = "faa" + // Bech32PrefixAccPub defines the Bech32 prefix of an account's public key + bech32PrefixAccPub = "fap" + // Bech32PrefixValAddr defines the Bech32 prefix of a validator's operator address + bech32PrefixValAddr = "fva" + // Bech32PrefixValPub defines the Bech32 prefix of a validator's operator public key + bech32PrefixValPub = "fvp" + // Bech32PrefixConsAddr defines the Bech32 prefix of a consensus node address + bech32PrefixConsAddr = "fca" + // Bech32PrefixConsPub defines the Bech32 prefix of a consensus node public key + bech32PrefixConsPub = "fcp" ) func main() { cdc := app.MakeCodec() + + config := sdk.GetConfig() + config.SetBech32PrefixForAccount(bech32PrefixAccAddr, bech32PrefixAccPub) + config.SetBech32PrefixForValidator(bech32PrefixValAddr, bech32PrefixValPub) + config.SetBech32PrefixForConsensusNode(bech32PrefixConsAddr, bech32PrefixConsPub) + config.Seal() + ctx := server.NewDefaultContext() cobra.EnableCommandSorting = false rootCmd := &cobra.Command{ @@ -50,6 +73,7 @@ func main() { irisInit.InitCmd(ctx, cdc, app.IrisAppInit()), irisInit.GenTxCmd(ctx,cdc), irisInit.TestnetFilesCmd(ctx,cdc,app.IrisAppInit()), + irisInit.CollectGenTxsCmd(ctx, cdc), startCmd, //server.TestnetFilesCmd(ctx, cdc, app.IrisAppInit()), server.UnsafeResetAllCmd(ctx), diff --git a/init/collect.go b/init/collect.go new file mode 100644 index 000000000..651d6e12b --- /dev/null +++ b/init/collect.go @@ -0,0 +1,118 @@ +package init + +import ( + "encoding/json" + "path/filepath" + + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/spf13/cobra" + "github.com/spf13/viper" + cfg "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/crypto" + "github.com/tendermint/tendermint/libs/cli" + "github.com/tendermint/tendermint/types" + "github.com/irisnet/irishub/app" + "github.com/irisnet/irishub/client" +) + +type initConfig struct { + ChainID string + GenTxsDir string + Name string + NodeID string + ValPubKey crypto.PubKey +} + +// nolint +func CollectGenTxsCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { + cmd := &cobra.Command{ + Use: "collect-gentxs", + Short: "Collect genesis txs and output a genesis.json file", + RunE: func(_ *cobra.Command, _ []string) error { + config := ctx.Config + config.SetRoot(viper.GetString(cli.HomeFlag)) + name := viper.GetString(client.FlagName) + + nodeID, valPubKey, err := InitializeNodeValidatorFiles(config) + if err != nil { + return err + } + + genDoc, err := loadGenesisDoc(cdc, config.GenesisFile()) + if err != nil { + return err + } + + toPrint := printInfo{ + Moniker: config.Moniker, + ChainID: genDoc.ChainID, + NodeID: nodeID, + } + + initCfg := initConfig{ + ChainID: genDoc.ChainID, + GenTxsDir: filepath.Join(config.RootDir, "config", "gentx"), + Name: name, + NodeID: nodeID, + ValPubKey: valPubKey, + } + + appMessage, err := genAppStateFromConfig(cdc, config, initCfg, genDoc) + if err != nil { + return err + } + + toPrint.AppMessage = appMessage + + // print out some key information + return displayInfo(cdc, toPrint) + }, + } + + cmd.Flags().String(cli.HomeFlag, app.DefaultNodeHome, "node's home directory") + return cmd +} + +func genAppStateFromConfig( + cdc *codec.Codec, config *cfg.Config, initCfg initConfig, genDoc types.GenesisDoc, +) (appState json.RawMessage, err error) { + + genFile := config.GenesisFile() + var ( + appGenTxs []auth.StdTx + persistentPeers string + genTxs []json.RawMessage + jsonRawTx json.RawMessage + ) + + // process genesis transactions, else create default genesis.json + appGenTxs, persistentPeers, err = app.CollectStdTxs( + cdc, config.Moniker, initCfg.GenTxsDir, genDoc, + ) + if err != nil { + return + } + + genTxs = make([]json.RawMessage, len(appGenTxs)) + config.P2P.PersistentPeers = persistentPeers + + for i, stdTx := range appGenTxs { + jsonRawTx, err = cdc.MarshalJSON(stdTx) + if err != nil { + return + } + genTxs[i] = jsonRawTx + } + + cfg.WriteConfigFile(filepath.Join(config.RootDir, "config", "config.toml"), config) + + appState, err = app.IrisAppGenStateJSON(cdc, genDoc, genTxs) + if err != nil { + return + } + + err = ExportGenesisFile(genFile, initCfg.ChainID, nil, appState) + return +} diff --git a/init/gentx.go b/init/gentx.go index 94395d356..66d28ce62 100644 --- a/init/gentx.go +++ b/init/gentx.go @@ -2,33 +2,40 @@ package init import ( "fmt" - "io/ioutil" - "os" - "path/filepath" - "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server" sdk "github.com/cosmos/cosmos-sdk/types" - authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" - signcmd "github.com/irisnet/irishub/client/bank/cli" - "github.com/irisnet/irishub/app" - "github.com/irisnet/irishub/client" - stakecmd "github.com/irisnet/irishub/client/stake/cli" "github.com/spf13/cobra" "github.com/spf13/viper" cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/crypto" tmcli "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/libs/common" + "io/ioutil" + "os" + "path/filepath" + stakecmd "github.com/irisnet/irishub/client/stake/cli" + "github.com/irisnet/irishub/client/stake/cli" + "github.com/irisnet/irishub/app" + "github.com/irisnet/irishub/client" + signcmd "github.com/irisnet/irishub/client/bank/cli" + authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" +) + +const ( + defaultAmount = "100iris" + defaultCommissionRate = "0.1" + defaultCommissionMaxRate = "0.2" + defaultCommissionMaxChangeRate = "0.01" ) -// GenTxCmd builds the iris gentx command. +// GenTxCmd builds the gaiad gentx command. // nolint: errcheck func GenTxCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "gentx", Short: "Generate a genesis tx carrying a self delegation", - Long: fmt.Sprintf(`This command is an alias of the 'iriscli stake create-validator' command'. + Long: fmt.Sprintf(`This command is an alias of the 'gaiad tx create-validator' command'. It creates a genesis piece carrying a self delegation with the following delegation and commission default parameters: @@ -37,7 +44,7 @@ following delegation and commission default parameters: commission rate: %s commission max rate: %s commission max change rate: %s -`, app.FreeFermionVal.String(),defaultCommissionRate, defaultCommissionMaxRate, defaultCommissionMaxChangeRate), +`, defaultAmount, defaultCommissionRate, defaultCommissionMaxRate, defaultCommissionMaxChangeRate), RunE: func(cmd *cobra.Command, args []string) error { config := ctx.Config @@ -46,7 +53,6 @@ following delegation and commission default parameters: if err != nil { return err } - ip := viper.GetString(stakecmd.FlagIP) if ip == "" { ip, err = server.ExternalIP() @@ -54,8 +60,20 @@ following delegation and commission default parameters: return err } } - // Run iris tx create-validator - prepareFlagsForTxCreateValidator(config, nodeID, ip, valPubKey) + genDoc, err := loadGenesisDoc(cdc, config.GenesisFile()) + if err != nil { + return err + } + + // Read --pubkey, if empty take it from priv_validator.json + if valPubKeyString := viper.GetString(cli.FlagPubKey); valPubKeyString != "" { + valPubKey, err = sdk.GetConsPubKeyBech32(valPubKeyString) + if err != nil { + return err + } + } + // Run gaiad tx create-validator + prepareFlagsForTxCreateValidator(config, nodeID, ip, genDoc.ChainID, valPubKey) createValidatorCmd := stakecmd.GetCmdCreateValidator(cdc) w, err := ioutil.TempFile("", "gentx") @@ -80,29 +98,42 @@ following delegation and commission default parameters: }, } + cmd.Flags().String(tmcli.HomeFlag, app.DefaultNodeHome, "node's home directory") cmd.Flags().String(flagClientHome, app.DefaultCLIHome, "client's home directory") - cmd.Flags().String(client.FlagChainID, "", "genesis file chain-id") cmd.Flags().String(client.FlagName, "", "name of private key with which to sign the gentx") cmd.Flags().String(stakecmd.FlagIP,"",fmt.Sprintf("Node's public IP. It takes effect only when used in combination with --%s", stakecmd.FlagGenesisFormat)) + cmd.Flags().AddFlagSet(stakecmd.FsCommissionCreate) + cmd.Flags().AddFlagSet(stakecmd.FsAmount) + cmd.Flags().AddFlagSet(stakecmd.FsPk) cmd.MarkFlagRequired(client.FlagName) return cmd } -func prepareFlagsForTxCreateValidator(config *cfg.Config, nodeID, ip string, valPubKey crypto.PubKey) { - viper.Set(tmcli.HomeFlag, viper.GetString(flagClientHome)) // --home +func prepareFlagsForTxCreateValidator(config *cfg.Config, nodeID, ip, chainID string, + valPubKey crypto.PubKey) { + viper.Set(tmcli.HomeFlag, viper.GetString(flagClientHome)) // --home + viper.Set(client.FlagChainID, chainID) viper.Set(client.FlagFrom, viper.GetString(client.FlagName)) // --from viper.Set(stakecmd.FlagNodeID, nodeID) // --node-id viper.Set(stakecmd.FlagIP, ip) // --ip viper.Set(stakecmd.FlagPubKey, sdk.MustBech32ifyConsPub(valPubKey)) // --pubkey - viper.Set(stakecmd.FlagAmount, fmt.Sprintf("%d%s", app.FeeAmt, app.Denom)) // --amount - viper.Set(stakecmd.FlagCommissionRate, defaultCommissionRate) - viper.Set(stakecmd.FlagCommissionMaxRate, defaultCommissionMaxRate) - viper.Set(stakecmd.FlagCommissionMaxChangeRate, defaultCommissionMaxChangeRate) - viper.Set(stakecmd.FlagGenesisFormat, true) // --genesis-format - viper.Set(stakecmd.FlagMoniker, config.Moniker) // --moniker + viper.Set(stakecmd.FlagGenesisFormat, true) // --genesis-format + viper.Set(stakecmd.FlagMoniker, config.Moniker) // --moniker if config.Moniker == "" { viper.Set(stakecmd.FlagMoniker, viper.GetString(client.FlagName)) } + if viper.GetString(stakecmd.FlagAmount) == "" { + viper.Set(stakecmd.FlagAmount, defaultAmount) + } + if viper.GetString(stakecmd.FlagCommissionRate) == "" { + viper.Set(stakecmd.FlagCommissionRate, defaultCommissionRate) + } + if viper.GetString(stakecmd.FlagCommissionMaxRate) == "" { + viper.Set(stakecmd.FlagCommissionMaxRate, defaultCommissionMaxRate) + } + if viper.GetString(stakecmd.FlagCommissionMaxChangeRate) == "" { + viper.Set(stakecmd.FlagCommissionMaxChangeRate, defaultCommissionMaxChangeRate) + } } func prepareFlagsForTxSign() { diff --git a/init/init.go b/init/init.go index 635cc89f5..56a072d31 100644 --- a/init/init.go +++ b/init/init.go @@ -2,57 +2,27 @@ package init import ( "encoding/json" - "errors" "fmt" - "github.com/irisnet/irishub/client" - "github.com/irisnet/irishub/app" - "github.com/cosmos/cosmos-sdk/x/auth" - authtx "github.com/cosmos/cosmos-sdk/x/auth/client/txbuilder" - "github.com/cosmos/cosmos-sdk/x/stake" - "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/privval" "os" "path/filepath" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/spf13/cobra" "github.com/spf13/viper" cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/libs/common" - "github.com/tendermint/tendermint/p2p" - "github.com/tendermint/tendermint/types" -) - -const ( - flagWithTxs = "with-txs" - flagOverwrite = "overwrite" - flagClientHome = "home-client" - flagOverwriteKey = "overwrite-key" - flagSkipGenesis = "skip-genesis" - flagMoniker = "moniker" + "github.com/irisnet/irishub/client" + "github.com/irisnet/irishub/app" ) const ( - defaultCommissionRate = "0.1" - defaultCommissionMaxRate = "0.2" - defaultCommissionMaxChangeRate = "0.01" + flagOverwrite = "overwrite" + flagClientHome = "home-client" + flagMoniker = "moniker" ) -type initConfig struct { - ChainID string - GenTxsDir string - Name string - NodeID string - ClientHome string - WithTxs bool - Overwrite bool - OverwriteKey bool - ValPubKey crypto.PubKey -} - type printInfo struct { Moniker string `json:"moniker"` ChainID string `json:"chain_id"` @@ -76,22 +46,16 @@ func InitCmd(ctx *server.Context, cdc *codec.Codec, appInit server.AppInit) *cob cmd := &cobra.Command{ Use: "init", Short: "Initialize private validator, p2p, genesis, and application configuration files", - Long: `Initialize validators's and node's configuration files. - -Note that only node's configuration files will be written if the flag --skip-genesis is -enabled, and the genesis file will not be generated. -`, - Args: cobra.NoArgs, + Long: `Initialize validators's and node's configuration files.`, + Args: cobra.NoArgs, RunE: func(_ *cobra.Command, _ []string) error { config := ctx.Config config.SetRoot(viper.GetString(cli.HomeFlag)) - - name := viper.GetString(client.FlagName) chainID := viper.GetString(client.FlagChainID) if chainID == "" { chainID = fmt.Sprintf("test-chain-%v", common.RandStr(6)) } - nodeID, valPubKey, err := InitializeNodeValidatorFiles(config) + nodeID, _, err := InitializeNodeValidatorFiles(config) if err != nil { return err } @@ -99,37 +63,26 @@ enabled, and the genesis file will not be generated. if viper.GetString(flagMoniker) != "" { config.Moniker = viper.GetString(flagMoniker) } - if config.Moniker == "" && name != "" { - config.Moniker = name - } - toPrint := printInfo{ - ChainID: chainID, - Moniker: config.Moniker, - NodeID: nodeID, - } - if viper.GetBool(flagSkipGenesis) { - cfg.WriteConfigFile(filepath.Join(config.RootDir, "config", "config.toml"), config) - return displayInfo(cdc, toPrint) - } - initCfg := initConfig{ - ChainID: chainID, - GenTxsDir: filepath.Join(config.RootDir, "config", "gentx"), - Name: name, - NodeID: nodeID, - ClientHome: viper.GetString(flagClientHome), - WithTxs: viper.GetBool(flagWithTxs), - Overwrite: viper.GetBool(flagOverwrite), - OverwriteKey: viper.GetBool(flagOverwriteKey), - ValPubKey: valPubKey, + var appState json.RawMessage + genFile := config.GenesisFile() + if appState, err = initializeEmptyGenesis(cdc, genFile, chainID, + viper.GetBool(flagOverwrite)); err != nil { + return err } - appMessage, err := initWithConfig(cdc, config, initCfg) - // print out some key information - if err != nil { + if err = ExportGenesisFile(genFile, chainID, nil, appState); err != nil { return err } - toPrint.AppMessage = appMessage + toPrint := printInfo{ + ChainID: chainID, + Moniker: config.Moniker, + NodeID: nodeID, + AppMessage: appState, + } + + cfg.WriteConfigFile(filepath.Join(config.RootDir, "config", "config.toml"), config) + return displayInfo(cdc, toPrint) }, } @@ -137,151 +90,6 @@ enabled, and the genesis file will not be generated. cmd.Flags().String(cli.HomeFlag, app.DefaultNodeHome, "node's home directory") cmd.Flags().BoolP(flagOverwrite, "o", false, "overwrite the genesis.json file") cmd.Flags().String(client.FlagChainID, "", "genesis file chain-id, if left blank will be randomly created") - cmd.Flags().Bool(flagWithTxs, false, "apply existing genesis transactions from [--home]/config/gentx/") - cmd.Flags().String(client.FlagName, "", "name of private key with which to sign the gentx") - cmd.Flags().String(flagMoniker, "", "overrides --name flag and set the validator's moniker to a different value; ignored if it runs without the --with-txs flag") - cmd.Flags().String(flagClientHome, app.DefaultCLIHome, "client's home directory") - cmd.Flags().Bool(flagOverwriteKey, false, "overwrite client's key") - cmd.Flags().Bool(flagSkipGenesis, false, "do not create genesis.json") + cmd.Flags().String(flagMoniker, "", "set the validator's moniker") return cmd } - -// InitializeNodeValidatorFiles creates private validator and p2p configuration files. -func InitializeNodeValidatorFiles(config *cfg.Config) (nodeID string, valPubKey crypto.PubKey, err error) { - nodeKey, err := p2p.LoadOrGenNodeKey(config.NodeKeyFile()) - if err != nil { - return - } - nodeID = string(nodeKey.ID()) - valPubKey = ReadOrCreatePrivValidator(config.PrivValidatorFile()) - return -} - -func initWithConfig(cdc *codec.Codec, config *cfg.Config, initCfg initConfig) ( - appMessage json.RawMessage, err error) { - genFile := config.GenesisFile() - if !initCfg.Overwrite && common.FileExists(genFile) { - err = fmt.Errorf("genesis.json file already exists: %v", genFile) - return - } - - // process genesis transactions, else create default genesis.json - var appGenTxs []auth.StdTx - var persistentPeers string - var genTxs []json.RawMessage - var appState json.RawMessage - var jsonRawTx json.RawMessage - chainID := initCfg.ChainID - - if initCfg.WithTxs { - appGenTxs, persistentPeers, err = app.CollectStdTxs(config.Moniker, initCfg.GenTxsDir, cdc) - if err != nil { - return - } - genTxs = make([]json.RawMessage, len(appGenTxs)) - config.P2P.PersistentPeers = persistentPeers - for i, stdTx := range appGenTxs { - jsonRawTx, err = cdc.MarshalJSON(stdTx) - if err != nil { - return - } - genTxs[i] = jsonRawTx - } - } else { - var ip, keyPass, secret string - var addr sdk.AccAddress - var signedTx auth.StdTx - - if initCfg.Name == "" { - err = errors.New("must specify validator's moniker (--name)") - return - } - - config.Moniker = initCfg.Name - ip, err = server.ExternalIP() - if err != nil { - return - } - memo := fmt.Sprintf("%s@%s:26656", initCfg.NodeID, ip) - buf := client.BufferStdin() - prompt := fmt.Sprintf("Password for account %q (default: %q):", initCfg.Name, app.DefaultKeyPass) - keyPass, err = client.GetPassword(prompt, buf) - if err != nil && keyPass != "" { - // An error was returned that either failed to read the password from - // STDIN or the given password is not empty but failed to meet minimum - // length requirements. - return - } - if keyPass == "" { - keyPass = app.DefaultKeyPass - } - - addr, secret, err = server.GenerateSaveCoinKey(initCfg.ClientHome, initCfg.Name, keyPass, initCfg.OverwriteKey) - if err != nil { - return - } - appMessage, err = json.Marshal(map[string]string{"secret": secret}) - if err != nil { - return - } - - msg := stake.NewMsgCreateValidator( - sdk.ValAddress(addr), - initCfg.ValPubKey, - sdk.NewCoin("iris-atto",sdk.NewIntWithDecimal(1,20)), - stake.NewDescription(config.Moniker, "", "", ""), - stake.NewCommissionMsg(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), - ) - txBldr := authtx.NewTxBuilderFromCLI().WithCodec(cdc).WithMemo(memo).WithChainID(chainID) - signedTx, err = txBldr.SignStdTx( - initCfg.Name, keyPass, auth.NewStdTx([]sdk.Msg{msg}, auth.StdFee{}, []auth.StdSignature{}, memo), false, - ) - if err != nil { - return - } - jsonRawTx, err = cdc.MarshalJSON(signedTx) - if err != nil { - return - } - genTxs = []json.RawMessage{jsonRawTx} - } - - cfg.WriteConfigFile(filepath.Join(config.RootDir, "config", "config.toml"), config) - appState, err = app.IrisAppGenStateJSON(cdc, genTxs) - if err != nil { - return - } - err = WriteGenesisFile(genFile, chainID, nil, appState) - - return -} - -// WriteGenesisFile creates and writes the genesis configuration to disk. An -// error is returned if building or writing the configuration to file fails. -// nolint: unparam -func WriteGenesisFile(genesisFile, chainID string, validators []types.GenesisValidator, appState json.RawMessage) error { - genDoc := types.GenesisDoc{ - ChainID: chainID, - Validators: validators, - AppState: appState, - } - - if err := genDoc.ValidateAndComplete(); err != nil { - return err - } - - return genDoc.SaveAs(genesisFile) -} - -// read of create the private key file for this config -func ReadOrCreatePrivValidator(privValFile string) crypto.PubKey { - // private validator - var privValidator *privval.FilePV - if common.FileExists(privValFile) { - privValidator = privval.LoadFilePV(privValFile) - } else { - privValidator = privval.GenFilePV(privValFile) - privValidator.Save() - } - return privValidator.GetPubKey() -} diff --git a/init/init_test.go b/init/init_test.go index be7bcfbcb..cc512aecd 100644 --- a/init/init_test.go +++ b/init/init_test.go @@ -2,8 +2,6 @@ package init import ( "bytes" - "github.com/irisnet/irishub/client" - "github.com/irisnet/irishub/app" "github.com/tendermint/tendermint/libs/cli" "io" "io/ioutil" @@ -19,6 +17,8 @@ import ( "github.com/tendermint/tendermint/libs/log" "github.com/spf13/viper" + "github.com/irisnet/irishub/app" + "github.com/irisnet/irishub/client" ) func TestInitCmd(t *testing.T) { @@ -42,7 +42,6 @@ func setupClientHome(t *testing.T) func() { clientDir, err := ioutil.TempDir("", "mock-sdk-cmd") require.Nil(t, err) viper.Set(flagClientHome, clientDir) - viper.Set(flagOverwriteKey, true) return func() { if err := os.RemoveAll(clientDir); err != nil { // TODO: Handle with #870 diff --git a/init/testnet.go b/init/testnet.go index a130ed455..42b5a66ed 100644 --- a/init/testnet.go +++ b/init/testnet.go @@ -3,90 +3,104 @@ package init import ( "encoding/json" "fmt" - "github.com/irisnet/irishub/client" - "github.com/irisnet/irishub/app" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth" - authtx "github.com/cosmos/cosmos-sdk/x/auth/client/txbuilder" - "github.com/cosmos/cosmos-sdk/x/stake" "net" "os" "path/filepath" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/stake" + "github.com/irisnet/irishub/app" + "github.com/irisnet/irishub/client" + "github.com/irisnet/irishub/client/context" "github.com/spf13/cobra" "github.com/spf13/viper" cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/crypto" cmn "github.com/tendermint/tendermint/libs/common" + "github.com/tendermint/tendermint/types" + tmtime "github.com/tendermint/tendermint/types/time" ) var ( - nodeDirPrefix = "node-dir-prefix" - nValidators = "v" - outputDir = "output-dir" - nodeDaemonHome = "node-daemon-home" - nodeCliHome = "node-cli-home" - - startingIPAddress = "starting-ip-address" + flagNodeDirPrefix = "node-dir-prefix" + flagNumValidators = "v" + flagOutputDir = "output-dir" + flagNodeDaemonHome = "node-daemon-home" + flagNodeCliHome = "node-cli-home" + flagStartingIPAddress = "starting-ip-address" ) const nodeDirPerm = 0755 // get cmd to initialize all files for tendermint testnet and application -func TestnetFilesCmd(ctx *server.Context, cdc *codec.Codec, appInit server.AppInit) *cobra.Command { +func TestnetFilesCmd(ctx *server.Context, cdc *codec.Codec, + appInit server.AppInit) *cobra.Command { + cmd := &cobra.Command{ Use: "testnet", - Short: "Initialize files for a irishub testnet", + Short: "Initialize files for a Irishub testnet", Long: `testnet will create "v" number of directories and populate each with necessary files (private validator, genesis, config, etc.). Note, strict routability for addresses is turned off in the config file. Example: - - iris testnet --v 4 -o ./output --starting-ip-address 192.168.0.1 + iris testnet --v 4 --output-dir ./output --starting-ip-address 192.168.10.2 `, RunE: func(_ *cobra.Command, _ []string) error { config := ctx.Config - return testnetWithConfig(config, cdc, appInit) + return initTestnet(config, cdc) }, } - cmd.Flags().Int(nValidators, 4, - "Number of validators to initialize the testnet with") - cmd.Flags().StringP(outputDir, "o", "./mytestnet", - "Directory to store initialization data for the testnet") - cmd.Flags().String(nodeDirPrefix, "node", - "Prefix the directory name for each node with (node results in node0, node1, ...)") - cmd.Flags().String(nodeDaemonHome, "iris", - "Home directory of the node's daemon configuration") - cmd.Flags().String(nodeCliHome, "iriscli", - "Home directory of the node's cli configuration") - - cmd.Flags().String(startingIPAddress, "192.168.0.1", + + cmd.Flags().Int(flagNumValidators, 4, + "Number of validators to initialize the testnet with", + ) + cmd.Flags().StringP(flagOutputDir, "o", "./mytestnet", + "Directory to store initialization data for the testnet", + ) + cmd.Flags().String(flagNodeDirPrefix, "node", + "Prefix the directory name for each node with (node results in node0, node1, ...)", + ) + cmd.Flags().String(flagNodeDaemonHome, "iris", + "Home directory of the node's daemon configuration", + ) + cmd.Flags().String(flagNodeCliHome, "iriscli", + "Home directory of the node's cli configuration", + ) + cmd.Flags().String(flagStartingIPAddress, "192.168.0.1", "Starting IP address (192.168.0.1 results in persistent peers list ID0@192.168.0.1:46656, ID1@192.168.0.2:46656, ...)") + return cmd } -func testnetWithConfig(config *cfg.Config, cdc *codec.Codec, appInit server.AppInit) error { - outDir := viper.GetString(outputDir) - numValidators := viper.GetInt(nValidators) +func initTestnet(config *cfg.Config, cdc *codec.Codec) error { + outDir := viper.GetString(flagOutputDir) + numValidators := viper.GetInt(flagNumValidators) - // Generate genesis.json and config.toml chainID := "chain-" + cmn.RandStr(6) + monikers := make([]string, numValidators) nodeIDs := make([]string, numValidators) valPubKeys := make([]crypto.PubKey, numValidators) - // Generate private key, node ID, initial transaction + var ( + accs []app.GenesisAccount + genFiles []string + ) + + // generate private keys, node IDs, and initial transactions for i := 0; i < numValidators; i++ { - nodeDirName := fmt.Sprintf("%s%d", viper.GetString(nodeDirPrefix), i) - nodeDaemonHomeName := viper.GetString(nodeDaemonHome) - nodeCliHomeName := viper.GetString(nodeCliHome) + nodeDirName := fmt.Sprintf("%s%d", viper.GetString(flagNodeDirPrefix), i) + nodeDaemonHomeName := viper.GetString(flagNodeDaemonHome) + nodeCliHomeName := viper.GetString(flagNodeCliHome) nodeDir := filepath.Join(outDir, nodeDirName, nodeDaemonHomeName) clientDir := filepath.Join(outDir, nodeDirName, nodeCliHomeName) gentxsDir := filepath.Join(outDir, "gentxs") + config.SetRoot(nodeDir) err := os.MkdirAll(filepath.Join(nodeDir, "config"), nodeDirPerm) @@ -103,20 +117,27 @@ func testnetWithConfig(config *cfg.Config, cdc *codec.Codec, appInit server.AppI monikers = append(monikers, nodeDirName) config.Moniker = nodeDirName - ip, err := getIP(i) + + ip, err := getIP(i, viper.GetString(flagStartingIPAddress)) if err != nil { _ = os.RemoveAll(outDir) return err } + nodeIDs[i], valPubKeys[i], err = InitializeNodeValidatorFiles(config) if err != nil { _ = os.RemoveAll(outDir) return err } + memo := fmt.Sprintf("%s@%s:26656", nodeIDs[i], ip) + genFiles = append(genFiles, config.GenesisFile()) buf := client.BufferStdin() - prompt := fmt.Sprintf("Password for account '%s' (default %s):", nodeDirName, app.DefaultKeyPass) + prompt := fmt.Sprintf( + "Password for account '%s' (default %s):", nodeDirName, app.DefaultKeyPass, + ) + keyPass, err := client.GetPassword(prompt, buf) if err != nil && keyPass != "" { // An error was returned that either failed to read the password from @@ -124,6 +145,7 @@ func testnetWithConfig(config *cfg.Config, cdc *codec.Codec, appInit server.AppI // length requirements. return err } + if keyPass == "" { keyPass = app.DefaultKeyPass } @@ -133,17 +155,27 @@ func testnetWithConfig(config *cfg.Config, cdc *codec.Codec, appInit server.AppI _ = os.RemoveAll(outDir) return err } + info := map[string]string{"secret": secret} + cliPrint, err := json.Marshal(info) if err != nil { return err } - // Save private key seed words + + // save private key seed words err = writeFile(fmt.Sprintf("%v.json", "key_seed"), clientDir, cliPrint) if err != nil { return err } + accs = append(accs, app.GenesisAccount{ + Address: addr, + Coins: sdk.Coins{ + app.FreeFermionAcc, + }, + }) + msg := stake.NewMsgCreateValidator( sdk.ValAddress(addr), valPubKeys[i], @@ -152,8 +184,9 @@ func testnetWithConfig(config *cfg.Config, cdc *codec.Codec, appInit server.AppI stake.NewCommissionMsg(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), ) tx := auth.NewStdTx([]sdk.Msg{msg}, auth.StdFee{}, []auth.StdSignature{}, memo) - txBldr := authtx.NewTxBuilderFromCLI().WithChainID(chainID).WithMemo(memo) - signedTx, err := txBldr.SignStdTx(nodeDirName, app.DefaultKeyPass, tx, false) + txCtx := context.NewTxContextFromCLI().WithChainID(chainID).WithMemo(memo) + + signedTx, err := txCtx.SignStdTx(nodeDirName, app.DefaultKeyPass, tx, false) if err != nil { _ = os.RemoveAll(outDir) return err @@ -165,7 +198,7 @@ func testnetWithConfig(config *cfg.Config, cdc *codec.Codec, appInit server.AppI return err } - // Gather gentxs folder + // gather gentxs folder err = writeFile(fmt.Sprintf("%v.json", nodeDirName), gentxsDir, txBytes) if err != nil { _ = os.RemoveAll(outDir) @@ -173,64 +206,140 @@ func testnetWithConfig(config *cfg.Config, cdc *codec.Codec, appInit server.AppI } } + if err := initGenFiles(cdc, chainID, accs, genFiles, numValidators); err != nil { + return err + } + + err := collectGenFiles( + cdc, config, chainID, monikers, nodeIDs, valPubKeys, numValidators, + outDir, viper.GetString(flagNodeDirPrefix), viper.GetString(flagNodeDaemonHome), + ) + if err != nil { + return err + } + + fmt.Printf("Successfully initialized %d node directories\n", numValidators) + return nil +} + +func initGenFiles( + cdc *codec.Codec, chainID string, accs []app.GenesisAccount, + genFiles []string, numValidators int, +) error { + + appGenState := app.NewDefaultGenesisState() + appGenState.Accounts = accs + + appGenStateJSON, err := codec.MarshalJSONIndent(cdc, appGenState) + if err != nil { + return err + } + + genDoc := types.GenesisDoc{ + ChainID: chainID, + AppState: appGenStateJSON, + Validators: nil, + } + + // generate empty genesis files for each validator and save for i := 0; i < numValidators; i++ { + if err := genDoc.SaveAs(genFiles[i]); err != nil { + return err + } + } + + return nil +} - nodeDirName := fmt.Sprintf("%s%d", viper.GetString(nodeDirPrefix), i) - nodeDaemonHomeName := viper.GetString(nodeDaemonHome) +func collectGenFiles( + cdc *codec.Codec, config *cfg.Config, chainID string, + monikers, nodeIDs []string, valPubKeys []crypto.PubKey, + numValidators int, outDir, nodeDirPrefix, nodeDaemonHomeName string, +) error { + + var appState json.RawMessage + genTime := tmtime.Now() + + for i := 0; i < numValidators; i++ { + nodeDirName := fmt.Sprintf("%s%d", nodeDirPrefix, i) nodeDir := filepath.Join(outDir, nodeDirName, nodeDaemonHomeName) gentxsDir := filepath.Join(outDir, "gentxs") moniker := monikers[i] config.Moniker = nodeDirName + config.SetRoot(nodeDir) nodeID, valPubKey := nodeIDs[i], valPubKeys[i] - // Run `init` and generate genesis.json and config.toml initCfg := initConfig{ - ChainID: chainID, - GenTxsDir: gentxsDir, - Name: moniker, - WithTxs: true, - Overwrite: true, - OverwriteKey: false, - NodeID: nodeID, - ValPubKey: valPubKey, - } - if _, err := initWithConfig(cdc, config, initCfg); err != nil { + ChainID: chainID, + GenTxsDir: gentxsDir, + Name: moniker, + NodeID: nodeID, + ValPubKey: valPubKey, + } + + genDoc, err := loadGenesisDoc(cdc, config.GenesisFile()) + if err != nil { + return err + } + + nodeAppState, err := genAppStateFromConfig(cdc, config, initCfg, genDoc) + if err != nil { + return err + } + + if appState == nil { + // set the canonical application state (they should not differ) + appState = nodeAppState + } + + genFile := config.GenesisFile() + + // overwrite each validator's genesis file to have a canonical genesis time + err = ExportGenesisFileWithTime(genFile, chainID, nil, appState, genTime) + if err != nil { return err } } - fmt.Printf("Successfully initialized %v node directories\n", viper.GetInt(nValidators)) return nil } -func getIP(i int) (ip string, err error) { - ip = viper.GetString(startingIPAddress) - if len(ip) == 0 { +func getIP(i int, startingIPAddr string) (string, error) { + var ( + ip string + err error + ) + + if len(startingIPAddr) == 0 { ip, err = server.ExternalIP() if err != nil { return "", err } } else { - ip, err = calculateIP(ip, i) + ip, err = calculateIP(startingIPAddr, i) if err != nil { return "", err } } + return ip, nil } func writeFile(name string, dir string, contents []byte) error { writePath := filepath.Join(dir) file := filepath.Join(writePath, name) + err := cmn.EnsureDir(writePath, 0700) if err != nil { return err } + err = cmn.WriteFile(file, contents, 0600) if err != nil { return err } + return nil } @@ -243,5 +352,6 @@ func calculateIP(ip string, i int) (string, error) { for j := 0; j < i; j++ { ipv4[3]++ } + return ipv4.String(), nil } diff --git a/init/utils.go b/init/utils.go new file mode 100644 index 000000000..8d41996d0 --- /dev/null +++ b/init/utils.go @@ -0,0 +1,112 @@ +package init + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "time" + + "github.com/cosmos/cosmos-sdk/codec" + amino "github.com/tendermint/go-amino" + cfg "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/crypto" + "github.com/tendermint/tendermint/libs/common" + "github.com/tendermint/tendermint/p2p" + "github.com/tendermint/tendermint/privval" + "github.com/tendermint/tendermint/types" + "github.com/irisnet/irishub/app" +) + +// ExportGenesisFile creates and writes the genesis configuration to disk. An +// error is returned if building or writing the configuration to file fails. +func ExportGenesisFile( + genFile, chainID string, validators []types.GenesisValidator, appState json.RawMessage, +) error { + + genDoc := types.GenesisDoc{ + ChainID: chainID, + Validators: validators, + AppState: appState, + } + + if err := genDoc.ValidateAndComplete(); err != nil { + return err + } + + return genDoc.SaveAs(genFile) +} + +// ExportGenesisFileWithTime creates and writes the genesis configuration to disk. +// An error is returned if building or writing the configuration to file fails. +func ExportGenesisFileWithTime( + genFile, chainID string, validators []types.GenesisValidator, + appState json.RawMessage, genTime time.Time, +) error { + + genDoc := types.GenesisDoc{ + GenesisTime: genTime, + ChainID: chainID, + Validators: validators, + AppState: appState, + } + + if err := genDoc.ValidateAndComplete(); err != nil { + return err + } + + return genDoc.SaveAs(genFile) +} + +// read of create the private key file for this config +func ReadOrCreatePrivValidator(privValFile string) crypto.PubKey { + var privValidator *privval.FilePV + + if common.FileExists(privValFile) { + privValidator = privval.LoadFilePV(privValFile) + } else { + privValidator = privval.GenFilePV(privValFile) + privValidator.Save() + } + + return privValidator.GetPubKey() +} + +// InitializeNodeValidatorFiles creates private validator and p2p configuration files. +func InitializeNodeValidatorFiles( + config *cfg.Config) (nodeID string, valPubKey crypto.PubKey, err error, +) { + + nodeKey, err := p2p.LoadOrGenNodeKey(config.NodeKeyFile()) + if err != nil { + return nodeID, valPubKey, err + } + + nodeID = string(nodeKey.ID()) + valPubKey = ReadOrCreatePrivValidator(config.PrivValidatorFile()) + + return nodeID, valPubKey, nil +} + +func loadGenesisDoc(cdc *amino.Codec, genFile string) (genDoc types.GenesisDoc, err error) { + genContents, err := ioutil.ReadFile(genFile) + if err != nil { + return genDoc, err + } + + if err := cdc.UnmarshalJSON(genContents, &genDoc); err != nil { + return genDoc, err + } + + return genDoc, err +} + +func initializeEmptyGenesis( + cdc *codec.Codec, genFile, chainID string, overwrite bool, +) (appState json.RawMessage, err error) { + + if !overwrite && common.FileExists(genFile) { + return nil, fmt.Errorf("genesis.json file already exists: %v", genFile) + } + + return codec.MarshalJSONIndent(cdc, app.NewDefaultGenesisState()) +}