From 87d371f32e0bb695bb5b400f35733589a62547b4 Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Mon, 7 May 2018 16:01:58 -0400 Subject: [PATCH 001/548] test --- test.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 test.txt diff --git a/test.txt b/test.txt new file mode 100644 index 0000000000..4e44cf3e9f --- /dev/null +++ b/test.txt @@ -0,0 +1 @@ +test fork \ No newline at end of file From cba8d0082e9cfbd459723445a1285026c840cf0c Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Mon, 21 May 2018 00:18:43 -0300 Subject: [PATCH 002/548] instructions to launch basecoin and do account tx's --- examples/examples.md | 155 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 examples/examples.md diff --git a/examples/examples.md b/examples/examples.md new file mode 100644 index 0000000000..f755084710 --- /dev/null +++ b/examples/examples.md @@ -0,0 +1,155 @@ +# Basecoin Example +=============== + +Here we explain how to get started with a basic Basecoin blockchain, how +to send transactions between accounts using the ``basecli`` tool, and +what is happening under the hood. + +## Setup and Install +------- + +You will need to have go installed on your computer. Please refer to the [cosmos testnet tutorial](https://cosmos.network/validators/tutorial), which will always have the most updated instructions on how to get setup with go and the cosmos repository. + +Once you have go installed, run the command: + +``` +go get github.com/cosmos/cosmos-sdk +``` + +There will be an error stating `can't load package: package github.com/cosmos/cosmos-sdk: no Go files`, however you can ignore this error, it doesn't affect us. Now change directories to: + +`cd $GOPATH/src/github.com/cosmos/cosmos-sdk` + +And run : + +``` +make get_tools // run $ make update_tools if already installed +make get_vendor_deps +make install_examples +``` +In this case we run `make install_examples`, which creates binaries for `basecli` and `basecoind`. + +##Using basecli and basecoind + +Check the versions by running: + +``` +basecli version +basecoind version +``` + +They should read something like `0.17.1-5d18d5f`, but the versions will be constantly updating so don't worry if your version is higher that 0.17.1. + +Note that you can always check help in the terminal by running `basecli -h` or `basecoind -h`. It is good to check these out if you are stuck, because updates to the code base might slighty change the commands, and you might find the correct command in there. + +Let's start by initializing the basecoind daemon. Run the command + +`basecoind init` + +And you should see something like this: + +``` +{ + "chain_id": "test-chain-z77iHG", + "node_id": "e14c5056212b5736e201dd1d64c89246f3288129", + "app_message": { + "secret": "pluck life bracket worry guilt wink upgrade olive tilt output reform census member trouble around abandon" + } +} +``` + +This creates the ~/.basecoind folder, which has config.toml, genesis.json, node_key.json, priv_validator.json. Take some time to review what is contained in these files if you want to understand what is going on at a deeper level. + + +# Generating keys + +The next thing we'll need to do is add the key from priv_validator.json to the gaiacli key manager. For this we need a 16 word seed and a password. You can also get the 16 word seed from the output seen above, under `"secret"`. Then run the command: + +`basecli keys add alice --recover` + +Which will give you three prompts: + +Enter a passphrase for your key: +Repeat the passphrase: +Enter your recovery seed phrase: + +NAME: ADDRESS: PUBKEY: +alice 90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD 1624DE62201D47E63694448665F5D0217EA8458177728C91C373047A42BD3C0FB78BD0BFA7 +bob 29D721F054537C91F618A0FDBF770DA51EF8C48D 1624DE6220F54B2A2CA9EB4EE30DE23A73D15902E087C09CC5616456DDDD3814769E2E0A16 +charlie 2E8E13EEB8E3F0411ACCBC9BE0384732C24FBD5E 1624DE6220F8C9FB8B07855FD94126F88A155BD6EB973509AE5595EFDE1AF05B4964836A53 + +Creating you first locally saved key creates the ~/.basecli folder which holds the keys you are storing. Now that you have the key for alice, you can start up the blockchain by running + +`basecoind start` + +You should see blocks start getting created at a fast rate, with a lot of output in the terminal. + +Next we need to make some more keys so we can send them some tokens. Open a new terminal, and run the following commands, to make two new accounts, and give each account a password you can remember: + +`basecli keys add bob` +`basecli keys add charlie` + +You can see your keys with the command: + +`basecli keys list` + +You should now see alice, bob and charlie's account all show up. + +# Send transactions + +Lets send bob and charlie some tokens. First, lets query alice's account so we can see what kind of tokens she has: + +`basecli account 90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD` + +Where `90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD` is alices address we got from running `basecli keys list`. You should see a large amount of "mycoin" there. If you search the bob or charlies address, the command will fail, because they haven't been added into the blockchain database yet since they have no coins. We need to send them some! + +The following command will send coins from alice, to bob: + +`basecli send --name=alice --amount=10000mycoin --to=29D721F054537C91F618A0FDBF770DA51EF8C48D --sequence=0 --chain-id=test-chain-AE4XQo` + +Where +- name is the name you gave your key +- `mycoin` is the name of the token for this basecoin demo, initialized in the genesis.json file +- sequence is a tally of how many transactions have been made by this account. Sicne this is the first tx on this account, it is 0 +- chain-id is the unique ID that helps tendermint identify which network to connect to. You can find it in the terminal output from the gaiad daemon in the header block , or in the genesis.json file at `~/.basecoind/config/gensis.json` + +Now if we check bobs account, it should have ``10000`` 'mycoin' : + +`basecli account 29D721F054537C91F618A0FDBF770DA51EF8C48D` + +Now lets send some from bob to charlie + +`basecli send --name=bob --amount=5000mycoin --to=2E8E13EEB8E3F0411ACCBC9BE0384732C24FBD5E --sequence=0 --chain-id=test-chain-AE4XQo` + +Note how we use the ``--name`` flag to select a different account to send from. + +Lets now try to send from bob back to alice: + +`basecli send --name=bob --amount=3000mycoin --to=90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD --sequence=1 --chain-id=test-chain-AE4XQo` + +Notice that the sequence is now 1, since we have already recorded bobs 1st transaction as sequnce 0. Also note the ``hash`` value in the response - this is the hash of the transaction. We can query for the transaction by this hash: + +`basecli tx ` + +It will return the details of the transaction hash, such as how many coins were send and to which address. + +That is the basic implementation of basecoin! + + +## Clean up the basecoind and basecli data + +**WARNING:** Running these commands will wipe out any existing +information in both the ``~/.basecli`` and ``~/.basecoind`` directories, +including private keys. + +To remove all the files created and refresh your environment (e.g., if +starting this tutorial again or trying something new), the following +commands are run: + +``` +basecoind unsafe_reset_all +rm -rf ~/.basecoind +rm -rf ~/.basecli +``` + + From c5983df57a60a4366fd964e9f9291569174f8fbe Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Mon, 21 May 2018 00:22:05 -0300 Subject: [PATCH 003/548] deleted a test file that isnt needed --- test.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 test.txt diff --git a/test.txt b/test.txt deleted file mode 100644 index 4e44cf3e9f..0000000000 --- a/test.txt +++ /dev/null @@ -1 +0,0 @@ -test fork \ No newline at end of file From 2c01805a1b9eb637e8eddcd2ba45d072d0e9f47b Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Mon, 21 May 2018 00:28:31 -0300 Subject: [PATCH 004/548] markdown formatting fixes --- examples/examples.md | 64 ++++++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 20 deletions(-) diff --git a/examples/examples.md b/examples/examples.md index f755084710..53610855a7 100644 --- a/examples/examples.md +++ b/examples/examples.md @@ -1,12 +1,10 @@ # Basecoin Example -=============== Here we explain how to get started with a basic Basecoin blockchain, how to send transactions between accounts using the ``basecli`` tool, and what is happening under the hood. ## Setup and Install -------- You will need to have go installed on your computer. Please refer to the [cosmos testnet tutorial](https://cosmos.network/validators/tutorial), which will always have the most updated instructions on how to get setup with go and the cosmos repository. @@ -18,18 +16,20 @@ go get github.com/cosmos/cosmos-sdk There will be an error stating `can't load package: package github.com/cosmos/cosmos-sdk: no Go files`, however you can ignore this error, it doesn't affect us. Now change directories to: -`cd $GOPATH/src/github.com/cosmos/cosmos-sdk` +``` +cd $GOPATH/src/github.com/cosmos/cosmos-sdk +``` And run : ``` -make get_tools // run $ make update_tools if already installed +make get_tools // run make update_tools if you already had it installed make get_vendor_deps make install_examples ``` In this case we run `make install_examples`, which creates binaries for `basecli` and `basecoind`. -##Using basecli and basecoind +## Using basecli and basecoind Check the versions by running: @@ -44,7 +44,9 @@ Note that you can always check help in the terminal by running `basecli -h` or ` Let's start by initializing the basecoind daemon. Run the command -`basecoind init` +``` +basecoind init +``` And you should see something like this: @@ -58,14 +60,16 @@ And you should see something like this: } ``` -This creates the ~/.basecoind folder, which has config.toml, genesis.json, node_key.json, priv_validator.json. Take some time to review what is contained in these files if you want to understand what is going on at a deeper level. +This creates the `~/.basecoind folder`, which has config.toml, genesis.json, node_key.json, priv_validator.json. Take some time to review what is contained in these files if you want to understand what is going on at a deeper level. -# Generating keys +## Generating keys The next thing we'll need to do is add the key from priv_validator.json to the gaiacli key manager. For this we need a 16 word seed and a password. You can also get the 16 word seed from the output seen above, under `"secret"`. Then run the command: -`basecli keys add alice --recover` +``` +basecli keys add alice --recover +``` Which will give you three prompts: @@ -73,39 +77,51 @@ Enter a passphrase for your key: Repeat the passphrase: Enter your recovery seed phrase: +``` NAME: ADDRESS: PUBKEY: alice 90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD 1624DE62201D47E63694448665F5D0217EA8458177728C91C373047A42BD3C0FB78BD0BFA7 bob 29D721F054537C91F618A0FDBF770DA51EF8C48D 1624DE6220F54B2A2CA9EB4EE30DE23A73D15902E087C09CC5616456DDDD3814769E2E0A16 charlie 2E8E13EEB8E3F0411ACCBC9BE0384732C24FBD5E 1624DE6220F8C9FB8B07855FD94126F88A155BD6EB973509AE5595EFDE1AF05B4964836A53 +``` Creating you first locally saved key creates the ~/.basecli folder which holds the keys you are storing. Now that you have the key for alice, you can start up the blockchain by running -`basecoind start` +``` +basecoind start +``` You should see blocks start getting created at a fast rate, with a lot of output in the terminal. Next we need to make some more keys so we can send them some tokens. Open a new terminal, and run the following commands, to make two new accounts, and give each account a password you can remember: -`basecli keys add bob` -`basecli keys add charlie` +``` +basecli keys add bob +basecli keys add charlie +``` You can see your keys with the command: -`basecli keys list` +``` +basecli keys list +``` You should now see alice, bob and charlie's account all show up. -# Send transactions +## Send transactions Lets send bob and charlie some tokens. First, lets query alice's account so we can see what kind of tokens she has: -`basecli account 90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD` +``` +basecli account 90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD +``` Where `90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD` is alices address we got from running `basecli keys list`. You should see a large amount of "mycoin" there. If you search the bob or charlies address, the command will fail, because they haven't been added into the blockchain database yet since they have no coins. We need to send them some! The following command will send coins from alice, to bob: -`basecli send --name=alice --amount=10000mycoin --to=29D721F054537C91F618A0FDBF770DA51EF8C48D --sequence=0 --chain-id=test-chain-AE4XQo` +``` +basecli send --name=alice --amount=10000mycoin --to=29D721F054537C91F618A0FDBF770DA51EF8C48D --sequence=0 --chain-id=test-chain-AE4XQo +``` Where - name is the name you gave your key @@ -115,21 +131,29 @@ Where Now if we check bobs account, it should have ``10000`` 'mycoin' : -`basecli account 29D721F054537C91F618A0FDBF770DA51EF8C48D` +``` +basecli account 29D721F054537C91F618A0FDBF770DA51EF8C48D +``` Now lets send some from bob to charlie -`basecli send --name=bob --amount=5000mycoin --to=2E8E13EEB8E3F0411ACCBC9BE0384732C24FBD5E --sequence=0 --chain-id=test-chain-AE4XQo` +``` +basecli send --name=bob --amount=5000mycoin --to=2E8E13EEB8E3F0411ACCBC9BE0384732C24FBD5E --sequence=0 --chain-id=test-chain-AE4XQo +``` Note how we use the ``--name`` flag to select a different account to send from. Lets now try to send from bob back to alice: -`basecli send --name=bob --amount=3000mycoin --to=90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD --sequence=1 --chain-id=test-chain-AE4XQo` +``` +basecli send --name=bob --amount=3000mycoin --to=90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD --sequence=1 --chain-id=test-chain-AE4XQo +``` Notice that the sequence is now 1, since we have already recorded bobs 1st transaction as sequnce 0. Also note the ``hash`` value in the response - this is the hash of the transaction. We can query for the transaction by this hash: -`basecli tx ` +``` +basecli tx +``` It will return the details of the transaction hash, such as how many coins were send and to which address. From 1e097889cbc9a22b7e6b3d507cf4e87da2cd4451 Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Mon, 21 May 2018 00:31:22 -0300 Subject: [PATCH 005/548] markdown formatting fixes --- examples/examples.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/examples/examples.md b/examples/examples.md index 53610855a7..ff998450f8 100644 --- a/examples/examples.md +++ b/examples/examples.md @@ -79,9 +79,9 @@ Enter your recovery seed phrase: ``` NAME: ADDRESS: PUBKEY: -alice 90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD 1624DE62201D47E63694448665F5D0217EA8458177728C91C373047A42BD3C0FB78BD0BFA7 -bob 29D721F054537C91F618A0FDBF770DA51EF8C48D 1624DE6220F54B2A2CA9EB4EE30DE23A73D15902E087C09CC5616456DDDD3814769E2E0A16 -charlie 2E8E13EEB8E3F0411ACCBC9BE0384732C24FBD5E 1624DE6220F8C9FB8B07855FD94126F88A155BD6EB973509AE5595EFDE1AF05B4964836A53 +alice 90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD 1624DE62201D47E63694448665F5D0217EA8458177728C91C373047A42BD3C0FB78BD0BFA7 +bob 29D721F054537C91F618A0FDBF770DA51EF8C48D 1624DE6220F54B2A2CA9EB4EE30DE23A73D15902E087C09CC5616456DDDD3814769E2E0A16 +charlie 2E8E13EEB8E3F0411ACCBC9BE0384732C24FBD5E 1624DE6220F8C9FB8B07855FD94126F88A155BD6EB973509AE5595EFDE1AF05B4964836A53 ``` Creating you first locally saved key creates the ~/.basecli folder which holds the keys you are storing. Now that you have the key for alice, you can start up the blockchain by running @@ -120,16 +120,17 @@ Where `90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD` is alices address we got from r The following command will send coins from alice, to bob: ``` -basecli send --name=alice --amount=10000mycoin --to=29D721F054537C91F618A0FDBF770DA51EF8C48D --sequence=0 --chain-id=test-chain-AE4XQo +basecli send --name=alice --amount=10000mycoin --to=29D721F054537C91F618A0FDBF770DA51EF8C48D +--sequence=0 --chain-id=test-chain-AE4XQo ``` -Where +Flag Descriptions: - name is the name you gave your key - `mycoin` is the name of the token for this basecoin demo, initialized in the genesis.json file - sequence is a tally of how many transactions have been made by this account. Sicne this is the first tx on this account, it is 0 - chain-id is the unique ID that helps tendermint identify which network to connect to. You can find it in the terminal output from the gaiad daemon in the header block , or in the genesis.json file at `~/.basecoind/config/gensis.json` -Now if we check bobs account, it should have ``10000`` 'mycoin' : +Now if we check bobs account, it should have `10000 mycoin` : ``` basecli account 29D721F054537C91F618A0FDBF770DA51EF8C48D @@ -138,7 +139,8 @@ basecli account 29D721F054537C91F618A0FDBF770DA51EF8C48D Now lets send some from bob to charlie ``` -basecli send --name=bob --amount=5000mycoin --to=2E8E13EEB8E3F0411ACCBC9BE0384732C24FBD5E --sequence=0 --chain-id=test-chain-AE4XQo +basecli send --name=bob --amount=5000mycoin --to=2E8E13EEB8E3F0411ACCBC9BE0384732C24FBD5E +--sequence=0 --chain-id=test-chain-AE4XQo ``` Note how we use the ``--name`` flag to select a different account to send from. From 8f4234b44dc607284a6cfcb9ea386297c5a6e3a6 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 22 May 2018 10:40:04 +0200 Subject: [PATCH 006/548] Require --name on init gen-tx --- cmd/gaia/app/genesis.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd/gaia/app/genesis.go b/cmd/gaia/app/genesis.go index 7cb7564dd3..b70ac17a1a 100644 --- a/cmd/gaia/app/genesis.go +++ b/cmd/gaia/app/genesis.go @@ -65,7 +65,7 @@ func GaiaAppInit() server.AppInit { fsAppGenState := pflag.NewFlagSet("", pflag.ContinueOnError) fsAppGenTx := pflag.NewFlagSet("", pflag.ContinueOnError) - fsAppGenTx.String(flagName, "", "validator moniker, if left blank, do not add validator") + fsAppGenTx.String(flagName, "", "validator moniker, required") fsAppGenTx.String(flagClientHome, DefaultCLIHome, "home directory for the client, used for key generation") fsAppGenTx.Bool(flagOWK, false, "overwrite the accounts created") @@ -94,6 +94,9 @@ func GaiaAppGenTx(cdc *wire.Codec, pk crypto.PubKey) ( clientRoot := viper.GetString(flagClientHome) overwrite := viper.GetBool(flagOWK) name := viper.GetString(flagName) + if name == "" { + return nil, nil, tmtypes.GenesisValidator{}, errors.New("Must specify --name (validator moniker)") + } addr, secret, err = server.GenerateSaveCoinKey(clientRoot, name, "1234567890", overwrite) if err != nil { return From 1fdb65169a0389e153b52d623fe86f015cb8ada8 Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Tue, 22 May 2018 21:03:19 -0300 Subject: [PATCH 007/548] added updated explaination from old docs --- examples/examples.md | 164 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 150 insertions(+), 14 deletions(-) diff --git a/examples/examples.md b/examples/examples.md index ff998450f8..804636e25b 100644 --- a/examples/examples.md +++ b/examples/examples.md @@ -27,7 +27,7 @@ make get_tools // run make update_tools if you already had it installed make get_vendor_deps make install_examples ``` -In this case we run `make install_examples`, which creates binaries for `basecli` and `basecoind`. +Then run `make install_examples`, which creates binaries for `basecli` and `basecoind`. You can look at the Makefile if you want to see the details on what these make commands are doing. ## Using basecli and basecoind @@ -65,7 +65,7 @@ This creates the `~/.basecoind folder`, which has config.toml, genesis.json, nod ## Generating keys -The next thing we'll need to do is add the key from priv_validator.json to the gaiacli key manager. For this we need a 16 word seed and a password. You can also get the 16 word seed from the output seen above, under `"secret"`. Then run the command: +The next thing we'll need to do is add the key from priv_validator.json to the gaiacli key manager. For this we need the 16 word seed that represents the private key, and a password. You can also get the 16 word seed from the output seen above, under `"secret"`. Then run the command: ``` basecli keys add alice --recover @@ -73,18 +73,13 @@ basecli keys add alice --recover Which will give you three prompts: +``` Enter a passphrase for your key: Repeat the passphrase: Enter your recovery seed phrase: - -``` -NAME: ADDRESS: PUBKEY: -alice 90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD 1624DE62201D47E63694448665F5D0217EA8458177728C91C373047A42BD3C0FB78BD0BFA7 -bob 29D721F054537C91F618A0FDBF770DA51EF8C48D 1624DE6220F54B2A2CA9EB4EE30DE23A73D15902E087C09CC5616456DDDD3814769E2E0A16 -charlie 2E8E13EEB8E3F0411ACCBC9BE0384732C24FBD5E 1624DE6220F8C9FB8B07855FD94126F88A155BD6EB973509AE5595EFDE1AF05B4964836A53 ``` -Creating you first locally saved key creates the ~/.basecli folder which holds the keys you are storing. Now that you have the key for alice, you can start up the blockchain by running +You just created your first locally stored key, under the name alice, and this account is linked to the private key that is running the basecoind validator node. Once you do this, the ~/.basecli folder is created, which will hold all keys you are storing. Now that you have the key for alice, you can start up the blockchain by running ``` basecoind start @@ -107,6 +102,14 @@ basecli keys list You should now see alice, bob and charlie's account all show up. +``` +NAME: ADDRESS: PUBKEY: +alice 90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD 1624DE62201D47E63694448665F5D0217EA8458177728C91C373047A42BD3C0FB78BD0BFA7 +bob 29D721F054537C91F618A0FDBF770DA51EF8C48D 1624DE6220F54B2A2CA9EB4EE30DE23A73D15902E087C09CC5616456DDDD3814769E2E0A16 +charlie 2E8E13EEB8E3F0411ACCBC9BE0384732C24FBD5E 1624DE6220F8C9FB8B07855FD94126F88A155BD6EB973509AE5595EFDE1AF05B4964836A53 +``` + + ## Send transactions Lets send bob and charlie some tokens. First, lets query alice's account so we can see what kind of tokens she has: @@ -115,7 +118,7 @@ Lets send bob and charlie some tokens. First, lets query alice's account so we c basecli account 90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD ``` -Where `90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD` is alices address we got from running `basecli keys list`. You should see a large amount of "mycoin" there. If you search the bob or charlies address, the command will fail, because they haven't been added into the blockchain database yet since they have no coins. We need to send them some! +Where `90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD` is alices address we got from running `basecli keys list`. You should see a large amount of "mycoin" there. If you search for bob's or charlie's address, the command will fail, because they haven't been added into the blockchain database yet since they have no coins. We need to send them some! The following command will send coins from alice, to bob: @@ -130,13 +133,13 @@ Flag Descriptions: - sequence is a tally of how many transactions have been made by this account. Sicne this is the first tx on this account, it is 0 - chain-id is the unique ID that helps tendermint identify which network to connect to. You can find it in the terminal output from the gaiad daemon in the header block , or in the genesis.json file at `~/.basecoind/config/gensis.json` -Now if we check bobs account, it should have `10000 mycoin` : +Now if we check bobs account, it should have `10000 mycoin`. You can do so by running : ``` basecli account 29D721F054537C91F618A0FDBF770DA51EF8C48D ``` -Now lets send some from bob to charlie +Now lets send some from bob to charlie. Make sure you send less than bob has, otherwise the transaction will fail: ``` basecli send --name=bob --amount=5000mycoin --to=2E8E13EEB8E3F0411ACCBC9BE0384732C24FBD5E @@ -151,13 +154,13 @@ Lets now try to send from bob back to alice: basecli send --name=bob --amount=3000mycoin --to=90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD --sequence=1 --chain-id=test-chain-AE4XQo ``` -Notice that the sequence is now 1, since we have already recorded bobs 1st transaction as sequnce 0. Also note the ``hash`` value in the response - this is the hash of the transaction. We can query for the transaction by this hash: +Notice that the sequence is now 1, since we have already recorded bobs 1st transaction as sequnce 0. Also note the ``hash`` value in the response in the terminal - this is the hash of the transaction. We can query for the transaction with this command: ``` basecli tx ``` -It will return the details of the transaction hash, such as how many coins were send and to which address. +It will return the details of the transaction hash, such as how many coins were send and to which address, and on what block it occured That is the basic implementation of basecoin! @@ -178,4 +181,137 @@ rm -rf ~/.basecoind rm -rf ~/.basecli ``` +# Technical Details on how Basecoin Works + +This section describes some of the more technical aspects for what is going on under the hood of Basecoin. + +## Proof + +Even if you don't see it in the UI, the result of every query comes with +a proof. This is a Merkle proof that the result of the query is actually +contained in the state. And the state's Merkle root is contained in a +recent block header. Behind the scenes, ``basecli`` will not only +verify that this state matches the header, but also that the header is +properly signed by the known validator set. It will even update the +validator set as needed, so long as there have not been major changes +and it is secure to do so. So, if you wonder why the query may take a +second... there is a lot of work going on in the background to make sure +even a lying full node can't trick your client. + +## Accounts and Transactions + +For a better understanding of how to further use the tools, it helps to +understand the underlying data structures. + +### Accounts + +The Basecoin state consists entirely of a set of accounts. Each account +contains an address, a public key, a balance in many different coin denominations, +and a strictly increasing sequence number for replay protection. This +type of account was directly inspired by accounts in Ethereum, and is +unlike Bitcoin's use of Unspent Transaction Outputs (UTXOs). + +``` + type BaseAccount struct { + Address sdk.Address `json:"address"` + Coins sdk.Coins `json:"coins"` + PubKey crypto.PubKey `json:"public_key"` + Sequence int64 `json:"sequence"` + } +``` + +You can also add more fields to accounts, and basecoin actually does so. Basecoin +adds a Name field in order to show how easily the base account structure can be +modified to suit any applications needs. + +``` + type AppAccount struct { + auth.BaseAccount + Name string `json:"name"` + } +``` + +Within accounts, coin balances are stored. Basecoin is a multi-asset cryptocurrency, so each account can have many +different kinds of tokens, which are held in an array. + +``` + type Coins []Coin + + type Coin struct { + Denom string `json:"denom"` + Amount int64 `json:"amount"` + } +``` + +If you want to add more coins to a blockchain, you can do so manually in +the ``~/.basecoin/genesis.json`` before you start the blockchain for the +first time. + +Accounts are serialized and stored in a Merkle tree under the key +``base/a/
``, where ``
`` is the address of the account. +Typically, the address of the account is the 20-byte ``RIPEMD160`` hash +of the public key, but other formats are acceptable as well, as defined +in the `Tendermint crypto +library `__. The Merkle tree +used in Basecoin is a balanced, binary search tree, which we call an +`IAVL tree `__. + +### Transactions + +Basecoin defines a transaction type, the `SendTx`, which allows tokens +to be sent to other accounts. The `SendTx` takes a list of inputs and +a list of outputs, and transfers all the tokens listed in the inputs +from their corresponding accounts to the accounts listed in the output. +The `SendTx` is structured as follows: +``` + type SendTx struct { + Gas int64 `json:"gas"` + Fee Coin `json:"fee"` + Inputs []TxInput `json:"inputs"` + Outputs []TxOutput `json:"outputs"` + } + + type TxInput struct { + Address []byte `json:"address"` // Hash of the PubKey + Coins Coins `json:"coins"` // + Sequence int `json:"sequence"` // Must be 1 greater than the last committed TxInput + Signature crypto.Signature `json:"signature"` // Depends on the PubKey type and the whole Tx + PubKey crypto.PubKey `json:"pub_key"` // Is present iff Sequence == 0 + } + + type TxOutput struct { + Address []byte `json:"address"` // Hash of the PubKey + Coins Coins `json:"coins"` // + } +``` +Note the `SendTx` includes a field for `Gas` and `Fee`. The +`Gas` limits the total amount of computation that can be done by the +transaction, while the `Fee` refers to the total amount paid in fees. +This is slightly different from Ethereum's concept of `Gas` and +`GasPrice`, where `Fee = Gas x GasPrice`. In Basecoin, the `Gas` +and `Fee` are independent, and the `GasPrice` is implicit. + +In Basecoin, the `Fee` is meant to be used by the validators to inform +the ordering of transactions, like in Bitcoin. And the `Gas` is meant +to be used by the application plugin to control its execution. There is +currently no means to pass `Fee` information to the Tendermint +validators, but it will come soon... so this version of Basecoin does +not actually fully implement fees and gas, but it still allows us +to send transactions between accounts. + +Note also that the `PubKey` only needs to be sent for +`Sequence == 0`. After that, it is stored under the account in the +Merkle tree and subsequent transactions can exclude it, using only the +`Address` to refer to the sender. Ethereum does not require public +keys to be sent in transactions as it uses a different elliptic curve +scheme which enables the public key to be derived from the signature +itself. + +Finally, note that the use of multiple inputs and multiple outputs +allows us to send many different types of tokens between many different +accounts at once in an atomic transaction. Thus, the `SendTx` can +serve as a basic unit of decentralized exchange. When using multiple +inputs and outputs, you must make sure that the sum of coins of the +inputs equals the sum of coins of the outputs (no creating money), and +that all accounts that provide inputs have signed the transaction. From 450f0b6822c948bb6ac023f9a0d9f3dd9724f577 Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Tue, 22 May 2018 21:44:50 -0300 Subject: [PATCH 008/548] fixing display --- examples/examples.md | 68 ++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/examples/examples.md b/examples/examples.md index 804636e25b..6af50fcfa2 100644 --- a/examples/examples.md +++ b/examples/examples.md @@ -157,7 +157,7 @@ basecli send --name=bob --amount=3000mycoin --to=90B0B9BE0914ECEE0B6DB74E67B07A0 Notice that the sequence is now 1, since we have already recorded bobs 1st transaction as sequnce 0. Also note the ``hash`` value in the response in the terminal - this is the hash of the transaction. We can query for the transaction with this command: ``` -basecli tx +basecli tx ``` It will return the details of the transaction hash, such as how many coins were send and to which address, and on what block it occured @@ -181,7 +181,7 @@ rm -rf ~/.basecoind rm -rf ~/.basecli ``` -# Technical Details on how Basecoin Works +## Technical Details on how Basecoin Works This section describes some of the more technical aspects for what is going on under the hood of Basecoin. @@ -212,12 +212,12 @@ type of account was directly inspired by accounts in Ethereum, and is unlike Bitcoin's use of Unspent Transaction Outputs (UTXOs). ``` - type BaseAccount struct { - Address sdk.Address `json:"address"` - Coins sdk.Coins `json:"coins"` - PubKey crypto.PubKey `json:"public_key"` - Sequence int64 `json:"sequence"` - } +type BaseAccount struct { + Address sdk.Address `json:"address"` + Coins sdk.Coins `json:"coins"` + PubKey crypto.PubKey `json:"public_key"` + Sequence int64 `json:"sequence"` +} ``` You can also add more fields to accounts, and basecoin actually does so. Basecoin @@ -225,22 +225,22 @@ adds a Name field in order to show how easily the base account structure can be modified to suit any applications needs. ``` - type AppAccount struct { - auth.BaseAccount - Name string `json:"name"` - } +type AppAccount struct { + auth.BaseAccount + Name string `json:"name"` +} ``` Within accounts, coin balances are stored. Basecoin is a multi-asset cryptocurrency, so each account can have many different kinds of tokens, which are held in an array. ``` - type Coins []Coin +type Coins []Coin - type Coin struct { - Denom string `json:"denom"` - Amount int64 `json:"amount"` - } +type Coin struct { + Denom string `json:"denom"` + Amount int64 `json:"amount"` +} ``` If you want to add more coins to a blockchain, you can do so manually in @@ -264,25 +264,25 @@ a list of outputs, and transfers all the tokens listed in the inputs from their corresponding accounts to the accounts listed in the output. The `SendTx` is structured as follows: ``` - type SendTx struct { - Gas int64 `json:"gas"` - Fee Coin `json:"fee"` - Inputs []TxInput `json:"inputs"` - Outputs []TxOutput `json:"outputs"` - } +type SendTx struct { + Gas int64 `json:"gas"` + Fee Coin `json:"fee"` + Inputs []TxInput `json:"inputs"` + Outputs []TxOutput `json:"outputs"` +} - type TxInput struct { - Address []byte `json:"address"` // Hash of the PubKey - Coins Coins `json:"coins"` // - Sequence int `json:"sequence"` // Must be 1 greater than the last committed TxInput - Signature crypto.Signature `json:"signature"` // Depends on the PubKey type and the whole Tx - PubKey crypto.PubKey `json:"pub_key"` // Is present iff Sequence == 0 - } +type TxInput struct { + Address []byte `json:"address"` // Hash of the PubKey + Coins Coins `json:"coins"` // + Sequence int `json:"sequence"` // Must be 1 greater than the last committed TxInput + Signature crypto.Signature `json:"signature"` // Depends on the PubKey type and the whole Tx + PubKey crypto.PubKey `json:"pub_key"` // Is present iff Sequence == 0 +} - type TxOutput struct { - Address []byte `json:"address"` // Hash of the PubKey - Coins Coins `json:"coins"` // - } +type TxOutput struct { + Address []byte `json:"address"` // Hash of the PubKey + Coins Coins `json:"coins"` // +} ``` Note the `SendTx` includes a field for `Gas` and `Fee`. The `Gas` limits the total amount of computation that can be done by the From 89f787a3dfb01c2e989edfc9d9680357d4bbb2ae Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Tue, 22 May 2018 21:56:07 -0300 Subject: [PATCH 009/548] more display updates --- examples/examples.md | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/examples/examples.md b/examples/examples.md index 6af50fcfa2..b295bea6b2 100644 --- a/examples/examples.md +++ b/examples/examples.md @@ -1,6 +1,6 @@ # Basecoin Example -Here we explain how to get started with a basic Basecoin blockchain, how +Here we explain how to get started with a simple Basecoin blockchain, how to send transactions between accounts using the ``basecli`` tool, and what is happening under the hood. @@ -38,7 +38,7 @@ basecli version basecoind version ``` -They should read something like `0.17.1-5d18d5f`, but the versions will be constantly updating so don't worry if your version is higher that 0.17.1. +They should read something like `0.17.1-5d18d5f`, but the versions will be constantly updating so don't worry if your version is higher that 0.17.1. That's a good thing. Note that you can always check help in the terminal by running `basecli -h` or `basecoind -h`. It is good to check these out if you are stuck, because updates to the code base might slighty change the commands, and you might find the correct command in there. @@ -79,15 +79,15 @@ Repeat the passphrase: Enter your recovery seed phrase: ``` -You just created your first locally stored key, under the name alice, and this account is linked to the private key that is running the basecoind validator node. Once you do this, the ~/.basecli folder is created, which will hold all keys you are storing. Now that you have the key for alice, you can start up the blockchain by running +You just created your first locally stored key, under the name alice, and this account is linked to the private key that is running the basecoind validator node. Once you do this, the ~/.basecli folder is created, which will hold the alice key and any other keys you make. Now that you have the key for alice, you can start up the blockchain by running ``` basecoind start ``` -You should see blocks start getting created at a fast rate, with a lot of output in the terminal. +You should see blocks being created at a fast rate, with a lot of output in the terminal. -Next we need to make some more keys so we can send them some tokens. Open a new terminal, and run the following commands, to make two new accounts, and give each account a password you can remember: +Next we need to make some more keys so we can use the send transaction functionality of basecoin. Open a new terminal, and run the following commands, to make two new accounts, and give each account a password you can remember: ``` basecli keys add bob @@ -105,7 +105,7 @@ You should now see alice, bob and charlie's account all show up. ``` NAME: ADDRESS: PUBKEY: alice 90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD 1624DE62201D47E63694448665F5D0217EA8458177728C91C373047A42BD3C0FB78BD0BFA7 -bob 29D721F054537C91F618A0FDBF770DA51EF8C48D 1624DE6220F54B2A2CA9EB4EE30DE23A73D15902E087C09CC5616456DDDD3814769E2E0A16 +bob 29D721F054537C91F618A0FDBF770DA51EF8C48D 1624DE6220F54B2A2CA9EB4EE30DE23A73D15902E087C09CC5616456DDDD3814769E2E0A16 charlie 2E8E13EEB8E3F0411ACCBC9BE0384732C24FBD5E 1624DE6220F8C9FB8B07855FD94126F88A155BD6EB973509AE5595EFDE1AF05B4964836A53 ``` @@ -128,10 +128,10 @@ basecli send --name=alice --amount=10000mycoin --to=29D721F054537C91F618A0FDBF77 ``` Flag Descriptions: -- name is the name you gave your key +- `name` is the name you gave your key - `mycoin` is the name of the token for this basecoin demo, initialized in the genesis.json file -- sequence is a tally of how many transactions have been made by this account. Sicne this is the first tx on this account, it is 0 -- chain-id is the unique ID that helps tendermint identify which network to connect to. You can find it in the terminal output from the gaiad daemon in the header block , or in the genesis.json file at `~/.basecoind/config/gensis.json` +- `sequence` is a tally of how many transactions have been made by this account. Sicne this is the first tx on this account, it is 0 +- `chain-id` is the unique ID that helps tendermint identify which network to connect to. You can find it in the terminal output from the gaiad daemon in the header block , or in the genesis.json file at `~/.basecoind/config/gensis.json` Now if we check bobs account, it should have `10000 mycoin`. You can do so by running : @@ -151,25 +151,28 @@ Note how we use the ``--name`` flag to select a different account to send from. Lets now try to send from bob back to alice: ``` -basecli send --name=bob --amount=3000mycoin --to=90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD --sequence=1 --chain-id=test-chain-AE4XQo +basecli send --name=bob --amount=3000mycoin --to=90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD +--sequence=1 --chain-id=test-chain-AE4XQo ``` -Notice that the sequence is now 1, since we have already recorded bobs 1st transaction as sequnce 0. Also note the ``hash`` value in the response in the terminal - this is the hash of the transaction. We can query for the transaction with this command: +Notice that the sequence is now 1, since we have already recorded bobs 1st transaction as `sequnce 0`. Also note the ``hash`` value in the response in the terminal - this is the hash of the transaction. We can query for the transaction with this command: ``` basecli tx ``` -It will return the details of the transaction hash, such as how many coins were send and to which address, and on what block it occured +It will return the details of the transaction hash, such as how many coins were send and to which address, and on what block it occured. That is the basic implementation of basecoin! -## Clean up the basecoind and basecli data +## Reset the basecoind blockchain and basecli data **WARNING:** Running these commands will wipe out any existing information in both the ``~/.basecli`` and ``~/.basecoind`` directories, -including private keys. +including private keys. This should be no problem considering that basecoin +is just an example, but it is always good to pay extra attention when +you are removing private keys, in any scenario involving a blockchain. To remove all the files created and refresh your environment (e.g., if starting this tutorial again or trying something new), the following @@ -201,7 +204,7 @@ even a lying full node can't trick your client. ## Accounts and Transactions For a better understanding of how to further use the tools, it helps to -understand the underlying data structures. +understand the underlying data structures, so lets look at accounts and transactions. ### Accounts @@ -222,7 +225,8 @@ type BaseAccount struct { You can also add more fields to accounts, and basecoin actually does so. Basecoin adds a Name field in order to show how easily the base account structure can be -modified to suit any applications needs. +modified to suit any applications needs. It takes the `auth.BaseAccount` we see above, +and extends it with `Name`. ``` type AppAccount struct { From 114c9a2077d2a70fbd560585d2936fe94241b812 Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Tue, 22 May 2018 21:56:43 -0300 Subject: [PATCH 010/548] more display updates --- examples/examples.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/examples.md b/examples/examples.md index b295bea6b2..bfc97893ef 100644 --- a/examples/examples.md +++ b/examples/examples.md @@ -216,7 +216,7 @@ unlike Bitcoin's use of Unspent Transaction Outputs (UTXOs). ``` type BaseAccount struct { - Address sdk.Address `json:"address"` + Address sdk.Address `json:"address"` Coins sdk.Coins `json:"coins"` PubKey crypto.PubKey `json:"public_key"` Sequence int64 `json:"sequence"` From 16e18b7e9680667105f422a455300bae5c002eda Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Wed, 23 May 2018 09:43:17 -0300 Subject: [PATCH 011/548] fixed small typos --- examples/examples.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/examples.md b/examples/examples.md index bfc97893ef..7d8665ca62 100644 --- a/examples/examples.md +++ b/examples/examples.md @@ -1,6 +1,6 @@ # Basecoin Example -Here we explain how to get started with a simple Basecoin blockchain, how +Here we explain how to get started with a basic Basecoin blockchain, how to send transactions between accounts using the ``basecli`` tool, and what is happening under the hood. @@ -103,7 +103,7 @@ basecli keys list You should now see alice, bob and charlie's account all show up. ``` -NAME: ADDRESS: PUBKEY: +NAME: ADDRESS: PUBKEY: alice 90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD 1624DE62201D47E63694448665F5D0217EA8458177728C91C373047A42BD3C0FB78BD0BFA7 bob 29D721F054537C91F618A0FDBF770DA51EF8C48D 1624DE6220F54B2A2CA9EB4EE30DE23A73D15902E087C09CC5616456DDDD3814769E2E0A16 charlie 2E8E13EEB8E3F0411ACCBC9BE0384732C24FBD5E 1624DE6220F8C9FB8B07855FD94126F88A155BD6EB973509AE5595EFDE1AF05B4964836A53 @@ -118,7 +118,7 @@ Lets send bob and charlie some tokens. First, lets query alice's account so we c basecli account 90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD ``` -Where `90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD` is alices address we got from running `basecli keys list`. You should see a large amount of "mycoin" there. If you search for bob's or charlie's address, the command will fail, because they haven't been added into the blockchain database yet since they have no coins. We need to send them some! +Where `90B0B9BE0914ECEE0B6DB74E67B07A00056B9BBD` is alice's address we got from running `basecli keys list`. You should see a large amount of "mycoin" there. If you search for bob's or charlie's address, the command will fail, because they haven't been added into the blockchain database yet since they have no coins. We need to send them some! The following command will send coins from alice, to bob: @@ -130,7 +130,7 @@ basecli send --name=alice --amount=10000mycoin --to=29D721F054537C91F618A0FDBF77 Flag Descriptions: - `name` is the name you gave your key - `mycoin` is the name of the token for this basecoin demo, initialized in the genesis.json file -- `sequence` is a tally of how many transactions have been made by this account. Sicne this is the first tx on this account, it is 0 +- `sequence` is a tally of how many transactions have been made by this account. Since this is the first tx on this account, it is 0 - `chain-id` is the unique ID that helps tendermint identify which network to connect to. You can find it in the terminal output from the gaiad daemon in the header block , or in the genesis.json file at `~/.basecoind/config/gensis.json` Now if we check bobs account, it should have `10000 mycoin`. You can do so by running : @@ -155,7 +155,7 @@ basecli send --name=bob --amount=3000mycoin --to=90B0B9BE0914ECEE0B6DB74E67B07A0 --sequence=1 --chain-id=test-chain-AE4XQo ``` -Notice that the sequence is now 1, since we have already recorded bobs 1st transaction as `sequnce 0`. Also note the ``hash`` value in the response in the terminal - this is the hash of the transaction. We can query for the transaction with this command: +Notice that the sequence is now 1, since we have already recorded bobs 1st transaction as `sequence 0`. Also note the ``hash`` value in the response in the terminal - this is the hash of the transaction. We can query for the transaction with this command: ``` basecli tx From 3055d939edd968deee8a0c2ad33fef8664e8bd1d Mon Sep 17 00:00:00 2001 From: sunnya97 Date: Wed, 23 May 2018 19:26:54 -0700 Subject: [PATCH 012/548] in progress --- baseapp/baseapp.go | 3 +- client/context/helpers.go | 9 +- client/context/types.go | 6 +- client/tx/query.go | 3 +- cmd/gaia/app/app.go | 13 +- cmd/gaia/app/genesis.go | 11 +- types/account.go | 29 ----- types/handler.go | 3 - types/signature.go | 10 -- types/tx_msg.go | 117 ----------------- x/auth/account.go | 25 ++++ x/auth/ante.go | 30 ++--- x/auth/client/cli/account.go | 7 +- x/auth/context.go | 8 +- x/auth/mapper.go | 30 +++-- x/auth/stdtx.go | 131 ++++++++++++++++++++ x/auth/wire.go | 12 -- x/bank/keeper.go | 27 ++-- x/{auth => baseaccount}/baseaccount.go | 9 +- x/{auth => baseaccount}/baseaccount_test.go | 2 +- x/{auth => baseaccount}/handler.go | 13 +- x/{auth => baseaccount}/msgs.go | 7 +- x/{auth => baseaccount}/msgs_test.go | 2 +- x/baseaccount/wire.go | 14 +++ x/stake/test_common.go | 13 +- 25 files changed, 270 insertions(+), 264 deletions(-) delete mode 100644 types/signature.go create mode 100644 x/auth/account.go create mode 100644 x/auth/stdtx.go delete mode 100644 x/auth/wire.go rename x/{auth => baseaccount}/baseaccount.go (90%) rename x/{auth => baseaccount}/baseaccount_test.go (99%) rename x/{auth => baseaccount}/handler.go (58%) rename x/{auth => baseaccount}/msgs.go (87%) rename x/{auth => baseaccount}/msgs_test.go (97%) create mode 100644 x/baseaccount/wire.go diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index ef3bbc3c79..4ce8a05d9b 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -15,6 +15,7 @@ import ( "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" ) // Key to store the header in the DB itself. @@ -125,7 +126,7 @@ func (app *BaseApp) SetTxDecoder(txDecoder sdk.TxDecoder) { // default custom logic for transaction decoding func defaultTxDecoder(cdc *wire.Codec) sdk.TxDecoder { return func(txBytes []byte) (sdk.Tx, sdk.Error) { - var tx = sdk.StdTx{} + var tx = auth.StdTx{} if len(txBytes) == 0 { return nil, sdk.ErrTxDecode("txBytes are empty") diff --git a/client/context/helpers.go b/client/context/helpers.go index 562bde9b4c..f4686befde 100644 --- a/client/context/helpers.go +++ b/client/context/helpers.go @@ -6,6 +6,7 @@ import ( "github.com/pkg/errors" "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" rpcclient "github.com/tendermint/tendermint/rpc/client" ctypes "github.com/tendermint/tendermint/rpc/core/types" cmn "github.com/tendermint/tmlibs/common" @@ -109,11 +110,11 @@ func (ctx CoreContext) SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *w return nil, errors.Errorf("Chain ID required but not specified") } sequence := ctx.Sequence - signMsg := sdk.StdSignMsg{ + signMsg := auth.StdSignMsg{ ChainID: chainID, Sequences: []int64{sequence}, Msg: msg, - Fee: sdk.NewStdFee(10000, sdk.Coin{}), // TODO run simulate to estimate gas? + Fee: auth.NewStdFee(10000, sdk.Coin{}), // TODO run simulate to estimate gas? } keybase, err := keys.GetKeyBase() @@ -128,14 +129,14 @@ func (ctx CoreContext) SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *w if err != nil { return nil, err } - sigs := []sdk.StdSignature{{ + sigs := []auth.StdSignature{{ PubKey: pubkey, Signature: sig, Sequence: sequence, }} // marshal bytes - tx := sdk.NewStdTx(signMsg.Msg, signMsg.Fee, sigs) + tx := auth.NewStdTx(signMsg.Msg, signMsg.Fee, sigs) return cdc.MarshalBinary(tx) } diff --git a/client/context/types.go b/client/context/types.go index e580027d67..da15b32936 100644 --- a/client/context/types.go +++ b/client/context/types.go @@ -3,7 +3,7 @@ package context import ( rpcclient "github.com/tendermint/tendermint/rpc/client" - sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" ) // typical context created in sdk modules for transactions/queries @@ -15,7 +15,7 @@ type CoreContext struct { FromAddressName string Sequence int64 Client rpcclient.Client - Decoder sdk.AccountDecoder + Decoder auth.AccountDecoder AccountStore string } @@ -63,7 +63,7 @@ func (c CoreContext) WithClient(client rpcclient.Client) CoreContext { } // WithDecoder - return a copy of the context with an updated Decoder -func (c CoreContext) WithDecoder(decoder sdk.AccountDecoder) CoreContext { +func (c CoreContext) WithDecoder(decoder auth.AccountDecoder) CoreContext { c.Decoder = decoder return c } diff --git a/client/tx/query.go b/client/tx/query.go index 2078b78831..7673dd38db 100644 --- a/client/tx/query.go +++ b/client/tx/query.go @@ -17,6 +17,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" ) // Get the default command for a tx query @@ -95,7 +96,7 @@ type txInfo struct { } func parseTx(cdc *wire.Codec, txBytes []byte) (sdk.Tx, error) { - var tx sdk.StdTx + var tx auth.StdTx err := cdc.UnmarshalBinary(txBytes, &tx) if err != nil { return nil, err diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index 5ff532bffa..df4429ee25 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -14,6 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/cosmos/cosmos-sdk/x/baseaccount" "github.com/cosmos/cosmos-sdk/x/ibc" "github.com/cosmos/cosmos-sdk/x/stake" ) @@ -40,7 +41,7 @@ type GaiaApp struct { keyStake *sdk.KVStoreKey // Manage getting and setting accounts - accountMapper sdk.AccountMapper + accountMapper auth.AccountMapper coinKeeper bank.Keeper ibcMapper ibc.Mapper stakeKeeper stake.Keeper @@ -62,8 +63,8 @@ func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { // define the accountMapper app.accountMapper = auth.NewAccountMapper( app.cdc, - app.keyAccount, // target store - &auth.BaseAccount{}, // prototype + app.keyAccount, // target store + &baseaccount.BaseAccount{}, // prototype ) // add handlers @@ -81,7 +82,7 @@ func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { app.SetInitChainer(app.initChainer) app.SetEndBlocker(stake.NewEndBlocker(app.stakeKeeper)) app.MountStoresIAVL(app.keyMain, app.keyAccount, app.keyIBC, app.keyStake) - app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, stake.FeeHandler)) + app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper)) err := app.LoadLatestVersion(app.keyMain) if err != nil { cmn.Exit(err.Error()) @@ -96,7 +97,7 @@ func MakeCodec() *wire.Codec { ibc.RegisterWire(cdc) bank.RegisterWire(cdc) stake.RegisterWire(cdc) - auth.RegisterWire(cdc) + baseaccount.RegisterWire(cdc) sdk.RegisterWire(cdc) wire.RegisterCrypto(cdc) return cdc @@ -131,7 +132,7 @@ func (app *GaiaApp) ExportAppStateJSON() (appState json.RawMessage, err error) { // iterate to get the accounts accounts := []GenesisAccount{} - appendAccount := func(acc sdk.Account) (stop bool) { + appendAccount := func(acc auth.Account) (stop bool) { account := NewGenesisAccountI(acc) accounts = append(accounts, account) return false diff --git a/cmd/gaia/app/genesis.go b/cmd/gaia/app/genesis.go index 7cb7564dd3..fb02a19ef4 100644 --- a/cmd/gaia/app/genesis.go +++ b/cmd/gaia/app/genesis.go @@ -13,6 +13,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/baseaccount" "github.com/cosmos/cosmos-sdk/x/stake" ) @@ -28,14 +29,14 @@ type GenesisAccount struct { Coins sdk.Coins `json:"coins"` } -func NewGenesisAccount(acc *auth.BaseAccount) GenesisAccount { +func NewGenesisAccount(acc *baseaccount.BaseAccount) GenesisAccount { return GenesisAccount{ Address: acc.Address, Coins: acc.Coins, } } -func NewGenesisAccountI(acc sdk.Account) GenesisAccount { +func NewGenesisAccountI(acc auth.Account) GenesisAccount { return GenesisAccount{ Address: acc.GetAddress(), Coins: acc.GetCoins(), @@ -43,8 +44,8 @@ func NewGenesisAccountI(acc sdk.Account) GenesisAccount { } // convert GenesisAccount to auth.BaseAccount -func (ga *GenesisAccount) ToAccount() (acc *auth.BaseAccount) { - return &auth.BaseAccount{ +func (ga *GenesisAccount) ToAccount() (acc *baseaccount.BaseAccount) { + return &baseaccount.BaseAccount{ Address: ga.Address, Coins: ga.Coins.Sort(), } @@ -148,7 +149,7 @@ func GaiaAppGenState(cdc *wire.Codec, appGenTxs []json.RawMessage) (appState jso } // create the genesis account, give'm few steaks and a buncha token with there name - accAuth := auth.NewBaseAccountWithAddress(genTx.Address) + accAuth := baseaccount.NewBaseAccountWithAddress(genTx.Address) accAuth.Coins = sdk.Coins{ {genTx.Name + "Token", 1000}, {"steak", freeFermionsAcc}, diff --git a/types/account.go b/types/account.go index 74cd87f38c..be8b90a1cd 100644 --- a/types/account.go +++ b/types/account.go @@ -4,7 +4,6 @@ import ( "encoding/hex" "errors" - crypto "github.com/tendermint/go-crypto" cmn "github.com/tendermint/tmlibs/common" ) @@ -22,31 +21,3 @@ func GetAddress(address string) (addr Address, err error) { } return Address(bz), nil } - -// Account is a standard account using a sequence number for replay protection -// and a pubkey for authentication. -type Account interface { - GetAddress() Address - SetAddress(Address) error // errors if already set. - - GetPubKey() crypto.PubKey // can return nil. - SetPubKey(crypto.PubKey) error - - GetSequence() int64 - SetSequence(int64) error - - GetCoins() Coins - SetCoins(Coins) error -} - -// AccountMapper stores and retrieves accounts from stores -// retrieved from the context. -type AccountMapper interface { - NewAccountWithAddress(ctx Context, addr Address) Account - GetAccount(ctx Context, addr Address) Account - SetAccount(ctx Context, acc Account) - IterateAccounts(ctx Context, process func(Account) (stop bool)) -} - -// AccountDecoder unmarshals account bytes -type AccountDecoder func(accountBytes []byte) (Account, error) diff --git a/types/handler.go b/types/handler.go index 679a3b1a78..129f42647a 100644 --- a/types/handler.go +++ b/types/handler.go @@ -3,8 +3,5 @@ package types // core function variable which application runs for transactions type Handler func(ctx Context, msg Msg) Result -// core function variable which application runs to handle fees -type FeeHandler func(ctx Context, tx Tx, fee Coins) - // If newCtx.IsZero(), ctx is used instead. type AnteHandler func(ctx Context, tx Tx) (newCtx Context, result Result, abort bool) diff --git a/types/signature.go b/types/signature.go deleted file mode 100644 index 5bca2f6069..0000000000 --- a/types/signature.go +++ /dev/null @@ -1,10 +0,0 @@ -package types - -import crypto "github.com/tendermint/go-crypto" - -// Standard Signature -type StdSignature struct { - crypto.PubKey `json:"pub_key"` // optional - crypto.Signature `json:"signature"` - Sequence int64 `json:"sequence"` -} diff --git a/types/tx_msg.go b/types/tx_msg.go index e17d152a5f..186cf9b242 100644 --- a/types/tx_msg.go +++ b/types/tx_msg.go @@ -31,123 +31,6 @@ type Tx interface { // Gets the Msg. GetMsg() Msg - - // Signatures returns the signature of signers who signed the Msg. - // CONTRACT: Length returned is same as length of - // pubkeys returned from MsgKeySigners, and the order - // matches. - // CONTRACT: If the signature is missing (ie the Msg is - // invalid), then the corresponding signature is - // .Empty(). - GetSignatures() []StdSignature -} - -var _ Tx = (*StdTx)(nil) - -// StdTx is a standard way to wrap a Msg with Fee and Signatures. -// NOTE: the first signature is the FeePayer (Signatures must not be nil). -type StdTx struct { - Msg `json:"msg"` - Fee StdFee `json:"fee"` - Signatures []StdSignature `json:"signatures"` -} - -func NewStdTx(msg Msg, fee StdFee, sigs []StdSignature) StdTx { - return StdTx{ - Msg: msg, - Fee: fee, - Signatures: sigs, - } -} - -//nolint -func (tx StdTx) GetMsg() Msg { return tx.Msg } -func (tx StdTx) GetSignatures() []StdSignature { return tx.Signatures } - -// FeePayer returns the address responsible for paying the fees -// for the transactions. It's the first address returned by msg.GetSigners(). -// If GetSigners() is empty, this panics. -func FeePayer(tx Tx) Address { - return tx.GetMsg().GetSigners()[0] -} - -//__________________________________________________________ - -// StdFee includes the amount of coins paid in fees and the maximum -// gas to be used by the transaction. The ratio yields an effective "gasprice", -// which must be above some miminum to be accepted into the mempool. -type StdFee struct { - Amount Coins `json:"amount"` - Gas int64 `json:"gas"` -} - -func NewStdFee(gas int64, amount ...Coin) StdFee { - return StdFee{ - Amount: amount, - Gas: gas, - } -} - -// fee bytes for signing later -func (fee StdFee) Bytes() []byte { - // normalize. XXX - // this is a sign of something ugly - // (in the lcd_test, client side its null, - // server side its []) - if len(fee.Amount) == 0 { - fee.Amount = Coins{} - } - bz, err := json.Marshal(fee) // TODO - if err != nil { - panic(err) - } - return bz -} - -//__________________________________________________________ - -// StdSignDoc is replay-prevention structure. -// It includes the result of msg.GetSignBytes(), -// as well as the ChainID (prevent cross chain replay) -// and the Sequence numbers for each signature (prevent -// inchain replay and enforce tx ordering per account). -type StdSignDoc struct { - ChainID string `json:"chain_id"` - Sequences []int64 `json:"sequences"` - FeeBytes []byte `json:"fee_bytes"` - MsgBytes []byte `json:"msg_bytes"` - AltBytes []byte `json:"alt_bytes"` -} - -// StdSignBytes returns the bytes to sign for a transaction. -// TODO: change the API to just take a chainID and StdTx ? -func StdSignBytes(chainID string, sequences []int64, fee StdFee, msg Msg) []byte { - bz, err := json.Marshal(StdSignDoc{ - ChainID: chainID, - Sequences: sequences, - FeeBytes: fee.Bytes(), - MsgBytes: msg.GetSignBytes(), - }) - if err != nil { - panic(err) - } - return bz -} - -// StdSignMsg is a convenience structure for passing along -// a Msg with the other requirements for a StdSignDoc before -// it is signed. For use in the CLI. -type StdSignMsg struct { - ChainID string - Sequences []int64 - Fee StdFee - Msg Msg - // XXX: Alt -} - -// get message bytes -func (msg StdSignMsg) Bytes() []byte { - return StdSignBytes(msg.ChainID, msg.Sequences, msg.Fee, msg.Msg) } //__________________________________________________________ diff --git a/x/auth/account.go b/x/auth/account.go new file mode 100644 index 0000000000..28366467aa --- /dev/null +++ b/x/auth/account.go @@ -0,0 +1,25 @@ +package auth + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + crypto "github.com/tendermint/go-crypto" +) + +// Account is a standard account using a sequence number for replay protection +// and a pubkey for authentication. +type Account interface { + GetAddress() sdk.Address + SetAddress(sdk.Address) error // errors if already set. + + GetPubKey() crypto.PubKey // can return nil. + SetPubKey(crypto.PubKey) error + + GetSequence() int64 + SetSequence(int64) error + + GetCoins() sdk.Coins + SetCoins(sdk.Coins) error +} + +// AccountDecoder unmarshals account bytes +type AccountDecoder func(accountBytes []byte) (Account, error) diff --git a/x/auth/ante.go b/x/auth/ante.go index 248083206d..2139524077 100644 --- a/x/auth/ante.go +++ b/x/auth/ante.go @@ -15,13 +15,20 @@ const ( // NewAnteHandler returns an AnteHandler that checks // and increments sequence numbers, checks signatures, // and deducts fees from the first signer. -func NewAnteHandler(am sdk.AccountMapper, feeHandler sdk.FeeHandler) sdk.AnteHandler { +func NewAnteHandler(am AccountMapper) sdk.AnteHandler { + return func( ctx sdk.Context, tx sdk.Tx, ) (_ sdk.Context, _ sdk.Result, abort bool) { + // This AnteHandler requires Txs to be StdTxs + stdTx, ok := tx.(StdTx) + if !ok { + return ctx, sdk.ErrInternal("tx must be sdk.StdTx").Result(), true + } + // Assert that there are signatures. - var sigs = tx.GetSignatures() + var sigs = stdTx.GetSignatures() if len(sigs) == 0 { return ctx, sdk.ErrUnauthorized("no signers").Result(), @@ -30,12 +37,6 @@ func NewAnteHandler(am sdk.AccountMapper, feeHandler sdk.FeeHandler) sdk.AnteHan msg := tx.GetMsg() - // TODO: will this always be a stdtx? should that be used in the function signature? - stdTx, ok := tx.(sdk.StdTx) - if !ok { - return ctx, sdk.ErrInternal("tx must be sdk.StdTx").Result(), true - } - // Assert that number of signatures is correct. var signerAddrs = msg.GetSigners() if len(sigs) != len(signerAddrs) { @@ -56,10 +57,10 @@ func NewAnteHandler(am sdk.AccountMapper, feeHandler sdk.FeeHandler) sdk.AnteHan if chainID == "" { chainID = viper.GetString("chain-id") } - signBytes := sdk.StdSignBytes(ctx.ChainID(), sequences, fee, msg) + signBytes := StdSignBytes(ctx.ChainID(), sequences, fee, msg) // Check sig and nonce and collect signer accounts. - var signerAccs = make([]sdk.Account, len(signerAddrs)) + var signerAccs = make([]Account, len(signerAddrs)) for i := 0; i < len(sigs); i++ { signerAddr, sig := signerAddrs[i], sigs[i] @@ -77,7 +78,6 @@ func NewAnteHandler(am sdk.AccountMapper, feeHandler sdk.FeeHandler) sdk.AnteHan // TODO: min fee if !fee.Amount.IsZero() { signerAcc, res = deductFees(signerAcc, fee) - feeHandler(ctx, tx, fee.Amount) if !res.IsOK() { return ctx, res, true } @@ -104,9 +104,9 @@ func NewAnteHandler(am sdk.AccountMapper, feeHandler sdk.FeeHandler) sdk.AnteHan // verify the signature and increment the sequence. // if the account doesn't have a pubkey, set it. func processSig( - ctx sdk.Context, am sdk.AccountMapper, - addr sdk.Address, sig sdk.StdSignature, signBytes []byte) ( - acc sdk.Account, res sdk.Result) { + ctx sdk.Context, am AccountMapper, + addr sdk.Address, sig StdSignature, signBytes []byte) ( + acc Account, res sdk.Result) { // Get the account. acc = am.GetAccount(ctx, addr) @@ -152,7 +152,7 @@ func processSig( // Deduct the fee from the account. // We could use the CoinKeeper (in addition to the AccountMapper, // because the CoinKeeper doesn't give us accounts), but it seems easier to do this. -func deductFees(acc sdk.Account, fee sdk.StdFee) (sdk.Account, sdk.Result) { +func deductFees(acc Account, fee StdFee) (Account, sdk.Result) { coins := acc.GetCoins() feeAmount := fee.Amount diff --git a/x/auth/client/cli/account.go b/x/auth/client/cli/account.go index b45cb12ddf..08bd520fb1 100644 --- a/x/auth/client/cli/account.go +++ b/x/auth/client/cli/account.go @@ -9,6 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" ) // GetAccountCmd for the auth.BaseAccount type @@ -17,8 +18,8 @@ func GetAccountCmdDefault(storeName string, cdc *wire.Codec) *cobra.Command { } // Get account decoder for auth.DefaultAccount -func GetAccountDecoder(cdc *wire.Codec) sdk.AccountDecoder { - return func(accBytes []byte) (acct sdk.Account, err error) { +func GetAccountDecoder(cdc *wire.Codec) auth.AccountDecoder { + return func(accBytes []byte) (acct auth.Account, err error) { // acct := new(auth.BaseAccount) err = cdc.UnmarshalBinaryBare(accBytes, &acct) if err != nil { @@ -30,7 +31,7 @@ func GetAccountDecoder(cdc *wire.Codec) sdk.AccountDecoder { // GetAccountCmd returns a query account that will display the // state of the account at a given address -func GetAccountCmd(storeName string, cdc *wire.Codec, decoder sdk.AccountDecoder) *cobra.Command { +func GetAccountCmd(storeName string, cdc *wire.Codec, decoder auth.AccountDecoder) *cobra.Command { return &cobra.Command{ Use: "account [address]", Short: "Query account balance", diff --git a/x/auth/context.go b/x/auth/context.go index b233f1e861..40fb177858 100644 --- a/x/auth/context.go +++ b/x/auth/context.go @@ -34,15 +34,15 @@ const ( ) // add the signers to the context -func WithSigners(ctx types.Context, accounts []types.Account) types.Context { +func WithSigners(ctx types.Context, accounts []Account) types.Context { return ctx.WithValue(contextKeySigners, accounts) } // get the signers from the context -func GetSigners(ctx types.Context) []types.Account { +func GetSigners(ctx types.Context) []Account { v := ctx.Value(contextKeySigners) if v == nil { - return []types.Account{} + return []Account{} } - return v.([]types.Account) + return v.([]Account) } diff --git a/x/auth/mapper.go b/x/auth/mapper.go index 3666f13b69..cdab2480e3 100644 --- a/x/auth/mapper.go +++ b/x/auth/mapper.go @@ -9,9 +9,6 @@ import ( crypto "github.com/tendermint/go-crypto" ) -var _ sdk.AccountMapper = (*AccountMapper)(nil) - -// Implements sdk.AccountMapper. // This AccountMapper encodes/decodes accounts using the // go-amino (binary) encoding/decoding library. type AccountMapper struct { @@ -19,8 +16,8 @@ type AccountMapper struct { // The (unexposed) key used to access the store from the Context. key sdk.StoreKey - // The prototypical sdk.Account concrete type. - proto sdk.Account + // The prototypical Account concrete type. + proto Account // The wire codec for binary encoding/decoding of accounts. cdc *wire.Codec @@ -29,7 +26,7 @@ type AccountMapper struct { // NewAccountMapper returns a new sdk.AccountMapper that // uses go-amino to (binary) encode and decode concrete sdk.Accounts. // nolint -func NewAccountMapper(cdc *wire.Codec, key sdk.StoreKey, proto sdk.Account) AccountMapper { +func NewAccountMapper(cdc *wire.Codec, key sdk.StoreKey, proto Account) AccountMapper { return AccountMapper{ key: key, proto: proto, @@ -38,14 +35,14 @@ func NewAccountMapper(cdc *wire.Codec, key sdk.StoreKey, proto sdk.Account) Acco } // Implaements sdk.AccountMapper. -func (am AccountMapper) NewAccountWithAddress(ctx sdk.Context, addr sdk.Address) sdk.Account { +func (am AccountMapper) NewAccountWithAddress(ctx sdk.Context, addr sdk.Address) Account { acc := am.clonePrototype() acc.SetAddress(addr) return acc } // Implements sdk.AccountMapper. -func (am AccountMapper) GetAccount(ctx sdk.Context, addr sdk.Address) sdk.Account { +func (am AccountMapper) GetAccount(ctx sdk.Context, addr sdk.Address) Account { store := ctx.KVStore(am.key) bz := store.Get(addr) if bz == nil { @@ -56,7 +53,7 @@ func (am AccountMapper) GetAccount(ctx sdk.Context, addr sdk.Address) sdk.Accoun } // Implements sdk.AccountMapper. -func (am AccountMapper) SetAccount(ctx sdk.Context, acc sdk.Account) { +func (am AccountMapper) SetAccount(ctx sdk.Context, acc Account) { addr := acc.GetAddress() store := ctx.KVStore(am.key) bz := am.encodeAccount(acc) @@ -64,7 +61,7 @@ func (am AccountMapper) SetAccount(ctx sdk.Context, acc sdk.Account) { } // Implements sdk.AccountMapper. -func (am AccountMapper) IterateAccounts(ctx sdk.Context, process func(sdk.Account) (stop bool)) { +func (am AccountMapper) IterateAccounts(ctx sdk.Context, process func(Account) (stop bool)) { store := ctx.KVStore(am.key) iter := store.Iterator(nil, nil) for { @@ -89,7 +86,8 @@ func (am AccountMapper) GetPubKey(ctx sdk.Context, addr sdk.Address) (crypto.Pub return acc.GetPubKey(), nil } -func (am AccountMapper) setPubKey(ctx sdk.Context, addr sdk.Address, newPubKey crypto.PubKey) sdk.Error { +// Sets the PubKey of the account at address +func (am AccountMapper) SetPubKey(ctx sdk.Context, addr sdk.Address, newPubKey crypto.PubKey) sdk.Error { acc := am.GetAccount(ctx, addr) if acc == nil { return sdk.ErrUnknownAddress(addr.String()) @@ -122,7 +120,7 @@ func (am AccountMapper) setSequence(ctx sdk.Context, addr sdk.Address, newSequen // misc. // Creates a new struct (or pointer to struct) from am.proto. -func (am AccountMapper) clonePrototype() sdk.Account { +func (am AccountMapper) clonePrototype() Account { protoRt := reflect.TypeOf(am.proto) if protoRt.Kind() == reflect.Ptr { protoCrt := protoRt.Elem() @@ -130,7 +128,7 @@ func (am AccountMapper) clonePrototype() sdk.Account { panic("accountMapper requires a struct proto sdk.Account, or a pointer to one") } protoRv := reflect.New(protoCrt) - clone, ok := protoRv.Interface().(sdk.Account) + clone, ok := protoRv.Interface().(Account) if !ok { panic(fmt.Sprintf("accountMapper requires a proto sdk.Account, but %v doesn't implement sdk.Account", protoRt)) } @@ -138,14 +136,14 @@ func (am AccountMapper) clonePrototype() sdk.Account { } protoRv := reflect.New(protoRt).Elem() - clone, ok := protoRv.Interface().(sdk.Account) + clone, ok := protoRv.Interface().(Account) if !ok { panic(fmt.Sprintf("accountMapper requires a proto sdk.Account, but %v doesn't implement sdk.Account", protoRt)) } return clone } -func (am AccountMapper) encodeAccount(acc sdk.Account) []byte { +func (am AccountMapper) encodeAccount(acc Account) []byte { bz, err := am.cdc.MarshalBinaryBare(acc) if err != nil { panic(err) @@ -153,7 +151,7 @@ func (am AccountMapper) encodeAccount(acc sdk.Account) []byte { return bz } -func (am AccountMapper) decodeAccount(bz []byte) (acc sdk.Account) { +func (am AccountMapper) decodeAccount(bz []byte) (acc Account) { err := am.cdc.UnmarshalBinaryBare(bz, &acc) if err != nil { panic(err) diff --git a/x/auth/stdtx.go b/x/auth/stdtx.go new file mode 100644 index 0000000000..bc01b01490 --- /dev/null +++ b/x/auth/stdtx.go @@ -0,0 +1,131 @@ +package auth + +import ( + "encoding/json" + + sdk "github.com/cosmos/cosmos-sdk/types" + crypto "github.com/tendermint/go-crypto" +) + +var _ sdk.Tx = (*StdTx)(nil) + +// StdTx is a standard way to wrap a Msg with Fee and Signatures. +// NOTE: the first signature is the FeePayer (Signatures must not be nil). +type StdTx struct { + Msg sdk.Msg `json:"msg"` + Fee StdFee `json:"fee"` + Signatures []StdSignature `json:"signatures"` +} + +func NewStdTx(msg sdk.Msg, fee StdFee, sigs []StdSignature) StdTx { + return StdTx{ + Msg: msg, + Fee: fee, + Signatures: sigs, + } +} + +//nolint +func (tx StdTx) GetMsg() sdk.Msg { return tx.Msg } + +// Signatures returns the signature of signers who signed the Msg. +// CONTRACT: Length returned is same as length of +// pubkeys returned from MsgKeySigners, and the order +// matches. +// CONTRACT: If the signature is missing (ie the Msg is +// invalid), then the corresponding signature is +// .Empty(). +func (tx StdTx) GetSignatures() []StdSignature { return tx.Signatures } + +// FeePayer returns the address responsible for paying the fees +// for the transactions. It's the first address returned by msg.GetSigners(). +// If GetSigners() is empty, this panics. +func FeePayer(tx sdk.Tx) sdk.Address { + return tx.GetMsg().GetSigners()[0] +} + +//__________________________________________________________ + +// StdFee includes the amount of coins paid in fees and the maximum +// gas to be used by the transaction. The ratio yields an effective "gasprice", +// which must be above some miminum to be accepted into the mempool. +type StdFee struct { + Amount sdk.Coins `json:"amount"` + Gas int64 `json:"gas"` +} + +func NewStdFee(gas int64, amount ...sdk.Coin) StdFee { + return StdFee{ + Amount: amount, + Gas: gas, + } +} + +// fee bytes for signing later +func (fee StdFee) Bytes() []byte { + // normalize. XXX + // this is a sign of something ugly + // (in the lcd_test, client side its null, + // server side its []) + if len(fee.Amount) == 0 { + fee.Amount = sdk.Coins{} + } + bz, err := json.Marshal(fee) // TODO + if err != nil { + panic(err) + } + return bz +} + +//__________________________________________________________ + +// StdSignDoc is replay-prevention structure. +// It includes the result of msg.GetSignBytes(), +// as well as the ChainID (prevent cross chain replay) +// and the Sequence numbers for each signature (prevent +// inchain replay and enforce tx ordering per account). +type StdSignDoc struct { + ChainID string `json:"chain_id"` + Sequences []int64 `json:"sequences"` + FeeBytes []byte `json:"fee_bytes"` + MsgBytes []byte `json:"msg_bytes"` + AltBytes []byte `json:"alt_bytes"` +} + +// StdSignBytes returns the bytes to sign for a transaction. +// TODO: change the API to just take a chainID and StdTx ? +func StdSignBytes(chainID string, sequences []int64, fee StdFee, msg sdk.Msg) []byte { + bz, err := json.Marshal(StdSignDoc{ + ChainID: chainID, + Sequences: sequences, + FeeBytes: fee.Bytes(), + MsgBytes: msg.GetSignBytes(), + }) + if err != nil { + panic(err) + } + return bz +} + +// StdSignMsg is a convenience structure for passing along +// a Msg with the other requirements for a StdSignDoc before +// it is signed. For use in the CLI. +type StdSignMsg struct { + ChainID string + Sequences []int64 + Fee StdFee + Msg sdk.Msg + // XXX: Alt +} + +// get message bytes +func (msg StdSignMsg) Bytes() []byte { + return StdSignBytes(msg.ChainID, msg.Sequences, msg.Fee, msg.Msg) +} + +// Standard Signature +type StdSignature struct { + crypto.PubKey `json:"pub_key"` // optional + crypto.Signature `json:"signature"` + Sequence int64 `json:"sequence"` +} diff --git a/x/auth/wire.go b/x/auth/wire.go deleted file mode 100644 index 9db1b85cca..0000000000 --- a/x/auth/wire.go +++ /dev/null @@ -1,12 +0,0 @@ -package auth - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/wire" -) - -// Register concrete types on wire codec for default AppAccount -func RegisterWire(cdc *wire.Codec) { - cdc.RegisterInterface((*sdk.Account)(nil), nil) - cdc.RegisterConcrete(&BaseAccount{}, "auth/Account", nil) -} diff --git a/x/bank/keeper.go b/x/bank/keeper.go index 6ef73c68b6..b14da4d81f 100644 --- a/x/bank/keeper.go +++ b/x/bank/keeper.go @@ -4,6 +4,7 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" ) const ( @@ -16,11 +17,11 @@ const ( // Keeper manages transfers between accounts type Keeper struct { - am sdk.AccountMapper + am auth.AccountMapper } // NewKeeper returns a new Keeper -func NewKeeper(am sdk.AccountMapper) Keeper { +func NewKeeper(am auth.AccountMapper) Keeper { return Keeper{am: am} } @@ -63,11 +64,11 @@ func (keeper Keeper) InputOutputCoins(ctx sdk.Context, inputs []Input, outputs [ // SendKeeper only allows transfers between accounts, without the possibility of creating coins type SendKeeper struct { - am sdk.AccountMapper + am auth.AccountMapper } // NewSendKeeper returns a new Keeper -func NewSendKeeper(am sdk.AccountMapper) SendKeeper { +func NewSendKeeper(am auth.AccountMapper) SendKeeper { return SendKeeper{am: am} } @@ -95,11 +96,11 @@ func (keeper SendKeeper) InputOutputCoins(ctx sdk.Context, inputs []Input, outpu // ViewKeeper only allows reading of balances type ViewKeeper struct { - am sdk.AccountMapper + am auth.AccountMapper } // NewViewKeeper returns a new Keeper -func NewViewKeeper(am sdk.AccountMapper) ViewKeeper { +func NewViewKeeper(am auth.AccountMapper) ViewKeeper { return ViewKeeper{am: am} } @@ -115,7 +116,7 @@ func (keeper ViewKeeper) HasCoins(ctx sdk.Context, addr sdk.Address, amt sdk.Coi //______________________________________________________________________________________________ -func getCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address) sdk.Coins { +func getCoins(ctx sdk.Context, am auth.AccountMapper, addr sdk.Address) sdk.Coins { ctx.GasMeter().ConsumeGas(costGetCoins, "getCoins") acc := am.GetAccount(ctx, addr) if acc == nil { @@ -124,7 +125,7 @@ func getCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address) sdk.Coins return acc.GetCoins() } -func setCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.Coins) sdk.Error { +func setCoins(ctx sdk.Context, am auth.AccountMapper, addr sdk.Address, amt sdk.Coins) sdk.Error { ctx.GasMeter().ConsumeGas(costSetCoins, "setCoins") acc := am.GetAccount(ctx, addr) if acc == nil { @@ -136,13 +137,13 @@ func setCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.C } // HasCoins returns whether or not an account has at least amt coins. -func hasCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.Coins) bool { +func hasCoins(ctx sdk.Context, am auth.AccountMapper, addr sdk.Address, amt sdk.Coins) bool { ctx.GasMeter().ConsumeGas(costHasCoins, "hasCoins") return getCoins(ctx, am, addr).IsGTE(amt) } // SubtractCoins subtracts amt from the coins at the addr. -func subtractCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) { +func subtractCoins(ctx sdk.Context, am auth.AccountMapper, addr sdk.Address, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) { ctx.GasMeter().ConsumeGas(costSubtractCoins, "subtractCoins") oldCoins := getCoins(ctx, am, addr) newCoins := oldCoins.Minus(amt) @@ -155,7 +156,7 @@ func subtractCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt } // AddCoins adds amt to the coins at the addr. -func addCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) { +func addCoins(ctx sdk.Context, am auth.AccountMapper, addr sdk.Address, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) { ctx.GasMeter().ConsumeGas(costAddCoins, "addCoins") oldCoins := getCoins(ctx, am, addr) newCoins := oldCoins.Plus(amt) @@ -169,7 +170,7 @@ func addCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.C // SendCoins moves coins from one account to another // NOTE: Make sure to revert state changes from tx on error -func sendCoins(ctx sdk.Context, am sdk.AccountMapper, fromAddr sdk.Address, toAddr sdk.Address, amt sdk.Coins) (sdk.Tags, sdk.Error) { +func sendCoins(ctx sdk.Context, am auth.AccountMapper, fromAddr sdk.Address, toAddr sdk.Address, amt sdk.Coins) (sdk.Tags, sdk.Error) { _, subTags, err := subtractCoins(ctx, am, fromAddr, amt) if err != nil { return nil, err @@ -185,7 +186,7 @@ func sendCoins(ctx sdk.Context, am sdk.AccountMapper, fromAddr sdk.Address, toAd // InputOutputCoins handles a list of inputs and outputs // NOTE: Make sure to revert state changes from tx on error -func inputOutputCoins(ctx sdk.Context, am sdk.AccountMapper, inputs []Input, outputs []Output) (sdk.Tags, sdk.Error) { +func inputOutputCoins(ctx sdk.Context, am auth.AccountMapper, inputs []Input, outputs []Output) (sdk.Tags, sdk.Error) { allTags := sdk.EmptyTags() for _, in := range inputs { diff --git a/x/auth/baseaccount.go b/x/baseaccount/baseaccount.go similarity index 90% rename from x/auth/baseaccount.go rename to x/baseaccount/baseaccount.go index ff907fc387..9701ac41dc 100644 --- a/x/auth/baseaccount.go +++ b/x/baseaccount/baseaccount.go @@ -1,18 +1,19 @@ -package auth +package baseaccount import ( "errors" - "github.com/tendermint/go-crypto" + crypto "github.com/tendermint/go-crypto" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" ) //----------------------------------------------------------- // BaseAccount -var _ sdk.Account = (*BaseAccount)(nil) +var _ auth.Account = (*BaseAccount)(nil) // BaseAccount - base account structure. // Extend this by embedding this in your AppAccount. @@ -82,7 +83,7 @@ func (acc *BaseAccount) SetSequence(seq int64) error { // Most users shouldn't use this, but this comes handy for tests. func RegisterBaseAccount(cdc *wire.Codec) { - cdc.RegisterInterface((*sdk.Account)(nil), nil) + cdc.RegisterInterface((*auth.Account)(nil), nil) cdc.RegisterConcrete(&BaseAccount{}, "cosmos-sdk/BaseAccount", nil) wire.RegisterCrypto(cdc) } diff --git a/x/auth/baseaccount_test.go b/x/baseaccount/baseaccount_test.go similarity index 99% rename from x/auth/baseaccount_test.go rename to x/baseaccount/baseaccount_test.go index d3363e4fb0..ed1a322c2f 100644 --- a/x/auth/baseaccount_test.go +++ b/x/baseaccount/baseaccount_test.go @@ -1,4 +1,4 @@ -package auth +package baseaccount import ( "testing" diff --git a/x/auth/handler.go b/x/baseaccount/handler.go similarity index 58% rename from x/auth/handler.go rename to x/baseaccount/handler.go index 8a0e1061ae..46307c8818 100644 --- a/x/auth/handler.go +++ b/x/baseaccount/handler.go @@ -1,19 +1,20 @@ -package auth +package baseaccount import ( "reflect" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" ) -// NewHandler returns a handler for "auth" type messages. -func NewHandler(am AccountMapper) sdk.Handler { +// NewHandler returns a handler for "baseaccount" type messages. +func NewHandler(am auth.AccountMapper) sdk.Handler { return func(ctx sdk.Context, msg sdk.Msg) sdk.Result { switch msg := msg.(type) { case MsgChangeKey: return handleMsgChangeKey(ctx, am, msg) default: - errMsg := "Unrecognized auth Msg type: " + reflect.TypeOf(msg).Name() + errMsg := "Unrecognized baseaccount Msg type: " + reflect.TypeOf(msg).Name() return sdk.ErrUnknownRequest(errMsg).Result() } } @@ -21,9 +22,9 @@ func NewHandler(am AccountMapper) sdk.Handler { // Handle MsgChangeKey // Should be very expensive, because once this happens, an account is un-prunable -func handleMsgChangeKey(ctx sdk.Context, am AccountMapper, msg MsgChangeKey) sdk.Result { +func handleMsgChangeKey(ctx sdk.Context, am auth.AccountMapper, msg MsgChangeKey) sdk.Result { - err := am.setPubKey(ctx, msg.Address, msg.NewPubKey) + err := am.SetPubKey(ctx, msg.Address, msg.NewPubKey) if err != nil { return err.Result() } diff --git a/x/auth/msgs.go b/x/baseaccount/msgs.go similarity index 87% rename from x/auth/msgs.go rename to x/baseaccount/msgs.go index 545b296e5b..f0319ac7fe 100644 --- a/x/auth/msgs.go +++ b/x/baseaccount/msgs.go @@ -1,11 +1,10 @@ -package auth +package baseaccount import ( "encoding/json" - "github.com/tendermint/go-crypto" - sdk "github.com/cosmos/cosmos-sdk/types" + crypto "github.com/tendermint/go-crypto" ) // MsgChangeKey - high level transaction of the auth module @@ -22,7 +21,7 @@ func NewMsgChangeKey(addr sdk.Address, pubkey crypto.PubKey) MsgChangeKey { } // Implements Msg. -func (msg MsgChangeKey) Type() string { return "auth" } +func (msg MsgChangeKey) Type() string { return "baseaccount" } // Implements Msg. func (msg MsgChangeKey) ValidateBasic() sdk.Error { diff --git a/x/auth/msgs_test.go b/x/baseaccount/msgs_test.go similarity index 97% rename from x/auth/msgs_test.go rename to x/baseaccount/msgs_test.go index 30c98b073b..46797fa0d8 100644 --- a/x/auth/msgs_test.go +++ b/x/baseaccount/msgs_test.go @@ -1,4 +1,4 @@ -package auth +package baseaccount import ( "testing" diff --git a/x/baseaccount/wire.go b/x/baseaccount/wire.go new file mode 100644 index 0000000000..4c77d1c72c --- /dev/null +++ b/x/baseaccount/wire.go @@ -0,0 +1,14 @@ +package baseaccount + +import ( + "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" +) + +// Register concrete types on wire codec +func RegisterWire(cdc *wire.Codec) { + cdc.RegisterInterface((*auth.Account)(nil), nil) + cdc.RegisterConcrete(&BaseAccount{}, "baseaccount/BaseAccount", nil) + wire.RegisterCrypto(cdc) + cdc.RegisterConcrete(MsgChangeKey{}, "baseaccount/changekey", nil) +} diff --git a/x/stake/test_common.go b/x/stake/test_common.go index 27acebe086..5a87081af1 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -17,6 +17,7 @@ import ( "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/cosmos/cosmos-sdk/x/baseaccount" ) // dummy addresses used for testing @@ -129,8 +130,8 @@ func makeTestCodec() *wire.Codec { cdc.RegisterConcrete(MsgUnbond{}, "test/stake/Unbond", nil) // Register AppAccount - cdc.RegisterInterface((*sdk.Account)(nil), nil) - cdc.RegisterConcrete(&auth.BaseAccount{}, "test/stake/Account", nil) + cdc.RegisterInterface((*auth.Account)(nil), nil) + cdc.RegisterConcrete(&baseaccount.BaseAccount{}, "test/stake/Account", nil) wire.RegisterCrypto(cdc) return cdc @@ -148,7 +149,7 @@ func paramsNoInflation() Params { } // hogpodge of all sorts of input required for testing -func createTestInput(t *testing.T, isCheckTx bool, initCoins int64) (sdk.Context, sdk.AccountMapper, Keeper) { +func createTestInput(t *testing.T, isCheckTx bool, initCoins int64) (sdk.Context, auth.AccountMapper, Keeper) { db := dbm.NewMemDB() keyStake := sdk.NewKVStoreKey("stake") keyMain := keyStake //sdk.NewKVStoreKey("main") //TODO fix multistore @@ -161,9 +162,9 @@ func createTestInput(t *testing.T, isCheckTx bool, initCoins int64) (sdk.Context ctx := sdk.NewContext(ms, abci.Header{ChainID: "foochainid"}, isCheckTx, nil, log.NewNopLogger()) cdc := makeTestCodec() accountMapper := auth.NewAccountMapper( - cdc, // amino codec - keyMain, // target store - &auth.BaseAccount{}, // prototype + cdc, // amino codec + keyMain, // target store + &baseaccount.BaseAccount{}, // prototype ) ck := bank.NewKeeper(accountMapper) keeper := NewKeeper(cdc, keyStake, ck, DefaultCodespace) From 34a10072b4c9ded9d70250c55f7c476e9de71893 Mon Sep 17 00:00:00 2001 From: sunnya97 Date: Wed, 23 May 2018 19:47:33 -0700 Subject: [PATCH 013/548] in progress --- x/auth/client/rest/query.go | 7 ++++--- x/ibc/client/cli/relay.go | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/x/auth/client/rest/query.go b/x/auth/client/rest/query.go index 52244fec9c..a60ce5cdb2 100644 --- a/x/auth/client/rest/query.go +++ b/x/auth/client/rest/query.go @@ -10,19 +10,20 @@ import ( "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" - auth "github.com/cosmos/cosmos-sdk/x/auth/client/cli" + "github.com/cosmos/cosmos-sdk/x/auth" + authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" ) // register REST routes func RegisterRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec, storeName string) { r.HandleFunc( "/accounts/{address}", - QueryAccountRequestHandlerFn(storeName, cdc, auth.GetAccountDecoder(cdc), ctx), + QueryAccountRequestHandlerFn(storeName, cdc, authcmd.GetAccountDecoder(cdc), ctx), ).Methods("GET") } // query accountREST Handler -func QueryAccountRequestHandlerFn(storeName string, cdc *wire.Codec, decoder sdk.AccountDecoder, ctx context.CoreContext) http.HandlerFunc { +func QueryAccountRequestHandlerFn(storeName string, cdc *wire.Codec, decoder auth.AccountDecoder, ctx context.CoreContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) addr := vars["address"] diff --git a/x/ibc/client/cli/relay.go b/x/ibc/client/cli/relay.go index 86e8b1dbf8..7fd9a8fcc1 100644 --- a/x/ibc/client/cli/relay.go +++ b/x/ibc/client/cli/relay.go @@ -12,6 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" wire "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" "github.com/cosmos/cosmos-sdk/x/ibc" ) @@ -27,7 +28,7 @@ const ( type relayCommander struct { cdc *wire.Codec address sdk.Address - decoder sdk.AccountDecoder + decoder auth.AccountDecoder mainStore string ibcStore string From cb527126600cddd895f5671bed8dbcdca270415d Mon Sep 17 00:00:00 2001 From: sunnya97 Date: Wed, 23 May 2018 19:26:54 -0700 Subject: [PATCH 014/548] in progress --- baseapp/baseapp.go | 3 +- client/context/helpers.go | 9 +- client/context/types.go | 6 +- client/tx/query.go | 3 +- cmd/gaia/app/app.go | 18 ++- cmd/gaia/app/genesis.go | 11 +- types/account.go | 29 ----- types/handler.go | 3 - types/signature.go | 10 -- types/tx_msg.go | 117 ----------------- x/auth/account.go | 25 ++++ x/auth/ante.go | 30 ++--- x/auth/client/cli/account.go | 7 +- x/auth/context.go | 8 +- x/auth/mapper.go | 30 +++-- x/auth/stdtx.go | 131 ++++++++++++++++++++ x/auth/wire.go | 12 -- x/bank/keeper.go | 27 ++-- x/{auth => baseaccount}/baseaccount.go | 9 +- x/{auth => baseaccount}/baseaccount_test.go | 2 +- x/{auth => baseaccount}/handler.go | 13 +- x/{auth => baseaccount}/msgs.go | 7 +- x/{auth => baseaccount}/msgs_test.go | 2 +- x/baseaccount/wire.go | 14 +++ x/stake/test_common.go | 16 ++- 25 files changed, 280 insertions(+), 262 deletions(-) delete mode 100644 types/signature.go create mode 100644 x/auth/account.go create mode 100644 x/auth/stdtx.go delete mode 100644 x/auth/wire.go rename x/{auth => baseaccount}/baseaccount.go (90%) rename x/{auth => baseaccount}/baseaccount_test.go (99%) rename x/{auth => baseaccount}/handler.go (58%) rename x/{auth => baseaccount}/msgs.go (87%) rename x/{auth => baseaccount}/msgs_test.go (97%) create mode 100644 x/baseaccount/wire.go diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index ef3bbc3c79..4ce8a05d9b 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -15,6 +15,7 @@ import ( "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" ) // Key to store the header in the DB itself. @@ -125,7 +126,7 @@ func (app *BaseApp) SetTxDecoder(txDecoder sdk.TxDecoder) { // default custom logic for transaction decoding func defaultTxDecoder(cdc *wire.Codec) sdk.TxDecoder { return func(txBytes []byte) (sdk.Tx, sdk.Error) { - var tx = sdk.StdTx{} + var tx = auth.StdTx{} if len(txBytes) == 0 { return nil, sdk.ErrTxDecode("txBytes are empty") diff --git a/client/context/helpers.go b/client/context/helpers.go index 562bde9b4c..f4686befde 100644 --- a/client/context/helpers.go +++ b/client/context/helpers.go @@ -6,6 +6,7 @@ import ( "github.com/pkg/errors" "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" rpcclient "github.com/tendermint/tendermint/rpc/client" ctypes "github.com/tendermint/tendermint/rpc/core/types" cmn "github.com/tendermint/tmlibs/common" @@ -109,11 +110,11 @@ func (ctx CoreContext) SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *w return nil, errors.Errorf("Chain ID required but not specified") } sequence := ctx.Sequence - signMsg := sdk.StdSignMsg{ + signMsg := auth.StdSignMsg{ ChainID: chainID, Sequences: []int64{sequence}, Msg: msg, - Fee: sdk.NewStdFee(10000, sdk.Coin{}), // TODO run simulate to estimate gas? + Fee: auth.NewStdFee(10000, sdk.Coin{}), // TODO run simulate to estimate gas? } keybase, err := keys.GetKeyBase() @@ -128,14 +129,14 @@ func (ctx CoreContext) SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *w if err != nil { return nil, err } - sigs := []sdk.StdSignature{{ + sigs := []auth.StdSignature{{ PubKey: pubkey, Signature: sig, Sequence: sequence, }} // marshal bytes - tx := sdk.NewStdTx(signMsg.Msg, signMsg.Fee, sigs) + tx := auth.NewStdTx(signMsg.Msg, signMsg.Fee, sigs) return cdc.MarshalBinary(tx) } diff --git a/client/context/types.go b/client/context/types.go index e580027d67..da15b32936 100644 --- a/client/context/types.go +++ b/client/context/types.go @@ -3,7 +3,7 @@ package context import ( rpcclient "github.com/tendermint/tendermint/rpc/client" - sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" ) // typical context created in sdk modules for transactions/queries @@ -15,7 +15,7 @@ type CoreContext struct { FromAddressName string Sequence int64 Client rpcclient.Client - Decoder sdk.AccountDecoder + Decoder auth.AccountDecoder AccountStore string } @@ -63,7 +63,7 @@ func (c CoreContext) WithClient(client rpcclient.Client) CoreContext { } // WithDecoder - return a copy of the context with an updated Decoder -func (c CoreContext) WithDecoder(decoder sdk.AccountDecoder) CoreContext { +func (c CoreContext) WithDecoder(decoder auth.AccountDecoder) CoreContext { c.Decoder = decoder return c } diff --git a/client/tx/query.go b/client/tx/query.go index 2078b78831..7673dd38db 100644 --- a/client/tx/query.go +++ b/client/tx/query.go @@ -17,6 +17,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" ) // Get the default command for a tx query @@ -95,7 +96,7 @@ type txInfo struct { } func parseTx(cdc *wire.Codec, txBytes []byte) (sdk.Tx, error) { - var tx sdk.StdTx + var tx auth.StdTx err := cdc.UnmarshalBinary(txBytes, &tx) if err != nil { return nil, err diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index 42869c9558..9436c8b0fc 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -14,7 +14,11 @@ import ( "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" +<<<<<<< HEAD feed "github.com/cosmos/cosmos-sdk/x/fee_distribution" +======= + "github.com/cosmos/cosmos-sdk/x/baseaccount" +>>>>>>> in progress "github.com/cosmos/cosmos-sdk/x/ibc" "github.com/cosmos/cosmos-sdk/x/stake" ) @@ -41,7 +45,7 @@ type GaiaApp struct { keyStake *sdk.KVStoreKey // Manage getting and setting accounts - accountMapper sdk.AccountMapper + accountMapper auth.AccountMapper coinKeeper bank.Keeper ibcMapper ibc.Mapper stakeKeeper stake.Keeper @@ -63,8 +67,8 @@ func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { // define the accountMapper app.accountMapper = auth.NewAccountMapper( app.cdc, - app.keyAccount, // target store - &auth.BaseAccount{}, // prototype + app.keyAccount, // target store + &baseaccount.BaseAccount{}, // prototype ) // add handlers @@ -82,7 +86,11 @@ func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { app.SetInitChainer(app.initChainer) app.SetEndBlocker(stake.NewEndBlocker(app.stakeKeeper)) app.MountStoresIAVL(app.keyMain, app.keyAccount, app.keyIBC, app.keyStake) +<<<<<<< HEAD app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, feed.BurnFeeHandler)) +======= + app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper)) +>>>>>>> in progress err := app.LoadLatestVersion(app.keyMain) if err != nil { cmn.Exit(err.Error()) @@ -97,7 +105,7 @@ func MakeCodec() *wire.Codec { ibc.RegisterWire(cdc) bank.RegisterWire(cdc) stake.RegisterWire(cdc) - auth.RegisterWire(cdc) + baseaccount.RegisterWire(cdc) sdk.RegisterWire(cdc) wire.RegisterCrypto(cdc) return cdc @@ -132,7 +140,7 @@ func (app *GaiaApp) ExportAppStateJSON() (appState json.RawMessage, err error) { // iterate to get the accounts accounts := []GenesisAccount{} - appendAccount := func(acc sdk.Account) (stop bool) { + appendAccount := func(acc auth.Account) (stop bool) { account := NewGenesisAccountI(acc) accounts = append(accounts, account) return false diff --git a/cmd/gaia/app/genesis.go b/cmd/gaia/app/genesis.go index 525fe8ab07..6914ec4927 100644 --- a/cmd/gaia/app/genesis.go +++ b/cmd/gaia/app/genesis.go @@ -13,6 +13,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/baseaccount" "github.com/cosmos/cosmos-sdk/x/stake" ) @@ -28,14 +29,14 @@ type GenesisAccount struct { Coins sdk.Coins `json:"coins"` } -func NewGenesisAccount(acc *auth.BaseAccount) GenesisAccount { +func NewGenesisAccount(acc *baseaccount.BaseAccount) GenesisAccount { return GenesisAccount{ Address: acc.Address, Coins: acc.Coins, } } -func NewGenesisAccountI(acc sdk.Account) GenesisAccount { +func NewGenesisAccountI(acc auth.Account) GenesisAccount { return GenesisAccount{ Address: acc.GetAddress(), Coins: acc.GetCoins(), @@ -43,8 +44,8 @@ func NewGenesisAccountI(acc sdk.Account) GenesisAccount { } // convert GenesisAccount to auth.BaseAccount -func (ga *GenesisAccount) ToAccount() (acc *auth.BaseAccount) { - return &auth.BaseAccount{ +func (ga *GenesisAccount) ToAccount() (acc *baseaccount.BaseAccount) { + return &baseaccount.BaseAccount{ Address: ga.Address, Coins: ga.Coins.Sort(), } @@ -148,7 +149,7 @@ func GaiaAppGenState(cdc *wire.Codec, appGenTxs []json.RawMessage) (appState jso } // create the genesis account, give'm few steaks and a buncha token with there name - accAuth := auth.NewBaseAccountWithAddress(genTx.Address) + accAuth := baseaccount.NewBaseAccountWithAddress(genTx.Address) accAuth.Coins = sdk.Coins{ {genTx.Name + "Token", 1000}, {"steak", freeFermionsAcc}, diff --git a/types/account.go b/types/account.go index 74cd87f38c..be8b90a1cd 100644 --- a/types/account.go +++ b/types/account.go @@ -4,7 +4,6 @@ import ( "encoding/hex" "errors" - crypto "github.com/tendermint/go-crypto" cmn "github.com/tendermint/tmlibs/common" ) @@ -22,31 +21,3 @@ func GetAddress(address string) (addr Address, err error) { } return Address(bz), nil } - -// Account is a standard account using a sequence number for replay protection -// and a pubkey for authentication. -type Account interface { - GetAddress() Address - SetAddress(Address) error // errors if already set. - - GetPubKey() crypto.PubKey // can return nil. - SetPubKey(crypto.PubKey) error - - GetSequence() int64 - SetSequence(int64) error - - GetCoins() Coins - SetCoins(Coins) error -} - -// AccountMapper stores and retrieves accounts from stores -// retrieved from the context. -type AccountMapper interface { - NewAccountWithAddress(ctx Context, addr Address) Account - GetAccount(ctx Context, addr Address) Account - SetAccount(ctx Context, acc Account) - IterateAccounts(ctx Context, process func(Account) (stop bool)) -} - -// AccountDecoder unmarshals account bytes -type AccountDecoder func(accountBytes []byte) (Account, error) diff --git a/types/handler.go b/types/handler.go index 679a3b1a78..129f42647a 100644 --- a/types/handler.go +++ b/types/handler.go @@ -3,8 +3,5 @@ package types // core function variable which application runs for transactions type Handler func(ctx Context, msg Msg) Result -// core function variable which application runs to handle fees -type FeeHandler func(ctx Context, tx Tx, fee Coins) - // If newCtx.IsZero(), ctx is used instead. type AnteHandler func(ctx Context, tx Tx) (newCtx Context, result Result, abort bool) diff --git a/types/signature.go b/types/signature.go deleted file mode 100644 index 5bca2f6069..0000000000 --- a/types/signature.go +++ /dev/null @@ -1,10 +0,0 @@ -package types - -import crypto "github.com/tendermint/go-crypto" - -// Standard Signature -type StdSignature struct { - crypto.PubKey `json:"pub_key"` // optional - crypto.Signature `json:"signature"` - Sequence int64 `json:"sequence"` -} diff --git a/types/tx_msg.go b/types/tx_msg.go index e17d152a5f..186cf9b242 100644 --- a/types/tx_msg.go +++ b/types/tx_msg.go @@ -31,123 +31,6 @@ type Tx interface { // Gets the Msg. GetMsg() Msg - - // Signatures returns the signature of signers who signed the Msg. - // CONTRACT: Length returned is same as length of - // pubkeys returned from MsgKeySigners, and the order - // matches. - // CONTRACT: If the signature is missing (ie the Msg is - // invalid), then the corresponding signature is - // .Empty(). - GetSignatures() []StdSignature -} - -var _ Tx = (*StdTx)(nil) - -// StdTx is a standard way to wrap a Msg with Fee and Signatures. -// NOTE: the first signature is the FeePayer (Signatures must not be nil). -type StdTx struct { - Msg `json:"msg"` - Fee StdFee `json:"fee"` - Signatures []StdSignature `json:"signatures"` -} - -func NewStdTx(msg Msg, fee StdFee, sigs []StdSignature) StdTx { - return StdTx{ - Msg: msg, - Fee: fee, - Signatures: sigs, - } -} - -//nolint -func (tx StdTx) GetMsg() Msg { return tx.Msg } -func (tx StdTx) GetSignatures() []StdSignature { return tx.Signatures } - -// FeePayer returns the address responsible for paying the fees -// for the transactions. It's the first address returned by msg.GetSigners(). -// If GetSigners() is empty, this panics. -func FeePayer(tx Tx) Address { - return tx.GetMsg().GetSigners()[0] -} - -//__________________________________________________________ - -// StdFee includes the amount of coins paid in fees and the maximum -// gas to be used by the transaction. The ratio yields an effective "gasprice", -// which must be above some miminum to be accepted into the mempool. -type StdFee struct { - Amount Coins `json:"amount"` - Gas int64 `json:"gas"` -} - -func NewStdFee(gas int64, amount ...Coin) StdFee { - return StdFee{ - Amount: amount, - Gas: gas, - } -} - -// fee bytes for signing later -func (fee StdFee) Bytes() []byte { - // normalize. XXX - // this is a sign of something ugly - // (in the lcd_test, client side its null, - // server side its []) - if len(fee.Amount) == 0 { - fee.Amount = Coins{} - } - bz, err := json.Marshal(fee) // TODO - if err != nil { - panic(err) - } - return bz -} - -//__________________________________________________________ - -// StdSignDoc is replay-prevention structure. -// It includes the result of msg.GetSignBytes(), -// as well as the ChainID (prevent cross chain replay) -// and the Sequence numbers for each signature (prevent -// inchain replay and enforce tx ordering per account). -type StdSignDoc struct { - ChainID string `json:"chain_id"` - Sequences []int64 `json:"sequences"` - FeeBytes []byte `json:"fee_bytes"` - MsgBytes []byte `json:"msg_bytes"` - AltBytes []byte `json:"alt_bytes"` -} - -// StdSignBytes returns the bytes to sign for a transaction. -// TODO: change the API to just take a chainID and StdTx ? -func StdSignBytes(chainID string, sequences []int64, fee StdFee, msg Msg) []byte { - bz, err := json.Marshal(StdSignDoc{ - ChainID: chainID, - Sequences: sequences, - FeeBytes: fee.Bytes(), - MsgBytes: msg.GetSignBytes(), - }) - if err != nil { - panic(err) - } - return bz -} - -// StdSignMsg is a convenience structure for passing along -// a Msg with the other requirements for a StdSignDoc before -// it is signed. For use in the CLI. -type StdSignMsg struct { - ChainID string - Sequences []int64 - Fee StdFee - Msg Msg - // XXX: Alt -} - -// get message bytes -func (msg StdSignMsg) Bytes() []byte { - return StdSignBytes(msg.ChainID, msg.Sequences, msg.Fee, msg.Msg) } //__________________________________________________________ diff --git a/x/auth/account.go b/x/auth/account.go new file mode 100644 index 0000000000..28366467aa --- /dev/null +++ b/x/auth/account.go @@ -0,0 +1,25 @@ +package auth + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + crypto "github.com/tendermint/go-crypto" +) + +// Account is a standard account using a sequence number for replay protection +// and a pubkey for authentication. +type Account interface { + GetAddress() sdk.Address + SetAddress(sdk.Address) error // errors if already set. + + GetPubKey() crypto.PubKey // can return nil. + SetPubKey(crypto.PubKey) error + + GetSequence() int64 + SetSequence(int64) error + + GetCoins() sdk.Coins + SetCoins(sdk.Coins) error +} + +// AccountDecoder unmarshals account bytes +type AccountDecoder func(accountBytes []byte) (Account, error) diff --git a/x/auth/ante.go b/x/auth/ante.go index 21d17fb9be..d57c8558ef 100644 --- a/x/auth/ante.go +++ b/x/auth/ante.go @@ -15,13 +15,20 @@ const ( // NewAnteHandler returns an AnteHandler that checks // and increments sequence numbers, checks signatures, // and deducts fees from the first signer. -func NewAnteHandler(am sdk.AccountMapper, feeHandler sdk.FeeHandler) sdk.AnteHandler { +func NewAnteHandler(am AccountMapper) sdk.AnteHandler { + return func( ctx sdk.Context, tx sdk.Tx, ) (_ sdk.Context, _ sdk.Result, abort bool) { + // This AnteHandler requires Txs to be StdTxs + stdTx, ok := tx.(StdTx) + if !ok { + return ctx, sdk.ErrInternal("tx must be sdk.StdTx").Result(), true + } + // Assert that there are signatures. - var sigs = tx.GetSignatures() + var sigs = stdTx.GetSignatures() if len(sigs) == 0 { return ctx, sdk.ErrUnauthorized("no signers").Result(), @@ -30,12 +37,6 @@ func NewAnteHandler(am sdk.AccountMapper, feeHandler sdk.FeeHandler) sdk.AnteHan msg := tx.GetMsg() - // TODO: will this always be a stdtx? should that be used in the function signature? - stdTx, ok := tx.(sdk.StdTx) - if !ok { - return ctx, sdk.ErrInternal("tx must be sdk.StdTx").Result(), true - } - // Assert that number of signatures is correct. var signerAddrs = msg.GetSigners() if len(sigs) != len(signerAddrs) { @@ -56,10 +57,10 @@ func NewAnteHandler(am sdk.AccountMapper, feeHandler sdk.FeeHandler) sdk.AnteHan if chainID == "" { chainID = viper.GetString("chain-id") } - signBytes := sdk.StdSignBytes(ctx.ChainID(), sequences, fee, msg) + signBytes := StdSignBytes(ctx.ChainID(), sequences, fee, msg) // Check sig and nonce and collect signer accounts. - var signerAccs = make([]sdk.Account, len(signerAddrs)) + var signerAccs = make([]Account, len(signerAddrs)) for i := 0; i < len(sigs); i++ { signerAddr, sig := signerAddrs[i], sigs[i] @@ -77,7 +78,6 @@ func NewAnteHandler(am sdk.AccountMapper, feeHandler sdk.FeeHandler) sdk.AnteHan // TODO: min fee if !fee.Amount.IsZero() { signerAcc, res = deductFees(signerAcc, fee) - feeHandler(ctx, tx, fee.Amount) if !res.IsOK() { return ctx, res, true } @@ -104,9 +104,9 @@ func NewAnteHandler(am sdk.AccountMapper, feeHandler sdk.FeeHandler) sdk.AnteHan // verify the signature and increment the sequence. // if the account doesn't have a pubkey, set it. func processSig( - ctx sdk.Context, am sdk.AccountMapper, - addr sdk.Address, sig sdk.StdSignature, signBytes []byte) ( - acc sdk.Account, res sdk.Result) { + ctx sdk.Context, am AccountMapper, + addr sdk.Address, sig StdSignature, signBytes []byte) ( + acc Account, res sdk.Result) { // Get the account. acc = am.GetAccount(ctx, addr) @@ -152,7 +152,7 @@ func processSig( // Deduct the fee from the account. // We could use the CoinKeeper (in addition to the AccountMapper, // because the CoinKeeper doesn't give us accounts), but it seems easier to do this. -func deductFees(acc sdk.Account, fee sdk.StdFee) (sdk.Account, sdk.Result) { +func deductFees(acc Account, fee StdFee) (Account, sdk.Result) { coins := acc.GetCoins() feeAmount := fee.Amount diff --git a/x/auth/client/cli/account.go b/x/auth/client/cli/account.go index b45cb12ddf..08bd520fb1 100644 --- a/x/auth/client/cli/account.go +++ b/x/auth/client/cli/account.go @@ -9,6 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" ) // GetAccountCmd for the auth.BaseAccount type @@ -17,8 +18,8 @@ func GetAccountCmdDefault(storeName string, cdc *wire.Codec) *cobra.Command { } // Get account decoder for auth.DefaultAccount -func GetAccountDecoder(cdc *wire.Codec) sdk.AccountDecoder { - return func(accBytes []byte) (acct sdk.Account, err error) { +func GetAccountDecoder(cdc *wire.Codec) auth.AccountDecoder { + return func(accBytes []byte) (acct auth.Account, err error) { // acct := new(auth.BaseAccount) err = cdc.UnmarshalBinaryBare(accBytes, &acct) if err != nil { @@ -30,7 +31,7 @@ func GetAccountDecoder(cdc *wire.Codec) sdk.AccountDecoder { // GetAccountCmd returns a query account that will display the // state of the account at a given address -func GetAccountCmd(storeName string, cdc *wire.Codec, decoder sdk.AccountDecoder) *cobra.Command { +func GetAccountCmd(storeName string, cdc *wire.Codec, decoder auth.AccountDecoder) *cobra.Command { return &cobra.Command{ Use: "account [address]", Short: "Query account balance", diff --git a/x/auth/context.go b/x/auth/context.go index b233f1e861..40fb177858 100644 --- a/x/auth/context.go +++ b/x/auth/context.go @@ -34,15 +34,15 @@ const ( ) // add the signers to the context -func WithSigners(ctx types.Context, accounts []types.Account) types.Context { +func WithSigners(ctx types.Context, accounts []Account) types.Context { return ctx.WithValue(contextKeySigners, accounts) } // get the signers from the context -func GetSigners(ctx types.Context) []types.Account { +func GetSigners(ctx types.Context) []Account { v := ctx.Value(contextKeySigners) if v == nil { - return []types.Account{} + return []Account{} } - return v.([]types.Account) + return v.([]Account) } diff --git a/x/auth/mapper.go b/x/auth/mapper.go index 3666f13b69..cdab2480e3 100644 --- a/x/auth/mapper.go +++ b/x/auth/mapper.go @@ -9,9 +9,6 @@ import ( crypto "github.com/tendermint/go-crypto" ) -var _ sdk.AccountMapper = (*AccountMapper)(nil) - -// Implements sdk.AccountMapper. // This AccountMapper encodes/decodes accounts using the // go-amino (binary) encoding/decoding library. type AccountMapper struct { @@ -19,8 +16,8 @@ type AccountMapper struct { // The (unexposed) key used to access the store from the Context. key sdk.StoreKey - // The prototypical sdk.Account concrete type. - proto sdk.Account + // The prototypical Account concrete type. + proto Account // The wire codec for binary encoding/decoding of accounts. cdc *wire.Codec @@ -29,7 +26,7 @@ type AccountMapper struct { // NewAccountMapper returns a new sdk.AccountMapper that // uses go-amino to (binary) encode and decode concrete sdk.Accounts. // nolint -func NewAccountMapper(cdc *wire.Codec, key sdk.StoreKey, proto sdk.Account) AccountMapper { +func NewAccountMapper(cdc *wire.Codec, key sdk.StoreKey, proto Account) AccountMapper { return AccountMapper{ key: key, proto: proto, @@ -38,14 +35,14 @@ func NewAccountMapper(cdc *wire.Codec, key sdk.StoreKey, proto sdk.Account) Acco } // Implaements sdk.AccountMapper. -func (am AccountMapper) NewAccountWithAddress(ctx sdk.Context, addr sdk.Address) sdk.Account { +func (am AccountMapper) NewAccountWithAddress(ctx sdk.Context, addr sdk.Address) Account { acc := am.clonePrototype() acc.SetAddress(addr) return acc } // Implements sdk.AccountMapper. -func (am AccountMapper) GetAccount(ctx sdk.Context, addr sdk.Address) sdk.Account { +func (am AccountMapper) GetAccount(ctx sdk.Context, addr sdk.Address) Account { store := ctx.KVStore(am.key) bz := store.Get(addr) if bz == nil { @@ -56,7 +53,7 @@ func (am AccountMapper) GetAccount(ctx sdk.Context, addr sdk.Address) sdk.Accoun } // Implements sdk.AccountMapper. -func (am AccountMapper) SetAccount(ctx sdk.Context, acc sdk.Account) { +func (am AccountMapper) SetAccount(ctx sdk.Context, acc Account) { addr := acc.GetAddress() store := ctx.KVStore(am.key) bz := am.encodeAccount(acc) @@ -64,7 +61,7 @@ func (am AccountMapper) SetAccount(ctx sdk.Context, acc sdk.Account) { } // Implements sdk.AccountMapper. -func (am AccountMapper) IterateAccounts(ctx sdk.Context, process func(sdk.Account) (stop bool)) { +func (am AccountMapper) IterateAccounts(ctx sdk.Context, process func(Account) (stop bool)) { store := ctx.KVStore(am.key) iter := store.Iterator(nil, nil) for { @@ -89,7 +86,8 @@ func (am AccountMapper) GetPubKey(ctx sdk.Context, addr sdk.Address) (crypto.Pub return acc.GetPubKey(), nil } -func (am AccountMapper) setPubKey(ctx sdk.Context, addr sdk.Address, newPubKey crypto.PubKey) sdk.Error { +// Sets the PubKey of the account at address +func (am AccountMapper) SetPubKey(ctx sdk.Context, addr sdk.Address, newPubKey crypto.PubKey) sdk.Error { acc := am.GetAccount(ctx, addr) if acc == nil { return sdk.ErrUnknownAddress(addr.String()) @@ -122,7 +120,7 @@ func (am AccountMapper) setSequence(ctx sdk.Context, addr sdk.Address, newSequen // misc. // Creates a new struct (or pointer to struct) from am.proto. -func (am AccountMapper) clonePrototype() sdk.Account { +func (am AccountMapper) clonePrototype() Account { protoRt := reflect.TypeOf(am.proto) if protoRt.Kind() == reflect.Ptr { protoCrt := protoRt.Elem() @@ -130,7 +128,7 @@ func (am AccountMapper) clonePrototype() sdk.Account { panic("accountMapper requires a struct proto sdk.Account, or a pointer to one") } protoRv := reflect.New(protoCrt) - clone, ok := protoRv.Interface().(sdk.Account) + clone, ok := protoRv.Interface().(Account) if !ok { panic(fmt.Sprintf("accountMapper requires a proto sdk.Account, but %v doesn't implement sdk.Account", protoRt)) } @@ -138,14 +136,14 @@ func (am AccountMapper) clonePrototype() sdk.Account { } protoRv := reflect.New(protoRt).Elem() - clone, ok := protoRv.Interface().(sdk.Account) + clone, ok := protoRv.Interface().(Account) if !ok { panic(fmt.Sprintf("accountMapper requires a proto sdk.Account, but %v doesn't implement sdk.Account", protoRt)) } return clone } -func (am AccountMapper) encodeAccount(acc sdk.Account) []byte { +func (am AccountMapper) encodeAccount(acc Account) []byte { bz, err := am.cdc.MarshalBinaryBare(acc) if err != nil { panic(err) @@ -153,7 +151,7 @@ func (am AccountMapper) encodeAccount(acc sdk.Account) []byte { return bz } -func (am AccountMapper) decodeAccount(bz []byte) (acc sdk.Account) { +func (am AccountMapper) decodeAccount(bz []byte) (acc Account) { err := am.cdc.UnmarshalBinaryBare(bz, &acc) if err != nil { panic(err) diff --git a/x/auth/stdtx.go b/x/auth/stdtx.go new file mode 100644 index 0000000000..bc01b01490 --- /dev/null +++ b/x/auth/stdtx.go @@ -0,0 +1,131 @@ +package auth + +import ( + "encoding/json" + + sdk "github.com/cosmos/cosmos-sdk/types" + crypto "github.com/tendermint/go-crypto" +) + +var _ sdk.Tx = (*StdTx)(nil) + +// StdTx is a standard way to wrap a Msg with Fee and Signatures. +// NOTE: the first signature is the FeePayer (Signatures must not be nil). +type StdTx struct { + Msg sdk.Msg `json:"msg"` + Fee StdFee `json:"fee"` + Signatures []StdSignature `json:"signatures"` +} + +func NewStdTx(msg sdk.Msg, fee StdFee, sigs []StdSignature) StdTx { + return StdTx{ + Msg: msg, + Fee: fee, + Signatures: sigs, + } +} + +//nolint +func (tx StdTx) GetMsg() sdk.Msg { return tx.Msg } + +// Signatures returns the signature of signers who signed the Msg. +// CONTRACT: Length returned is same as length of +// pubkeys returned from MsgKeySigners, and the order +// matches. +// CONTRACT: If the signature is missing (ie the Msg is +// invalid), then the corresponding signature is +// .Empty(). +func (tx StdTx) GetSignatures() []StdSignature { return tx.Signatures } + +// FeePayer returns the address responsible for paying the fees +// for the transactions. It's the first address returned by msg.GetSigners(). +// If GetSigners() is empty, this panics. +func FeePayer(tx sdk.Tx) sdk.Address { + return tx.GetMsg().GetSigners()[0] +} + +//__________________________________________________________ + +// StdFee includes the amount of coins paid in fees and the maximum +// gas to be used by the transaction. The ratio yields an effective "gasprice", +// which must be above some miminum to be accepted into the mempool. +type StdFee struct { + Amount sdk.Coins `json:"amount"` + Gas int64 `json:"gas"` +} + +func NewStdFee(gas int64, amount ...sdk.Coin) StdFee { + return StdFee{ + Amount: amount, + Gas: gas, + } +} + +// fee bytes for signing later +func (fee StdFee) Bytes() []byte { + // normalize. XXX + // this is a sign of something ugly + // (in the lcd_test, client side its null, + // server side its []) + if len(fee.Amount) == 0 { + fee.Amount = sdk.Coins{} + } + bz, err := json.Marshal(fee) // TODO + if err != nil { + panic(err) + } + return bz +} + +//__________________________________________________________ + +// StdSignDoc is replay-prevention structure. +// It includes the result of msg.GetSignBytes(), +// as well as the ChainID (prevent cross chain replay) +// and the Sequence numbers for each signature (prevent +// inchain replay and enforce tx ordering per account). +type StdSignDoc struct { + ChainID string `json:"chain_id"` + Sequences []int64 `json:"sequences"` + FeeBytes []byte `json:"fee_bytes"` + MsgBytes []byte `json:"msg_bytes"` + AltBytes []byte `json:"alt_bytes"` +} + +// StdSignBytes returns the bytes to sign for a transaction. +// TODO: change the API to just take a chainID and StdTx ? +func StdSignBytes(chainID string, sequences []int64, fee StdFee, msg sdk.Msg) []byte { + bz, err := json.Marshal(StdSignDoc{ + ChainID: chainID, + Sequences: sequences, + FeeBytes: fee.Bytes(), + MsgBytes: msg.GetSignBytes(), + }) + if err != nil { + panic(err) + } + return bz +} + +// StdSignMsg is a convenience structure for passing along +// a Msg with the other requirements for a StdSignDoc before +// it is signed. For use in the CLI. +type StdSignMsg struct { + ChainID string + Sequences []int64 + Fee StdFee + Msg sdk.Msg + // XXX: Alt +} + +// get message bytes +func (msg StdSignMsg) Bytes() []byte { + return StdSignBytes(msg.ChainID, msg.Sequences, msg.Fee, msg.Msg) +} + +// Standard Signature +type StdSignature struct { + crypto.PubKey `json:"pub_key"` // optional + crypto.Signature `json:"signature"` + Sequence int64 `json:"sequence"` +} diff --git a/x/auth/wire.go b/x/auth/wire.go deleted file mode 100644 index 9db1b85cca..0000000000 --- a/x/auth/wire.go +++ /dev/null @@ -1,12 +0,0 @@ -package auth - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/wire" -) - -// Register concrete types on wire codec for default AppAccount -func RegisterWire(cdc *wire.Codec) { - cdc.RegisterInterface((*sdk.Account)(nil), nil) - cdc.RegisterConcrete(&BaseAccount{}, "auth/Account", nil) -} diff --git a/x/bank/keeper.go b/x/bank/keeper.go index 6ef73c68b6..b14da4d81f 100644 --- a/x/bank/keeper.go +++ b/x/bank/keeper.go @@ -4,6 +4,7 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" ) const ( @@ -16,11 +17,11 @@ const ( // Keeper manages transfers between accounts type Keeper struct { - am sdk.AccountMapper + am auth.AccountMapper } // NewKeeper returns a new Keeper -func NewKeeper(am sdk.AccountMapper) Keeper { +func NewKeeper(am auth.AccountMapper) Keeper { return Keeper{am: am} } @@ -63,11 +64,11 @@ func (keeper Keeper) InputOutputCoins(ctx sdk.Context, inputs []Input, outputs [ // SendKeeper only allows transfers between accounts, without the possibility of creating coins type SendKeeper struct { - am sdk.AccountMapper + am auth.AccountMapper } // NewSendKeeper returns a new Keeper -func NewSendKeeper(am sdk.AccountMapper) SendKeeper { +func NewSendKeeper(am auth.AccountMapper) SendKeeper { return SendKeeper{am: am} } @@ -95,11 +96,11 @@ func (keeper SendKeeper) InputOutputCoins(ctx sdk.Context, inputs []Input, outpu // ViewKeeper only allows reading of balances type ViewKeeper struct { - am sdk.AccountMapper + am auth.AccountMapper } // NewViewKeeper returns a new Keeper -func NewViewKeeper(am sdk.AccountMapper) ViewKeeper { +func NewViewKeeper(am auth.AccountMapper) ViewKeeper { return ViewKeeper{am: am} } @@ -115,7 +116,7 @@ func (keeper ViewKeeper) HasCoins(ctx sdk.Context, addr sdk.Address, amt sdk.Coi //______________________________________________________________________________________________ -func getCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address) sdk.Coins { +func getCoins(ctx sdk.Context, am auth.AccountMapper, addr sdk.Address) sdk.Coins { ctx.GasMeter().ConsumeGas(costGetCoins, "getCoins") acc := am.GetAccount(ctx, addr) if acc == nil { @@ -124,7 +125,7 @@ func getCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address) sdk.Coins return acc.GetCoins() } -func setCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.Coins) sdk.Error { +func setCoins(ctx sdk.Context, am auth.AccountMapper, addr sdk.Address, amt sdk.Coins) sdk.Error { ctx.GasMeter().ConsumeGas(costSetCoins, "setCoins") acc := am.GetAccount(ctx, addr) if acc == nil { @@ -136,13 +137,13 @@ func setCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.C } // HasCoins returns whether or not an account has at least amt coins. -func hasCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.Coins) bool { +func hasCoins(ctx sdk.Context, am auth.AccountMapper, addr sdk.Address, amt sdk.Coins) bool { ctx.GasMeter().ConsumeGas(costHasCoins, "hasCoins") return getCoins(ctx, am, addr).IsGTE(amt) } // SubtractCoins subtracts amt from the coins at the addr. -func subtractCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) { +func subtractCoins(ctx sdk.Context, am auth.AccountMapper, addr sdk.Address, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) { ctx.GasMeter().ConsumeGas(costSubtractCoins, "subtractCoins") oldCoins := getCoins(ctx, am, addr) newCoins := oldCoins.Minus(amt) @@ -155,7 +156,7 @@ func subtractCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt } // AddCoins adds amt to the coins at the addr. -func addCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) { +func addCoins(ctx sdk.Context, am auth.AccountMapper, addr sdk.Address, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) { ctx.GasMeter().ConsumeGas(costAddCoins, "addCoins") oldCoins := getCoins(ctx, am, addr) newCoins := oldCoins.Plus(amt) @@ -169,7 +170,7 @@ func addCoins(ctx sdk.Context, am sdk.AccountMapper, addr sdk.Address, amt sdk.C // SendCoins moves coins from one account to another // NOTE: Make sure to revert state changes from tx on error -func sendCoins(ctx sdk.Context, am sdk.AccountMapper, fromAddr sdk.Address, toAddr sdk.Address, amt sdk.Coins) (sdk.Tags, sdk.Error) { +func sendCoins(ctx sdk.Context, am auth.AccountMapper, fromAddr sdk.Address, toAddr sdk.Address, amt sdk.Coins) (sdk.Tags, sdk.Error) { _, subTags, err := subtractCoins(ctx, am, fromAddr, amt) if err != nil { return nil, err @@ -185,7 +186,7 @@ func sendCoins(ctx sdk.Context, am sdk.AccountMapper, fromAddr sdk.Address, toAd // InputOutputCoins handles a list of inputs and outputs // NOTE: Make sure to revert state changes from tx on error -func inputOutputCoins(ctx sdk.Context, am sdk.AccountMapper, inputs []Input, outputs []Output) (sdk.Tags, sdk.Error) { +func inputOutputCoins(ctx sdk.Context, am auth.AccountMapper, inputs []Input, outputs []Output) (sdk.Tags, sdk.Error) { allTags := sdk.EmptyTags() for _, in := range inputs { diff --git a/x/auth/baseaccount.go b/x/baseaccount/baseaccount.go similarity index 90% rename from x/auth/baseaccount.go rename to x/baseaccount/baseaccount.go index ff907fc387..9701ac41dc 100644 --- a/x/auth/baseaccount.go +++ b/x/baseaccount/baseaccount.go @@ -1,18 +1,19 @@ -package auth +package baseaccount import ( "errors" - "github.com/tendermint/go-crypto" + crypto "github.com/tendermint/go-crypto" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" ) //----------------------------------------------------------- // BaseAccount -var _ sdk.Account = (*BaseAccount)(nil) +var _ auth.Account = (*BaseAccount)(nil) // BaseAccount - base account structure. // Extend this by embedding this in your AppAccount. @@ -82,7 +83,7 @@ func (acc *BaseAccount) SetSequence(seq int64) error { // Most users shouldn't use this, but this comes handy for tests. func RegisterBaseAccount(cdc *wire.Codec) { - cdc.RegisterInterface((*sdk.Account)(nil), nil) + cdc.RegisterInterface((*auth.Account)(nil), nil) cdc.RegisterConcrete(&BaseAccount{}, "cosmos-sdk/BaseAccount", nil) wire.RegisterCrypto(cdc) } diff --git a/x/auth/baseaccount_test.go b/x/baseaccount/baseaccount_test.go similarity index 99% rename from x/auth/baseaccount_test.go rename to x/baseaccount/baseaccount_test.go index d3363e4fb0..ed1a322c2f 100644 --- a/x/auth/baseaccount_test.go +++ b/x/baseaccount/baseaccount_test.go @@ -1,4 +1,4 @@ -package auth +package baseaccount import ( "testing" diff --git a/x/auth/handler.go b/x/baseaccount/handler.go similarity index 58% rename from x/auth/handler.go rename to x/baseaccount/handler.go index 8a0e1061ae..46307c8818 100644 --- a/x/auth/handler.go +++ b/x/baseaccount/handler.go @@ -1,19 +1,20 @@ -package auth +package baseaccount import ( "reflect" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" ) -// NewHandler returns a handler for "auth" type messages. -func NewHandler(am AccountMapper) sdk.Handler { +// NewHandler returns a handler for "baseaccount" type messages. +func NewHandler(am auth.AccountMapper) sdk.Handler { return func(ctx sdk.Context, msg sdk.Msg) sdk.Result { switch msg := msg.(type) { case MsgChangeKey: return handleMsgChangeKey(ctx, am, msg) default: - errMsg := "Unrecognized auth Msg type: " + reflect.TypeOf(msg).Name() + errMsg := "Unrecognized baseaccount Msg type: " + reflect.TypeOf(msg).Name() return sdk.ErrUnknownRequest(errMsg).Result() } } @@ -21,9 +22,9 @@ func NewHandler(am AccountMapper) sdk.Handler { // Handle MsgChangeKey // Should be very expensive, because once this happens, an account is un-prunable -func handleMsgChangeKey(ctx sdk.Context, am AccountMapper, msg MsgChangeKey) sdk.Result { +func handleMsgChangeKey(ctx sdk.Context, am auth.AccountMapper, msg MsgChangeKey) sdk.Result { - err := am.setPubKey(ctx, msg.Address, msg.NewPubKey) + err := am.SetPubKey(ctx, msg.Address, msg.NewPubKey) if err != nil { return err.Result() } diff --git a/x/auth/msgs.go b/x/baseaccount/msgs.go similarity index 87% rename from x/auth/msgs.go rename to x/baseaccount/msgs.go index 545b296e5b..f0319ac7fe 100644 --- a/x/auth/msgs.go +++ b/x/baseaccount/msgs.go @@ -1,11 +1,10 @@ -package auth +package baseaccount import ( "encoding/json" - "github.com/tendermint/go-crypto" - sdk "github.com/cosmos/cosmos-sdk/types" + crypto "github.com/tendermint/go-crypto" ) // MsgChangeKey - high level transaction of the auth module @@ -22,7 +21,7 @@ func NewMsgChangeKey(addr sdk.Address, pubkey crypto.PubKey) MsgChangeKey { } // Implements Msg. -func (msg MsgChangeKey) Type() string { return "auth" } +func (msg MsgChangeKey) Type() string { return "baseaccount" } // Implements Msg. func (msg MsgChangeKey) ValidateBasic() sdk.Error { diff --git a/x/auth/msgs_test.go b/x/baseaccount/msgs_test.go similarity index 97% rename from x/auth/msgs_test.go rename to x/baseaccount/msgs_test.go index 30c98b073b..46797fa0d8 100644 --- a/x/auth/msgs_test.go +++ b/x/baseaccount/msgs_test.go @@ -1,4 +1,4 @@ -package auth +package baseaccount import ( "testing" diff --git a/x/baseaccount/wire.go b/x/baseaccount/wire.go new file mode 100644 index 0000000000..4c77d1c72c --- /dev/null +++ b/x/baseaccount/wire.go @@ -0,0 +1,14 @@ +package baseaccount + +import ( + "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" +) + +// Register concrete types on wire codec +func RegisterWire(cdc *wire.Codec) { + cdc.RegisterInterface((*auth.Account)(nil), nil) + cdc.RegisterConcrete(&BaseAccount{}, "baseaccount/BaseAccount", nil) + wire.RegisterCrypto(cdc) + cdc.RegisterConcrete(MsgChangeKey{}, "baseaccount/changekey", nil) +} diff --git a/x/stake/test_common.go b/x/stake/test_common.go index 2dac36069e..19487c5785 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -16,6 +16,7 @@ import ( "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/cosmos/cosmos-sdk/x/baseaccount" ) // dummy addresses used for testing @@ -72,8 +73,8 @@ func makeTestCodec() *wire.Codec { cdc.RegisterConcrete(MsgUnbond{}, "test/stake/Unbond", nil) // Register AppAccount - cdc.RegisterInterface((*sdk.Account)(nil), nil) - cdc.RegisterConcrete(&auth.BaseAccount{}, "test/stake/Account", nil) + cdc.RegisterInterface((*auth.Account)(nil), nil) + cdc.RegisterConcrete(&baseaccount.BaseAccount{}, "test/stake/Account", nil) wire.RegisterCrypto(cdc) return cdc @@ -91,7 +92,12 @@ func paramsNoInflation() Params { } // hogpodge of all sorts of input required for testing +<<<<<<< HEAD func createTestInput(t *testing.T, isCheckTx bool, initCoins int64) (sdk.Context, sdk.AccountMapper, Keeper) { +======= +func createTestInput(t *testing.T, isCheckTx bool, initCoins int64) (sdk.Context, auth.AccountMapper, Keeper) { + db := dbm.NewMemDB() +>>>>>>> in progress keyStake := sdk.NewKVStoreKey("stake") keyAcc := sdk.NewKVStoreKey("acc") @@ -105,9 +111,9 @@ func createTestInput(t *testing.T, isCheckTx bool, initCoins int64) (sdk.Context ctx := sdk.NewContext(ms, abci.Header{ChainID: "foochainid"}, isCheckTx, nil, log.NewNopLogger()) cdc := makeTestCodec() accountMapper := auth.NewAccountMapper( - cdc, // amino codec - keyAcc, // target store - &auth.BaseAccount{}, // prototype + cdc, // amino codec + keyMain, // target store + &baseaccount.BaseAccount{}, // prototype ) ck := bank.NewKeeper(accountMapper) keeper := NewKeeper(cdc, keyStake, ck, DefaultCodespace) From 56d1c48812ce44bbc9ea179ee727bbc01071a95a Mon Sep 17 00:00:00 2001 From: sunnya97 Date: Wed, 23 May 2018 19:47:33 -0700 Subject: [PATCH 015/548] in progress --- x/auth/client/rest/query.go | 7 ++++--- x/ibc/client/cli/relay.go | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/x/auth/client/rest/query.go b/x/auth/client/rest/query.go index 52244fec9c..a60ce5cdb2 100644 --- a/x/auth/client/rest/query.go +++ b/x/auth/client/rest/query.go @@ -10,19 +10,20 @@ import ( "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" - auth "github.com/cosmos/cosmos-sdk/x/auth/client/cli" + "github.com/cosmos/cosmos-sdk/x/auth" + authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" ) // register REST routes func RegisterRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec, storeName string) { r.HandleFunc( "/accounts/{address}", - QueryAccountRequestHandlerFn(storeName, cdc, auth.GetAccountDecoder(cdc), ctx), + QueryAccountRequestHandlerFn(storeName, cdc, authcmd.GetAccountDecoder(cdc), ctx), ).Methods("GET") } // query accountREST Handler -func QueryAccountRequestHandlerFn(storeName string, cdc *wire.Codec, decoder sdk.AccountDecoder, ctx context.CoreContext) http.HandlerFunc { +func QueryAccountRequestHandlerFn(storeName string, cdc *wire.Codec, decoder auth.AccountDecoder, ctx context.CoreContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) addr := vars["address"] diff --git a/x/ibc/client/cli/relay.go b/x/ibc/client/cli/relay.go index 3a1e63a84a..caf96d60a4 100644 --- a/x/ibc/client/cli/relay.go +++ b/x/ibc/client/cli/relay.go @@ -12,6 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" wire "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" "github.com/cosmos/cosmos-sdk/x/ibc" ) @@ -27,7 +28,7 @@ const ( type relayCommander struct { cdc *wire.Codec address sdk.Address - decoder sdk.AccountDecoder + decoder auth.AccountDecoder mainStore string ibcStore string accStore string From 5d7c3af1b8577f3df20ee00704398ca23f8c95c8 Mon Sep 17 00:00:00 2001 From: sunnya97 Date: Wed, 23 May 2018 22:09:01 -0700 Subject: [PATCH 016/548] works --- Gopkg.lock | 47 +--------- baseapp/baseapp_test.go | 15 ++-- client/lcd/lcd_test.go | 5 +- cmd/gaia/app/app.go | 7 +- cmd/gaia/app/app_test.go | 12 +-- cmd/gaia/app/genesis.go | 9 +- examples/basecoin/app/app.go | 10 +-- examples/basecoin/app/app_test.go | 12 +-- examples/basecoin/types/account.go | 6 +- examples/democoin/app/app.go | 8 +- examples/democoin/app/app_test.go | 16 ++-- examples/democoin/types/account.go | 6 +- .../democoin/x/simplestake/keeper_test.go | 7 +- examples/kvstore/tx.go | 3 +- mock/tx.go | 3 +- x/auth/account.go | 81 +++++++++++++++++ .../account_test.go} | 2 +- x/auth/ante.go | 2 +- x/auth/ante_test.go | 34 +++---- x/auth/context_test.go | 2 +- x/{baseaccount => auth}/handler.go | 7 +- x/{baseaccount => auth}/msgs.go | 4 +- x/{baseaccount => auth}/msgs_test.go | 2 +- types/tx_msg_test.go => x/auth/stdtx_test.go | 16 ++-- x/auth/wire.go | 12 +++ x/baseaccount/baseaccount.go | 89 ------------------- x/baseaccount/wire.go | 14 --- x/ibc/ibc_test.go | 4 +- x/stake/test_common.go | 9 +- 29 files changed, 197 insertions(+), 247 deletions(-) rename x/{baseaccount/baseaccount_test.go => auth/account_test.go} (99%) rename x/{baseaccount => auth}/handler.go (79%) rename x/{baseaccount => auth}/msgs.go (91%) rename x/{baseaccount => auth}/msgs_test.go (97%) rename types/tx_msg_test.go => x/auth/stdtx_test.go (70%) create mode 100644 x/auth/wire.go delete mode 100644 x/baseaccount/baseaccount.go delete mode 100644 x/baseaccount/wire.go diff --git a/Gopkg.lock b/Gopkg.lock index dcc57cab33..37a32820c2 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -13,51 +13,6 @@ packages = ["btcec"] revision = "1432d294a5b055c297457c25434efbf13384cc46" -[[projects]] - name = "github.com/cosmos/cosmos-sdk" - packages = [ - "baseapp", - "client", - "client/context", - "client/keys", - "client/lcd", - "client/rpc", - "client/tx", - "cmd/gaia/app", - "examples/basecoin/app", - "examples/basecoin/types", - "examples/democoin/app", - "examples/democoin/types", - "examples/democoin/x/cool", - "examples/democoin/x/cool/client/cli", - "examples/democoin/x/pow", - "examples/democoin/x/pow/client/cli", - "examples/democoin/x/simplestake", - "examples/democoin/x/simplestake/client/cli", - "examples/democoin/x/sketchy", - "mock", - "server", - "store", - "tests", - "types", - "version", - "wire", - "x/auth", - "x/auth/client/cli", - "x/auth/client/rest", - "x/bank", - "x/bank/client", - "x/bank/client/cli", - "x/bank/client/rest", - "x/ibc", - "x/ibc/client/cli", - "x/ibc/client/rest", - "x/stake", - "x/stake/client/cli" - ] - revision = "187be1a5df81de1fd71da9053102d3a4868ec979" - version = "v0.17.2" - [[projects]] name = "github.com/davecgh/go-spew" packages = ["spew"] @@ -502,6 +457,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "9b6ee069da61cf1815c332c5624e8af99b51ea72e2e9b91d780db92299598dcc" + inputs-digest = "7540d2ecdb5d7d5084ab4e6132e929bbd501bd6add3006d8f08a6b2c127e0c7d" solver-name = "gps-cdcl" solver-version = 1 diff --git a/baseapp/baseapp_test.go b/baseapp/baseapp_test.go index 969a9f9add..61498b1b19 100644 --- a/baseapp/baseapp_test.go +++ b/baseapp/baseapp_test.go @@ -11,13 +11,14 @@ import ( "github.com/stretchr/testify/require" abci "github.com/tendermint/abci/types" - "github.com/tendermint/go-crypto" + crypto "github.com/tendermint/go-crypto" cmn "github.com/tendermint/tmlibs/common" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" ) func defaultLogger() log.Logger { @@ -446,12 +447,12 @@ type testUpdatePowerTx struct { const msgType = "testUpdatePowerTx" -func (tx testUpdatePowerTx) Type() string { return msgType } -func (tx testUpdatePowerTx) GetMsg() sdk.Msg { return tx } -func (tx testUpdatePowerTx) GetSignBytes() []byte { return nil } -func (tx testUpdatePowerTx) ValidateBasic() sdk.Error { return nil } -func (tx testUpdatePowerTx) GetSigners() []sdk.Address { return nil } -func (tx testUpdatePowerTx) GetSignatures() []sdk.StdSignature { return nil } +func (tx testUpdatePowerTx) Type() string { return msgType } +func (tx testUpdatePowerTx) GetMsg() sdk.Msg { return tx } +func (tx testUpdatePowerTx) GetSignBytes() []byte { return nil } +func (tx testUpdatePowerTx) ValidateBasic() sdk.Error { return nil } +func (tx testUpdatePowerTx) GetSigners() []sdk.Address { return nil } +func (tx testUpdatePowerTx) GetSignatures() []auth.StdSignature { return nil } func TestValidatorChange(t *testing.T) { diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 66a8a4085f..29b4ba1124 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -35,6 +35,7 @@ import ( btypes "github.com/cosmos/cosmos-sdk/examples/basecoin/types" tests "github.com/cosmos/cosmos-sdk/tests" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" ) var ( @@ -436,11 +437,11 @@ func request(t *testing.T, port, method, path string, payload []byte) (*http.Res return res, string(output) } -func getAccount(t *testing.T, sendAddr string) sdk.Account { +func getAccount(t *testing.T, sendAddr string) auth.Account { // get the account to get the sequence res, body := request(t, port, "GET", "/accounts/"+sendAddr, nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - var acc sdk.Account + var acc auth.Account err := cdc.UnmarshalJSON([]byte(body), &acc) require.Nil(t, err) return acc diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index df4429ee25..b2f51498ba 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -14,7 +14,6 @@ import ( "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/baseaccount" "github.com/cosmos/cosmos-sdk/x/ibc" "github.com/cosmos/cosmos-sdk/x/stake" ) @@ -63,8 +62,8 @@ func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { // define the accountMapper app.accountMapper = auth.NewAccountMapper( app.cdc, - app.keyAccount, // target store - &baseaccount.BaseAccount{}, // prototype + app.keyAccount, // target store + &auth.BaseAccount{}, // prototype ) // add handlers @@ -97,7 +96,7 @@ func MakeCodec() *wire.Codec { ibc.RegisterWire(cdc) bank.RegisterWire(cdc) stake.RegisterWire(cdc) - baseaccount.RegisterWire(cdc) + auth.RegisterWire(cdc) sdk.RegisterWire(cdc) wire.RegisterCrypto(cdc) return cdc diff --git a/cmd/gaia/app/app_test.go b/cmd/gaia/app/app_test.go index 42a56959ca..b6f1c9e03c 100644 --- a/cmd/gaia/app/app_test.go +++ b/cmd/gaia/app/app_test.go @@ -38,7 +38,7 @@ var ( coins = sdk.Coins{{"foocoin", 10}} halfCoins = sdk.Coins{{"foocoin", 5}} manyCoins = sdk.Coins{{"foocoin", 1}, {"barcoin", 1}} - fee = sdk.StdFee{ + fee = auth.StdFee{ sdk.Coins{{"foocoin", 0}}, 100000, } @@ -463,17 +463,17 @@ func CheckBalance(t *testing.T, gapp *GaiaApp, addr sdk.Address, balExpected str assert.Equal(t, balExpected, fmt.Sprintf("%v", res2.GetCoins())) } -func genTx(msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) sdk.StdTx { - sigs := make([]sdk.StdSignature, len(priv)) +func genTx(msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) auth.StdTx { + sigs := make([]auth.StdSignature, len(priv)) for i, p := range priv { - sigs[i] = sdk.StdSignature{ + sigs[i] = auth.StdSignature{ PubKey: p.PubKey(), - Signature: p.Sign(sdk.StdSignBytes(chainID, seq, fee, msg)), + Signature: p.Sign(auth.StdSignBytes(chainID, seq, fee, msg)), Sequence: seq[i], } } - return sdk.NewStdTx(msg, fee, sigs) + return auth.NewStdTx(msg, fee, sigs) } diff --git a/cmd/gaia/app/genesis.go b/cmd/gaia/app/genesis.go index 6914ec4927..8cf45e84a2 100644 --- a/cmd/gaia/app/genesis.go +++ b/cmd/gaia/app/genesis.go @@ -13,7 +13,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/baseaccount" "github.com/cosmos/cosmos-sdk/x/stake" ) @@ -29,7 +28,7 @@ type GenesisAccount struct { Coins sdk.Coins `json:"coins"` } -func NewGenesisAccount(acc *baseaccount.BaseAccount) GenesisAccount { +func NewGenesisAccount(acc *auth.BaseAccount) GenesisAccount { return GenesisAccount{ Address: acc.Address, Coins: acc.Coins, @@ -44,8 +43,8 @@ func NewGenesisAccountI(acc auth.Account) GenesisAccount { } // convert GenesisAccount to auth.BaseAccount -func (ga *GenesisAccount) ToAccount() (acc *baseaccount.BaseAccount) { - return &baseaccount.BaseAccount{ +func (ga *GenesisAccount) ToAccount() (acc *auth.BaseAccount) { + return &auth.BaseAccount{ Address: ga.Address, Coins: ga.Coins.Sort(), } @@ -149,7 +148,7 @@ func GaiaAppGenState(cdc *wire.Codec, appGenTxs []json.RawMessage) (appState jso } // create the genesis account, give'm few steaks and a buncha token with there name - accAuth := baseaccount.NewBaseAccountWithAddress(genTx.Address) + accAuth := auth.NewBaseAccountWithAddress(genTx.Address) accAuth.Coins = sdk.Coins{ {genTx.Name + "Token", 1000}, {"steak", freeFermionsAcc}, diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index b1a434fa2c..610a9e5525 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -35,7 +35,7 @@ type BasecoinApp struct { keyStake *sdk.KVStoreKey // Manage getting and setting accounts - accountMapper sdk.AccountMapper + accountMapper auth.AccountMapper coinKeeper bank.Keeper ibcMapper ibc.Mapper stakeKeeper stake.Keeper @@ -70,7 +70,7 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { // register message routes app.Router(). - AddRoute("auth", auth.NewHandler(app.accountMapper.(auth.AccountMapper))). + AddRoute("auth", auth.NewHandler(app.accountMapper)). AddRoute("bank", bank.NewHandler(app.coinKeeper)). AddRoute("ibc", ibc.NewHandler(app.ibcMapper, app.coinKeeper)). AddRoute("stake", stake.NewHandler(app.stakeKeeper)) @@ -78,7 +78,7 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { // Initialize BaseApp. app.SetInitChainer(app.initChainer) app.MountStoresIAVL(app.keyMain, app.keyAccount, app.keyIBC, app.keyStake) - app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, auth.BurnFeeHandler)) + app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper)) err := app.LoadLatestVersion(app.keyMain) if err != nil { cmn.Exit(err.Error()) @@ -96,7 +96,7 @@ func MakeCodec() *wire.Codec { ibc.RegisterWire(cdc) // register custom AppAccount - cdc.RegisterInterface((*sdk.Account)(nil), nil) + cdc.RegisterInterface((*auth.Account)(nil), nil) cdc.RegisterConcrete(&types.AppAccount{}, "basecoin/Account", nil) return cdc } @@ -129,7 +129,7 @@ func (app *BasecoinApp) ExportAppStateJSON() (appState json.RawMessage, err erro // iterate to get the accounts accounts := []*types.GenesisAccount{} - appendAccount := func(acc sdk.Account) (stop bool) { + appendAccount := func(acc auth.Account) (stop bool) { account := &types.GenesisAccount{ Address: acc.GetAddress(), Coins: acc.GetCoins(), diff --git a/examples/basecoin/app/app_test.go b/examples/basecoin/app/app_test.go index d0b59f3313..e297288d3f 100644 --- a/examples/basecoin/app/app_test.go +++ b/examples/basecoin/app/app_test.go @@ -37,7 +37,7 @@ var ( coins = sdk.Coins{{"foocoin", 10}} halfCoins = sdk.Coins{{"foocoin", 5}} manyCoins = sdk.Coins{{"foocoin", 1}, {"barcoin", 1}} - fee = sdk.StdFee{ + fee = auth.StdFee{ sdk.Coins{{"foocoin", 0}}, 100000, } @@ -471,17 +471,17 @@ func TestIBCMsgs(t *testing.T) { SignCheckDeliver(t, bapp, receiveMsg, []int64{3}, false, priv1) } -func genTx(msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) sdk.StdTx { - sigs := make([]sdk.StdSignature, len(priv)) +func genTx(msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) auth.StdTx { + sigs := make([]auth.StdSignature, len(priv)) for i, p := range priv { - sigs[i] = sdk.StdSignature{ + sigs[i] = auth.StdSignature{ PubKey: p.PubKey(), - Signature: p.Sign(sdk.StdSignBytes(chainID, seq, fee, msg)), + Signature: p.Sign(auth.StdSignBytes(chainID, seq, fee, msg)), Sequence: seq[i], } } - return sdk.NewStdTx(msg, fee, sigs) + return auth.NewStdTx(msg, fee, sigs) } diff --git a/examples/basecoin/types/account.go b/examples/basecoin/types/account.go index e6eb5d7b46..223e0b9eb1 100644 --- a/examples/basecoin/types/account.go +++ b/examples/basecoin/types/account.go @@ -6,7 +6,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth" ) -var _ sdk.Account = (*AppAccount)(nil) +var _ auth.Account = (*AppAccount)(nil) // Custom extensions for this application. This is just an example of // extending auth.BaseAccount with custom fields. @@ -23,8 +23,8 @@ func (acc AppAccount) GetName() string { return acc.Name } func (acc *AppAccount) SetName(name string) { acc.Name = name } // Get the AccountDecoder function for the custom AppAccount -func GetAccountDecoder(cdc *wire.Codec) sdk.AccountDecoder { - return func(accBytes []byte) (res sdk.Account, err error) { +func GetAccountDecoder(cdc *wire.Codec) auth.AccountDecoder { + return func(accBytes []byte) (res auth.Account, err error) { if len(accBytes) == 0 { return nil, sdk.ErrTxDecode("accBytes are empty") } diff --git a/examples/democoin/app/app.go b/examples/democoin/app/app.go index 7c8250b189..9696630b6e 100644 --- a/examples/democoin/app/app.go +++ b/examples/democoin/app/app.go @@ -46,7 +46,7 @@ type DemocoinApp struct { stakeKeeper simplestake.Keeper // Manage getting and setting accounts - accountMapper sdk.AccountMapper + accountMapper auth.AccountMapper } func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp { @@ -89,7 +89,7 @@ func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp { // Initialize BaseApp. app.SetInitChainer(app.initChainerFn(app.coolKeeper, app.powKeeper)) app.MountStoresIAVL(app.capKeyMainStore, app.capKeyAccountStore, app.capKeyPowStore, app.capKeyIBCStore, app.capKeyStakingStore) - app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, auth.BurnFeeHandler)) + app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper)) err := app.LoadLatestVersion(app.capKeyMainStore) if err != nil { cmn.Exit(err.Error()) @@ -109,7 +109,7 @@ func MakeCodec() *wire.Codec { simplestake.RegisterWire(cdc) // Register AppAccount - cdc.RegisterInterface((*sdk.Account)(nil), nil) + cdc.RegisterInterface((*auth.Account)(nil), nil) cdc.RegisterConcrete(&types.AppAccount{}, "democoin/Account", nil) return cdc } @@ -158,7 +158,7 @@ func (app *DemocoinApp) ExportAppStateJSON() (appState json.RawMessage, err erro // iterate to get the accounts accounts := []*types.GenesisAccount{} - appendAccount := func(acc sdk.Account) (stop bool) { + appendAccount := func(acc auth.Account) (stop bool) { account := &types.GenesisAccount{ Address: acc.GetAddress(), Coins: acc.GetCoins(), diff --git a/examples/democoin/app/app_test.go b/examples/democoin/app/app_test.go index b0f188f10b..e025c50627 100644 --- a/examples/democoin/app/app_test.go +++ b/examples/democoin/app/app_test.go @@ -31,7 +31,7 @@ var ( addr1 = priv1.PubKey().Address() addr2 = crypto.GenPrivKeyEd25519().PubKey().Address() coins = sdk.Coins{{"foocoin", 10}} - fee = sdk.StdFee{ + fee = auth.StdFee{ sdk.Coins{{"foocoin", 0}}, 1000000, } @@ -93,8 +93,8 @@ func TestMsgs(t *testing.T) { sequences := []int64{0} for i, m := range msgs { - sig := priv1.Sign(sdk.StdSignBytes(chainID, sequences, fee, m.msg)) - tx := sdk.NewStdTx(m.msg, fee, []sdk.StdSignature{{ + sig := priv1.Sign(auth.StdSignBytes(chainID, sequences, fee, m.msg)) + tx := auth.NewStdTx(m.msg, fee, []auth.StdSignature{{ PubKey: priv1.PubKey(), Signature: sig, }}) @@ -194,8 +194,8 @@ func TestMsgSendWithAccounts(t *testing.T) { // Sign the tx sequences := []int64{0} - sig := priv1.Sign(sdk.StdSignBytes(chainID, sequences, fee, sendMsg)) - tx := sdk.NewStdTx(sendMsg, fee, []sdk.StdSignature{{ + sig := priv1.Sign(auth.StdSignBytes(chainID, sequences, fee, sendMsg)) + tx := auth.NewStdTx(sendMsg, fee, []auth.StdSignature{{ PubKey: priv1.PubKey(), Signature: sig, }}) @@ -227,7 +227,7 @@ func TestMsgSendWithAccounts(t *testing.T) { // resigning the tx with the bumped sequence should work sequences = []int64{1} - sig = priv1.Sign(sdk.StdSignBytes(chainID, sequences, fee, tx.Msg)) + sig = priv1.Sign(auth.StdSignBytes(chainID, sequences, fee, tx.Msg)) tx.Signatures[0].Signature = sig res = bapp.Deliver(tx) assert.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) @@ -394,9 +394,9 @@ func TestHandler(t *testing.T) { func SignCheckDeliver(t *testing.T, bapp *DemocoinApp, msg sdk.Msg, seq int64, expPass bool) { // Sign the tx - tx := sdk.NewStdTx(msg, fee, []sdk.StdSignature{{ + tx := auth.NewStdTx(msg, fee, []auth.StdSignature{{ PubKey: priv1.PubKey(), - Signature: priv1.Sign(sdk.StdSignBytes(chainID, []int64{seq}, fee, msg)), + Signature: priv1.Sign(auth.StdSignBytes(chainID, []int64{seq}, fee, msg)), Sequence: seq, }}) diff --git a/examples/democoin/types/account.go b/examples/democoin/types/account.go index 8a744229ad..211cf3c416 100644 --- a/examples/democoin/types/account.go +++ b/examples/democoin/types/account.go @@ -9,7 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/examples/democoin/x/pow" ) -var _ sdk.Account = (*AppAccount)(nil) +var _ auth.Account = (*AppAccount)(nil) // Custom extensions for this application. This is just an example of // extending auth.BaseAccount with custom fields. @@ -26,8 +26,8 @@ func (acc AppAccount) GetName() string { return acc.Name } func (acc *AppAccount) SetName(name string) { acc.Name = name } // Get the AccountDecoder function for the custom AppAccount -func GetAccountDecoder(cdc *wire.Codec) sdk.AccountDecoder { - return func(accBytes []byte) (res sdk.Account, err error) { +func GetAccountDecoder(cdc *wire.Codec) auth.AccountDecoder { + return func(accBytes []byte) (res auth.Account, err error) { if len(accBytes) == 0 { return nil, sdk.ErrTxDecode("accBytes are empty") } diff --git a/examples/democoin/x/simplestake/keeper_test.go b/examples/democoin/x/simplestake/keeper_test.go index 302a2e58b6..515c19cc59 100644 --- a/examples/democoin/x/simplestake/keeper_test.go +++ b/examples/democoin/x/simplestake/keeper_test.go @@ -31,10 +31,13 @@ func setupMultiStore() (sdk.MultiStore, *sdk.KVStoreKey, *sdk.KVStoreKey) { } func TestKeeperGetSet(t *testing.T) { - ms, _, capKey := setupMultiStore() + ms, authKey, capKey := setupMultiStore() + cdc := wire.NewCodec() + auth.RegisterBaseAccount(cdc) ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) - stakeKeeper := NewKeeper(capKey, bank.NewKeeper(nil), DefaultCodespace) + accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) + stakeKeeper := NewKeeper(capKey, bank.NewKeeper(accountMapper), DefaultCodespace) addr := sdk.Address([]byte("some-address")) bi := stakeKeeper.getBondInfo(ctx, addr) diff --git a/examples/kvstore/tx.go b/examples/kvstore/tx.go index 12bce0736f..fa32d93bfb 100644 --- a/examples/kvstore/tx.go +++ b/examples/kvstore/tx.go @@ -4,6 +4,7 @@ import ( "bytes" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" ) // An sdk.Tx which is its own sdk.Msg. @@ -34,7 +35,7 @@ func (tx kvstoreTx) GetSigners() []sdk.Address { return nil } -func (tx kvstoreTx) GetSignatures() []sdk.StdSignature { +func (tx kvstoreTx) GetSignatures() []auth.StdSignature { return nil } diff --git a/mock/tx.go b/mock/tx.go index 81dea45718..bd437f2d08 100644 --- a/mock/tx.go +++ b/mock/tx.go @@ -6,6 +6,7 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" ) // An sdk.Tx which is its own sdk.Msg. @@ -47,7 +48,7 @@ func (tx kvstoreTx) GetSigners() []sdk.Address { return nil } -func (tx kvstoreTx) GetSignatures() []sdk.StdSignature { +func (tx kvstoreTx) GetSignatures() []auth.StdSignature { return nil } diff --git a/x/auth/account.go b/x/auth/account.go index 28366467aa..0ae72a8a64 100644 --- a/x/auth/account.go +++ b/x/auth/account.go @@ -1,7 +1,10 @@ package auth import ( + "errors" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" crypto "github.com/tendermint/go-crypto" ) @@ -23,3 +26,81 @@ type Account interface { // AccountDecoder unmarshals account bytes type AccountDecoder func(accountBytes []byte) (Account, error) + +//----------------------------------------------------------- +// BaseAccount + +var _ Account = (*BaseAccount)(nil) + +// BaseAccount - base account structure. +// Extend this by embedding this in your AppAccount. +// See the examples/basecoin/types/account.go for an example. +type BaseAccount struct { + Address sdk.Address `json:"address"` + Coins sdk.Coins `json:"coins"` + PubKey crypto.PubKey `json:"public_key"` + Sequence int64 `json:"sequence"` +} + +func NewBaseAccountWithAddress(addr sdk.Address) BaseAccount { + return BaseAccount{ + Address: addr, + } +} + +// Implements sdk.Account. +func (acc BaseAccount) GetAddress() sdk.Address { + return acc.Address +} + +// Implements sdk.Account. +func (acc *BaseAccount) SetAddress(addr sdk.Address) error { + if len(acc.Address) != 0 { + return errors.New("cannot override BaseAccount address") + } + acc.Address = addr + return nil +} + +// Implements sdk.Account. +func (acc BaseAccount) GetPubKey() crypto.PubKey { + return acc.PubKey +} + +// Implements sdk.Account. +func (acc *BaseAccount) SetPubKey(pubKey crypto.PubKey) error { + acc.PubKey = pubKey + return nil +} + +// Implements sdk.Account. +func (acc *BaseAccount) GetCoins() sdk.Coins { + return acc.Coins +} + +// Implements sdk.Account. +func (acc *BaseAccount) SetCoins(coins sdk.Coins) error { + acc.Coins = coins + return nil +} + +// Implements sdk.Account. +func (acc *BaseAccount) GetSequence() int64 { + return acc.Sequence +} + +// Implements sdk.Account. +func (acc *BaseAccount) SetSequence(seq int64) error { + acc.Sequence = seq + return nil +} + +//---------------------------------------- +// Wire + +// Most users shouldn't use this, but this comes handy for tests. +func RegisterBaseAccount(cdc *wire.Codec) { + cdc.RegisterInterface((*Account)(nil), nil) + cdc.RegisterConcrete(&BaseAccount{}, "cosmos-sdk/BaseAccount", nil) + wire.RegisterCrypto(cdc) +} diff --git a/x/baseaccount/baseaccount_test.go b/x/auth/account_test.go similarity index 99% rename from x/baseaccount/baseaccount_test.go rename to x/auth/account_test.go index ed1a322c2f..d3363e4fb0 100644 --- a/x/baseaccount/baseaccount_test.go +++ b/x/auth/account_test.go @@ -1,4 +1,4 @@ -package baseaccount +package auth import ( "testing" diff --git a/x/auth/ante.go b/x/auth/ante.go index d57c8558ef..c92a87641a 100644 --- a/x/auth/ante.go +++ b/x/auth/ante.go @@ -24,7 +24,7 @@ func NewAnteHandler(am AccountMapper) sdk.AnteHandler { // This AnteHandler requires Txs to be StdTxs stdTx, ok := tx.(StdTx) if !ok { - return ctx, sdk.ErrInternal("tx must be sdk.StdTx").Result(), true + return ctx, sdk.ErrInternal("tx must be StdTx").Result(), true } // Assert that there are signatures. diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index ec296b12be..fcde2b464b 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -17,8 +17,8 @@ func newTestMsg(addrs ...sdk.Address) *sdk.TestMsg { return sdk.NewTestMsg(addrs...) } -func newStdFee() sdk.StdFee { - return sdk.NewStdFee(100, +func newStdFee() StdFee { + return NewStdFee(100, sdk.Coin{"atom", 150}, ) } @@ -52,17 +52,17 @@ func checkInvalidTx(t *testing.T, anteHandler sdk.AnteHandler, ctx sdk.Context, assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, code), result.Code) } -func newTestTx(ctx sdk.Context, msg sdk.Msg, privs []crypto.PrivKey, seqs []int64, fee sdk.StdFee) sdk.Tx { - signBytes := sdk.StdSignBytes(ctx.ChainID(), seqs, fee, msg) +func newTestTx(ctx sdk.Context, msg sdk.Msg, privs []crypto.PrivKey, seqs []int64, fee StdFee) sdk.Tx { + signBytes := StdSignBytes(ctx.ChainID(), seqs, fee, msg) return newTestTxWithSignBytes(msg, privs, seqs, fee, signBytes) } -func newTestTxWithSignBytes(msg sdk.Msg, privs []crypto.PrivKey, seqs []int64, fee sdk.StdFee, signBytes []byte) sdk.Tx { - sigs := make([]sdk.StdSignature, len(privs)) +func newTestTxWithSignBytes(msg sdk.Msg, privs []crypto.PrivKey, seqs []int64, fee StdFee, signBytes []byte) sdk.Tx { + sigs := make([]StdSignature, len(privs)) for i, priv := range privs { - sigs[i] = sdk.StdSignature{PubKey: priv.PubKey(), Signature: priv.Sign(signBytes), Sequence: seqs[i]} + sigs[i] = StdSignature{PubKey: priv.PubKey(), Signature: priv.Sign(signBytes), Sequence: seqs[i]} } - tx := sdk.NewStdTx(msg, fee, sigs) + tx := NewStdTx(msg, fee, sigs) return tx } @@ -73,7 +73,7 @@ func TestAnteHandlerSigErrors(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper, BurnFeeHandler) + anteHandler := NewAnteHandler(mapper) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses @@ -114,7 +114,7 @@ func TestAnteHandlerSequences(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper, BurnFeeHandler) + anteHandler := NewAnteHandler(mapper) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses @@ -180,7 +180,7 @@ func TestAnteHandlerFees(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper, BurnFeeHandler) + anteHandler := NewAnteHandler(mapper) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses @@ -194,7 +194,7 @@ func TestAnteHandlerFees(t *testing.T) { var tx sdk.Tx msg := newTestMsg(addr1) privs, seqs := []crypto.PrivKey{priv1}, []int64{0} - fee := sdk.NewStdFee(100, + fee := NewStdFee(100, sdk.Coin{"atom", 150}, ) @@ -217,7 +217,7 @@ func TestAnteHandlerBadSignBytes(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper, BurnFeeHandler) + anteHandler := NewAnteHandler(mapper) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses @@ -252,7 +252,7 @@ func TestAnteHandlerBadSignBytes(t *testing.T) { cases := []struct { chainID string seqs []int64 - fee sdk.StdFee + fee StdFee msg sdk.Msg code sdk.CodeType }{ @@ -268,7 +268,7 @@ func TestAnteHandlerBadSignBytes(t *testing.T) { for _, cs := range cases { tx := newTestTxWithSignBytes( msg, privs, seqs, fee, - sdk.StdSignBytes(cs.chainID, cs.seqs, cs.fee, cs.msg), + StdSignBytes(cs.chainID, cs.seqs, cs.fee, cs.msg), ) checkInvalidTx(t, anteHandler, ctx, tx, cs.code) } @@ -292,7 +292,7 @@ func TestAnteHandlerSetPubKey(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper, BurnFeeHandler) + anteHandler := NewAnteHandler(mapper) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses @@ -322,7 +322,7 @@ func TestAnteHandlerSetPubKey(t *testing.T) { // test public key not found msg = newTestMsg(addr2) tx = newTestTx(ctx, msg, privs, seqs, fee) - sigs := tx.GetSignatures() + sigs := tx.(StdTx).GetSignatures() sigs[0].PubKey = nil checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeInvalidPubKey) diff --git a/x/auth/context_test.go b/x/auth/context_test.go index 89e318e0a1..e1db131679 100644 --- a/x/auth/context_test.go +++ b/x/auth/context_test.go @@ -26,7 +26,7 @@ func TestContextWithSigners(t *testing.T) { signers := GetSigners(ctx) assert.Equal(t, 0, len(signers)) - ctx2 := WithSigners(ctx, []sdk.Account{&acc1, &acc2}) + ctx2 := WithSigners(ctx, []Account{&acc1, &acc2}) // original context is unchanged signers = GetSigners(ctx) diff --git a/x/baseaccount/handler.go b/x/auth/handler.go similarity index 79% rename from x/baseaccount/handler.go rename to x/auth/handler.go index 46307c8818..764c6f7a28 100644 --- a/x/baseaccount/handler.go +++ b/x/auth/handler.go @@ -1,14 +1,13 @@ -package baseaccount +package auth import ( "reflect" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth" ) // NewHandler returns a handler for "baseaccount" type messages. -func NewHandler(am auth.AccountMapper) sdk.Handler { +func NewHandler(am AccountMapper) sdk.Handler { return func(ctx sdk.Context, msg sdk.Msg) sdk.Result { switch msg := msg.(type) { case MsgChangeKey: @@ -22,7 +21,7 @@ func NewHandler(am auth.AccountMapper) sdk.Handler { // Handle MsgChangeKey // Should be very expensive, because once this happens, an account is un-prunable -func handleMsgChangeKey(ctx sdk.Context, am auth.AccountMapper, msg MsgChangeKey) sdk.Result { +func handleMsgChangeKey(ctx sdk.Context, am AccountMapper, msg MsgChangeKey) sdk.Result { err := am.SetPubKey(ctx, msg.Address, msg.NewPubKey) if err != nil { diff --git a/x/baseaccount/msgs.go b/x/auth/msgs.go similarity index 91% rename from x/baseaccount/msgs.go rename to x/auth/msgs.go index f0319ac7fe..c449b837b1 100644 --- a/x/baseaccount/msgs.go +++ b/x/auth/msgs.go @@ -1,4 +1,4 @@ -package baseaccount +package auth import ( "encoding/json" @@ -21,7 +21,7 @@ func NewMsgChangeKey(addr sdk.Address, pubkey crypto.PubKey) MsgChangeKey { } // Implements Msg. -func (msg MsgChangeKey) Type() string { return "baseaccount" } +func (msg MsgChangeKey) Type() string { return "auth" } // Implements Msg. func (msg MsgChangeKey) ValidateBasic() sdk.Error { diff --git a/x/baseaccount/msgs_test.go b/x/auth/msgs_test.go similarity index 97% rename from x/baseaccount/msgs_test.go rename to x/auth/msgs_test.go index 46797fa0d8..30c98b073b 100644 --- a/x/baseaccount/msgs_test.go +++ b/x/auth/msgs_test.go @@ -1,4 +1,4 @@ -package baseaccount +package auth import ( "testing" diff --git a/types/tx_msg_test.go b/x/auth/stdtx_test.go similarity index 70% rename from types/tx_msg_test.go rename to x/auth/stdtx_test.go index f72cdea26e..412b37c20d 100644 --- a/types/tx_msg_test.go +++ b/x/auth/stdtx_test.go @@ -1,4 +1,4 @@ -package types +package auth import ( "testing" @@ -6,18 +6,20 @@ import ( "github.com/stretchr/testify/assert" crypto "github.com/tendermint/go-crypto" + + sdk "github.com/cosmos/cosmos-sdk/types" ) -func newStdFee() StdFee { - return NewStdFee(100, - Coin{"atom", 150}, - ) -} +// func newStdFee() StdFee { +// return NewStdFee(100, +// Coin{"atom", 150}, +// ) +// } func TestStdTx(t *testing.T) { priv := crypto.GenPrivKeyEd25519() addr := priv.PubKey().Address() - msg := NewTestMsg(addr) + msg := sdk.NewTestMsg(addr) fee := newStdFee() sigs := []StdSignature{} diff --git a/x/auth/wire.go b/x/auth/wire.go new file mode 100644 index 0000000000..42b34b96d5 --- /dev/null +++ b/x/auth/wire.go @@ -0,0 +1,12 @@ +package auth + +import ( + "github.com/cosmos/cosmos-sdk/wire" +) + +// Register concrete types on wire codec for default AppAccount +func RegisterWire(cdc *wire.Codec) { + cdc.RegisterInterface((*Account)(nil), nil) + cdc.RegisterConcrete(&BaseAccount{}, "auth/Account", nil) + cdc.RegisterConcrete(MsgChangeKey{}, "auth/ChangeKey", nil) +} diff --git a/x/baseaccount/baseaccount.go b/x/baseaccount/baseaccount.go deleted file mode 100644 index 9701ac41dc..0000000000 --- a/x/baseaccount/baseaccount.go +++ /dev/null @@ -1,89 +0,0 @@ -package baseaccount - -import ( - "errors" - - crypto "github.com/tendermint/go-crypto" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/wire" - "github.com/cosmos/cosmos-sdk/x/auth" -) - -//----------------------------------------------------------- -// BaseAccount - -var _ auth.Account = (*BaseAccount)(nil) - -// BaseAccount - base account structure. -// Extend this by embedding this in your AppAccount. -// See the examples/basecoin/types/account.go for an example. -type BaseAccount struct { - Address sdk.Address `json:"address"` - Coins sdk.Coins `json:"coins"` - PubKey crypto.PubKey `json:"public_key"` - Sequence int64 `json:"sequence"` -} - -func NewBaseAccountWithAddress(addr sdk.Address) BaseAccount { - return BaseAccount{ - Address: addr, - } -} - -// Implements sdk.Account. -func (acc BaseAccount) GetAddress() sdk.Address { - return acc.Address -} - -// Implements sdk.Account. -func (acc *BaseAccount) SetAddress(addr sdk.Address) error { - if len(acc.Address) != 0 { - return errors.New("cannot override BaseAccount address") - } - acc.Address = addr - return nil -} - -// Implements sdk.Account. -func (acc BaseAccount) GetPubKey() crypto.PubKey { - return acc.PubKey -} - -// Implements sdk.Account. -func (acc *BaseAccount) SetPubKey(pubKey crypto.PubKey) error { - acc.PubKey = pubKey - return nil -} - -// Implements sdk.Account. -func (acc *BaseAccount) GetCoins() sdk.Coins { - return acc.Coins -} - -// Implements sdk.Account. -func (acc *BaseAccount) SetCoins(coins sdk.Coins) error { - acc.Coins = coins - return nil -} - -// Implements sdk.Account. -func (acc *BaseAccount) GetSequence() int64 { - return acc.Sequence -} - -// Implements sdk.Account. -func (acc *BaseAccount) SetSequence(seq int64) error { - acc.Sequence = seq - return nil -} - -//---------------------------------------- -// Wire - -// Most users shouldn't use this, but this comes handy for tests. -func RegisterBaseAccount(cdc *wire.Codec) { - cdc.RegisterInterface((*auth.Account)(nil), nil) - cdc.RegisterConcrete(&BaseAccount{}, "cosmos-sdk/BaseAccount", nil) - wire.RegisterCrypto(cdc) -} diff --git a/x/baseaccount/wire.go b/x/baseaccount/wire.go deleted file mode 100644 index 4c77d1c72c..0000000000 --- a/x/baseaccount/wire.go +++ /dev/null @@ -1,14 +0,0 @@ -package baseaccount - -import ( - "github.com/cosmos/cosmos-sdk/wire" - "github.com/cosmos/cosmos-sdk/x/auth" -) - -// Register concrete types on wire codec -func RegisterWire(cdc *wire.Codec) { - cdc.RegisterInterface((*auth.Account)(nil), nil) - cdc.RegisterConcrete(&BaseAccount{}, "baseaccount/BaseAccount", nil) - wire.RegisterCrypto(cdc) - cdc.RegisterConcrete(MsgChangeKey{}, "baseaccount/changekey", nil) -} diff --git a/x/ibc/ibc_test.go b/x/ibc/ibc_test.go index 60cc59bad9..e13df4f8dd 100644 --- a/x/ibc/ibc_test.go +++ b/x/ibc/ibc_test.go @@ -6,7 +6,7 @@ import ( "github.com/stretchr/testify/assert" abci "github.com/tendermint/abci/types" - "github.com/tendermint/go-crypto" + crypto "github.com/tendermint/go-crypto" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" @@ -49,7 +49,7 @@ func makeCodec() *wire.Codec { cdc.RegisterConcrete(IBCReceiveMsg{}, "test/ibc/IBCReceiveMsg", nil) // Register AppAccount - cdc.RegisterInterface((*sdk.Account)(nil), nil) + cdc.RegisterInterface((*auth.Account)(nil), nil) cdc.RegisterConcrete(&auth.BaseAccount{}, "test/ibc/Account", nil) wire.RegisterCrypto(cdc) diff --git a/x/stake/test_common.go b/x/stake/test_common.go index e75faaf01a..b7a5152c09 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -16,7 +16,6 @@ import ( "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/baseaccount" ) // dummy addresses used for testing @@ -74,7 +73,7 @@ func makeTestCodec() *wire.Codec { // Register AppAccount cdc.RegisterInterface((*auth.Account)(nil), nil) - cdc.RegisterConcrete(&baseaccount.BaseAccount{}, "test/stake/Account", nil) + cdc.RegisterConcrete(&auth.BaseAccount{}, "test/stake/Account", nil) wire.RegisterCrypto(cdc) return cdc @@ -107,9 +106,9 @@ func createTestInput(t *testing.T, isCheckTx bool, initCoins int64) (sdk.Context ctx := sdk.NewContext(ms, abci.Header{ChainID: "foochainid"}, isCheckTx, nil, log.NewNopLogger()) cdc := makeTestCodec() accountMapper := auth.NewAccountMapper( - cdc, // amino codec - keyAcc, // target store - &baseaccount.BaseAccount{}, // prototype + cdc, // amino codec + keyAcc, // target store + &auth.BaseAccount{}, // prototype ) ck := bank.NewKeeper(accountMapper) keeper := NewKeeper(cdc, keyStake, ck, DefaultCodespace) From 157720836225e9d67b02edc1ee742d4c533a4402 Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Thu, 24 May 2018 14:03:22 -0300 Subject: [PATCH 017/548] fix typos --- examples/examples.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/examples.md b/examples/examples.md index 7d8665ca62..55db606c4c 100644 --- a/examples/examples.md +++ b/examples/examples.md @@ -40,7 +40,7 @@ basecoind version They should read something like `0.17.1-5d18d5f`, but the versions will be constantly updating so don't worry if your version is higher that 0.17.1. That's a good thing. -Note that you can always check help in the terminal by running `basecli -h` or `basecoind -h`. It is good to check these out if you are stuck, because updates to the code base might slighty change the commands, and you might find the correct command in there. +Note that you can always check help in the terminal by running `basecli -h` or `basecoind -h`. It is good to check these out if you are stuck, because updates to the code base might slightly change the commands, and you might find the correct command in there. Let's start by initializing the basecoind daemon. Run the command @@ -131,7 +131,7 @@ Flag Descriptions: - `name` is the name you gave your key - `mycoin` is the name of the token for this basecoin demo, initialized in the genesis.json file - `sequence` is a tally of how many transactions have been made by this account. Since this is the first tx on this account, it is 0 -- `chain-id` is the unique ID that helps tendermint identify which network to connect to. You can find it in the terminal output from the gaiad daemon in the header block , or in the genesis.json file at `~/.basecoind/config/gensis.json` +- `chain-id` is the unique ID that helps tendermint identify which network to connect to. You can find it in the terminal output from the gaiad daemon in the header block , or in the genesis.json file at `~/.basecoind/config/genesis.json` Now if we check bobs account, it should have `10000 mycoin`. You can do so by running : @@ -161,7 +161,7 @@ Notice that the sequence is now 1, since we have already recorded bobs 1st trans basecli tx ``` -It will return the details of the transaction hash, such as how many coins were send and to which address, and on what block it occured. +It will return the details of the transaction hash, such as how many coins were send and to which address, and on what block it occurred. That is the basic implementation of basecoin! From efd1a3ac44f09dcc8e8622951080948424efebac Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Mon, 14 May 2018 16:03:03 -0700 Subject: [PATCH 018/548] Typo fix --- types/tx_msg.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/types/tx_msg.go b/types/tx_msg.go index e17d152a5f..9e9a369ffb 100644 --- a/types/tx_msg.go +++ b/types/tx_msg.go @@ -152,7 +152,7 @@ func (msg StdSignMsg) Bytes() []byte { //__________________________________________________________ -// TxDeocder unmarshals transaction bytes +// TxDecoder unmarshals transaction bytes type TxDecoder func(txBytes []byte) (Tx, Error) //__________________________________________________________ From ad3c63dded9e5a4aa77ce06bfb856f53efcf13f6 Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Mon, 14 May 2018 16:43:51 -0700 Subject: [PATCH 019/548] Added POST /stake/bondunbond endpoint --- x/stake/client/rest/query.go | 7 +-- x/stake/client/rest/rest.go | 14 +++++ x/stake/client/rest/tx.go | 117 +++++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 4 deletions(-) create mode 100644 x/stake/client/rest/rest.go create mode 100644 x/stake/client/rest/tx.go diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index 6093902934..4a4b83901e 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -14,13 +14,12 @@ import ( "github.com/cosmos/cosmos-sdk/x/stake" ) -// RegisterRoutes - Central function to define routes that get registered by the main application -func RegisterRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec, kb keys.Keybase) { - r.HandleFunc("/stake/{delegator}/bonding_status/{validator}", BondingStatusHandlerFn("stake", cdc, kb, ctx)).Methods("GET") +func registerQueryRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec, kb keys.Keybase) { + r.HandleFunc("/stake/{delegator}/bonding_status/{candidate}", bondingStatusHandlerFn("stake", cdc, kb, ctx)).Methods("GET") } // BondingStatusHandlerFn - http request handler to query delegator bonding status -func BondingStatusHandlerFn(storeName string, cdc *wire.Codec, kb keys.Keybase, ctx context.CoreContext) http.HandlerFunc { +func bondingStatusHandlerFn(storeName string, cdc *wire.Codec, kb keys.Keybase, ctx context.CoreContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // read parameters vars := mux.Vars(r) diff --git a/x/stake/client/rest/rest.go b/x/stake/client/rest/rest.go new file mode 100644 index 0000000000..32d56f42c5 --- /dev/null +++ b/x/stake/client/rest/rest.go @@ -0,0 +1,14 @@ +package rest + +import ( + "github.com/gorilla/mux" + "github.com/tendermint/go-crypto/keys" + + "github.com/cosmos/cosmos-sdk/client/context" + "github.com/cosmos/cosmos-sdk/wire" +) + +func RegisterRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec, kb keys.Keybase) { + registerQueryRoutes(ctx, r, cdc, kb) + registerTxRoutes(ctx, r, cdc, kb) +} diff --git a/x/stake/client/rest/tx.go b/x/stake/client/rest/tx.go new file mode 100644 index 0000000000..75e0f8d75d --- /dev/null +++ b/x/stake/client/rest/tx.go @@ -0,0 +1,117 @@ +package rest + +import ( + "encoding/json" + "io/ioutil" + "net/http" + + "github.com/gorilla/mux" + "github.com/tendermint/go-crypto/keys" + ctypes "github.com/tendermint/tendermint/rpc/core/types" + + "github.com/cosmos/cosmos-sdk/client/context" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/stake" +) + +func registerTxRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec, kb keys.Keybase) { + r.HandleFunc("/stake/bondunbond", bondUnbondRequestHandlerFn(cdc, kb, ctx)).Methods("POST") +} + +type bond struct { + Amount sdk.Coin `json:"amount"` + Candidate sdk.Address `json:"candidate"` +} + +type unbond struct { + Shares string `json:"shares"` + Candidate sdk.Address `json:"candidate"` +} + +type bondUnbondBody struct { + // fees is not used currently + // Fees sdk.Coin `json="fees"` + LocalAccountName string `json:"name"` + Password string `json:"password"` + ChainID string `json:"chain_id"` + Sequence int64 `json:"sequence"` + Bond []bond `json:"bond"` + Unbond []unbond `json:"unbond"` +} + +func bondUnbondRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx context.CoreContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var m bondUnbondBody + body, err := ioutil.ReadAll(r.Body) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(err.Error())) + return + } + err = json.Unmarshal(body, &m) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(err.Error())) + return + } + + info, err := kb.Get(m.LocalAccountName) + if err != nil { + w.WriteHeader(http.StatusUnauthorized) + w.Write([]byte(err.Error())) + return + } + + // build messages + messages := make([]sdk.Msg, 0, len(m.Bond)+len(m.Unbond)) + for _, bond := range m.Bond { + msg := stake.NewMsgDelegate(info.Address(), bond.Candidate, bond.Amount) + messages = append(messages, msg) + } + for _, unbond := range m.Unbond { + msg := stake.NewMsgUnbond(info.Address(), unbond.Candidate, unbond.Shares) + messages = append(messages, msg) + } + + // sign messages + signedTxs := make([][]byte, 0, len(messages)) + for _, msg := range messages { + // increment sequence for each message + ctx = ctx.WithSequence(m.Sequence) + m.Sequence++ + + txBytes, err := ctx.SignAndBuild(m.LocalAccountName, m.Password, msg, cdc) + if err != nil { + w.WriteHeader(http.StatusUnauthorized) + w.Write([]byte(err.Error())) + return + } + + signedTxs = append(signedTxs, txBytes) + } + + // send + // XXX the operation might not be atomic if a tx fails + // should we have a sdk.MultiMsg type to make sending atomic? + results := make([]*ctypes.ResultBroadcastTxCommit, 0, len(signedTxs)) + for _, txBytes := range signedTxs { + res, err := ctx.BroadcastTx(txBytes) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(err.Error())) + return + } + results = append(results, res) + } + + output, err := json.MarshalIndent(results, "", " ") + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(err.Error())) + return + } + + w.Write(output) + } +} From 660e4e9080580e7a7b7880c5832db330b37c70e0 Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Mon, 14 May 2018 16:44:07 -0700 Subject: [PATCH 020/548] Fixed json field names in stake msg types --- x/stake/msg.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/x/stake/msg.go b/x/stake/msg.go index 0adff84d9b..4bfc496dee 100644 --- a/x/stake/msg.go +++ b/x/stake/msg.go @@ -117,8 +117,8 @@ func (msg MsgEditCandidacy) ValidateBasic() sdk.Error { // MsgDelegate - struct for bonding transactions type MsgDelegate struct { - DelegatorAddr sdk.Address `json:"address"` - ValidatorAddr sdk.Address `json:"address"` + DelegatorAddr sdk.Address `json:"delegator"` + ValidatorAddr sdk.Address `json:"candidate"` Bond sdk.Coin `json:"bond"` } @@ -164,8 +164,8 @@ func (msg MsgDelegate) ValidateBasic() sdk.Error { // MsgUnbond - struct for unbonding transactions type MsgUnbond struct { - DelegatorAddr sdk.Address `json:"address"` - ValidatorAddr sdk.Address `json:"address"` + DelegatorAddr sdk.Address `json:"delegator"` + ValidatorAddr sdk.Address `json:"candidate"` Shares string `json:"shares"` } From 5b81938e576ddd17e1dfd3fe5806b0686c906081 Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Mon, 14 May 2018 16:49:26 -0700 Subject: [PATCH 021/548] Enable stake REST routes --- client/lcd/root.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/lcd/root.go b/client/lcd/root.go index a7be5079bf..df8be897c3 100644 --- a/client/lcd/root.go +++ b/client/lcd/root.go @@ -22,6 +22,7 @@ import ( auth "github.com/cosmos/cosmos-sdk/x/auth/client/rest" bank "github.com/cosmos/cosmos-sdk/x/bank/client/rest" ibc "github.com/cosmos/cosmos-sdk/x/ibc/client/rest" + stake "github.com/cosmos/cosmos-sdk/x/stake/client/rest" ) const ( @@ -83,5 +84,6 @@ func createHandler(cdc *wire.Codec) http.Handler { auth.RegisterRoutes(ctx, r, cdc, "acc") bank.RegisterRoutes(ctx, r, cdc, kb) ibc.RegisterRoutes(ctx, r, cdc, kb) + stake.RegisterRoutes(ctx, r, cdc, kb) return r } From 8e104030d5578956cc462022305f4043f88eaca8 Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Mon, 14 May 2018 17:01:51 -0700 Subject: [PATCH 022/548] Fixed stake query REST handler --- x/stake/client/rest/query.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index 4a4b83901e..700a65f2b9 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -24,7 +24,7 @@ func bondingStatusHandlerFn(storeName string, cdc *wire.Codec, kb keys.Keybase, // read parameters vars := mux.Vars(r) delegator := vars["delegator"] - validator := vars["validator"] + candidate := vars["candidate"] bz, err := hex.DecodeString(delegator) if err != nil { @@ -34,7 +34,7 @@ func bondingStatusHandlerFn(storeName string, cdc *wire.Codec, kb keys.Keybase, } delegatorAddr := sdk.Address(bz) - bz, err = hex.DecodeString(validator) + bz, err = hex.DecodeString(candidate) if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) From 39995fe0659caecba754bb27c2a420db0905c5eb Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Mon, 14 May 2018 17:43:46 -0700 Subject: [PATCH 023/548] Added (non-working) stake REST tests --- client/lcd/lcd_test.go | 235 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 221 insertions(+), 14 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 66a8a4085f..d78e7655c8 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -32,15 +32,19 @@ import ( client "github.com/cosmos/cosmos-sdk/client" keys "github.com/cosmos/cosmos-sdk/client/keys" bapp "github.com/cosmos/cosmos-sdk/examples/basecoin/app" - btypes "github.com/cosmos/cosmos-sdk/examples/basecoin/types" tests "github.com/cosmos/cosmos-sdk/tests" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/stake" ) var ( coinDenom = "mycoin" coinAmount = int64(10000000) + stakeDenom = "steak" + candidateAddr1 = "127A12E4489FEB5A74201426B0CB538732FB4C8E" + candidateAddr2 = "C2893CA8EBDDD1C5F938CAB3BAEFE53A2E266698" + // XXX bad globals name = "test" password = "0123456789" @@ -305,6 +309,56 @@ func TestTxs(t *testing.T) { // assert.NotEqual(t, "[]", body) } +func TestBond(t *testing.T) { + + acc := getAccount(t, sendAddr) + initialBalance := acc.GetCoins() + + // create bond TX + resultTx := doBond(t, port, seed) + tests.WaitForHeight(resultTx.Height+1, port) + + // check if tx was commited + assert.Equal(t, uint32(0), resultTx.CheckTx.Code) + assert.Equal(t, uint32(0), resultTx.DeliverTx.Code) + + // query sender + acc = getAccount(t, sendAddr) + coins := acc.GetCoins() + mycoins := coins[0] + assert.Equal(t, coinDenom, mycoins.Denom) + assert.Equal(t, initialBalance[0].Amount-1, mycoins.Amount) + + // query candidate + bond := getDelegatorBond(t, sendAddr, candidateAddr1) + assert.Equal(t, "foo", bond.Shares.String()) +} + +func TestUnbond(t *testing.T) { + + acc := getAccount(t, sendAddr) + initialBalance := acc.GetCoins() + + // create unbond TX + resultTx := doUnbond(t, port, seed) + tests.WaitForHeight(resultTx.Height+1, port) + + // check if tx was commited + assert.Equal(t, uint32(0), resultTx.CheckTx.Code) + assert.Equal(t, uint32(0), resultTx.DeliverTx.Code) + + // query sender + acc = getAccount(t, sendAddr) + coins := acc.GetCoins() + mycoins := coins[0] + assert.Equal(t, coinDenom, mycoins.Denom) + assert.Equal(t, initialBalance[0].Amount, mycoins.Amount) + + // query candidate + bond := getDelegatorBond(t, sendAddr, candidateAddr1) + assert.Equal(t, "foo", bond.Shares.String()) +} + //__________________________________________________________ // helpers @@ -347,21 +401,74 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { return nil, nil, err } - coins := sdk.Coins{{coinDenom, coinAmount}} - appState := map[string]interface{}{ - "accounts": []*btypes.GenesisAccount{ + genDoc.AppStateJSON = []byte(` + { + "accounts": [ { - Name: "tester", - Address: pubKey.Address(), - Coins: coins, - }, - }, + "name": "tester", + "address": "` + pubKey.Address().String() + `", + "coins": [{"denom": "` + coinDenom + `", "amount": 100000}] + } + ], + "stake": { + "pool": { + "total_supply": 1650, + "bonded_shares": "1100", + "unbonded_shares": "0", + "bonded_pool": 1100, + "unbonded_pool": 0, + "inflation_last_time": 0, + "inflation": "7/100" + }, + "params": { + "inflation_rate_change": "13/100", + "inflation_max": "1/5", + "inflation_min": "7/100", + "goal_bonded": "67/100", + "max_validators": 100, + "bond_denom": "` + stakeDenom + `" + }, + "candidates": [ + { + "status": 1, + "owner": "` + candidateAddr1 + `", + "pub_key": { + "type": "AC26791624DE60", + "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" + }, + "assets": "100", + "liabilities": "0", + "description": { + "moniker": "adrian", + "identity": "", + "website": "", + "details": "" + }, + "validator_bond_height": 0, + "validator_bond_counter": 0 + }, + { + "status": 1, + "owner": "` + candidateAddr2 + `", + "pub_key": { + "type": "AC26791624DE60", + "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" + }, + "assets": "100", + "liabilities": "0", + "description": { + "moniker": "yourname", + "identity": "", + "website": "", + "details": "" + }, + "validator_bond_height": 0, + "validator_bond_counter": 0 + } + ] + } } - stateBytes, err := json.Marshal(appState) - if err != nil { - return nil, nil, err - } - genDoc.AppStateJSON = stateBytes + `) // LCD listen address port = fmt.Sprintf("%d", 17377) // XXX @@ -490,3 +597,103 @@ func doIBCTransfer(t *testing.T, port, seed string) (resultTx ctypes.ResultBroad return resultTx } + +func getDelegatorBond(t *testing.T, delegatorAddr, candidateAddr string) stake.DelegatorBond { + // get the account to get the sequence + res, body := request(t, port, "GET", "/stake/"+delegatorAddr+"/bonding_info/"+candidateAddr, nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + var bond stake.DelegatorBond + err := cdc.UnmarshalJSON([]byte(body), &bond) + require.Nil(t, err) + return bond +} + +func doBond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxCommit) { + // get the account to get the sequence + acc := getAccount(t, sendAddr) + sequence := acc.GetSequence() + + // send + jsonStr := []byte(fmt.Sprintf(`{ + "name": "%s", + "password": "%s", + "sequence": %d, + "bond": [ + { + "candidate": "%s", + "amount": { "denom": "%s", "amount": 100 } + } + ], + "unbond": [] + }`, name, password, sequence, candidateAddr1, stakeDenom)) + res, body := request(t, port, "POST", "/stake/bondunbond", jsonStr) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + err := cdc.UnmarshalJSON([]byte(body), &resultTx) + require.Nil(t, err) + + return +} + +func doUnbond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxCommit) { + // get the account to get the sequence + acc := getAccount(t, sendAddr) + sequence := acc.GetSequence() + + // send + jsonStr := []byte(fmt.Sprintf(`{ + "name": "%s", + "password": "%s", + "sequence": %d, + "bond": [], + "unbond": [ + { + "candidate": "%s", + "shares": "1" + } + ] + }`, name, password, sequence, candidateAddr1, stakeDenom)) + res, body := request(t, port, "POST", "/stake/bondunbond", jsonStr) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + err := cdc.UnmarshalJSON([]byte(body), &resultTx) + require.Nil(t, err) + + return +} + +func doMultiBond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxCommit) { + // get the account to get the sequence + acc := getAccount(t, sendAddr) + sequence := acc.GetSequence() + + // send + jsonStr := []byte(fmt.Sprintf(`{ + "name": "%s", + "password": "%s", + "sequence": %d, + "bond": [ + { + "candidate": "%s", + "amount": { "denom": "%s", "amount": 1 } + }, + { + "candidate": "%s", + "amount": { "denom": "%s", "amount": 1 } + }, + ], + "unbond": [ + { + "candidate": "%s", + "shares": "1" + } + ] + }`, name, password, sequence, candidateAddr1, stakeDenom, candidateAddr2, stakeDenom, candidateAddr1)) + res, body := request(t, port, "POST", "/stake/bondunbond", jsonStr) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + err := cdc.UnmarshalJSON([]byte(body), &resultTx) + require.Nil(t, err) + + return +} From 98b9040c633d69a5a905de5d4966a9817bff8cce Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Fri, 18 May 2018 17:05:15 +0900 Subject: [PATCH 024/548] Use actual types for genesis doc instead of unmarshaling JSON --- client/lcd/lcd_test.go | 134 ++++++++++++++++++++--------------------- 1 file changed, 66 insertions(+), 68 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index d78e7655c8..9406d7ce9c 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -16,6 +16,7 @@ import ( "github.com/stretchr/testify/require" abci "github.com/tendermint/abci/types" + crypto "github.com/tendermint/go-crypto" cryptoKeys "github.com/tendermint/go-crypto/keys" tmcfg "github.com/tendermint/tendermint/config" nm "github.com/tendermint/tendermint/node" @@ -32,6 +33,7 @@ import ( client "github.com/cosmos/cosmos-sdk/client" keys "github.com/cosmos/cosmos-sdk/client/keys" bapp "github.com/cosmos/cosmos-sdk/examples/basecoin/app" + btypes "github.com/cosmos/cosmos-sdk/examples/basecoin/types" tests "github.com/cosmos/cosmos-sdk/tests" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/stake" @@ -387,6 +389,8 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { config.Consensus.TimeoutCommit = 1000 config.Consensus.SkipTimeoutCommit = false + fmt.Println("test") + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) // logger = log.NewFilter(logger, log.AllowError()) privValidatorFile := config.PrivValidatorFile() @@ -401,74 +405,68 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { return nil, nil, err } - genDoc.AppStateJSON = []byte(` - { - "accounts": [ - { - "name": "tester", - "address": "` + pubKey.Address().String() + `", - "coins": [{"denom": "` + coinDenom + `", "amount": 100000}] - } - ], - "stake": { - "pool": { - "total_supply": 1650, - "bonded_shares": "1100", - "unbonded_shares": "0", - "bonded_pool": 1100, - "unbonded_pool": 0, - "inflation_last_time": 0, - "inflation": "7/100" - }, - "params": { - "inflation_rate_change": "13/100", - "inflation_max": "1/5", - "inflation_min": "7/100", - "goal_bonded": "67/100", - "max_validators": 100, - "bond_denom": "` + stakeDenom + `" - }, - "candidates": [ - { - "status": 1, - "owner": "` + candidateAddr1 + `", - "pub_key": { - "type": "AC26791624DE60", - "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" - }, - "assets": "100", - "liabilities": "0", - "description": { - "moniker": "adrian", - "identity": "", - "website": "", - "details": "" - }, - "validator_bond_height": 0, - "validator_bond_counter": 0 - }, - { - "status": 1, - "owner": "` + candidateAddr2 + `", - "pub_key": { - "type": "AC26791624DE60", - "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" - }, - "assets": "100", - "liabilities": "0", - "description": { - "moniker": "yourname", - "identity": "", - "website": "", - "details": "" - }, - "validator_bond_height": 0, - "validator_bond_counter": 0 - } - ] - } + genDoc.Validators = []tmtypes.GenesisValidator{ + tmtypes.GenesisValidator{ + PubKey: crypto.GenPrivKeyEd25519().PubKey(), + Power: 100, + Name: "val1", + }, + tmtypes.GenesisValidator{ + PubKey: crypto.GenPrivKeyEd25519().PubKey(), + Power: 100, + Name: "val2", + }, } - `) + + coins := sdk.Coins{{coinDenom, coinAmount}} + appState := map[string]interface{}{ + "accounts": []*btypes.GenesisAccount{ + { + Name: "tester", + Address: pubKey.Address(), + Coins: coins, + }, + }, + "stake": stake.GenesisState{ + Pool: stake.Pool{ + TotalSupply: 1650, + BondedShares: sdk.NewRat(200, 1), + UnbondedShares: sdk.ZeroRat(), + BondedPool: 200, + UnbondedPool: 0, + InflationLastTime: 0, + Inflation: sdk.NewRat(7, 100), + }, + Params: stake.Params{ + InflationRateChange: sdk.NewRat(13, 100), + InflationMax: sdk.NewRat(1, 5), + InflationMin: sdk.NewRat(7, 100), + GoalBonded: sdk.NewRat(67, 100), + MaxValidators: 100, + BondDenom: stakeDenom, + }, + Candidates: []stake.Candidate{ + { + Status: 1, + Address: genDoc.Validators[0].PubKey.Address(), + PubKey: genDoc.Validators[0].PubKey, + Assets: sdk.NewRat(100, 1), + Liabilities: sdk.ZeroRat(), + Description: stake.Description{ + Moniker: "adrian", + }, + ValidatorBondHeight: 0, + ValidatorBondCounter: 0, + }, + }, + }, + } + + stateBytes, err := json.Marshal(appState) + if err != nil { + return nil, nil, err + } + genDoc.AppStateJSON = stateBytes // LCD listen address port = fmt.Sprintf("%d", 17377) // XXX @@ -652,7 +650,7 @@ func doUnbond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastT "shares": "1" } ] - }`, name, password, sequence, candidateAddr1, stakeDenom)) + }`, name, password, sequence, candidateAddr1)) res, body := request(t, port, "POST", "/stake/bondunbond", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) From 10056d36d1b761093c79934e134e47c77313870c Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Sun, 20 May 2018 14:09:52 +0900 Subject: [PATCH 025/548] Set generated candidate addresses in lcd tests --- client/lcd/lcd_test.go | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 9406d7ce9c..263d75c25e 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -2,6 +2,7 @@ package lcd import ( "bytes" + "encoding/hex" "encoding/json" "fmt" "io/ioutil" @@ -44,8 +45,8 @@ var ( coinAmount = int64(10000000) stakeDenom = "steak" - candidateAddr1 = "127A12E4489FEB5A74201426B0CB538732FB4C8E" - candidateAddr2 = "C2893CA8EBDDD1C5F938CAB3BAEFE53A2E266698" + candidateAddr1 = "" + candidateAddr2 = "" // XXX bad globals name = "test" @@ -405,18 +406,20 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { return nil, nil, err } - genDoc.Validators = []tmtypes.GenesisValidator{ + genDoc.Validators = append(genDoc.Validators, tmtypes.GenesisValidator{ PubKey: crypto.GenPrivKeyEd25519().PubKey(), - Power: 100, + Power: 1, Name: "val1", }, tmtypes.GenesisValidator{ PubKey: crypto.GenPrivKeyEd25519().PubKey(), - Power: 100, + Power: 1, Name: "val2", }, - } + ) + candidateAddr1 = hex.EncodeToString(genDoc.Validators[0].PubKey.Address()) + candidateAddr2 = hex.EncodeToString(genDoc.Validators[1].PubKey.Address()) coins := sdk.Coins{{coinDenom, coinAmount}} appState := map[string]interface{}{ @@ -453,7 +456,19 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { Assets: sdk.NewRat(100, 1), Liabilities: sdk.ZeroRat(), Description: stake.Description{ - Moniker: "adrian", + Moniker: "validator1", + }, + ValidatorBondHeight: 0, + ValidatorBondCounter: 0, + }, + { + Status: 1, + Address: genDoc.Validators[1].PubKey.Address(), + PubKey: genDoc.Validators[1].PubKey, + Assets: sdk.NewRat(100, 1), + Liabilities: sdk.ZeroRat(), + Description: stake.Description{ + Moniker: "validator2", }, ValidatorBondHeight: 0, ValidatorBondCounter: 0, From 074dfd79200c4bb8e0e6a2506ceedc790813df30 Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Sun, 20 May 2018 14:43:53 +0900 Subject: [PATCH 026/548] Added candidate list REST query handler --- x/stake/client/rest/query.go | 45 ++++++++++++++++++++++++++++++++---- x/stake/client/rest/rest.go | 3 ++- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index 700a65f2b9..576bad3cc9 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -6,7 +6,6 @@ import ( "net/http" "github.com/gorilla/mux" - "github.com/tendermint/go-crypto/keys" "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" @@ -14,12 +13,13 @@ import ( "github.com/cosmos/cosmos-sdk/x/stake" ) -func registerQueryRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec, kb keys.Keybase) { - r.HandleFunc("/stake/{delegator}/bonding_status/{candidate}", bondingStatusHandlerFn("stake", cdc, kb, ctx)).Methods("GET") +func registerQueryRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec) { + r.HandleFunc("/stake/{delegator}/bonding_status/{candidate}", bondingStatusHandlerFn("stake", cdc, ctx)).Methods("GET") + r.HandleFunc("/stake/candidates", candidatesHandlerFn("stake", cdc, ctx)).Methods("GET") } -// BondingStatusHandlerFn - http request handler to query delegator bonding status -func bondingStatusHandlerFn(storeName string, cdc *wire.Codec, kb keys.Keybase, ctx context.CoreContext) http.HandlerFunc { +// bondingStatusHandlerFn - http request handler to query delegator bonding status +func bondingStatusHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // read parameters vars := mux.Vars(r) @@ -75,3 +75,38 @@ func bondingStatusHandlerFn(storeName string, cdc *wire.Codec, kb keys.Keybase, w.Write(output) } } + +// candidatesHandlerFn - http request handler to query list of candidates +func candidatesHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + res, err := ctx.Query(stake.CandidatesKey, storeName) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf("Couldn't query bond. Error: %s", err.Error()))) + return + } + + // the query will return empty if there is no data for this bond + if len(res) == 0 { + w.WriteHeader(http.StatusNoContent) + return + } + + var candidates []stake.Candidate + err = cdc.UnmarshalBinary(res, &candidates) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf("Couldn't decode candidates. Error: %s", err.Error()))) + return + } + + output, err := cdc.MarshalJSON(candidates) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(err.Error())) + return + } + + w.Write(output) + } +} diff --git a/x/stake/client/rest/rest.go b/x/stake/client/rest/rest.go index 32d56f42c5..1f3a2957d5 100644 --- a/x/stake/client/rest/rest.go +++ b/x/stake/client/rest/rest.go @@ -8,7 +8,8 @@ import ( "github.com/cosmos/cosmos-sdk/wire" ) +// RegisterRoutes registers staking-related REST handlers to a router func RegisterRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec, kb keys.Keybase) { - registerQueryRoutes(ctx, r, cdc, kb) + registerQueryRoutes(ctx, r, cdc) registerTxRoutes(ctx, r, cdc, kb) } From 2c46662141a072480f60db9492583656dd488d7d Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Sun, 20 May 2018 14:59:29 +0900 Subject: [PATCH 027/548] Added LCD test for candidates query --- client/lcd/lcd_test.go | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 263d75c25e..5ed6ddcc9c 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -312,6 +312,13 @@ func TestTxs(t *testing.T) { // assert.NotEqual(t, "[]", body) } +func TestCandidates(t *testing.T) { + candidates := getCandidates(t) + assert.Equal(t, len(candidates), 2) + assert.Equal(t, hex.EncodeToString(candidates[0].Address), candidateAddr1) + assert.Equal(t, hex.EncodeToString(candidates[1].Address), candidateAddr2) +} + func TestBond(t *testing.T) { acc := getAccount(t, sendAddr) @@ -390,10 +397,8 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { config.Consensus.TimeoutCommit = 1000 config.Consensus.SkipTimeoutCommit = false - fmt.Println("test") - logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) - // logger = log.NewFilter(logger, log.AllowError()) + logger = log.NewFilter(logger, log.AllowError()) privValidatorFile := config.PrivValidatorFile() privVal := pvm.LoadOrGenFilePV(privValidatorFile) db := dbm.NewMemDB() @@ -418,8 +423,8 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { Name: "val2", }, ) - candidateAddr1 = hex.EncodeToString(genDoc.Validators[0].PubKey.Address()) - candidateAddr2 = hex.EncodeToString(genDoc.Validators[1].PubKey.Address()) + candidateAddr1 = hex.EncodeToString(genDoc.Validators[1].PubKey.Address()) + candidateAddr2 = hex.EncodeToString(genDoc.Validators[2].PubKey.Address()) coins := sdk.Coins{{coinDenom, coinAmount}} appState := map[string]interface{}{ @@ -451,8 +456,8 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { Candidates: []stake.Candidate{ { Status: 1, - Address: genDoc.Validators[0].PubKey.Address(), - PubKey: genDoc.Validators[0].PubKey, + Address: genDoc.Validators[1].PubKey.Address(), + PubKey: genDoc.Validators[1].PubKey, Assets: sdk.NewRat(100, 1), Liabilities: sdk.ZeroRat(), Description: stake.Description{ @@ -463,8 +468,8 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { }, { Status: 1, - Address: genDoc.Validators[1].PubKey.Address(), - PubKey: genDoc.Validators[1].PubKey, + Address: genDoc.Validators[2].PubKey.Address(), + PubKey: genDoc.Validators[2].PubKey, Assets: sdk.NewRat(100, 1), Liabilities: sdk.ZeroRat(), Description: stake.Description{ @@ -621,6 +626,16 @@ func getDelegatorBond(t *testing.T, delegatorAddr, candidateAddr string) stake.D return bond } +func getCandidates(t *testing.T) []stake.Candidate { + // get the account to get the sequence + res, body := request(t, port, "GET", "/stake/candidates", nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + var candidates []stake.Candidate + err := cdc.UnmarshalJSON([]byte(body), &candidates) + require.Nil(t, err) + return candidates +} + func doBond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxCommit) { // get the account to get the sequence acc := getAccount(t, sendAddr) From ae9a9eaaa3433e3ba890345984d34f5afca35937 Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Sun, 20 May 2018 15:16:07 +0900 Subject: [PATCH 028/548] Updated changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a9eeb71f3..89b7ec744b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ FEATURES * [stake] Creation of a validator/delegation generics in `/types` * [stake] Helper Description of the store in x/stake/store.md * [stake] removed use of caches in the stake keeper +* [stake] Added REST API BUG FIXES From cb107c738343274022f7a1778cbfdf825c78bcd8 Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Mon, 21 May 2018 10:46:09 +0900 Subject: [PATCH 029/548] Fixed LCD tests --- client/lcd/lcd_test.go | 83 ++++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 47 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 5ed6ddcc9c..157a386811 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -33,8 +33,7 @@ import ( client "github.com/cosmos/cosmos-sdk/client" keys "github.com/cosmos/cosmos-sdk/client/keys" - bapp "github.com/cosmos/cosmos-sdk/examples/basecoin/app" - btypes "github.com/cosmos/cosmos-sdk/examples/basecoin/types" + gapp "github.com/cosmos/cosmos-sdk/cmd/gaia/app" tests "github.com/cosmos/cosmos-sdk/tests" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/stake" @@ -321,9 +320,6 @@ func TestCandidates(t *testing.T) { func TestBond(t *testing.T) { - acc := getAccount(t, sendAddr) - initialBalance := acc.GetCoins() - // create bond TX resultTx := doBond(t, port, seed) tests.WaitForHeight(resultTx.Height+1, port) @@ -333,22 +329,17 @@ func TestBond(t *testing.T) { assert.Equal(t, uint32(0), resultTx.DeliverTx.Code) // query sender - acc = getAccount(t, sendAddr) + acc := getAccount(t, sendAddr) coins := acc.GetCoins() - mycoins := coins[0] - assert.Equal(t, coinDenom, mycoins.Denom) - assert.Equal(t, initialBalance[0].Amount-1, mycoins.Amount) + assert.Equal(t, int64(9999900), coins.AmountOf(stakeDenom)) // query candidate bond := getDelegatorBond(t, sendAddr, candidateAddr1) - assert.Equal(t, "foo", bond.Shares.String()) + assert.Equal(t, "100/1", bond.Shares.String()) } func TestUnbond(t *testing.T) { - acc := getAccount(t, sendAddr) - initialBalance := acc.GetCoins() - // create unbond TX resultTx := doUnbond(t, port, seed) tests.WaitForHeight(resultTx.Height+1, port) @@ -358,15 +349,13 @@ func TestUnbond(t *testing.T) { assert.Equal(t, uint32(0), resultTx.DeliverTx.Code) // query sender - acc = getAccount(t, sendAddr) + acc := getAccount(t, sendAddr) coins := acc.GetCoins() - mycoins := coins[0] - assert.Equal(t, coinDenom, mycoins.Denom) - assert.Equal(t, initialBalance[0].Amount, mycoins.Amount) + assert.Equal(t, int64(9999911), coins.AmountOf(stakeDenom)) // query candidate bond := getDelegatorBond(t, sendAddr, candidateAddr1) - assert.Equal(t, "foo", bond.Shares.String()) + assert.Equal(t, "99/1", bond.Shares.String()) } //__________________________________________________________ @@ -398,12 +387,12 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { config.Consensus.SkipTimeoutCommit = false logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) - logger = log.NewFilter(logger, log.AllowError()) + // logger = log.NewFilter(logger, log.AllowError()) privValidatorFile := config.PrivValidatorFile() privVal := pvm.LoadOrGenFilePV(privValidatorFile) db := dbm.NewMemDB() - app := bapp.NewBasecoinApp(logger, db) - cdc = bapp.MakeCodec() // XXX + app := gapp.NewGaiaApp(logger, db) + cdc = gapp.MakeCodec() // XXX genesisFile := config.GenesisFile() genDoc, err := tmtypes.GenesisDocFromFile(genesisFile) @@ -415,27 +404,24 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { tmtypes.GenesisValidator{ PubKey: crypto.GenPrivKeyEd25519().PubKey(), Power: 1, - Name: "val1", - }, - tmtypes.GenesisValidator{ - PubKey: crypto.GenPrivKeyEd25519().PubKey(), - Power: 1, - Name: "val2", + Name: "val", }, ) - candidateAddr1 = hex.EncodeToString(genDoc.Validators[1].PubKey.Address()) - candidateAddr2 = hex.EncodeToString(genDoc.Validators[2].PubKey.Address()) + candidateAddr1 = hex.EncodeToString(genDoc.Validators[0].PubKey.Address()) + candidateAddr2 = hex.EncodeToString(genDoc.Validators[1].PubKey.Address()) - coins := sdk.Coins{{coinDenom, coinAmount}} - appState := map[string]interface{}{ - "accounts": []*btypes.GenesisAccount{ + coins := sdk.Coins{ + {coinDenom, coinAmount}, + {stakeDenom, coinAmount}, + } + appState := gapp.GenesisState{ + Accounts: []gapp.GenesisAccount{ { - Name: "tester", Address: pubKey.Address(), Coins: coins, }, }, - "stake": stake.GenesisState{ + StakeData: stake.GenesisState{ Pool: stake.Pool{ TotalSupply: 1650, BondedShares: sdk.NewRat(200, 1), @@ -456,9 +442,9 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { Candidates: []stake.Candidate{ { Status: 1, - Address: genDoc.Validators[1].PubKey.Address(), - PubKey: genDoc.Validators[1].PubKey, - Assets: sdk.NewRat(100, 1), + Address: genDoc.Validators[0].PubKey.Address(), + PubKey: genDoc.Validators[0].PubKey, + Assets: sdk.NewRat(1000, 1), Liabilities: sdk.ZeroRat(), Description: stake.Description{ Moniker: "validator1", @@ -468,8 +454,8 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { }, { Status: 1, - Address: genDoc.Validators[2].PubKey.Address(), - PubKey: genDoc.Validators[2].PubKey, + Address: genDoc.Validators[1].PubKey.Address(), + PubKey: genDoc.Validators[1].PubKey, Assets: sdk.NewRat(100, 1), Liabilities: sdk.ZeroRat(), Description: stake.Description{ @@ -482,7 +468,7 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { }, } - stateBytes, err := json.Marshal(appState) + stateBytes, err := cdc.MarshalJSONIndent(appState, "", " ") if err != nil { return nil, nil, err } @@ -618,7 +604,7 @@ func doIBCTransfer(t *testing.T, port, seed string) (resultTx ctypes.ResultBroad func getDelegatorBond(t *testing.T, delegatorAddr, candidateAddr string) stake.DelegatorBond { // get the account to get the sequence - res, body := request(t, port, "GET", "/stake/"+delegatorAddr+"/bonding_info/"+candidateAddr, nil) + res, body := request(t, port, "GET", "/stake/"+delegatorAddr+"/bonding_status/"+candidateAddr, nil) require.Equal(t, http.StatusOK, res.StatusCode, body) var bond stake.DelegatorBond err := cdc.UnmarshalJSON([]byte(body), &bond) @@ -657,10 +643,11 @@ func doBond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxC res, body := request(t, port, "POST", "/stake/bondunbond", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) - err := cdc.UnmarshalJSON([]byte(body), &resultTx) + var results []ctypes.ResultBroadcastTxCommit + err := cdc.UnmarshalJSON([]byte(body), &results) require.Nil(t, err) - return + return results[0] } func doUnbond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxCommit) { @@ -684,10 +671,11 @@ func doUnbond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastT res, body := request(t, port, "POST", "/stake/bondunbond", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) - err := cdc.UnmarshalJSON([]byte(body), &resultTx) + var results []ctypes.ResultBroadcastTxCommit + err := cdc.UnmarshalJSON([]byte(body), &results) require.Nil(t, err) - return + return results[0] } func doMultiBond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxCommit) { @@ -720,8 +708,9 @@ func doMultiBond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadca res, body := request(t, port, "POST", "/stake/bondunbond", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) - err := cdc.UnmarshalJSON([]byte(body), &resultTx) + var results []ctypes.ResultBroadcastTxCommit + err := cdc.UnmarshalJSON([]byte(body), &results) require.Nil(t, err) - return + return results[0] } From 6ad16e6c9019d1a1bbd0fd4cc9922105d45fc9f1 Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Mon, 21 May 2018 10:52:06 +0900 Subject: [PATCH 030/548] Changes to /stake/candidates REST handler --- client/lcd/lcd_test.go | 2 +- x/stake/client/rest/query.go | 21 ++++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 157a386811..578490ca13 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -387,7 +387,7 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { config.Consensus.SkipTimeoutCommit = false logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) - // logger = log.NewFilter(logger, log.AllowError()) + logger = log.NewFilter(logger, log.AllowError()) privValidatorFile := config.PrivValidatorFile() privVal := pvm.LoadOrGenFilePV(privValidatorFile) db := dbm.NewMemDB() diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index 576bad3cc9..4decfdbfd8 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -79,25 +79,28 @@ func bondingStatusHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreC // candidatesHandlerFn - http request handler to query list of candidates func candidatesHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - res, err := ctx.Query(stake.CandidatesKey, storeName) + res, err := ctx.QuerySubspace(cdc, stake.CandidatesKey, storeName) if err != nil { w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(fmt.Sprintf("Couldn't query bond. Error: %s", err.Error()))) + w.Write([]byte(fmt.Sprintf("Couldn't query candidates. Error: %s", err.Error()))) return } - // the query will return empty if there is no data for this bond if len(res) == 0 { w.WriteHeader(http.StatusNoContent) return } - var candidates []stake.Candidate - err = cdc.UnmarshalBinary(res, &candidates) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(fmt.Sprintf("Couldn't decode candidates. Error: %s", err.Error()))) - return + candidates := make(stake.Candidates, 0, len(res)) + for _, kv := range res { + var candidate stake.Candidate + err = cdc.UnmarshalBinary(kv.Value, &candidate) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf("Couldn't decode candidate. Error: %s", err.Error()))) + return + } + candidates = append(candidates, candidate) } output, err := cdc.MarshalJSON(candidates) From 0738de17f4ab37157dd199df583ef0acdea93245 Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Fri, 25 May 2018 00:14:10 +0900 Subject: [PATCH 031/548] Removed candidates endpoint and addressed some comments --- client/lcd/lcd_test.go | 56 +++++++++--------------------------- x/stake/client/rest/query.go | 48 ++++--------------------------- 2 files changed, 19 insertions(+), 85 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 578490ca13..7d1dab6762 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -311,13 +311,6 @@ func TestTxs(t *testing.T) { // assert.NotEqual(t, "[]", body) } -func TestCandidates(t *testing.T) { - candidates := getCandidates(t) - assert.Equal(t, len(candidates), 2) - assert.Equal(t, hex.EncodeToString(candidates[0].Address), candidateAddr1) - assert.Equal(t, hex.EncodeToString(candidates[1].Address), candidateAddr2) -} - func TestBond(t *testing.T) { // create bond TX @@ -334,7 +327,7 @@ func TestBond(t *testing.T) { assert.Equal(t, int64(9999900), coins.AmountOf(stakeDenom)) // query candidate - bond := getDelegatorBond(t, sendAddr, candidateAddr1) + bond := getDelegation(t, sendAddr, candidateAddr1) assert.Equal(t, "100/1", bond.Shares.String()) } @@ -354,7 +347,7 @@ func TestUnbond(t *testing.T) { assert.Equal(t, int64(9999911), coins.AmountOf(stakeDenom)) // query candidate - bond := getDelegatorBond(t, sendAddr, candidateAddr1) + bond := getDelegation(t, sendAddr, candidateAddr1) assert.Equal(t, "99/1", bond.Shares.String()) } @@ -423,13 +416,10 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { }, StakeData: stake.GenesisState{ Pool: stake.Pool{ - TotalSupply: 1650, - BondedShares: sdk.NewRat(200, 1), - UnbondedShares: sdk.ZeroRat(), - BondedPool: 200, - UnbondedPool: 0, - InflationLastTime: 0, - Inflation: sdk.NewRat(7, 100), + BondedShares: sdk.NewRat(200, 1), + UnbondedShares: sdk.ZeroRat(), + Inflation: sdk.NewRat(7, 100), + PrevBondedShares: sdk.ZeroRat(), }, Params: stake.Params{ InflationRateChange: sdk.NewRat(13, 100), @@ -439,30 +429,20 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { MaxValidators: 100, BondDenom: stakeDenom, }, - Candidates: []stake.Candidate{ + Validators: []stake.Validator{ { - Status: 1, - Address: genDoc.Validators[0].PubKey.Address(), - PubKey: genDoc.Validators[0].PubKey, - Assets: sdk.NewRat(1000, 1), - Liabilities: sdk.ZeroRat(), + Owner: genDoc.Validators[0].PubKey.Address(), + PubKey: genDoc.Validators[0].PubKey, Description: stake.Description{ Moniker: "validator1", }, - ValidatorBondHeight: 0, - ValidatorBondCounter: 0, }, { - Status: 1, - Address: genDoc.Validators[1].PubKey.Address(), - PubKey: genDoc.Validators[1].PubKey, - Assets: sdk.NewRat(100, 1), - Liabilities: sdk.ZeroRat(), + Owner: genDoc.Validators[1].PubKey.Address(), + PubKey: genDoc.Validators[1].PubKey, Description: stake.Description{ Moniker: "validator2", }, - ValidatorBondHeight: 0, - ValidatorBondCounter: 0, }, }, }, @@ -602,26 +582,16 @@ func doIBCTransfer(t *testing.T, port, seed string) (resultTx ctypes.ResultBroad return resultTx } -func getDelegatorBond(t *testing.T, delegatorAddr, candidateAddr string) stake.DelegatorBond { +func getDelegation(t *testing.T, delegatorAddr, candidateAddr string) stake.Delegation { // get the account to get the sequence res, body := request(t, port, "GET", "/stake/"+delegatorAddr+"/bonding_status/"+candidateAddr, nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - var bond stake.DelegatorBond + var bond stake.Delegation err := cdc.UnmarshalJSON([]byte(body), &bond) require.Nil(t, err) return bond } -func getCandidates(t *testing.T) []stake.Candidate { - // get the account to get the sequence - res, body := request(t, port, "GET", "/stake/candidates", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - var candidates []stake.Candidate - err := cdc.UnmarshalJSON([]byte(body), &candidates) - require.Nil(t, err) - return candidates -} - func doBond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxCommit) { // get the account to get the sequence acc := getAccount(t, sendAddr) diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index 4decfdbfd8..02cc732c9d 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -14,8 +14,10 @@ import ( ) func registerQueryRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec) { - r.HandleFunc("/stake/{delegator}/bonding_status/{candidate}", bondingStatusHandlerFn("stake", cdc, ctx)).Methods("GET") - r.HandleFunc("/stake/candidates", candidatesHandlerFn("stake", cdc, ctx)).Methods("GET") + r.HandleFunc( + "/stake/{delegator}/bonding_status/{validator}", + bondingStatusHandlerFn("stake", cdc, ctx), + ).Methods("GET") } // bondingStatusHandlerFn - http request handler to query delegator bonding status @@ -24,7 +26,7 @@ func bondingStatusHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreC // read parameters vars := mux.Vars(r) delegator := vars["delegator"] - candidate := vars["candidate"] + validator := vars["validator"] bz, err := hex.DecodeString(delegator) if err != nil { @@ -34,7 +36,7 @@ func bondingStatusHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreC } delegatorAddr := sdk.Address(bz) - bz, err = hex.DecodeString(candidate) + bz, err = hex.DecodeString(validator) if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) @@ -75,41 +77,3 @@ func bondingStatusHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreC w.Write(output) } } - -// candidatesHandlerFn - http request handler to query list of candidates -func candidatesHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - res, err := ctx.QuerySubspace(cdc, stake.CandidatesKey, storeName) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(fmt.Sprintf("Couldn't query candidates. Error: %s", err.Error()))) - return - } - - if len(res) == 0 { - w.WriteHeader(http.StatusNoContent) - return - } - - candidates := make(stake.Candidates, 0, len(res)) - for _, kv := range res { - var candidate stake.Candidate - err = cdc.UnmarshalBinary(kv.Value, &candidate) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(fmt.Sprintf("Couldn't decode candidate. Error: %s", err.Error()))) - return - } - candidates = append(candidates, candidate) - } - - output, err := cdc.MarshalJSON(candidates) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(err.Error())) - return - } - - w.Write(output) - } -} From a9bcdb2a0a96b35e8cfb5bcf1f8425b842f401b6 Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Fri, 25 May 2018 00:41:17 +0900 Subject: [PATCH 032/548] Addressed comments --- x/stake/client/rest/query.go | 2 +- x/stake/client/rest/tx.go | 52 +++++++++++++++++++----------------- x/stake/msg.go | 8 +++--- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index 02cc732c9d..cbcf5f5e8e 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -20,7 +20,7 @@ func registerQueryRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec ).Methods("GET") } -// bondingStatusHandlerFn - http request handler to query delegator bonding status +// http request handler to query delegator bonding status func bondingStatusHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // read parameters diff --git a/x/stake/client/rest/tx.go b/x/stake/client/rest/tx.go index 75e0f8d75d..2560fcc9f0 100644 --- a/x/stake/client/rest/tx.go +++ b/x/stake/client/rest/tx.go @@ -1,6 +1,7 @@ package rest import ( + "bytes" "encoding/json" "io/ioutil" "net/http" @@ -16,33 +17,26 @@ import ( ) func registerTxRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec, kb keys.Keybase) { - r.HandleFunc("/stake/bondunbond", bondUnbondRequestHandlerFn(cdc, kb, ctx)).Methods("POST") + r.HandleFunc( + "/stake/delegations", + editDelegationsRequestHandlerFn(cdc, kb, ctx), + ).Methods("POST") } -type bond struct { - Amount sdk.Coin `json:"amount"` - Candidate sdk.Address `json:"candidate"` -} - -type unbond struct { - Shares string `json:"shares"` - Candidate sdk.Address `json:"candidate"` -} - -type bondUnbondBody struct { +type editDelegationsBody struct { // fees is not used currently // Fees sdk.Coin `json="fees"` - LocalAccountName string `json:"name"` - Password string `json:"password"` - ChainID string `json:"chain_id"` - Sequence int64 `json:"sequence"` - Bond []bond `json:"bond"` - Unbond []unbond `json:"unbond"` + LocalAccountName string `json:"name"` + Password string `json:"password"` + ChainID string `json:"chain_id"` + Sequence int64 `json:"sequence"` + Delegate []stake.MsgDelegate `json:"delegate"` + Unbond []stake.MsgUnbond `json:"unbond"` } -func bondUnbondRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx context.CoreContext) http.HandlerFunc { +func editDelegationsRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx context.CoreContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var m bondUnbondBody + var m editDelegationsBody body, err := ioutil.ReadAll(r.Body) if err != nil { w.WriteHeader(http.StatusBadRequest) @@ -64,13 +58,21 @@ func bondUnbondRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx context.Co } // build messages - messages := make([]sdk.Msg, 0, len(m.Bond)+len(m.Unbond)) - for _, bond := range m.Bond { - msg := stake.NewMsgDelegate(info.Address(), bond.Candidate, bond.Amount) + messages := make([]sdk.Msg, 0, len(m.Delegate)+len(m.Unbond)) + for _, msg := range m.Delegate { + if !bytes.Equal(info.Address(), msg.DelegatorAddr) { + w.WriteHeader(http.StatusUnauthorized) + w.Write([]byte("Must use own delegator address")) + return + } messages = append(messages, msg) } - for _, unbond := range m.Unbond { - msg := stake.NewMsgUnbond(info.Address(), unbond.Candidate, unbond.Shares) + for _, msg := range m.Unbond { + if !bytes.Equal(info.Address(), msg.DelegatorAddr) { + w.WriteHeader(http.StatusUnauthorized) + w.Write([]byte("Must use own delegator address")) + return + } messages = append(messages, msg) } diff --git a/x/stake/msg.go b/x/stake/msg.go index 4bfc496dee..2d1757947e 100644 --- a/x/stake/msg.go +++ b/x/stake/msg.go @@ -117,8 +117,8 @@ func (msg MsgEditCandidacy) ValidateBasic() sdk.Error { // MsgDelegate - struct for bonding transactions type MsgDelegate struct { - DelegatorAddr sdk.Address `json:"delegator"` - ValidatorAddr sdk.Address `json:"candidate"` + DelegatorAddr sdk.Address `json:"delegator_addr"` + ValidatorAddr sdk.Address `json:"validator_addr"` Bond sdk.Coin `json:"bond"` } @@ -164,8 +164,8 @@ func (msg MsgDelegate) ValidateBasic() sdk.Error { // MsgUnbond - struct for unbonding transactions type MsgUnbond struct { - DelegatorAddr sdk.Address `json:"delegator"` - ValidatorAddr sdk.Address `json:"candidate"` + DelegatorAddr sdk.Address `json:"delegator_addr"` + ValidatorAddr sdk.Address `json:"validator_addr"` Shares string `json:"shares"` } From 57d86cc04c03871622179e96a51da9e5671e7af6 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Fri, 25 May 2018 10:17:49 -0400 Subject: [PATCH 033/548] fix many lcd errors, restructure lcd init --- Gopkg.lock | 47 +--------------- client/lcd/lcd_test.go | 110 ++++++++++++++++---------------------- cmd/gaia/app/genesis.go | 44 ++++++++++----- x/stake/genesis.go | 4 +- x/stake/keeper_test.go | 6 +-- x/stake/params.go | 3 +- x/stake/pool.go | 2 +- x/stake/test_common.go | 4 +- x/stake/tick_test.go | 2 +- x/stake/validator_test.go | 2 +- 10 files changed, 89 insertions(+), 135 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index dcc57cab33..37a32820c2 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -13,51 +13,6 @@ packages = ["btcec"] revision = "1432d294a5b055c297457c25434efbf13384cc46" -[[projects]] - name = "github.com/cosmos/cosmos-sdk" - packages = [ - "baseapp", - "client", - "client/context", - "client/keys", - "client/lcd", - "client/rpc", - "client/tx", - "cmd/gaia/app", - "examples/basecoin/app", - "examples/basecoin/types", - "examples/democoin/app", - "examples/democoin/types", - "examples/democoin/x/cool", - "examples/democoin/x/cool/client/cli", - "examples/democoin/x/pow", - "examples/democoin/x/pow/client/cli", - "examples/democoin/x/simplestake", - "examples/democoin/x/simplestake/client/cli", - "examples/democoin/x/sketchy", - "mock", - "server", - "store", - "tests", - "types", - "version", - "wire", - "x/auth", - "x/auth/client/cli", - "x/auth/client/rest", - "x/bank", - "x/bank/client", - "x/bank/client/cli", - "x/bank/client/rest", - "x/ibc", - "x/ibc/client/cli", - "x/ibc/client/rest", - "x/stake", - "x/stake/client/cli" - ] - revision = "187be1a5df81de1fd71da9053102d3a4868ec979" - version = "v0.17.2" - [[projects]] name = "github.com/davecgh/go-spew" packages = ["spew"] @@ -502,6 +457,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "9b6ee069da61cf1815c332c5624e8af99b51ea72e2e9b91d780db92299598dcc" + inputs-digest = "7540d2ecdb5d7d5084ab4e6132e929bbd501bd6add3006d8f08a6b2c127e0c7d" solver-name = "gps-cdcl" solver-version = 1 diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 7d1dab6762..5108279ac0 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -36,16 +36,18 @@ import ( gapp "github.com/cosmos/cosmos-sdk/cmd/gaia/app" tests "github.com/cosmos/cosmos-sdk/tests" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/stake" ) var ( - coinDenom = "mycoin" + coinDenom = "steak" coinAmount = int64(10000000) stakeDenom = "steak" - candidateAddr1 = "" - candidateAddr2 = "" + validatorAddr1 = "" + validatorAddr2 = "" // XXX bad globals name = "test" @@ -222,6 +224,7 @@ func TestValidators(t *testing.T) { func TestCoinSend(t *testing.T) { // query empty + //res, body := request(t, port, "GET", "/accounts/8FA6AB57AD6870F6B5B2E57735F38F2F30E73CB6", nil) res, body := request(t, port, "GET", "/accounts/8FA6AB57AD6870F6B5B2E57735F38F2F30E73CB6", nil) require.Equal(t, http.StatusNoContent, res.StatusCode, body) @@ -327,7 +330,7 @@ func TestBond(t *testing.T) { assert.Equal(t, int64(9999900), coins.AmountOf(stakeDenom)) // query candidate - bond := getDelegation(t, sendAddr, candidateAddr1) + bond := getDelegation(t, sendAddr, validatorAddr1) assert.Equal(t, "100/1", bond.Shares.String()) } @@ -347,7 +350,7 @@ func TestUnbond(t *testing.T) { assert.Equal(t, int64(9999911), coins.AmountOf(stakeDenom)) // query candidate - bond := getDelegation(t, sendAddr, candidateAddr1) + bond := getDelegation(t, sendAddr, validatorAddr1) assert.Equal(t, "99/1", bond.Shares.String()) } @@ -366,14 +369,6 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { if err != nil { return nil, nil, err } - var info cryptoKeys.Info - info, seed, err = kb.Create(name, password, cryptoKeys.AlgoEd25519) // XXX global seed - if err != nil { - return nil, nil, err - } - - pubKey := info.PubKey - sendAddr = pubKey.Address().String() // XXX global config := GetConfig() config.Consensus.TimeoutCommit = 1000 @@ -400,59 +395,46 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { Name: "val", }, ) - candidateAddr1 = hex.EncodeToString(genDoc.Validators[0].PubKey.Address()) - candidateAddr2 = hex.EncodeToString(genDoc.Validators[1].PubKey.Address()) - coins := sdk.Coins{ - {coinDenom, coinAmount}, - {stakeDenom, coinAmount}, - } - appState := gapp.GenesisState{ - Accounts: []gapp.GenesisAccount{ - { - Address: pubKey.Address(), - Coins: coins, - }, - }, - StakeData: stake.GenesisState{ - Pool: stake.Pool{ - BondedShares: sdk.NewRat(200, 1), - UnbondedShares: sdk.ZeroRat(), - Inflation: sdk.NewRat(7, 100), - PrevBondedShares: sdk.ZeroRat(), - }, - Params: stake.Params{ - InflationRateChange: sdk.NewRat(13, 100), - InflationMax: sdk.NewRat(1, 5), - InflationMin: sdk.NewRat(7, 100), - GoalBonded: sdk.NewRat(67, 100), - MaxValidators: 100, - BondDenom: stakeDenom, - }, - Validators: []stake.Validator{ - { - Owner: genDoc.Validators[0].PubKey.Address(), - PubKey: genDoc.Validators[0].PubKey, - Description: stake.Description{ - Moniker: "validator1", - }, - }, - { - Owner: genDoc.Validators[1].PubKey.Address(), - PubKey: genDoc.Validators[1].PubKey, - Description: stake.Description{ - Moniker: "validator2", - }, - }, - }, - }, - } + pk1 := genDoc.Validators[0].PubKey + pk2 := genDoc.Validators[1].PubKey + validatorAddr1 = hex.EncodeToString(pk1.Address()) + validatorAddr2 = hex.EncodeToString(pk2.Address()) - stateBytes, err := cdc.MarshalJSONIndent(appState, "", " ") + // NOTE it's bad practice to reuse pk address for the owner address but doing in the + // test for simplicity + var appGenTxs [2]json.RawMessage + appGenTxs[0], _, _, err = gapp.GaiaAppGenTxNF(cdc, pk1, pk1.Address(), "test_val1", true) if err != nil { return nil, nil, err } - genDoc.AppStateJSON = stateBytes + appGenTxs[1], _, _, err = gapp.GaiaAppGenTxNF(cdc, pk2, pk2.Address(), "test_val2", true) + if err != nil { + return nil, nil, err + } + + genesisState, err := gapp.GaiaAppGenState(cdc, appGenTxs[:]) + if err != nil { + return nil, nil, err + } + + // add the sendAddr to genesis + var info cryptoKeys.Info + info, seed, err = kb.Create(name, password, cryptoKeys.AlgoEd25519) // XXX global seed + if err != nil { + return nil, nil, err + } + sendAddr = info.PubKey.Address().String() // XXX global + accAuth := auth.NewBaseAccountWithAddress(info.PubKey.Address()) + accAuth.Coins = sdk.Coins{{"steak", 100}} + acc := gapp.NewGenesisAccount(&accAuth) + genesisState.Accounts = append(genesisState.Accounts, acc) + + appState, err := wire.MarshalJSONIndent(cdc, genesisState) + if err != nil { + return nil, nil, err + } + genDoc.AppStateJSON = appState // LCD listen address port = fmt.Sprintf("%d", 17377) // XXX @@ -609,7 +591,7 @@ func doBond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxC } ], "unbond": [] - }`, name, password, sequence, candidateAddr1, stakeDenom)) + }`, name, password, sequence, validatorAddr1, stakeDenom)) res, body := request(t, port, "POST", "/stake/bondunbond", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) @@ -637,7 +619,7 @@ func doUnbond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastT "shares": "1" } ] - }`, name, password, sequence, candidateAddr1)) + }`, name, password, sequence, validatorAddr1)) res, body := request(t, port, "POST", "/stake/bondunbond", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) @@ -674,7 +656,7 @@ func doMultiBond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadca "shares": "1" } ] - }`, name, password, sequence, candidateAddr1, stakeDenom, candidateAddr2, stakeDenom, candidateAddr1)) + }`, name, password, sequence, validatorAddr1, stakeDenom, validatorAddr2, stakeDenom, validatorAddr1)) res, body := request(t, port, "POST", "/stake/bondunbond", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) diff --git a/cmd/gaia/app/genesis.go b/cmd/gaia/app/genesis.go index 525fe8ab07..64db335435 100644 --- a/cmd/gaia/app/genesis.go +++ b/cmd/gaia/app/genesis.go @@ -74,7 +74,7 @@ func GaiaAppInit() server.AppInit { FlagsAppGenState: fsAppGenState, FlagsAppGenTx: fsAppGenTx, AppGenTx: GaiaAppGenTx, - AppGenState: GaiaAppGenState, + AppGenState: GaiaAppGenStateJSON, } } @@ -85,19 +85,31 @@ type GaiaGenTx struct { PubKey crypto.PubKey `json:"pub_key"` } -// Generate a gaia genesis transaction +// Generate a gaia genesis transaction with flags func GaiaAppGenTx(cdc *wire.Codec, pk crypto.PubKey) ( appGenTx, cliPrint json.RawMessage, validator tmtypes.GenesisValidator, err error) { - - var addr sdk.Address - var secret string clientRoot := viper.GetString(flagClientHome) overwrite := viper.GetBool(flagOWK) name := viper.GetString(flagName) + var addr sdk.Address + var secret string addr, secret, err = server.GenerateSaveCoinKey(clientRoot, name, "1234567890", overwrite) if err != nil { return } + mm := map[string]string{"secret": secret} + var bz []byte + bz, err = cdc.MarshalJSON(mm) + if err != nil { + return + } + cliPrint = json.RawMessage(bz) + return GaiaAppGenTxNF(cdc, pk, addr, name, overwrite) +} + +// Generate a gaia genesis transaction without flags +func GaiaAppGenTxNF(cdc *wire.Codec, pk crypto.PubKey, addr sdk.Address, name string, overwrite bool) ( + appGenTx, cliPrint json.RawMessage, validator tmtypes.GenesisValidator, err error) { var bz []byte gaiaGenTx := GaiaGenTx{ @@ -111,13 +123,6 @@ func GaiaAppGenTx(cdc *wire.Codec, pk crypto.PubKey) ( } appGenTx = json.RawMessage(bz) - mm := map[string]string{"secret": secret} - bz, err = cdc.MarshalJSON(mm) - if err != nil { - return - } - cliPrint = json.RawMessage(bz) - validator = tmtypes.GenesisValidator{ PubKey: pk, Power: freeFermionVal, @@ -127,7 +132,7 @@ func GaiaAppGenTx(cdc *wire.Codec, pk crypto.PubKey) ( // Create the core parameters for genesis initialization for gaia // note that the pubkey input is this machines pubkey -func GaiaAppGenState(cdc *wire.Codec, appGenTxs []json.RawMessage) (appState json.RawMessage, err error) { +func GaiaAppGenState(cdc *wire.Codec, appGenTxs []json.RawMessage) (genesisState GenesisState, err error) { if len(appGenTxs) == 0 { err = errors.New("must provide at least genesis transaction") @@ -171,10 +176,21 @@ func GaiaAppGenState(cdc *wire.Codec, appGenTxs []json.RawMessage) (appState jso } // create the final app state - genesisState := GenesisState{ + genesisState = GenesisState{ Accounts: genaccs, StakeData: stakeData, } + return +} + +// GaiaAppGenState but with JSON +func GaiaAppGenStateJSON(cdc *wire.Codec, appGenTxs []json.RawMessage) (appState json.RawMessage, err error) { + + // create the final app state + genesisState, err := GaiaAppGenState(cdc, appGenTxs) + if err != nil { + return nil, err + } appState, err = wire.MarshalJSONIndent(cdc, genesisState) return } diff --git a/x/stake/genesis.go b/x/stake/genesis.go index d45adc3d7f..be8d0dbe44 100644 --- a/x/stake/genesis.go +++ b/x/stake/genesis.go @@ -22,8 +22,8 @@ func NewGenesisState(pool Pool, params Params, validators []Validator, bonds []D // get raw genesis raw message for testing func DefaultGenesisState() GenesisState { return GenesisState{ - Pool: initialPool(), - Params: defaultParams(), + Pool: InitialPool(), + Params: DefaultParams(), } } diff --git a/x/stake/keeper_test.go b/x/stake/keeper_test.go index f28a2cf684..01d4434e83 100644 --- a/x/stake/keeper_test.go +++ b/x/stake/keeper_test.go @@ -586,7 +586,7 @@ func TestGetTendermintUpdatesInserted(t *testing.T) { func TestGetTendermintUpdatesNotValidatorCliff(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 0) - params := defaultParams() + params := DefaultParams() params.MaxValidators = 2 keeper.setParams(ctx, params) @@ -721,7 +721,7 @@ func TestBond(t *testing.T) { func TestParams(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 0) - expParams := defaultParams() + expParams := DefaultParams() //check that the empty keeper loads the default resParams := keeper.GetParams(ctx) @@ -736,7 +736,7 @@ func TestParams(t *testing.T) { func TestPool(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 0) - expPool := initialPool() + expPool := InitialPool() //check that the empty keeper loads the default resPool := keeper.GetPool(ctx) diff --git a/x/stake/params.go b/x/stake/params.go index 32b8c0ae83..ace39935c3 100644 --- a/x/stake/params.go +++ b/x/stake/params.go @@ -23,7 +23,8 @@ func (p Params) equal(p2 Params) bool { return bytes.Equal(bz1, bz2) } -func defaultParams() Params { +// default params +func DefaultParams() Params { return Params{ InflationRateChange: sdk.NewRat(13, 100), InflationMax: sdk.NewRat(20, 100), diff --git a/x/stake/pool.go b/x/stake/pool.go index e2547b0503..0b320432ed 100644 --- a/x/stake/pool.go +++ b/x/stake/pool.go @@ -31,7 +31,7 @@ func (p Pool) equal(p2 Pool) bool { } // initial pool for testing -func initialPool() Pool { +func InitialPool() Pool { return Pool{ LooseUnbondedTokens: 0, BondedTokens: 0, diff --git a/x/stake/test_common.go b/x/stake/test_common.go index 2dac36069e..a0aca4a57c 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -111,8 +111,8 @@ func createTestInput(t *testing.T, isCheckTx bool, initCoins int64) (sdk.Context ) ck := bank.NewKeeper(accountMapper) keeper := NewKeeper(cdc, keyStake, ck, DefaultCodespace) - keeper.setPool(ctx, initialPool()) - keeper.setNewParams(ctx, defaultParams()) + keeper.setPool(ctx, InitialPool()) + keeper.setNewParams(ctx, DefaultParams()) // fill all the addresses with some coins for _, addr := range addrs { diff --git a/x/stake/tick_test.go b/x/stake/tick_test.go index 4f0f6dc061..438b678f1d 100644 --- a/x/stake/tick_test.go +++ b/x/stake/tick_test.go @@ -61,7 +61,7 @@ func TestGetInflation(t *testing.T) { func TestProcessProvisions(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 0) - params := defaultParams() + params := DefaultParams() params.MaxValidators = 2 keeper.setParams(ctx, params) pool := keeper.GetPool(ctx) diff --git a/x/stake/validator_test.go b/x/stake/validator_test.go index 1ca5ba2f75..db6ab6f4c7 100644 --- a/x/stake/validator_test.go +++ b/x/stake/validator_test.go @@ -169,7 +169,7 @@ func randomValidator(r *rand.Rand) Validator { // generate a random staking state func randomSetup(r *rand.Rand, numValidators int) (Pool, Validators) { - pool := initialPool() + pool := InitialPool() validators := make([]Validator, numValidators) for i := 0; i < numValidators; i++ { From d3bdb09ffce1a6cb2ed941f3d614b8999e5c423b Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Fri, 25 May 2018 20:29:40 -0700 Subject: [PATCH 034/548] passes, needs tests --- cmd/gaia/app/app.go | 11 +++--- examples/basecoin/app/app.go | 11 +++--- examples/democoin/app/app.go | 13 ++++---- x/auth/ante.go | 8 +++-- x/auth/ante_test.go | 25 ++++++++------ x/auth/context_test.go | 2 +- x/auth/feekeeper.go | 65 ++++++++++++++++++++++++++++++++++++ x/auth/mapper_test.go | 8 +++-- 8 files changed, 111 insertions(+), 32 deletions(-) create mode 100644 x/auth/feekeeper.go diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index b2f51498ba..dbecada004 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -40,10 +40,11 @@ type GaiaApp struct { keyStake *sdk.KVStoreKey // Manage getting and setting accounts - accountMapper auth.AccountMapper - coinKeeper bank.Keeper - ibcMapper ibc.Mapper - stakeKeeper stake.Keeper + accountMapper auth.AccountMapper + feeCollectionKeeper auth.FeeCollectionKeeper + coinKeeper bank.Keeper + ibcMapper ibc.Mapper + stakeKeeper stake.Keeper } func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { @@ -81,7 +82,7 @@ func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { app.SetInitChainer(app.initChainer) app.SetEndBlocker(stake.NewEndBlocker(app.stakeKeeper)) app.MountStoresIAVL(app.keyMain, app.keyAccount, app.keyIBC, app.keyStake) - app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper)) + app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, app.feeCollectionKeeper)) err := app.LoadLatestVersion(app.keyMain) if err != nil { cmn.Exit(err.Error()) diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index 610a9e5525..086fa32b36 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -35,10 +35,11 @@ type BasecoinApp struct { keyStake *sdk.KVStoreKey // Manage getting and setting accounts - accountMapper auth.AccountMapper - coinKeeper bank.Keeper - ibcMapper ibc.Mapper - stakeKeeper stake.Keeper + accountMapper auth.AccountMapper + feeCollectionKeeper auth.FeeCollectionKeeper + coinKeeper bank.Keeper + ibcMapper ibc.Mapper + stakeKeeper stake.Keeper } func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { @@ -78,7 +79,7 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { // Initialize BaseApp. app.SetInitChainer(app.initChainer) app.MountStoresIAVL(app.keyMain, app.keyAccount, app.keyIBC, app.keyStake) - app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper)) + app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, app.feeCollectionKeeper)) err := app.LoadLatestVersion(app.keyMain) if err != nil { cmn.Exit(err.Error()) diff --git a/examples/democoin/app/app.go b/examples/democoin/app/app.go index 9696630b6e..2075a64da0 100644 --- a/examples/democoin/app/app.go +++ b/examples/democoin/app/app.go @@ -39,11 +39,12 @@ type DemocoinApp struct { capKeyStakingStore *sdk.KVStoreKey // keepers - coinKeeper bank.Keeper - coolKeeper cool.Keeper - powKeeper pow.Keeper - ibcMapper ibc.Mapper - stakeKeeper simplestake.Keeper + feeCollectionKeeper auth.FeeCollectionKeeper + coinKeeper bank.Keeper + coolKeeper cool.Keeper + powKeeper pow.Keeper + ibcMapper ibc.Mapper + stakeKeeper simplestake.Keeper // Manage getting and setting accounts accountMapper auth.AccountMapper @@ -89,7 +90,7 @@ func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp { // Initialize BaseApp. app.SetInitChainer(app.initChainerFn(app.coolKeeper, app.powKeeper)) app.MountStoresIAVL(app.capKeyMainStore, app.capKeyAccountStore, app.capKeyPowStore, app.capKeyIBCStore, app.capKeyStakingStore) - app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper)) + app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, app.feeCollectionKeeper)) err := app.LoadLatestVersion(app.capKeyMainStore) if err != nil { cmn.Exit(err.Error()) diff --git a/x/auth/ante.go b/x/auth/ante.go index c92a87641a..21f8df0fbd 100644 --- a/x/auth/ante.go +++ b/x/auth/ante.go @@ -9,13 +9,14 @@ import ( ) const ( - verifyCost = 100 + deductFeesCost sdk.Gas = 10 + verifyCost = 100 ) // NewAnteHandler returns an AnteHandler that checks // and increments sequence numbers, checks signatures, // and deducts fees from the first signer. -func NewAnteHandler(am AccountMapper) sdk.AnteHandler { +func NewAnteHandler(am AccountMapper, fck FeeCollectionKeeper) sdk.AnteHandler { return func( ctx sdk.Context, tx sdk.Tx, @@ -77,7 +78,10 @@ func NewAnteHandler(am AccountMapper) sdk.AnteHandler { if i == 0 { // TODO: min fee if !fee.Amount.IsZero() { + ctx.GasMeter().ConsumeGas(deductFeesCost, "deductFees") signerAcc, res = deductFees(signerAcc, fee) + fck.addCollectedFees(ctx, fee.Amount) + if !res.IsOK() { return ctx, res, true } diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index fcde2b464b..e21be8f16f 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -69,11 +69,12 @@ func newTestTxWithSignBytes(msg sdk.Msg, privs []crypto.PrivKey, seqs []int64, f // Test various error cases in the AnteHandler control flow. func TestAnteHandlerSigErrors(t *testing.T) { // setup - ms, capKey := setupMultiStore() + ms, capKey, capKey2 := setupMultiStore() cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper) + feeCollector := NewFeeCollectionKeeper(cdc, capKey2) + anteHandler := NewAnteHandler(mapper, feeCollector) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses @@ -110,11 +111,12 @@ func TestAnteHandlerSigErrors(t *testing.T) { // Test logic around sequence checking with one signer and many signers. func TestAnteHandlerSequences(t *testing.T) { // setup - ms, capKey := setupMultiStore() + ms, capKey, capKey2 := setupMultiStore() cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper) + feeCollector := NewFeeCollectionKeeper(cdc, capKey2) + anteHandler := NewAnteHandler(mapper, feeCollector) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses @@ -176,11 +178,12 @@ func TestAnteHandlerSequences(t *testing.T) { // Test logic around fee deduction. func TestAnteHandlerFees(t *testing.T) { // setup - ms, capKey := setupMultiStore() + ms, capKey, capKey2 := setupMultiStore() cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper) + feeCollector := NewFeeCollectionKeeper(cdc, capKey2) + anteHandler := NewAnteHandler(mapper, feeCollector) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses @@ -213,11 +216,12 @@ func TestAnteHandlerFees(t *testing.T) { func TestAnteHandlerBadSignBytes(t *testing.T) { // setup - ms, capKey := setupMultiStore() + ms, capKey, capKey2 := setupMultiStore() cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper) + feeCollector := NewFeeCollectionKeeper(cdc, capKey2) + anteHandler := NewAnteHandler(mapper, feeCollector) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses @@ -288,11 +292,12 @@ func TestAnteHandlerBadSignBytes(t *testing.T) { func TestAnteHandlerSetPubKey(t *testing.T) { // setup - ms, capKey := setupMultiStore() + ms, capKey, capKey2 := setupMultiStore() cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper) + feeCollector := NewFeeCollectionKeeper(cdc, capKey2) + anteHandler := NewAnteHandler(mapper, feeCollector) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses diff --git a/x/auth/context_test.go b/x/auth/context_test.go index e1db131679..a93de44d0c 100644 --- a/x/auth/context_test.go +++ b/x/auth/context_test.go @@ -12,7 +12,7 @@ import ( ) func TestContextWithSigners(t *testing.T) { - ms, _ := setupMultiStore() + ms, _, _ := setupMultiStore() ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) _, _, addr1 := keyPubAddr() diff --git a/x/auth/feekeeper.go b/x/auth/feekeeper.go new file mode 100644 index 0000000000..0828fb3652 --- /dev/null +++ b/x/auth/feekeeper.go @@ -0,0 +1,65 @@ +package auth + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + wire "github.com/cosmos/cosmos-sdk/wire" +) + +// This FeeCollectionKeeper handles collection of fees in the anteHandler +// and setting of MinFees for different fee tokens +type FeeCollectionKeeper struct { + + // The (unexposed) key used to access the fee store from the Context. + key sdk.StoreKey + + // The wire codec for binary encoding/decoding of accounts. + cdc *wire.Codec +} + +// NewFeeKeeper returns a new FeeKeeper +func NewFeeCollectionKeeper(cdc *wire.Codec, key sdk.StoreKey) FeeCollectionKeeper { + return FeeCollectionKeeper{ + key: key, + cdc: cdc, + } +} + +// Adds to Collected Fee Pool +func (fck FeeCollectionKeeper) GetCollectedFees(ctx sdk.Context) sdk.Coins { + store := ctx.KVStore(fck.key) + bz := store.Get([]byte("collectedFees")) + if bz == nil { + return sdk.Coins{} + } + + feePool := &(sdk.Coins{}) + err := fck.cdc.UnmarshalBinary(bz, feePool) + if err != nil { + panic("should not happen") + } + return *feePool +} + +// Sets to Collected Fee Pool +func (fck FeeCollectionKeeper) setCollectedFees(ctx sdk.Context, coins sdk.Coins) { + bz, err := fck.cdc.MarshalBinary(coins) + if err != nil { + panic("should not happen") + } + + store := ctx.KVStore(fck.key) + store.Set([]byte("collectedFees"), bz) +} + +// Adds to Collected Fee Pool +func (fck FeeCollectionKeeper) addCollectedFees(ctx sdk.Context, coins sdk.Coins) sdk.Coins { + newCoins := fck.GetCollectedFees(ctx).Plus(coins) + fck.setCollectedFees(ctx, newCoins) + + return newCoins +} + +// Clears the collected Fee Pool +func (fck FeeCollectionKeeper) ClearCollectedFees(ctx sdk.Context) { + fck.setCollectedFees(ctx, sdk.Coins{}) +} diff --git a/x/auth/mapper_test.go b/x/auth/mapper_test.go index cdd418990a..7f6397069a 100644 --- a/x/auth/mapper_test.go +++ b/x/auth/mapper_test.go @@ -14,17 +14,19 @@ import ( wire "github.com/cosmos/cosmos-sdk/wire" ) -func setupMultiStore() (sdk.MultiStore, *sdk.KVStoreKey) { +func setupMultiStore() (sdk.MultiStore, *sdk.KVStoreKey, *sdk.KVStoreKey) { db := dbm.NewMemDB() capKey := sdk.NewKVStoreKey("capkey") + capKey2 := sdk.NewKVStoreKey("capkey2") ms := store.NewCommitMultiStore(db) ms.MountStoreWithDB(capKey, sdk.StoreTypeIAVL, db) + ms.MountStoreWithDB(capKey2, sdk.StoreTypeIAVL, db) ms.LoadLatestVersion() - return ms, capKey + return ms, capKey, capKey2 } func TestAccountMapperGetSet(t *testing.T) { - ms, capKey := setupMultiStore() + ms, capKey, _ := setupMultiStore() cdc := wire.NewCodec() RegisterBaseAccount(cdc) From f81a70b3150606c2d24ed028f2605990500eb208 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Fri, 25 May 2018 20:48:27 -0700 Subject: [PATCH 035/548] added keeper tests --- x/auth/feekeeper_test.go | 75 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 x/auth/feekeeper_test.go diff --git a/x/auth/feekeeper_test.go b/x/auth/feekeeper_test.go new file mode 100644 index 0000000000..2f1ffc59bc --- /dev/null +++ b/x/auth/feekeeper_test.go @@ -0,0 +1,75 @@ +package auth + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + abci "github.com/tendermint/abci/types" + "github.com/tendermint/tmlibs/log" + + sdk "github.com/cosmos/cosmos-sdk/types" + wire "github.com/cosmos/cosmos-sdk/wire" +) + +var ( + emptyCoins = sdk.Coins{} + oneCoin = sdk.Coins{{"foocoin", 1}} + twoCoins = sdk.Coins{{"foocoin", 2}} +) + +func TestFeeCollectionKeeperGetSet(t *testing.T) { + ms, _, capKey2 := setupMultiStore() + cdc := wire.NewCodec() + + // make context and keeper + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) + fck := NewFeeCollectionKeeper(cdc, capKey2) + + // no coins initially + currFees := fck.GetCollectedFees(ctx) + assert.True(t, currFees.IsEqual(emptyCoins)) + + // set feeCollection to oneCoin + fck.setCollectedFees(ctx, oneCoin) + + // check that it is equal to oneCoin + assert.True(t, fck.GetCollectedFees(ctx).IsEqual(oneCoin)) +} + +func TestFeeCollectionKeeperAdd(t *testing.T) { + ms, _, capKey2 := setupMultiStore() + cdc := wire.NewCodec() + + // make context and keeper + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) + fck := NewFeeCollectionKeeper(cdc, capKey2) + + // no coins initially + assert.True(t, fck.GetCollectedFees(ctx).IsEqual(emptyCoins)) + + // add oneCoin and check that pool is now oneCoin + fck.addCollectedFees(ctx, oneCoin) + assert.True(t, fck.GetCollectedFees(ctx).IsEqual(oneCoin)) + + // add oneCoin again and check that pool is now twoCoins + fck.addCollectedFees(ctx, oneCoin) + assert.True(t, fck.GetCollectedFees(ctx).IsEqual(twoCoins)) +} + +func TestFeeCollectionKeeperClear(t *testing.T) { + ms, _, capKey2 := setupMultiStore() + cdc := wire.NewCodec() + + // make context and keeper + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) + fck := NewFeeCollectionKeeper(cdc, capKey2) + + // set coins initially + fck.setCollectedFees(ctx, twoCoins) + assert.True(t, fck.GetCollectedFees(ctx).IsEqual(twoCoins)) + + // clear fees and see that pool is now empty + fck.ClearCollectedFees(ctx) + assert.True(t, fck.GetCollectedFees(ctx).IsEqual(emptyCoins)) +} From 4f6c77d8cba765f8f31125c3c753ed86efc88d5d Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Fri, 25 May 2018 21:10:09 -0700 Subject: [PATCH 036/548] antehandler tests --- x/auth/ante.go | 3 +-- x/auth/ante_test.go | 4 ++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/x/auth/ante.go b/x/auth/ante.go index 21f8df0fbd..9663bcfe45 100644 --- a/x/auth/ante.go +++ b/x/auth/ante.go @@ -80,11 +80,10 @@ func NewAnteHandler(am AccountMapper, fck FeeCollectionKeeper) sdk.AnteHandler { if !fee.Amount.IsZero() { ctx.GasMeter().ConsumeGas(deductFeesCost, "deductFees") signerAcc, res = deductFees(signerAcc, fee) - fck.addCollectedFees(ctx, fee.Amount) - if !res.IsOK() { return ctx, res, true } + fck.addCollectedFees(ctx, fee.Amount) } } diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index e21be8f16f..b7f22e5d54 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -209,9 +209,13 @@ func TestAnteHandlerFees(t *testing.T) { mapper.SetAccount(ctx, acc1) checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeInsufficientFunds) + assert.True(t, feeCollector.GetCollectedFees(ctx).IsEqual(emptyCoins)) + acc1.SetCoins(sdk.Coins{{"atom", 150}}) mapper.SetAccount(ctx, acc1) checkValidTx(t, anteHandler, ctx, tx) + + assert.True(t, feeCollector.GetCollectedFees(ctx).IsEqual(sdk.Coins{{"atom", 150}})) } func TestAnteHandlerBadSignBytes(t *testing.T) { From bf02cdcf974c2f22b7b61e18483a48ea63a6d43f Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Fri, 25 May 2018 21:14:49 -0700 Subject: [PATCH 037/548] address Chris review --- x/auth/feekeeper.go | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/x/auth/feekeeper.go b/x/auth/feekeeper.go index 0828fb3652..3e03a81aa2 100644 --- a/x/auth/feekeeper.go +++ b/x/auth/feekeeper.go @@ -5,6 +5,10 @@ import ( wire "github.com/cosmos/cosmos-sdk/wire" ) +var ( + collectedFeesKey = []byte("collectedFees") +) + // This FeeCollectionKeeper handles collection of fees in the anteHandler // and setting of MinFees for different fee tokens type FeeCollectionKeeper struct { @@ -27,28 +31,21 @@ func NewFeeCollectionKeeper(cdc *wire.Codec, key sdk.StoreKey) FeeCollectionKeep // Adds to Collected Fee Pool func (fck FeeCollectionKeeper) GetCollectedFees(ctx sdk.Context) sdk.Coins { store := ctx.KVStore(fck.key) - bz := store.Get([]byte("collectedFees")) + bz := store.Get(collectedFeesKey) if bz == nil { return sdk.Coins{} } feePool := &(sdk.Coins{}) - err := fck.cdc.UnmarshalBinary(bz, feePool) - if err != nil { - panic("should not happen") - } + fck.cdc.MustUnmarshalBinary(bz, feePool) return *feePool } // Sets to Collected Fee Pool func (fck FeeCollectionKeeper) setCollectedFees(ctx sdk.Context, coins sdk.Coins) { - bz, err := fck.cdc.MarshalBinary(coins) - if err != nil { - panic("should not happen") - } - + bz := fck.cdc.MustMarshalBinary(coins) store := ctx.KVStore(fck.key) - store.Set([]byte("collectedFees"), bz) + store.Set(collectedFeesKey, bz) } // Adds to Collected Fee Pool From 92356b7d9be1b63d764073fe9843264fba556047 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Sat, 26 May 2018 04:36:05 -0400 Subject: [PATCH 038/548] changelog update --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73f5e5f880..19c50d56e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,18 @@ ## 0.18.1 +BREAKING CHANGES + +* [x/auth] move stuff specific to auth anteHandler to the auth module rather than the types folder. This includes: + * StdTx (and its related stuff i.e. StdSignDoc, etc) + * StdFee + * StdSignature + * Account interface + * Related to this organization, I also: +* [x/auth] got rid of AccountMapper interface (in favor of the struct already in auth module) +* [x/auth] removed the FeeHandler function from the AnteHandler, Replaced with FeeKeeper +* [x/auth] Removed GetSignatures() from Tx interface (as different Tx styles might use something different than StdSignature) + BUG FIXES * auto-sequencing transactions correctly * query sequence via account store From cfa1d42292344f4ca6f034acb17ae104ff939936 Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Sat, 26 May 2018 17:37:39 +0900 Subject: [PATCH 039/548] Fixed LCD staking tests --- client/lcd/lcd_test.go | 44 +++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 5108279ac0..d2b6d7d4e8 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -45,7 +45,6 @@ var ( coinDenom = "steak" coinAmount = int64(10000000) - stakeDenom = "steak" validatorAddr1 = "" validatorAddr2 = "" @@ -327,11 +326,11 @@ func TestBond(t *testing.T) { // query sender acc := getAccount(t, sendAddr) coins := acc.GetCoins() - assert.Equal(t, int64(9999900), coins.AmountOf(stakeDenom)) + assert.Equal(t, int64(87), coins.AmountOf(coinDenom)) // query candidate bond := getDelegation(t, sendAddr, validatorAddr1) - assert.Equal(t, "100/1", bond.Shares.String()) + assert.Equal(t, "10/1", bond.Shares.String()) } func TestUnbond(t *testing.T) { @@ -347,11 +346,11 @@ func TestUnbond(t *testing.T) { // query sender acc := getAccount(t, sendAddr) coins := acc.GetCoins() - assert.Equal(t, int64(9999911), coins.AmountOf(stakeDenom)) + assert.Equal(t, int64(98), coins.AmountOf(coinDenom)) // query candidate bond := getDelegation(t, sendAddr, validatorAddr1) - assert.Equal(t, "99/1", bond.Shares.String()) + assert.Equal(t, "9/1", bond.Shares.String()) } //__________________________________________________________ @@ -584,15 +583,16 @@ func doBond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxC "name": "%s", "password": "%s", "sequence": %d, - "bond": [ + "delegate": [ { - "candidate": "%s", - "amount": { "denom": "%s", "amount": 100 } + "delegator_addr": "%x", + "validator_addr": "%s", + "bond": { "denom": "%s", "amount": 10 } } ], "unbond": [] - }`, name, password, sequence, validatorAddr1, stakeDenom)) - res, body := request(t, port, "POST", "/stake/bondunbond", jsonStr) + }`, name, password, sequence, acc.GetAddress(), validatorAddr1, coinDenom)) + res, body := request(t, port, "POST", "/stake/delegations", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) var results []ctypes.ResultBroadcastTxCommit @@ -615,12 +615,13 @@ func doUnbond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastT "bond": [], "unbond": [ { - "candidate": "%s", + "delegator_addr": "%x", + "validator_addr": "%s", "shares": "1" } ] - }`, name, password, sequence, validatorAddr1)) - res, body := request(t, port, "POST", "/stake/bondunbond", jsonStr) + }`, name, password, sequence, acc.GetAddress(), validatorAddr1)) + res, body := request(t, port, "POST", "/stake/delegations", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) var results []ctypes.ResultBroadcastTxCommit @@ -642,22 +643,25 @@ func doMultiBond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadca "sequence": %d, "bond": [ { - "candidate": "%s", - "amount": { "denom": "%s", "amount": 1 } + "delegator_addr": "%x", + "validator_addr": "%s", + "bond": { "denom": "%s", "amount": 1 } }, { - "candidate": "%s", - "amount": { "denom": "%s", "amount": 1 } + "delegator_addr": "%x", + "validator_addr": "%s", + "bond": { "denom": "%s", "amount": 1 } }, ], "unbond": [ { - "candidate": "%s", + "delegator_addr": "%x", + "validator_addr": "%s", "shares": "1" } ] - }`, name, password, sequence, validatorAddr1, stakeDenom, validatorAddr2, stakeDenom, validatorAddr1)) - res, body := request(t, port, "POST", "/stake/bondunbond", jsonStr) + }`, name, password, sequence, acc.GetAddress(), validatorAddr1, coinDenom, acc.GetAddress(), validatorAddr2, coinDenom, acc.GetAddress(), validatorAddr1)) + res, body := request(t, port, "POST", "/stake/delegations", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) var results []ctypes.ResultBroadcastTxCommit From caf8c77dced9ea440e2f5145a1b13294868824ef Mon Sep 17 00:00:00 2001 From: sunnya97 Date: Sat, 26 May 2018 18:00:39 -0700 Subject: [PATCH 040/548] works --- store/cachekvstore.go | 11 ----------- store/dbstoreadapter.go | 8 -------- store/gaskvstore.go | 10 ---------- store/iavlstore.go | 12 +----------- store/iavlstore_test.go | 12 ++++++------ types/store.go | 21 +++++++++++---------- x/stake/keeper.go | 28 ++++++++++++++-------------- 7 files changed, 32 insertions(+), 70 deletions(-) diff --git a/store/cachekvstore.go b/store/cachekvstore.go index 772b593050..109bbfc75b 100644 --- a/store/cachekvstore.go +++ b/store/cachekvstore.go @@ -5,7 +5,6 @@ import ( "sort" "sync" - sdk "github.com/cosmos/cosmos-sdk/types" cmn "github.com/tendermint/tmlibs/common" ) @@ -134,16 +133,6 @@ func (ci *cacheKVStore) ReverseIterator(start, end []byte) Iterator { return ci.iterator(start, end, false) } -// Implements KVStore. -func (ci *cacheKVStore) SubspaceIterator(prefix []byte) Iterator { - return ci.iterator(prefix, sdk.PrefixEndBytes(prefix), true) -} - -// Implements KVStore. -func (ci *cacheKVStore) ReverseSubspaceIterator(prefix []byte) Iterator { - return ci.iterator(prefix, sdk.PrefixEndBytes(prefix), false) -} - func (ci *cacheKVStore) iterator(start, end []byte, ascending bool) Iterator { var parent, cache Iterator if ascending { diff --git a/store/dbstoreadapter.go b/store/dbstoreadapter.go index 7a299471f6..58c9e1b293 100644 --- a/store/dbstoreadapter.go +++ b/store/dbstoreadapter.go @@ -19,13 +19,5 @@ func (dsa dbStoreAdapter) CacheWrap() CacheWrap { return NewCacheKVStore(dsa) } -func (dsa dbStoreAdapter) SubspaceIterator(prefix []byte) Iterator { - return dsa.Iterator(prefix, sdk.PrefixEndBytes(prefix)) -} - -func (dsa dbStoreAdapter) ReverseSubspaceIterator(prefix []byte) Iterator { - return dsa.ReverseIterator(prefix, sdk.PrefixEndBytes(prefix)) -} - // dbm.DB implements KVStore so we can CacheKVStore it. var _ KVStore = dbStoreAdapter{dbm.DB(nil)} diff --git a/store/gaskvstore.go b/store/gaskvstore.go index 9f50f34441..db65921da7 100644 --- a/store/gaskvstore.go +++ b/store/gaskvstore.go @@ -75,16 +75,6 @@ func (gi *gasKVStore) ReverseIterator(start, end []byte) sdk.Iterator { return gi.iterator(start, end, false) } -// Implements KVStore. -func (gi *gasKVStore) SubspaceIterator(prefix []byte) sdk.Iterator { - return gi.iterator(prefix, sdk.PrefixEndBytes(prefix), true) -} - -// Implements KVStore. -func (gi *gasKVStore) ReverseSubspaceIterator(prefix []byte) sdk.Iterator { - return gi.iterator(prefix, sdk.PrefixEndBytes(prefix), false) -} - // Implements KVStore. func (gi *gasKVStore) CacheWrap() sdk.CacheWrap { panic("you cannot CacheWrap a GasKVStore") diff --git a/store/iavlstore.go b/store/iavlstore.go index 5399b3d5c4..2b7914c4eb 100644 --- a/store/iavlstore.go +++ b/store/iavlstore.go @@ -125,16 +125,6 @@ func (st *iavlStore) ReverseIterator(start, end []byte) Iterator { return newIAVLIterator(st.tree.Tree(), start, end, false) } -// Implements KVStore. -func (st *iavlStore) SubspaceIterator(prefix []byte) Iterator { - return st.Iterator(prefix, sdk.PrefixEndBytes(prefix)) -} - -// Implements KVStore. -func (st *iavlStore) ReverseSubspaceIterator(prefix []byte) Iterator { - return st.ReverseIterator(prefix, sdk.PrefixEndBytes(prefix)) -} - // Query implements ABCI interface, allows queries // // by default we will return from (latest height -1), @@ -180,7 +170,7 @@ func (st *iavlStore) Query(req abci.RequestQuery) (res abci.ResponseQuery) { subspace := req.Data res.Key = subspace var KVs []KVPair - iterator := st.SubspaceIterator(subspace) + iterator := sdk.KVStorePrefixIterator(st, subspace) for ; iterator.Valid(); iterator.Next() { KVs = append(KVs, KVPair{iterator.Key(), iterator.Value()}) } diff --git a/store/iavlstore_test.go b/store/iavlstore_test.go index 32bc1ebe0b..e324758c5c 100644 --- a/store/iavlstore_test.go +++ b/store/iavlstore_test.go @@ -157,7 +157,7 @@ func TestIAVLSubspaceIterator(t *testing.T) { i := 0 - iter := iavlStore.SubspaceIterator([]byte("test")) + iter := sdk.KVStorePrefixIterator(iavlStore, []byte("test")) expected := []string{"test1", "test2", "test3"} for i = 0; iter.Valid(); iter.Next() { expectedKey := expected[i] @@ -168,7 +168,7 @@ func TestIAVLSubspaceIterator(t *testing.T) { } assert.Equal(t, len(expected), i) - iter = iavlStore.SubspaceIterator([]byte{byte(55), byte(255), byte(255)}) + iter = sdk.KVStorePrefixIterator(iavlStore, []byte{byte(55), byte(255), byte(255)}) expected2 := [][]byte{ []byte{byte(55), byte(255), byte(255), byte(0)}, []byte{byte(55), byte(255), byte(255), byte(1)}, @@ -183,7 +183,7 @@ func TestIAVLSubspaceIterator(t *testing.T) { } assert.Equal(t, len(expected), i) - iter = iavlStore.SubspaceIterator([]byte{byte(255), byte(255)}) + iter = sdk.KVStorePrefixIterator(iavlStore, []byte{byte(255), byte(255)}) expected2 = [][]byte{ []byte{byte(255), byte(255), byte(0)}, []byte{byte(255), byte(255), byte(1)}, @@ -216,7 +216,7 @@ func TestIAVLReverseSubspaceIterator(t *testing.T) { i := 0 - iter := iavlStore.ReverseSubspaceIterator([]byte("test")) + iter := sdk.KVStoreReversePrefixIterator(iavlStore, []byte("test")) expected := []string{"test3", "test2", "test1"} for i = 0; iter.Valid(); iter.Next() { expectedKey := expected[i] @@ -227,7 +227,7 @@ func TestIAVLReverseSubspaceIterator(t *testing.T) { } assert.Equal(t, len(expected), i) - iter = iavlStore.ReverseSubspaceIterator([]byte{byte(55), byte(255), byte(255)}) + iter = sdk.KVStoreReversePrefixIterator(iavlStore, []byte{byte(55), byte(255), byte(255)}) expected2 := [][]byte{ []byte{byte(55), byte(255), byte(255), byte(255)}, []byte{byte(55), byte(255), byte(255), byte(1)}, @@ -242,7 +242,7 @@ func TestIAVLReverseSubspaceIterator(t *testing.T) { } assert.Equal(t, len(expected), i) - iter = iavlStore.ReverseSubspaceIterator([]byte{byte(255), byte(255)}) + iter = sdk.KVStoreReversePrefixIterator(iavlStore, []byte{byte(255), byte(255)}) expected2 = [][]byte{ []byte{byte(255), byte(255), byte(255)}, []byte{byte(255), byte(255), byte(1)}, diff --git a/types/store.go b/types/store.go index abf02ec071..2bd34bebd8 100644 --- a/types/store.go +++ b/types/store.go @@ -84,7 +84,7 @@ type CommitMultiStore interface { LoadVersion(ver int64) error } -//---------------------------------------- +//---------subsp------------------------------- // KVStore // KVStore is a simple interface to get/set data @@ -113,25 +113,26 @@ type KVStore interface { // CONTRACT: No writes may happen within a domain while an iterator exists over it. ReverseIterator(start, end []byte) Iterator - // Iterator over all the keys with a certain prefix in ascending order. - // CONTRACT: No writes may happen within a domain while an iterator exists over it. - SubspaceIterator(prefix []byte) Iterator - - // Iterator over all the keys with a certain prefix in descending order. - // CONTRACT: No writes may happen within a domain while an iterator exists over it. - ReverseSubspaceIterator(prefix []byte) Iterator - // TODO Not yet implemented. // CreateSubKVStore(key *storeKey) (KVStore, error) // TODO Not yet implemented. // GetSubKVStore(key *storeKey) KVStore - } // Alias iterator to db's Iterator for convenience. type Iterator = dbm.Iterator +// Iterator over all the keys with a certain prefix in ascending order +func KVStorePrefixIterator(kvs KVStore, prefix []byte) Iterator { + return kvs.Iterator(prefix, PrefixEndBytes(prefix)) +} + +// Iterator over all the keys with a certain prefix in descending order. +func KVStoreReversePrefixIterator(kvs KVStore, prefix []byte) Iterator { + return kvs.ReverseIterator(prefix, PrefixEndBytes(prefix)) +} + // CacheKVStore cache-wraps a KVStore. After calling .Write() on // the CacheKVStore, all previously created CacheKVStores on the // object expire. diff --git a/x/stake/keeper.go b/x/stake/keeper.go index ada19df9f0..ce84b1e177 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -58,7 +58,7 @@ func (k Keeper) setValidator(ctx sdk.Context, validator Validator) { // Get the set of all validators with no limits, used during genesis dump func (k Keeper) getAllValidators(ctx sdk.Context) (validators Validators) { store := ctx.KVStore(k.storeKey) - iterator := store.SubspaceIterator(ValidatorsKey) + iterator := sdk.KVStorePrefixIterator(store, ValidatorsKey) i := 0 for ; ; i++ { @@ -78,7 +78,7 @@ func (k Keeper) getAllValidators(ctx sdk.Context) (validators Validators) { // Get the set of all validators, retrieve a maxRetrieve number of records func (k Keeper) GetValidators(ctx sdk.Context, maxRetrieve int16) (validators Validators) { store := ctx.KVStore(k.storeKey) - iterator := store.SubspaceIterator(ValidatorsKey) + iterator := sdk.KVStorePrefixIterator(store, ValidatorsKey) validators = make([]Validator, maxRetrieve) i := 0 @@ -106,7 +106,7 @@ func (k Keeper) GetValidatorsBonded(ctx sdk.Context) (validators []Validator) { maxValidators := k.GetParams(ctx).MaxValidators validators = make([]Validator, maxValidators) - iterator := store.SubspaceIterator(ValidatorsBondedKey) + iterator := sdk.KVStorePrefixIterator(store, ValidatorsBondedKey) i := 0 for ; iterator.Valid(); iterator.Next() { @@ -132,7 +132,7 @@ func (k Keeper) GetValidatorsByPower(ctx sdk.Context) []Validator { store := ctx.KVStore(k.storeKey) maxValidators := k.GetParams(ctx).MaxValidators validators := make([]Validator, maxValidators) - iterator := store.ReverseSubspaceIterator(ValidatorsByPowerKey) // largest to smallest + iterator := sdk.KVStoreReversePrefixIterator(store, ValidatorsByPowerKey) // largest to smallest i := 0 for { if !iterator.Valid() || i > int(maxValidators-1) { @@ -160,7 +160,7 @@ func (k Keeper) GetValidatorsByPower(ctx sdk.Context) []Validator { func (k Keeper) getTendermintUpdates(ctx sdk.Context) (updates []abci.Validator) { store := ctx.KVStore(k.storeKey) - iterator := store.SubspaceIterator(TendermintUpdatesKey) //smallest to largest + iterator := sdk.KVStorePrefixIterator(store, TendermintUpdatesKey) //smallest to largest for ; iterator.Valid(); iterator.Next() { valBytes := iterator.Value() var val abci.Validator @@ -176,7 +176,7 @@ func (k Keeper) clearTendermintUpdates(ctx sdk.Context) { store := ctx.KVStore(k.storeKey) // delete subspace - iterator := store.SubspaceIterator(TendermintUpdatesKey) + iterator := sdk.KVStorePrefixIterator(store, TendermintUpdatesKey) for ; iterator.Valid(); iterator.Next() { store.Delete(iterator.Key()) } @@ -278,7 +278,7 @@ func (k Keeper) updateBondedValidators(ctx sdk.Context, store sdk.KVStore, // add the actual validator power sorted store maxValidators := k.GetParams(ctx).MaxValidators - iterator := store.ReverseSubspaceIterator(ValidatorsByPowerKey) // largest to smallest + iterator := sdk.KVStoreReversePrefixIterator(store, ValidatorsByPowerKey) // largest to smallest bondedValidatorsCount := 0 var validator Validator for { @@ -343,7 +343,7 @@ func (k Keeper) updateBondedValidators(ctx sdk.Context, store sdk.KVStore, func (k Keeper) updateBondedValidatorsFull(ctx sdk.Context, store sdk.KVStore) { // clear the current validators store, add to the ToKickOut temp store toKickOut := make(map[string]byte) - iterator := store.SubspaceIterator(ValidatorsBondedKey) + iterator := sdk.KVStorePrefixIterator(store, ValidatorsBondedKey) for ; iterator.Valid(); iterator.Next() { ownerAddr := iterator.Value() toKickOut[string(ownerAddr)] = 0 // set anything @@ -352,7 +352,7 @@ func (k Keeper) updateBondedValidatorsFull(ctx sdk.Context, store sdk.KVStore) { // add the actual validator power sorted store maxValidators := k.GetParams(ctx).MaxValidators - iterator = store.ReverseSubspaceIterator(ValidatorsByPowerKey) // largest to smallest + iterator = sdk.KVStoreReversePrefixIterator(store, ValidatorsByPowerKey) // largest to smallest bondedValidatorsCount := 0 var validator Validator for { @@ -502,7 +502,7 @@ func (k Keeper) GetDelegation(ctx sdk.Context, // load all delegations used during genesis dump func (k Keeper) getAllDelegations(ctx sdk.Context) (delegations []Delegation) { store := ctx.KVStore(k.storeKey) - iterator := store.SubspaceIterator(DelegationKey) + iterator := sdk.KVStorePrefixIterator(store, DelegationKey) i := 0 for ; ; i++ { @@ -523,7 +523,7 @@ func (k Keeper) getAllDelegations(ctx sdk.Context) (delegations []Delegation) { func (k Keeper) GetDelegations(ctx sdk.Context, delegator sdk.Address, maxRetrieve int16) (bonds []Delegation) { store := ctx.KVStore(k.storeKey) delegatorPrefixKey := GetDelegationsKey(delegator, k.cdc) - iterator := store.SubspaceIterator(delegatorPrefixKey) //smallest to largest + iterator := sdk.KVStorePrefixIterator(store, delegatorPrefixKey) //smallest to largest bonds = make([]Delegation, maxRetrieve) i := 0 @@ -665,7 +665,7 @@ var _ sdk.ValidatorSet = Keeper{} // iterate through the active validator set and perform the provided function func (k Keeper) IterateValidators(ctx sdk.Context, fn func(index int64, validator sdk.Validator) (stop bool)) { store := ctx.KVStore(k.storeKey) - iterator := store.SubspaceIterator(ValidatorsKey) + iterator := sdk.KVStorePrefixIterator(store, ValidatorsKey) i := int64(0) for ; iterator.Valid(); iterator.Next() { bz := iterator.Value() @@ -683,7 +683,7 @@ func (k Keeper) IterateValidators(ctx sdk.Context, fn func(index int64, validato // iterate through the active validator set and perform the provided function func (k Keeper) IterateValidatorsBonded(ctx sdk.Context, fn func(index int64, validator sdk.Validator) (stop bool)) { store := ctx.KVStore(k.storeKey) - iterator := store.SubspaceIterator(ValidatorsBondedKey) + iterator := sdk.KVStorePrefixIterator(store, ValidatorsBondedKey) i := int64(0) for ; iterator.Valid(); iterator.Next() { address := iterator.Value() @@ -735,7 +735,7 @@ func (k Keeper) Delegation(ctx sdk.Context, addrDel sdk.Address, addrVal sdk.Add func (k Keeper) IterateDelegators(ctx sdk.Context, delAddr sdk.Address, fn func(index int64, delegation sdk.Delegation) (stop bool)) { store := ctx.KVStore(k.storeKey) key := GetDelegationsKey(delAddr, k.cdc) - iterator := store.SubspaceIterator(key) + iterator := sdk.KVStorePrefixIterator(store, key) i := int64(0) for ; iterator.Valid(); iterator.Next() { bz := iterator.Value() From c057a71f5b50268b0b90fa96df85e5676ace44ee Mon Sep 17 00:00:00 2001 From: sunnya97 Date: Sat, 26 May 2018 18:04:47 -0700 Subject: [PATCH 041/548] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e429a1c8e..faacc6e341 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ BREAKING CHANGES * [x/auth] got rid of AccountMapper interface (in favor of the struct already in auth module) * [x/auth] removed the FeeHandler function from the AnteHandler, Replaced with FeeKeeper * [x/auth] Removed GetSignatures() from Tx interface (as different Tx styles might use something different than StdSignature) +* [store] Removed SubspaceIterator and ReverseSubspaceIterator from KVStore interface and replaced them with helper functions in /types BUG FIXES From f33f49a840cab82c11a14e8b345d038ea7a36837 Mon Sep 17 00:00:00 2001 From: Zaki Manian Date: Sat, 26 May 2018 23:21:29 +0200 Subject: [PATCH 042/548] Almost from scratch reimplementation of bech32cosmos integration. --- Gopkg.lock | 8 ++- Gopkg.toml | 5 ++ client/keys/list.go | 3 +- client/keys/show.go | 3 +- client/keys/utils.go | 25 ++++++--- client/lcd/lcd_test.go | 9 ++-- cmd/gaia/cli_test/cli_test.go | 58 ++++++++++++++------ docs/spec/governance/state.md | 4 +- docs/spec/governance/transactions.md | 38 ++++++------- server/tm_cmds.go | 14 ++--- types/account.go | 75 +++++++++++++++++++++++++- types/stake.go | 14 +++++ x/auth/account_test.go | 2 +- x/auth/client/cli/account.go | 5 +- x/bank/client/cli/sendtx.go | 6 +-- x/bank/client/rest/sendtx.go | 4 +- x/stake/client/cli/query.go | 80 +++++++++++++++++++--------- x/stake/client/cli/tx.go | 12 ++--- x/stake/delegation.go | 21 ++++++++ x/stake/msg.go | 18 ++++--- x/stake/test_common.go | 42 ++++++++++----- x/stake/validator.go | 28 ++++++++++ x/stake/view_slash_keeper.go | 2 +- 23 files changed, 355 insertions(+), 121 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 37a32820c2..9ca4de6855 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -13,6 +13,12 @@ packages = ["btcec"] revision = "1432d294a5b055c297457c25434efbf13384cc46" +[[projects]] + branch = "master" + name = "github.com/cosmos/bech32cosmos" + packages = ["go"] + revision = "efca97cd8c0852c44d96dfdcc70565c306eddff0" + [[projects]] name = "github.com/davecgh/go-spew" packages = ["spew"] @@ -457,6 +463,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "7540d2ecdb5d7d5084ab4e6132e929bbd501bd6add3006d8f08a6b2c127e0c7d" + inputs-digest = "f0c6224dc5f30c1a7dea716d619665831ea0932b0eb9afc6ac897dbc459134fa" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 5480bc03fc..a1adc79ac7 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -85,6 +85,11 @@ name = "google.golang.org/genproto" revision = "7fd901a49ba6a7f87732eb344f6e3c5b19d1b200" + [[constraint]] + name = "github.com/cosmos/bech32cosmos" + branch = "master" + + [prune] go-tests = true unused-packages = true diff --git a/client/keys/list.go b/client/keys/list.go index 26e06d9daf..9af511e5cd 100644 --- a/client/keys/list.go +++ b/client/keys/list.go @@ -4,6 +4,7 @@ import ( "encoding/json" "net/http" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/spf13/cobra" ) @@ -55,7 +56,7 @@ func QueryKeysRequestHandler(w http.ResponseWriter, r *http.Request) { } keysOutput := make([]KeyOutput, len(infos)) for i, info := range infos { - keysOutput[i] = KeyOutput{Name: info.Name, Address: info.PubKey.Address().String()} + keysOutput[i] = KeyOutput{Name: info.Name, Address: sdk.Address(info.PubKey.Address().Bytes())} } output, err := json.MarshalIndent(keysOutput, "", " ") if err != nil { diff --git a/client/keys/show.go b/client/keys/show.go index d0555764df..c7be9cc9db 100644 --- a/client/keys/show.go +++ b/client/keys/show.go @@ -4,6 +4,7 @@ import ( "encoding/json" "net/http" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/gorilla/mux" keys "github.com/tendermint/go-crypto/keys" @@ -50,7 +51,7 @@ func GetKeyRequestHandler(w http.ResponseWriter, r *http.Request) { return } - keyOutput := KeyOutput{Name: info.Name, Address: info.PubKey.Address().String()} + keyOutput := KeyOutput{Name: info.Name, Address: sdk.Address(info.PubKey.Address())} output, err := json.MarshalIndent(keyOutput, "", " ") if err != nil { w.WriteHeader(500) diff --git a/client/keys/utils.go b/client/keys/utils.go index 013aa1848b..eaf1e4c2fb 100644 --- a/client/keys/utils.go +++ b/client/keys/utils.go @@ -1,19 +1,20 @@ package keys import ( - "encoding/hex" "encoding/json" "fmt" "path/filepath" - "strings" "github.com/spf13/viper" + crypto "github.com/tendermint/go-crypto" keys "github.com/tendermint/go-crypto/keys" "github.com/tendermint/tmlibs/cli" dbm "github.com/tendermint/tmlibs/db" "github.com/cosmos/cosmos-sdk/client" + + sdk "github.com/cosmos/cosmos-sdk/types" ) // KeyDBName is the directory under root where we store the keys @@ -47,16 +48,16 @@ func SetKeyBase(kb keys.Keybase) { // used for outputting keys.Info over REST type KeyOutput struct { - Name string `json:"name"` - Address string `json:"address"` - PubKey string `json:"pub_key"` + Name string `json:"name"` + Address sdk.Address `json:"address"` + PubKey crypto.PubKey `json:"pub_key"` } func NewKeyOutput(info keys.Info) KeyOutput { return KeyOutput{ Name: info.Name, - Address: info.PubKey.Address().String(), - PubKey: strings.ToUpper(hex.EncodeToString(info.PubKey.Bytes())), + Address: sdk.Address(info.PubKey.Address().Bytes()), + PubKey: info.PubKey, } } @@ -73,7 +74,15 @@ func printInfo(info keys.Info) { switch viper.Get(cli.OutputFlag) { case "text": fmt.Printf("NAME:\tADDRESS:\t\t\t\t\tPUBKEY:\n") - fmt.Printf("%s\t%s\t%s\n", ko.Name, ko.Address, ko.PubKey) + bechAccount, err := sdk.Bech32CosmosifyAcc(ko.Address) + if err != nil { + panic(err) + } + bechPubKey, err := sdk.Bech32CosmosifyAccPub(ko.PubKey) + if err != nil { + panic(err) + } + fmt.Printf("%s\t%s\t%s\n", ko.Name, bechAccount, bechPubKey) case "json": out, err := json.MarshalIndent(ko, "", "\t") if err != nil { diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 29b4ba1124..840312ef6c 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -92,10 +92,13 @@ func TestKeys(t *testing.T) { err = cdc.UnmarshalJSON([]byte(body), &m) require.Nil(t, err) + sendAddrAcc, _ := sdk.GetAccAddressHex(sendAddr) + addrAcc, _ := sdk.GetAccAddressHex(addr) + assert.Equal(t, m[0].Name, name, "Did not serve keys name correctly") - assert.Equal(t, m[0].Address, sendAddr, "Did not serve keys Address correctly") + assert.Equal(t, m[0].Address, sendAddrAcc, "Did not serve keys Address correctly") assert.Equal(t, m[1].Name, newName, "Did not serve keys name correctly") - assert.Equal(t, m[1].Address, addr, "Did not serve keys Address correctly") + assert.Equal(t, m[1].Address, addrAcc, "Did not serve keys Address correctly") // select key keyEndpoint := fmt.Sprintf("/keys/%s", newName) @@ -106,7 +109,7 @@ func TestKeys(t *testing.T) { require.Nil(t, err) assert.Equal(t, newName, m2.Name, "Did not serve keys name correctly") - assert.Equal(t, addr, m2.Address, "Did not serve keys Address correctly") + assert.Equal(t, addrAcc, m2.Address, "Did not serve keys Address correctly") // update key jsonStr = []byte(fmt.Sprintf(`{"old_password":"%s", "new_password":"12345678901"}`, newPassword)) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 2d8b9d6a34..0f549d6d6f 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -13,9 +13,11 @@ import ( "github.com/cosmos/cosmos-sdk/cmd/gaia/app" "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/tests" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/stake" + crypto "github.com/tendermint/go-crypto" ) func TestGaiaCLISend(t *testing.T) { @@ -38,24 +40,32 @@ func TestGaiaCLISend(t *testing.T) { fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json") barAddr, _ := executeGetAddrPK(t, "gaiacli keys show bar --output=json") - fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooAddr, flags)) + fooBech, err := sdk.Bech32CosmosifyAcc(fooAddr) + if err != nil { + t.Error(err) + } + barBech, err := sdk.Bech32CosmosifyAcc(barAddr) + if err != nil { + t.Error(err) + } + fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags)) assert.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak")) executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barAddr), pass) time.Sleep(time.Second * 3) // waiting for some blocks to pass - barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barAddr, flags)) + barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barBech, flags)) assert.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak")) - fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooAddr, flags)) + fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags)) assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak")) // test autosequencing executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barAddr), pass) time.Sleep(time.Second * 3) // waiting for some blocks to pass - barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barAddr, flags)) + barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barBech, flags)) assert.Equal(t, int64(20), barAcc.GetCoins().AmountOf("steak")) - fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooAddr, flags)) + fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags)) assert.Equal(t, int64(30), fooAcc.GetCoins().AmountOf("steak")) } @@ -77,21 +87,32 @@ func TestGaiaCLIDeclareCandidacy(t *testing.T) { defer cmd.Process.Kill() fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json") - barAddr, barPubKey := executeGetAddrPK(t, "gaiacli keys show bar --output=json") + barAddr, _ := executeGetAddrPK(t, "gaiacli keys show bar --output=json") - executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barAddr), pass) + fooBech, err := sdk.Bech32CosmosifyAcc(fooAddr) + if err != nil { + t.Error(err) + } + barBech, err := sdk.Bech32CosmosifyAcc(barAddr) + if err != nil { + t.Error(err) + } + valPrivkey := crypto.GenPrivKeyEd25519() + valAddr := sdk.Address((valPrivkey.PubKey().Address())) + bechVal, err := sdk.Bech32CosmosifyVal(valAddr) + + executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barBech), pass) time.Sleep(time.Second * 3) // waiting for some blocks to pass - fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooAddr, flags)) + fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags)) assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak")) - barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barAddr, flags)) + barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barBech, flags)) assert.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak")) // declare candidacy - declStr := fmt.Sprintf("gaiacli declare-candidacy %v", flags) + declStr := fmt.Sprintf("gaiacli create-validator %v", flags) declStr += fmt.Sprintf(" --name=%v", "bar") - declStr += fmt.Sprintf(" --address-candidate=%v", barAddr) - declStr += fmt.Sprintf(" --pubkey=%v", barPubKey) + declStr += fmt.Sprintf(" --validator-address=%v", bechVal) declStr += fmt.Sprintf(" --amount=%v", "3steak") declStr += fmt.Sprintf(" --moniker=%v", "bar-vally") fmt.Printf("debug declStr: %v\n", declStr) @@ -100,8 +121,8 @@ func TestGaiaCLIDeclareCandidacy(t *testing.T) { barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barAddr, flags)) assert.Equal(t, int64(7), barAcc.GetCoins().AmountOf("steak")) candidate := executeGetCandidate(t, fmt.Sprintf("gaiacli candidate %v --address-candidate=%v", flags, barAddr)) - assert.Equal(t, candidate.Address.String(), barAddr) - assert.Equal(t, int64(3), candidate.BondedShares.Evaluate()) + assert.Equal(t, candidate.Owner.String(), barAddr) + assert.Equal(t, int64(3), candidate.PoolShares) // TODO timeout issues if not connected to the internet // unbond a single share @@ -125,6 +146,9 @@ func executeWrite(t *testing.T, cmdStr string, writes ...string) { for _, write := range writes { _, err := wc.Write([]byte(write + "\n")) + if err != nil { + fmt.Println(err) + } require.NoError(t, err) } fmt.Printf("debug waiting cmdStr: %v\n", cmdStr) @@ -159,7 +183,7 @@ func executeInit(t *testing.T, cmdStr string) (chainID string) { return } -func executeGetAddrPK(t *testing.T, cmdStr string) (addr, pubKey string) { +func executeGetAddrPK(t *testing.T, cmdStr string) (sdk.Address, crypto.PubKey) { out := tests.ExecuteT(t, cmdStr) var ko keys.KeyOutput keys.UnmarshalJSON([]byte(out), &ko) @@ -180,9 +204,9 @@ func executeGetAccount(t *testing.T, cmdStr string) auth.BaseAccount { return acc } -func executeGetCandidate(t *testing.T, cmdStr string) stake.Candidate { +func executeGetCandidate(t *testing.T, cmdStr string) stake.Validator { out := tests.ExecuteT(t, cmdStr) - var candidate stake.Candidate + var candidate stake.Validator cdc := app.MakeCodec() err := cdc.UnmarshalJSON([]byte(out), &candidate) require.NoError(t, err, "out %v, err %v", out, err) diff --git a/docs/spec/governance/state.md b/docs/spec/governance/state.md index e533ec6fe1..91cfa1f764 100644 --- a/docs/spec/governance/state.md +++ b/docs/spec/governance/state.md @@ -103,9 +103,9 @@ type ValidatorGovInfo struct { * `Proposals: int64 => Proposal` maps `proposalID` to the `Proposal` `proposalID` -* `Options: => VoteType`: maps to the vote of the `voterAddress` for `proposalID` re its delegation to `validatorAddress`. +* `Options: => VoteType`: maps to the vote of the `voterAddress` for `proposalID` re its delegation to `Address`. Returns 0x0 If `voterAddress` has not voted under this validator. -* `ValidatorGovInfos: => ValidatorGovInfo`: maps to the gov info for the `validatorAddress` and `proposalID`. +* `ValidatorGovInfos: => ValidatorGovInfo`: maps to the gov info for the `Address` and `proposalID`. Returns `nil` if proposal has not entered voting period or if `address` was not the address of a validator when proposal entered voting period. diff --git a/docs/spec/governance/transactions.md b/docs/spec/governance/transactions.md index 5f5401de87..aacf046c13 100644 --- a/docs/spec/governance/transactions.md +++ b/docs/spec/governance/transactions.md @@ -184,7 +184,7 @@ vote on the proposal. type TxGovVote struct { ProposalID int64 // proposalID of the proposal Option string // option from OptionSet chosen by the voter - ValidatorAddress crypto.address // Address of the validator voter wants to tie its vote to + Address crypto.address // Address of the validator voter wants to tie its vote to } ``` @@ -202,7 +202,7 @@ Votes need to be tied to a validator in order to compute validator's voting power. If a delegator is bonded to multiple validators, it will have to send one transaction per validator (the UI should facilitate this so that multiple transactions can be sent in one "vote flow"). If the sender is the validator -itself, then it will input its own address as `ValidatorAddress` +itself, then it will input its own address as `Address` Next is a pseudocode proposal of the way `TxGovVote` transactions are handled: @@ -223,39 +223,39 @@ handled: // There is no proposal for this proposalID throw - validator = load(CurrentValidators, txGovVote.ValidatorAddress) + validator = load(CurrentValidators, txGovVote.Address) if !proposal.InitProcedure.OptionSet.includes(txGovVote.Option) OR (validator == nil) then // Throws if // Option is not in Option Set of procedure that was active when vote opened OR if - // ValidatorAddress is not the address of a current validator + // Address is not the address of a current validator throw - option = load(Options, ::) + option = load(Options, ::) if (option != nil) - // sender has already voted with the Atoms bonded to ValidatorAddress + // sender has already voted with the Atoms bonded to Address throw if (proposal.VotingStartBlock < 0) OR (CurrentBlock > proposal.VotingStartBlock + proposal.InitProcedure.VotingPeriod) OR - (proposal.VotingStartBlock < lastBondingBlock(sender, txGovVote.ValidatorAddress) OR + (proposal.VotingStartBlock < lastBondingBlock(sender, txGovVote.Address) OR (proposal.VotingStartBlock < lastUnbondingBlock(sender, txGovVote.Address) OR (proposal.Votes.YesVotes/proposal.InitTotalVotingPower >= 2/3) then // Throws if // Vote has not started OR if // Vote had ended OR if - // sender bonded Atoms to ValidatorAddress after start of vote OR if - // sender unbonded Atoms from ValidatorAddress after start of vote OR if + // sender bonded Atoms to Address after start of vote OR if + // sender unbonded Atoms from Address after start of vote OR if // special condition is met, i.e. proposal is accepted and closed throw - validatorGovInfo = load(ValidatorGovInfos, :) + validatorGovInfo = load(ValidatorGovInfos, :) if (validatorGovInfo == nil) // validator became validator after proposal entered voting period @@ -263,39 +263,39 @@ handled: // sender can vote, check if sender == validator and store sender's option in Options - store(Options, ::, txGovVote.Option) + store(Options, ::, txGovVote.Option) if (sender != validator.address) - // Here, sender is not the Address of the validator whose Address is txGovVote.ValidatorAddress + // Here, sender is not the Address of the validator whose Address is txGovVote.Address - if sender does not have bonded Atoms to txGovVote.ValidatorAddress then + if sender does not have bonded Atoms to txGovVote.Address then // check in Staking module throw - validatorOption = load(Options, ::) + validatorOption = load(Options, ::) if (validatorOption == nil) // Validator has not voted already - validatorGovInfo.Minus += sender.bondedAmounTo(txGovVote.ValidatorAddress) - store(ValidatorGovInfos, :, validatorGovInfo) + validatorGovInfo.Minus += sender.bondedAmounTo(txGovVote.Address) + store(ValidatorGovInfos, :, validatorGovInfo) else // Validator has already voted // Reduce votes of option chosen by validator by sender's bonded Amount - proposal.Votes.validatorOption -= sender.bondedAmountTo(txGovVote.ValidatorAddress) + proposal.Votes.validatorOption -= sender.bondedAmountTo(txGovVote.Address) // increase votes of option chosen by sender by bonded Amount senderOption = txGovVote.Option - propoal.Votes.senderOption -= sender.bondedAmountTo(txGovVote.ValidatorAddress) + propoal.Votes.senderOption -= sender.bondedAmountTo(txGovVote.Address) store(Proposals, txGovVote.ProposalID, proposal) else - // sender is the address of the validator whose main Address is txGovVote.ValidatorAddress + // sender is the address of the validator whose main Address is txGovVote.Address // i.e. sender == validator proposal.Votes.validatorOption += (validatorGovInfo.InitVotingPower - validatorGovInfo.Minus) diff --git a/server/tm_cmds.go b/server/tm_cmds.go index d581ca5f76..72598a80e5 100644 --- a/server/tm_cmds.go +++ b/server/tm_cmds.go @@ -1,14 +1,13 @@ package server import ( - "encoding/hex" "fmt" - "strings" "github.com/cosmos/cosmos-sdk/wire" "github.com/spf13/cobra" "github.com/spf13/viper" + sdk "github.com/cosmos/cosmos-sdk/types" tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" "github.com/tendermint/tendermint/p2p" pvm "github.com/tendermint/tendermint/types/priv_validator" @@ -41,21 +40,24 @@ func ShowValidatorCmd(ctx *Context) *cobra.Command { cfg := ctx.Config privValidator := pvm.LoadOrGenFilePV(cfg.PrivValidatorFile()) - pubKey := privValidator.PubKey + valAddr := sdk.Address(privValidator.PubKey.Address()) if viper.GetBool(flagJSON) { cdc := wire.NewCodec() wire.RegisterCrypto(cdc) - pubKeyJSONBytes, err := cdc.MarshalJSON(pubKey) + pubKeyJSONBytes, err := cdc.MarshalJSON(valAddr) if err != nil { return err } fmt.Println(string(pubKeyJSONBytes)) return nil } - pubKeyHex := strings.ToUpper(hex.EncodeToString(pubKey.Bytes())) - fmt.Println(pubKeyHex) + addr, err := sdk.Bech32CosmosifyVal(valAddr) + if err != nil { + return err + } + fmt.Println(addr) return nil }, } diff --git a/types/account.go b/types/account.go index be8b90a1cd..cf02d1d423 100644 --- a/types/account.go +++ b/types/account.go @@ -3,15 +3,38 @@ package types import ( "encoding/hex" "errors" + "fmt" + bech32cosmos "github.com/cosmos/bech32cosmos/go" + crypto "github.com/tendermint/go-crypto" cmn "github.com/tendermint/tmlibs/common" ) -// Address in go-crypto style +//Address is a go crypto-style Address type Address = cmn.HexBytes +// Bech32CosmosifyAcc takes Address and returns the Bech32Cosmos encoded string +func Bech32CosmosifyAcc(addr Address) (string, error) { + return bech32cosmos.ConvertAndEncode("cosmosaccaddr", addr.Bytes()) +} + +// Bech32CosmosifyAccPub takes AccountPubKey and returns the Bech32Cosmos encoded string +func Bech32CosmosifyAccPub(pub crypto.PubKey) (string, error) { + return bech32cosmos.ConvertAndEncode("cosmosaccpub", pub.Bytes()) +} + +// Bech32CosmosifyVal returns the Bech32Cosmos encoded string for a validator address +func Bech32CosmosifyVal(addr Address) (string, error) { + return bech32cosmos.ConvertAndEncode("cosmosvaladdr", addr.Bytes()) +} + +// Bech32CosmosifyValPub returns the Bech32Cosmos encoded string for a validator pubkey +func Bech32CosmosifyValPub(pub crypto.PubKey) (string, error) { + return bech32cosmos.ConvertAndEncode("cosmosvalpub", pub.Bytes()) +} + // create an Address from a string -func GetAddress(address string) (addr Address, err error) { +func GetAccAddressHex(address string) (addr Address, err error) { if len(address) == 0 { return addr, errors.New("must use provide address") } @@ -21,3 +44,51 @@ func GetAddress(address string) (addr Address, err error) { } return Address(bz), nil } + +// create an Address from a string +func GetAccAddressBech32Cosmos(address string) (addr Address, err error) { + if len(address) == 0 { + return addr, errors.New("must use provide address") + } + + hrp, bz, err := bech32cosmos.DecodeAndConvert(address) + + if hrp != "cosmosaccaddr" { + return addr, fmt.Errorf("Invalid Address Prefix. Expected cosmosaccaddr, Got %s", hrp) + } + + if err != nil { + return nil, err + } + return Address(bz), nil +} + +// create an Address from a string +func GetValAddressHex(address string) (addr Address, err error) { + if len(address) == 0 { + return addr, errors.New("must use provide address") + } + bz, err := hex.DecodeString(address) + if err != nil { + return nil, err + } + return Address(bz), nil +} + +// create an Address from a string +func GetValAddressBech32Cosmos(address string) (addr Address, err error) { + if len(address) == 0 { + return addr, errors.New("must use provide address") + } + + hrp, bz, err := bech32cosmos.DecodeAndConvert(address) + + if hrp != "cosmosvaladdr" { + return addr, fmt.Errorf("Invalid Address Prefix. Expected cosmosvaladdr, Got %s", hrp) + } + + if err != nil { + return nil, err + } + return Address(bz), nil +} diff --git a/types/stake.go b/types/stake.go index df74a705b9..c640e98e77 100644 --- a/types/stake.go +++ b/types/stake.go @@ -15,6 +15,20 @@ const ( Bonded BondStatus = 0x02 ) +//BondStatusToString for pretty prints of Bond Status +func BondStatusToString(b BondStatus) string { + switch b { + case 0x00: + return "Ubbonded" + case 0x01: + return "Unbonding" + case 0x02: + return "Bonded" + default: + return "" + } +} + // validator for a delegated proof of stake system type Validator interface { GetStatus() BondStatus // status of the validator diff --git a/x/auth/account_test.go b/x/auth/account_test.go index d3363e4fb0..a06545d3b8 100644 --- a/x/auth/account_test.go +++ b/x/auth/account_test.go @@ -18,7 +18,7 @@ func keyPubAddr() (crypto.PrivKey, crypto.PubKey, sdk.Address) { return key, pub, addr } -func TestBaseAccountAddressPubKey(t *testing.T) { +func TestBaseAddressPubKey(t *testing.T) { _, pub1, addr1 := keyPubAddr() _, pub2, addr2 := keyPubAddr() acc := NewBaseAccountWithAddress(addr1) diff --git a/x/auth/client/cli/account.go b/x/auth/client/cli/account.go index 08bd520fb1..4006baa149 100644 --- a/x/auth/client/cli/account.go +++ b/x/auth/client/cli/account.go @@ -1,7 +1,6 @@ package cli import ( - "encoding/hex" "fmt" "github.com/spf13/cobra" @@ -40,11 +39,11 @@ func GetAccountCmd(storeName string, cdc *wire.Codec, decoder auth.AccountDecode // find the key to look up the account addr := args[0] - bz, err := hex.DecodeString(addr) + + key, err := sdk.GetAccAddressBech32Cosmos(addr) if err != nil { return err } - key := sdk.Address(bz) // perform query ctx := context.NewCoreContextFromViper() diff --git a/x/bank/client/cli/sendtx.go b/x/bank/client/cli/sendtx.go index 9109842887..5ed56a85b4 100644 --- a/x/bank/client/cli/sendtx.go +++ b/x/bank/client/cli/sendtx.go @@ -1,7 +1,6 @@ package cli import ( - "encoding/hex" "fmt" "github.com/spf13/cobra" @@ -34,12 +33,11 @@ func SendTxCmd(cdc *wire.Codec) *cobra.Command { } toStr := viper.GetString(flagTo) - bz, err := hex.DecodeString(toStr) + + to, err := sdk.GetAccAddressBech32Cosmos(toStr) if err != nil { return err } - to := sdk.Address(bz) - // parse coins amount := viper.GetString(flagAmount) coins, err := sdk.ParseCoins(amount) diff --git a/x/bank/client/rest/sendtx.go b/x/bank/client/rest/sendtx.go index 6ce472b6fd..916aa08fe1 100644 --- a/x/bank/client/rest/sendtx.go +++ b/x/bank/client/rest/sendtx.go @@ -1,7 +1,6 @@ package rest import ( - "encoding/hex" "encoding/json" "io/ioutil" "net/http" @@ -58,13 +57,12 @@ func SendRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx context.CoreCont return } - bz, err := hex.DecodeString(address) + to, err := sdk.GetAccAddressHex(address) if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) return } - to := sdk.Address(bz) // build message msg := client.BuildMsg(info.PubKey.Address(), to, m.Amount) diff --git a/x/stake/client/cli/query.go b/x/stake/client/cli/query.go index 079dd003d8..491ad1a7b8 100644 --- a/x/stake/client/cli/query.go +++ b/x/stake/client/cli/query.go @@ -1,13 +1,11 @@ package cli import ( - "encoding/hex" "fmt" "github.com/spf13/cobra" "github.com/spf13/viper" - - crypto "github.com/tendermint/go-crypto" + "github.com/tendermint/tmlibs/cli" "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" @@ -23,7 +21,7 @@ func GetCmdQueryValidator(storeName string, cdc *wire.Codec) *cobra.Command { Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - addr, err := sdk.GetAddress(args[0]) + addr, err := sdk.GetAccAddressBech32Cosmos(args[0]) if err != nil { return err } @@ -33,13 +31,25 @@ func GetCmdQueryValidator(storeName string, cdc *wire.Codec) *cobra.Command { if err != nil { return err } - - // parse out the validator validator := new(stake.Validator) cdc.MustUnmarshalBinary(res, validator) - output, err := wire.MarshalJSONIndent(cdc, validator) - fmt.Println(string(output)) + switch viper.Get(cli.OutputFlag) { + case "text": + human, err := validator.HumanReadableString() + if err != nil { + return err + } + fmt.Println(human) + + case "json": + // parse out the validator + output, err := wire.MarshalJSONIndent(cdc, validator) + if err != nil { + return err + } + fmt.Println(string(output)) + } // TODO output with proofs / machine parseable etc. return nil }, @@ -70,11 +80,23 @@ func GetCmdQueryValidators(storeName string, cdc *wire.Codec) *cobra.Command { candidates = append(candidates, validator) } - output, err := wire.MarshalJSONIndent(cdc, candidates) - if err != nil { - return err + switch viper.Get(cli.OutputFlag) { + case "text": + for _, candidate := range candidates { + resp, err := candidate.HumanReadableString() + if err != nil { + return err + } + fmt.Println(resp) + } + case "json": + output, err := wire.MarshalJSONIndent(cdc, candidates) + if err != nil { + return err + } + fmt.Println(string(output)) + return nil } - fmt.Println(string(output)) return nil // TODO output with proofs / machine parseable etc. @@ -90,18 +112,17 @@ func GetCmdQueryDelegation(storeName string, cdc *wire.Codec) *cobra.Command { Short: "Query a delegations bond based on address and validator address", RunE: func(cmd *cobra.Command, args []string) error { - addr, err := sdk.GetAddress(viper.GetString(FlagAddressValidator)) + addr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) if err != nil { return err } - bz, err := hex.DecodeString(viper.GetString(FlagAddressDelegator)) + delAddr, err := sdk.GetValAddressHex(viper.GetString(FlagAddressDelegator)) if err != nil { return err } - delegation := crypto.Address(bz) - key := stake.GetDelegationKey(delegation, addr, cdc) + key := stake.GetDelegationKey(delAddr, addr, cdc) ctx := context.NewCoreContextFromViper() res, err := ctx.Query(key, storeName) if err != nil { @@ -110,15 +131,24 @@ func GetCmdQueryDelegation(storeName string, cdc *wire.Codec) *cobra.Command { // parse out the bond bond := new(stake.Delegation) - cdc.MustUnmarshalBinary(res, bond) - output, err := wire.MarshalJSONIndent(cdc, bond) - if err != nil { - return err - } - fmt.Println(string(output)) - return nil - // TODO output with proofs / machine parseable etc. + switch viper.Get(cli.OutputFlag) { + case "text": + resp, err := bond.HumanReadableString() + if err != nil { + return err + } + fmt.Println(resp) + case "json": + cdc.MustUnmarshalBinary(res, bond) + output, err := wire.MarshalJSONIndent(cdc, bond) + if err != nil { + return err + } + fmt.Println(string(output)) + return nil + } + return nil }, } @@ -135,7 +165,7 @@ func GetCmdQueryDelegations(storeName string, cdc *wire.Codec) *cobra.Command { Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - delegatorAddr, err := sdk.GetAddress(args[0]) + delegatorAddr, err := sdk.GetAccAddressBech32Cosmos(args[0]) if err != nil { return err } diff --git a/x/stake/client/cli/tx.go b/x/stake/client/cli/tx.go index dd9c97a72c..acb3d026f4 100644 --- a/x/stake/client/cli/tx.go +++ b/x/stake/client/cli/tx.go @@ -28,7 +28,7 @@ func GetCmdDeclareCandidacy(cdc *wire.Codec) *cobra.Command { if err != nil { return err } - validatorAddr, err := sdk.GetAddress(viper.GetString(FlagAddressValidator)) + validatorAddr, err := sdk.GetValAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) if err != nil { return err } @@ -82,7 +82,7 @@ func GetCmdEditCandidacy(cdc *wire.Codec) *cobra.Command { Short: "edit and existing validator account", RunE: func(cmd *cobra.Command, args []string) error { - validatorAddr, err := sdk.GetAddress(viper.GetString(FlagAddressValidator)) + validatorAddr, err := sdk.GetValAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) if err != nil { return err } @@ -123,8 +123,8 @@ func GetCmdDelegate(cdc *wire.Codec) *cobra.Command { return err } - delegatorAddr, err := sdk.GetAddress(viper.GetString(FlagAddressDelegator)) - validatorAddr, err := sdk.GetAddress(viper.GetString(FlagAddressValidator)) + delegatorAddr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressDelegator)) + validatorAddr, err := sdk.GetValAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) if err != nil { return err } @@ -171,8 +171,8 @@ func GetCmdUnbond(cdc *wire.Codec) *cobra.Command { } } - delegatorAddr, err := sdk.GetAddress(viper.GetString(FlagAddressDelegator)) - validatorAddr, err := sdk.GetAddress(viper.GetString(FlagAddressValidator)) + delegatorAddr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressDelegator)) + validatorAddr, err := sdk.GetValAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) if err != nil { return err } diff --git a/x/stake/delegation.go b/x/stake/delegation.go index 89afe8e907..37c68d9525 100644 --- a/x/stake/delegation.go +++ b/x/stake/delegation.go @@ -2,6 +2,7 @@ package stake import ( "bytes" + "fmt" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -31,3 +32,23 @@ var _ sdk.Delegation = Delegation{} func (b Delegation) GetDelegator() sdk.Address { return b.DelegatorAddr } func (b Delegation) GetValidator() sdk.Address { return b.ValidatorAddr } func (b Delegation) GetBondShares() sdk.Rat { return b.Shares } + +//Human Friendly pretty printer +func (b Delegation) HumanReadableString() (string, error) { + bechAcc, err := sdk.Bech32CosmosifyAcc(b.DelegatorAddr) + if err != nil { + return "", err + } + bechVal, err := sdk.Bech32CosmosifyVal(b.ValidatorAddr) + if err != nil { + return "", err + } + resp := "Delegation \n" + resp += fmt.Sprintf("Delegator: %s\n", bechAcc) + resp += fmt.Sprintf("Validator: %s\n", bechVal) + resp += fmt.Sprintf("Shares: %s", b.Shares.String()) + resp += fmt.Sprintf("Height: %d", b.Height) + + return resp, nil + +} diff --git a/x/stake/msg.go b/x/stake/msg.go index 0adff84d9b..41220acc62 100644 --- a/x/stake/msg.go +++ b/x/stake/msg.go @@ -47,8 +47,10 @@ func NewMsgDeclareCandidacy(validatorAddr sdk.Address, pubkey crypto.PubKey, } //nolint -func (msg MsgDeclareCandidacy) Type() string { return MsgType } //TODO update "stake/declarecandidacy" -func (msg MsgDeclareCandidacy) GetSigners() []sdk.Address { return []sdk.Address{msg.ValidatorAddr} } +func (msg MsgDeclareCandidacy) Type() string { return MsgType } //TODO update "stake/declarecandidacy" +func (msg MsgDeclareCandidacy) GetSigners() []sdk.Address { + return []sdk.Address{msg.ValidatorAddr} +} // get the bytes for the message signer to sign on func (msg MsgDeclareCandidacy) GetSignBytes() []byte { @@ -89,8 +91,10 @@ func NewMsgEditCandidacy(validatorAddr sdk.Address, description Description) Msg } //nolint -func (msg MsgEditCandidacy) Type() string { return MsgType } //TODO update "stake/msgeditcandidacy" -func (msg MsgEditCandidacy) GetSigners() []sdk.Address { return []sdk.Address{msg.ValidatorAddr} } +func (msg MsgEditCandidacy) Type() string { return MsgType } //TODO update "stake/msgeditcandidacy" +func (msg MsgEditCandidacy) GetSigners() []sdk.Address { + return []sdk.Address{msg.ValidatorAddr} +} // get the bytes for the message signer to sign on func (msg MsgEditCandidacy) GetSignBytes() []byte { @@ -131,8 +135,10 @@ func NewMsgDelegate(delegatorAddr, validatorAddr sdk.Address, bond sdk.Coin) Msg } //nolint -func (msg MsgDelegate) Type() string { return MsgType } //TODO update "stake/msgeditcandidacy" -func (msg MsgDelegate) GetSigners() []sdk.Address { return []sdk.Address{msg.DelegatorAddr} } +func (msg MsgDelegate) Type() string { return MsgType } //TODO update "stake/msgeditcandidacy" +func (msg MsgDelegate) GetSigners() []sdk.Address { + return []sdk.Address{msg.DelegatorAddr} +} // get the bytes for the message signer to sign on func (msg MsgDelegate) GetSignBytes() []byte { diff --git a/x/stake/test_common.go b/x/stake/test_common.go index b7a5152c09..bf3e665513 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -1,6 +1,7 @@ package stake import ( + "bytes" "encoding/hex" "testing" @@ -21,16 +22,16 @@ import ( // dummy addresses used for testing var ( addrs = []sdk.Address{ - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6160"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6161"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6162"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6163"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6164"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6165"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6166"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6167"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6168"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6169"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6160", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctqyxjnwh"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6161", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctpesxxn9"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6162", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctzhrnsa6"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6163", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctr2489qg"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6164", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctytvs4pd"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6165", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ct9k6yqul"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6166", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctxcf3kjq"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6167", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ct89l9r0j"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6168", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctg6jkls2"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6169", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctf8yz2dc"), } // dummy pubkeys used for testing @@ -137,10 +138,27 @@ func newPubKey(pk string) (res crypto.PubKey) { } // for incode address generation -func testAddr(addr string) sdk.Address { - res, err := sdk.GetAddress(addr) +func testAddr(addr string, bech string) sdk.Address { + + res, err := sdk.GetAccAddressHex(addr) if err != nil { panic(err) } + bechexpected, err := sdk.Bech32CosmosifyAcc(res) + if err != nil { + panic(err) + } + if bech != bechexpected { + panic("Bech encoding doesn't match reference") + } + + bechres, err := sdk.GetAccAddressBech32Cosmos(bech) + if err != nil { + panic(err) + } + if bytes.Compare(bechres, res) != 0 { + panic("Bech decode and hex decode don't match") + } + return res } diff --git a/x/stake/validator.go b/x/stake/validator.go index 88f061f315..cf4ee85fda 100644 --- a/x/stake/validator.go +++ b/x/stake/validator.go @@ -2,6 +2,7 @@ package stake import ( "bytes" + "fmt" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" @@ -236,3 +237,30 @@ func (v Validator) GetOwner() sdk.Address { return v.Owner } func (v Validator) GetPubKey() crypto.PubKey { return v.PubKey } func (v Validator) GetPower() sdk.Rat { return v.PoolShares.Bonded() } func (v Validator) GetBondHeight() int64 { return v.BondHeight } + +//Human Friendly pretty printer +func (v Validator) HumanReadableString() (string, error) { + bechOwner, err := sdk.Bech32CosmosifyAcc(v.Owner) + if err != nil { + return "", err + } + bechVal, err := sdk.Bech32CosmosifyValPub(v.PubKey) + if err != nil { + return "", err + } + resp := "Validator \n" + resp += fmt.Sprintf("Owner: %s\n", bechOwner) + resp += fmt.Sprintf("Validator: %s\n", bechVal) + resp += fmt.Sprintf("Shares: Status %s, Amount: %s\n", sdk.BondStatusToString(v.PoolShares.Status), v.PoolShares.Amount.String()) + resp += fmt.Sprintf("Delegator Shares: %s\n", v.DelegatorShares.String()) + resp += fmt.Sprintf("Description: %s\n", v.Description) + resp += fmt.Sprintf("Bond Height: %d\n", v.BondHeight) + resp += fmt.Sprintf("Proposer Reward Pool: %s\n", v.ProposerRewardPool.String()) + resp += fmt.Sprintf("Commission: %s\n", v.Commission.String()) + resp += fmt.Sprintf("Max Commission Rate: %s\n", v.CommissionMax.String()) + resp += fmt.Sprintf("Comission Change Rate: %s\n", v.CommissionChangeRate.String()) + resp += fmt.Sprintf("Commission Change Today: %s\n", v.CommissionChangeToday.String()) + resp += fmt.Sprintf("Previously Bonded Stares: %s\n", v.PrevBondedShares.String()) + + return resp, nil +} diff --git a/x/stake/view_slash_keeper.go b/x/stake/view_slash_keeper.go index 38ba227bde..cb7d16ce94 100644 --- a/x/stake/view_slash_keeper.go +++ b/x/stake/view_slash_keeper.go @@ -18,7 +18,7 @@ func NewViewSlashKeeper(k Keeper) ViewSlashKeeper { // load a delegator bond func (v ViewSlashKeeper) GetDelegation(ctx sdk.Context, - delegatorAddr, validatorAddr sdk.Address) (bond Delegation, found bool) { + delegatorAddr sdk.Address, validatorAddr sdk.Address) (bond Delegation, found bool) { return v.keeper.GetDelegation(ctx, delegatorAddr, validatorAddr) } From a163a3558f85908ce8435c5d01d607840873713d Mon Sep 17 00:00:00 2001 From: Zaki Manian Date: Sun, 27 May 2018 14:21:15 +0200 Subject: [PATCH 043/548] Use public keys consistently for validators and all addresses are for accounts --- server/tm_cmds.go | 6 +++--- types/account.go | 27 +++++++++++++++++++++++++-- x/stake/client/cli/tx.go | 18 +++++------------- 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/server/tm_cmds.go b/server/tm_cmds.go index 72598a80e5..fcec57f090 100644 --- a/server/tm_cmds.go +++ b/server/tm_cmds.go @@ -40,20 +40,20 @@ func ShowValidatorCmd(ctx *Context) *cobra.Command { cfg := ctx.Config privValidator := pvm.LoadOrGenFilePV(cfg.PrivValidatorFile()) - valAddr := sdk.Address(privValidator.PubKey.Address()) + valPubKey := privValidator.PubKey if viper.GetBool(flagJSON) { cdc := wire.NewCodec() wire.RegisterCrypto(cdc) - pubKeyJSONBytes, err := cdc.MarshalJSON(valAddr) + pubKeyJSONBytes, err := cdc.MarshalJSON(valPubKey) if err != nil { return err } fmt.Println(string(pubKeyJSONBytes)) return nil } - addr, err := sdk.Bech32CosmosifyVal(valAddr) + addr, err := sdk.Bech32CosmosifyValPub(valPubKey) if err != nil { return err } diff --git a/types/account.go b/types/account.go index cf02d1d423..615fd30c17 100644 --- a/types/account.go +++ b/types/account.go @@ -63,7 +63,7 @@ func GetAccAddressBech32Cosmos(address string) (addr Address, err error) { return Address(bz), nil } -// create an Address from a string +// create an Address from a hex string func GetValAddressHex(address string) (addr Address, err error) { if len(address) == 0 { return addr, errors.New("must use provide address") @@ -75,7 +75,7 @@ func GetValAddressHex(address string) (addr Address, err error) { return Address(bz), nil } -// create an Address from a string +// create an Address from a bech32cosmos string func GetValAddressBech32Cosmos(address string) (addr Address, err error) { if len(address) == 0 { return addr, errors.New("must use provide address") @@ -92,3 +92,26 @@ func GetValAddressBech32Cosmos(address string) (addr Address, err error) { } return Address(bz), nil } + +//Decode a validator publickey into a public key +func GetValPubKeyBech32Cosmos(pubkey string) (pk crypto.PubKey, err error) { + if len(pubkey) == 0 { + return pk, errors.New("must use provide pubkey") + } + hrp, bz, err := bech32cosmos.DecodeAndConvert(pubkey) + + if hrp != "cosmosvalpub" { + return pk, fmt.Errorf("Invalid Validator Pubkey Prefix. Expected cosmosvalpub, Got %s", hrp) + } + + if err != nil { + return nil, err + } + + pk, err = crypto.PubKeyFromBytes(bz) + if err != nil { + return nil, err + } + + return pk, nil +} diff --git a/x/stake/client/cli/tx.go b/x/stake/client/cli/tx.go index acb3d026f4..dc88bfc209 100644 --- a/x/stake/client/cli/tx.go +++ b/x/stake/client/cli/tx.go @@ -1,14 +1,11 @@ package cli import ( - "encoding/hex" "fmt" "github.com/spf13/cobra" "github.com/spf13/viper" - crypto "github.com/tendermint/go-crypto" - "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" @@ -28,7 +25,7 @@ func GetCmdDeclareCandidacy(cdc *wire.Codec) *cobra.Command { if err != nil { return err } - validatorAddr, err := sdk.GetValAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) + validatorAddr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) if err != nil { return err } @@ -37,15 +34,10 @@ func GetCmdDeclareCandidacy(cdc *wire.Codec) *cobra.Command { if len(pkStr) == 0 { return fmt.Errorf("must use --pubkey flag") } - pkBytes, err := hex.DecodeString(pkStr) + pk, err := sdk.GetValPubKeyBech32Cosmos(pkStr) if err != nil { return err } - pk, err := crypto.PubKeyFromBytes(pkBytes) - if err != nil { - return err - } - if viper.GetString(FlagMoniker) == "" { return fmt.Errorf("please enter a moniker for the validator using --moniker") } @@ -82,7 +74,7 @@ func GetCmdEditCandidacy(cdc *wire.Codec) *cobra.Command { Short: "edit and existing validator account", RunE: func(cmd *cobra.Command, args []string) error { - validatorAddr, err := sdk.GetValAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) + validatorAddr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) if err != nil { return err } @@ -124,7 +116,7 @@ func GetCmdDelegate(cdc *wire.Codec) *cobra.Command { } delegatorAddr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressDelegator)) - validatorAddr, err := sdk.GetValAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) + validatorAddr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) if err != nil { return err } @@ -172,7 +164,7 @@ func GetCmdUnbond(cdc *wire.Codec) *cobra.Command { } delegatorAddr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressDelegator)) - validatorAddr, err := sdk.GetValAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) + validatorAddr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) if err != nil { return err } From ba7d1c0b8e196b7614e8fcc0748e96020ba507a6 Mon Sep 17 00:00:00 2001 From: Zaki Manian Date: Sun, 27 May 2018 14:24:18 +0200 Subject: [PATCH 044/548] Use the account encoding for the validator address --- x/stake/delegation.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/stake/delegation.go b/x/stake/delegation.go index 37c68d9525..6877034d71 100644 --- a/x/stake/delegation.go +++ b/x/stake/delegation.go @@ -39,7 +39,7 @@ func (b Delegation) HumanReadableString() (string, error) { if err != nil { return "", err } - bechVal, err := sdk.Bech32CosmosifyVal(b.ValidatorAddr) + bechVal, err := sdk.Bech32CosmosifyAcc(b.ValidatorAddr) if err != nil { return "", err } From ca9af7462a14fddb8fc3bc2bc269fdac9c1149a6 Mon Sep 17 00:00:00 2001 From: Zaki Manian Date: Sun, 27 May 2018 14:51:19 +0200 Subject: [PATCH 045/548] Update change log --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e429a1c8e..5f3202bff0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ BREAKING CHANGES * [x/auth] got rid of AccountMapper interface (in favor of the struct already in auth module) * [x/auth] removed the FeeHandler function from the AnteHandler, Replaced with FeeKeeper * [x/auth] Removed GetSignatures() from Tx interface (as different Tx styles might use something different than StdSignature) +* Switch to bech32cosmos on all human readable inputs and outputs BUG FIXES From 2d8756385663b840bd30ee2c73978b807e32b59e Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Mon, 28 May 2018 11:26:43 -0700 Subject: [PATCH 046/548] Change to go-wire UnmarshalJSON for bank transactions The bank module now uses it's own codec to encode and decode Bank Msgs into JSON. --- CHANGELOG.md | 11 +++++++++++ x/bank/msgs.go | 8 ++++---- x/bank/msgs_test.go | 18 ++++++++++++++++-- x/bank/wire.go | 6 ++++++ 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index faacc6e341..f2f68824ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## Pending + +BREAKING CHANGES + +FEATURES + +IMPROVEMENTS +* bank module uses go-wire codec instead of 'encoding/json' + +FIXES + ## 0.18.1 BREAKING CHANGES diff --git a/x/bank/msgs.go b/x/bank/msgs.go index de7f2a8b15..c256b6de61 100644 --- a/x/bank/msgs.go +++ b/x/bank/msgs.go @@ -1,8 +1,6 @@ package bank import ( - "encoding/json" - sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -55,7 +53,8 @@ func (msg MsgSend) ValidateBasic() sdk.Error { // Implements Msg. func (msg MsgSend) GetSignBytes() []byte { - b, err := json.Marshal(msg) // XXX: ensure some canonical form + cdc := getCodec() + b, err := cdc.MarshalJSON(msg) // XXX: ensure some canonical form if err != nil { panic(err) } @@ -104,7 +103,8 @@ func (msg MsgIssue) ValidateBasic() sdk.Error { // Implements Msg. func (msg MsgIssue) GetSignBytes() []byte { - b, err := json.Marshal(msg) // XXX: ensure some canonical form + cdc := getCodec() + b, err := cdc.MarshalJSON(msg) // XXX: ensure some canonical form if err != nil { panic(err) } diff --git a/x/bank/msgs_test.go b/x/bank/msgs_test.go index 78de01f400..fd1992e3c9 100644 --- a/x/bank/msgs_test.go +++ b/x/bank/msgs_test.go @@ -186,8 +186,15 @@ func TestMsgSendGetSignBytes(t *testing.T) { Outputs: []Output{NewOutput(addr2, coins)}, } res := msg.GetSignBytes() + + cdc := getCodec() + unmarshaledMsg := &MsgSend{} + cdc.UnmarshalJSON(res, unmarshaledMsg) + assert.Equal(t, &msg, unmarshaledMsg) + // TODO bad results - assert.Equal(t, string(res), `{"inputs":[{"address":"696E707574","coins":[{"denom":"atom","amount":10}]}],"outputs":[{"address":"6F7574707574","coins":[{"denom":"atom","amount":10}]}]}`) + expected := `{"type":"EAFDE32A2C87F8","value":{"inputs":[{"address":"696E707574","coins":[{"denom":"atom","amount":10}]}],"outputs":[{"address":"6F7574707574","coins":[{"denom":"atom","amount":10}]}]}}` + assert.Equal(t, expected, string(res)) } func TestMsgSendGetSigners(t *testing.T) { @@ -255,8 +262,15 @@ func TestMsgIssueGetSignBytes(t *testing.T) { Outputs: []Output{NewOutput(addr, coins)}, } res := msg.GetSignBytes() + + cdc := getCodec() + unmarshaledMsg := &MsgIssue{} + cdc.UnmarshalJSON(res, unmarshaledMsg) + assert.Equal(t, &msg, unmarshaledMsg) + // TODO bad results - assert.Equal(t, string(res), `{"banker":"696E707574","outputs":[{"address":"6C6F616E2D66726F6D2D62616E6B","coins":[{"denom":"atom","amount":10}]}]}`) + expected := `{"type":"72E617C06ABAD0","value":{"banker":"696E707574","outputs":[{"address":"6C6F616E2D66726F6D2D62616E6B","coins":[{"denom":"atom","amount":10}]}]}}` + assert.Equal(t, expected, string(res)) } func TestMsgIssueGetSigners(t *testing.T) { diff --git a/x/bank/wire.go b/x/bank/wire.go index fdb6c252b5..49511ef0e5 100644 --- a/x/bank/wire.go +++ b/x/bank/wire.go @@ -9,3 +9,9 @@ func RegisterWire(cdc *wire.Codec) { cdc.RegisterConcrete(MsgSend{}, "cosmos-sdk/Send", nil) cdc.RegisterConcrete(MsgIssue{}, "cosmos-sdk/Issue", nil) } + +func getCodec() *wire.Codec { + cdc := wire.NewCodec() + RegisterWire(cdc) + return cdc +} From 95c5baf449b28a55f0b3c6cbcae086a70797e95a Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 23 May 2018 22:25:56 +0200 Subject: [PATCH 047/548] Rebase & squash slashing --- Gopkg.lock | 32 ++-- Gopkg.toml | 9 +- baseapp/baseapp.go | 18 ++- baseapp/baseapp_test.go | 2 +- cmd/gaia/app/app.go | 29 ++-- docs/spec/staking/old/spec.md | 12 +- docs/spec/staking/old/spec2.md | 18 +-- docs/spec/staking/transactions.md | 4 +- docs/spec/staking/valset-changes.md | 70 +++++---- examples/basecoin/app/app.go | 2 +- examples/democoin/app/app.go | 2 +- examples/democoin/x/cool/keeper_test.go | 2 +- examples/democoin/x/pow/handler_test.go | 2 +- examples/democoin/x/pow/keeper_test.go | 2 +- .../democoin/x/simplestake/keeper_test.go | 4 +- mock/app.go | 2 +- mock/app_test.go | 2 +- types/context.go | 12 +- types/context_test.go | 4 +- types/lib/mapper_test.go | 2 +- types/stake.go | 13 +- types/tags.go | 5 + x/auth/ante_test.go | 10 +- x/auth/context_test.go | 4 +- x/auth/mapper_test.go | 2 +- x/bank/keeper_test.go | 6 +- x/ibc/ibc_test.go | 2 +- x/slashing/errors.go | 32 ++++ x/slashing/keeper.go | 148 ++++++++++++++++++ x/slashing/keeper_test.go | 17 ++ x/slashing/tick.go | 44 ++++++ x/stake/test_common.go | 2 +- x/stake/validator.go | 6 + 33 files changed, 400 insertions(+), 121 deletions(-) create mode 100644 x/slashing/errors.go create mode 100644 x/slashing/keeper.go create mode 100644 x/slashing/keeper_test.go create mode 100644 x/slashing/tick.go diff --git a/Gopkg.lock b/Gopkg.lock index 37a32820c2..7f1f6185e6 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -253,6 +253,7 @@ revision = "e6d6b529196422703d54ff5c40e79809ec2020b3" [[projects]] + branch = "cwgoes/timestamp-in-evidence" name = "github.com/tendermint/abci" packages = [ "client", @@ -261,8 +262,7 @@ "server", "types" ] - revision = "78a8905690ef54f9d57e3b2b0ee7ad3a04ef3f1f" - version = "v0.10.3" + revision = "e196dacf804e3a4ab74252c27e99cb17b39bf501" [[projects]] branch = "master" @@ -293,18 +293,16 @@ version = "v0.6.2" [[projects]] - name = "github.com/tendermint/go-wire" - packages = ["."] - revision = "fa721242b042ecd4c6ed1a934ee740db4f74e45c" - version = "v0.7.3" - -[[projects]] + branch = "develop" name = "github.com/tendermint/iavl" - packages = ["."] - revision = "fd37a0fa3a7454423233bc3d5ea828f38e0af787" - version = "v0.7.0" + packages = [ + ".", + "sha256truncated" + ] + revision = "9b6f9c3f49d599cfcf43f1a56c3c22882d1f9f21" [[projects]] + branch = "cwgoes/update-abci" name = "github.com/tendermint/tendermint" packages = [ "blockchain", @@ -313,6 +311,9 @@ "consensus", "consensus/types", "evidence", + "libs/events", + "libs/pubsub", + "libs/pubsub/query", "lite", "lite/client", "lite/errors", @@ -341,8 +342,7 @@ "types/priv_validator", "version" ] - revision = "018e096748bafe1d2d1e69b909e4158f3b26f6b2" - version = "v0.19.5-rc1" + revision = "d3093426f455c4b33cee818e3bbf2d2b83e4b38d" [[projects]] name = "github.com/tendermint/tmlibs" @@ -355,9 +355,7 @@ "db", "flowrate", "log", - "merkle", - "pubsub", - "pubsub/query" + "merkle" ] revision = "cc5f287c4798ffe88c04d02df219ecb6932080fd" version = "v0.8.3-rc0" @@ -457,6 +455,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "7540d2ecdb5d7d5084ab4e6132e929bbd501bd6add3006d8f08a6b2c127e0c7d" + inputs-digest = "2bb789b91c383e3a861979c83e61f5f8fd71ea5661837c092353aaacf3091de1" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 5480bc03fc..05b01bfaef 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -52,9 +52,9 @@ name = "github.com/stretchr/testify" version = "~1.2.1" -[[constraint]] +[[override]] name = "github.com/tendermint/abci" - version = "~0.10.3" + branch = "cwgoes/timestamp-in-evidence" [[constraint]] name = "github.com/tendermint/go-crypto" @@ -70,11 +70,11 @@ [[constraint]] name = "github.com/tendermint/iavl" - version = "~0.7.0" + branch = "develop" [[constraint]] name = "github.com/tendermint/tendermint" - version = "0.19.5-rc1" + branch = "cwgoes/update-abci" [[override]] name = "github.com/tendermint/tmlibs" @@ -88,4 +88,3 @@ [prune] go-tests = true unused-packages = true - diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 4ce8a05d9b..baed1fb47d 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -65,9 +65,10 @@ type BaseApp struct { // See methods setCheckState and setDeliverState. // .valUpdates accumulate in DeliverTx and are reset in BeginBlock. // QUESTION: should we put valUpdates in the deliverState.ctx? - checkState *state // for CheckTx - deliverState *state // for DeliverTx - valUpdates []abci.Validator // cached validator changes from DeliverTx + checkState *state // for CheckTx + deliverState *state // for DeliverTx + valUpdates []abci.Validator // cached validator changes from DeliverTx + absentValidators [][]byte // absent validators from begin block } var _ abci.Application = (*BaseApp)(nil) @@ -234,9 +235,9 @@ func (app *BaseApp) initFromStore(mainKey sdk.StoreKey) error { // NewContext returns a new Context with the correct store, the given header, and nil txBytes. func (app *BaseApp) NewContext(isCheckTx bool, header abci.Header) sdk.Context { if isCheckTx { - return sdk.NewContext(app.checkState.ms, header, true, nil, app.Logger) + return sdk.NewContext(app.checkState.ms, header, true, nil, app.Logger, nil) } - return sdk.NewContext(app.deliverState.ms, header, false, nil, app.Logger) + return sdk.NewContext(app.deliverState.ms, header, false, nil, app.Logger, nil) } type state struct { @@ -252,7 +253,7 @@ func (app *BaseApp) setCheckState(header abci.Header) { ms := app.cms.CacheMultiStore() app.checkState = &state{ ms: ms, - ctx: sdk.NewContext(ms, header, true, nil, app.Logger), + ctx: sdk.NewContext(ms, header, true, nil, app.Logger, nil), } } @@ -260,7 +261,7 @@ func (app *BaseApp) setDeliverState(header abci.Header) { ms := app.cms.CacheMultiStore() app.deliverState = &state{ ms: ms, - ctx: sdk.NewContext(ms, header, false, nil, app.Logger), + ctx: sdk.NewContext(ms, header, false, nil, app.Logger, nil), } } @@ -384,6 +385,8 @@ func (app *BaseApp) BeginBlock(req abci.RequestBeginBlock) (res abci.ResponseBeg if app.beginBlocker != nil { res = app.beginBlocker(app.deliverState.ctx, req) } + // set the absent validators for addition to context in deliverTx + app.absentValidators = req.AbsentValidators return } @@ -493,6 +496,7 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte, tx sdk.Tx) (result sdk ctx = app.checkState.ctx.WithTxBytes(txBytes) } else { ctx = app.deliverState.ctx.WithTxBytes(txBytes) + ctx = ctx.WithAbsentValidators(app.absentValidators) } // Simulate a DeliverTx for gas calculation diff --git a/baseapp/baseapp_test.go b/baseapp/baseapp_test.go index 61498b1b19..0b825e1ee8 100644 --- a/baseapp/baseapp_test.go +++ b/baseapp/baseapp_test.go @@ -183,7 +183,7 @@ func TestInitChainer(t *testing.T) { // set initChainer and try again - should see the value app.SetInitChainer(initChainer) - app.InitChain(abci.RequestInitChain{AppStateBytes: []byte("{}")}) // must have valid JSON genesis file, even if empty + app.InitChain(abci.RequestInitChain{GenesisBytes: []byte("{}")}) // must have valid JSON genesis file, even if empty app.Commit() res = app.Query(query) assert.Equal(t, value, res.Value) diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index dbecada004..7ad3709a10 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -15,6 +15,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" "github.com/cosmos/cosmos-sdk/x/ibc" + "github.com/cosmos/cosmos-sdk/x/slashing" "github.com/cosmos/cosmos-sdk/x/stake" ) @@ -34,10 +35,11 @@ type GaiaApp struct { cdc *wire.Codec // keys to access the substores - keyMain *sdk.KVStoreKey - keyAccount *sdk.KVStoreKey - keyIBC *sdk.KVStoreKey - keyStake *sdk.KVStoreKey + keyMain *sdk.KVStoreKey + keyAccount *sdk.KVStoreKey + keyIBC *sdk.KVStoreKey + keyStake *sdk.KVStoreKey + keySlashing *sdk.KVStoreKey // Manage getting and setting accounts accountMapper auth.AccountMapper @@ -45,6 +47,7 @@ type GaiaApp struct { coinKeeper bank.Keeper ibcMapper ibc.Mapper stakeKeeper stake.Keeper + slashingKeeper slashing.Keeper } func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { @@ -52,12 +55,13 @@ func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { // create your application object var app = &GaiaApp{ - BaseApp: bam.NewBaseApp(appName, cdc, logger, db), - cdc: cdc, - keyMain: sdk.NewKVStoreKey("main"), - keyAccount: sdk.NewKVStoreKey("acc"), - keyIBC: sdk.NewKVStoreKey("ibc"), - keyStake: sdk.NewKVStoreKey("stake"), + BaseApp: bam.NewBaseApp(appName, cdc, logger, db), + cdc: cdc, + keyMain: sdk.NewKVStoreKey("main"), + keyAccount: sdk.NewKVStoreKey("acc"), + keyIBC: sdk.NewKVStoreKey("ibc"), + keyStake: sdk.NewKVStoreKey("stake"), + keySlashing: sdk.NewKVStoreKey("slashing"), } // define the accountMapper @@ -71,6 +75,7 @@ func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { app.coinKeeper = bank.NewKeeper(app.accountMapper) app.ibcMapper = ibc.NewMapper(app.cdc, app.keyIBC, app.RegisterCodespace(ibc.DefaultCodespace)) app.stakeKeeper = stake.NewKeeper(app.cdc, app.keyStake, app.coinKeeper, app.RegisterCodespace(stake.DefaultCodespace)) + app.slashingKeeper = slashing.NewKeeper(app.cdc, app.keySlashing, app.stakeKeeper, app.RegisterCodespace(slashing.DefaultCodespace)) // register message routes app.Router(). @@ -80,6 +85,7 @@ func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { // initialize BaseApp app.SetInitChainer(app.initChainer) + app.SetBeginBlocker(slashing.NewBeginBlocker(app.slashingKeeper)) app.SetEndBlocker(stake.NewEndBlocker(app.stakeKeeper)) app.MountStoresIAVL(app.keyMain, app.keyAccount, app.keyIBC, app.keyStake) app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, app.feeCollectionKeeper)) @@ -105,7 +111,8 @@ func MakeCodec() *wire.Codec { // custom logic for gaia initialization func (app *GaiaApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { - stateJSON := req.AppStateBytes + stateJSON := req.GenesisBytes + // TODO is this now the whole genesis file? var genesisState GenesisState err := app.cdc.UnmarshalJSON(stateJSON, &genesisState) diff --git a/docs/spec/staking/old/spec.md b/docs/spec/staking/old/spec.md index bd87ec0285..1eddc3e33d 100644 --- a/docs/spec/staking/old/spec.md +++ b/docs/spec/staking/old/spec.md @@ -297,12 +297,12 @@ type TxProveLive struct { ## Delegator bond Atom holders may delegate coins to validators, under this circumstance their -funds are held in a `DelegatorBond`. It is owned by one delegator, and is +funds are held in a `Delegation`. It is owned by one delegator, and is associated with the shares for one validator. The sender of the transaction is considered to be the owner of the bond, ``` golang -type DelegatorBond struct { +type Delegation struct { Candidate crypto.PubKey Shares rational.Rat AdjustmentFeePool coin.Coins @@ -318,11 +318,11 @@ Description: - AdjustmentRewardPool: Adjustment factor used to passively calculate each bonds entitled fees from `Candidate.ProposerRewardPool`` -Each `DelegatorBond` is individually indexed within the store by delegator +Each `Delegation` is individually indexed within the store by delegator address and candidate pubkey. - key: Delegator and Candidate-Pubkey - - value: DelegatorBond + - value: Delegation ### Delegating @@ -330,7 +330,7 @@ address and candidate pubkey. Delegator bonds are created using the TxDelegate transaction. Within this transaction the validator candidate queried with an amount of coins, whereby given the current exchange rate of candidate's delegator-shares-to-atoms the -candidate will return shares which are assigned in `DelegatorBond.Shares`. +candidate will return shares which are assigned in `Delegation.Shares`. ``` golang type TxDelegate struct { @@ -671,5 +671,5 @@ rate, all commission on fees must be simultaneously withdrawn. `candidate.Adjustment` must be set to the value of `canidate.Count` for the height which the candidate is added on the validator set. - The feePool of a new delegator bond will be 0 for the height at which the bond - was added. This is achieved by setting `DelegatorBond.FeeWithdrawalHeight` to + was added. This is achieved by setting `Delegation.FeeWithdrawalHeight` to the height which the bond was added. diff --git a/docs/spec/staking/old/spec2.md b/docs/spec/staking/old/spec2.md index 72bb8a2e37..68f20703dc 100644 --- a/docs/spec/staking/old/spec2.md +++ b/docs/spec/staking/old/spec2.md @@ -34,7 +34,7 @@ The staking module persists the following to the store: - `GlobalState`, describing the global pools - a `Candidate` for each candidate validator, indexed by public key - a `Candidate` for each candidate validator, indexed by shares in the global pool (ie. ordered) -- a `DelegatorBond` for each delegation to a candidate by a delegator, indexed by delegator and candidate +- a `Delegation` for each delegation to a candidate by a delegator, indexed by delegator and candidate public keys - a `Queue` of unbonding delegations (TODO) @@ -146,15 +146,15 @@ When validators are kicked from the validator set they are removed from this list. -### DelegatorBond +### Delegation Atom holders may delegate coins to validators, under this circumstance their -funds are held in a `DelegatorBond`. It is owned by one delegator, and is +funds are held in a `Delegation`. It is owned by one delegator, and is associated with the shares for one validator. The sender of the transaction is considered to be the owner of the bond, ``` golang -type DelegatorBond struct { +type Delegation struct { Candidate crypto.PubKey Shares rational.Rat AdjustmentFeePool coin.Coins @@ -170,11 +170,11 @@ Description: - AdjustmentRewardPool: Adjustment factor used to passively calculate each bonds entitled fees from `Candidate.ProposerRewardPool`` -Each `DelegatorBond` is individually indexed within the store by delegator +Each `Delegation` is individually indexed within the store by delegator address and candidate pubkey. - key: Delegator and Candidate-Pubkey - - value: DelegatorBond + - value: Delegation ### Unbonding Queue @@ -308,7 +308,7 @@ All bonding, whether self-bonding or delegation, is done via Delegator bonds are created using the TxDelegate transaction. Within this transaction the validator candidate queried with an amount of coins, whereby given the current exchange rate of candidate's delegator-shares-to-atoms the -candidate will return shares which are assigned in `DelegatorBond.Shares`. +candidate will return shares which are assigned in `Delegation.Shares`. ``` golang type TxDelegate struct { @@ -616,7 +616,7 @@ synced past the height of the oldest `powerChange`. This trim procedure will occur on an epoch basis. ```golang -type powerChange struct { +type powerChange struct height int64 // block height at change power rational.Rat // total power at change prevpower rational.Rat // total power at previous height-1 @@ -694,5 +694,5 @@ rate, all commission on fees must be simultaneously withdrawn. `candidate.Adjustment` must be set to the value of `canidate.Count` for the height which the candidate is added on the validator set. - The feePool of a new delegator bond will be 0 for the height at which the bond - was added. This is achieved by setting `DelegatorBond.FeeWithdrawalHeight` to + was added. This is achieved by setting `Delegation.FeeWithdrawalHeight` to the height which the bond was added. diff --git a/docs/spec/staking/transactions.md b/docs/spec/staking/transactions.md index 52f324b0f7..eed082503b 100644 --- a/docs/spec/staking/transactions.md +++ b/docs/spec/staking/transactions.md @@ -203,7 +203,7 @@ unbond(tx TxUnbond): return removeShares(candidate Candidate, shares rational.Rat): - globalPoolSharesToRemove = delegatorShareExRate(candidate) * shares + globalPoolSharesToRemove = DelegatorShareExRate(candidate) * shares if candidate.Status == Bonded gs.BondedShares -= globalPoolSharesToRemove @@ -218,7 +218,7 @@ removeShares(candidate Candidate, shares rational.Rat): candidate.IssuedDelegatorShares -= shares return returnedCoins -delegatorShareExRate(candidate Candidate): +DelegatorShareExRate(candidate Candidate): if candidate.IssuedDelegatorShares.IsZero() then return rational.One return candidate.GlobalStakeShares / candidate.IssuedDelegatorShares diff --git a/docs/spec/staking/valset-changes.md b/docs/spec/staking/valset-changes.md index bc52b89980..e5979af39a 100644 --- a/docs/spec/staking/valset-changes.md +++ b/docs/spec/staking/valset-changes.md @@ -31,8 +31,8 @@ tick(ctx Context): if time > unbondDelegationQueue.head().InitTime + UnbondingPeriod for each element elem in the unbondDelegationQueue where time > elem.InitTime + UnbondingPeriod do - transfer(unbondingQueueAddress, elem.Payout, elem.Tokens) - unbondDelegationQueue.remove(elem) + transfer(unbondingQueueAddress, elem.Payout, elem.Tokens) + unbondDelegationQueue.remove(elem) if time > reDelegationQueue.head().InitTime + UnbondingPeriod for each element elem in the unbondDelegationQueue where time > elem.InitTime + UnbondingPeriod do @@ -55,9 +55,9 @@ nextInflation(hrsPerYr rational.Rat): inflation = gs.Inflation + inflationRateChange if inflation > params.InflationMax then inflation = params.InflationMax - + if inflation < params.InflationMin then inflation = params.InflationMin - + return inflation UpdateValidatorSet(): @@ -71,26 +71,26 @@ UpdateValidatorSet(): updateVotingPower(candidates Candidates): foreach candidate in candidates do - candidate.VotingPower = (candidate.IssuedDelegatorShares - candidate.RedelegatingShares) * delegatorShareExRate(candidate) - + candidate.VotingPower = (candidate.IssuedDelegatorShares - candidate.RedelegatingShares) * DelegatorShareExRate(candidate) + candidates.Sort() - + foreach candidate in candidates do - if candidate is not in the first params.MaxVals - candidate.VotingPower = rational.Zero - if candidate.Status == Bonded then bondedToUnbondedPool(candidate Candidate) - - else if candidate.Status == UnBonded then unbondedToBondedPool(candidate) + if candidate is not in the first params.MaxVals + candidate.VotingPower = rational.Zero + if candidate.Status == Bonded then bondedToUnbondedPool(candidate Candidate) + + else if candidate.Status == UnBonded then unbondedToBondedPool(candidate) - saveCandidate(store, c) - + saveCandidate(store, c) + return candidates unbondedToBondedPool(candidate Candidate): removedTokens = exchangeRate(gs.UnbondedShares, gs.UnbondedPool) * candidate.GlobalStakeShares gs.UnbondedShares -= candidate.GlobalStakeShares gs.UnbondedPool -= removedTokens - + gs.BondedPool += removedTokens issuedShares = removedTokens / exchangeRate(gs.BondedShares, gs.BondedPool) gs.BondedShares += issuedShares @@ -155,16 +155,17 @@ The following information is stored with each validator candidate, and is only n ```go type ValidatorSigningInfo struct { - StartHeight int64 - SignedBlocksBitArray BitArray + StartHeight int64 + SignedBlocksBitArray BitArray + SignedBlocksCounter int64 } ``` Where: * `StartHeight` is set to the height that the candidate became an active validator (with non-zero voting power). * `SignedBlocksBitArray` is a bit-array of size `SIGNED_BLOCKS_WINDOW` that records, for each of the last `SIGNED_BLOCKS_WINDOW` blocks, -whether or not this validator was included in the LastCommit. It uses a `0` if the validator was included, and a `1` if it was not. -Note it is initialized with all 0s. +whether or not this validator was included in the LastCommit. It uses a `1` if the validator was included, and a `0` if it was not. Note it is initialized with all 0s. +* `SignedBlocksCounter` is a counter kept to avoid unnecessary array reads. `SignedBlocksBitArray.Sum() == SignedBlocksCounter` always. At the beginning of each block, we update the signing info for each validator and check if they should be automatically unbonded: @@ -173,18 +174,23 @@ h = block.Height index = h % SIGNED_BLOCKS_WINDOW for val in block.Validators: - signInfo = val.SignInfo - if val in block.LastCommit: - signInfo.SignedBlocksBitArray.Set(index, 0) - else - signInfo.SignedBlocksBitArray.Set(index, 1) + signInfo = val.SignInfo + previous = signInfo.SignedBlocksBitArray.Get(index) - // validator must be active for at least SIGNED_BLOCKS_WINDOW - // before they can be automatically unbonded for failing to be - // included in 50% of the recent LastCommits - minHeight = signInfo.StartHeight + SIGNED_BLOCKS_WINDOW - minSigned = SIGNED_BLOCKS_WINDOW / 2 - blocksSigned = signInfo.SignedBlocksBitArray.Sum() - if h > minHeight AND blocksSigned < minSigned: - unbond the validator + // update counter if array has changed + if previous and val in block.AbsentValidators: + signInfo.SignedBlocksBitArray.Set(index, 0) + signInfo.SignedBlocksCounter-- + else if !previous and val not in block.AbsentValidators: + signInfo.SignedBlocksBitArray.Set(index, 1) + signInfo.SignedBlocksCounter++ + // else previous == val not in block.AbsentValidators, no change + + // validator must be active for at least SIGNED_BLOCKS_WINDOW + // before they can be automatically unbonded for failing to be + // included in 50% of the recent LastCommits + minHeight = signInfo.StartHeight + SIGNED_BLOCKS_WINDOW + minSigned = SIGNED_BLOCKS_WINDOW / 2 + if h > minHeight AND signInfo.SignedBlocksCounter < minSigned: + unbond the validator ``` diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index 086fa32b36..a0b1f86ad6 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -104,7 +104,7 @@ func MakeCodec() *wire.Codec { // Custom logic for basecoin initialization func (app *BasecoinApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { - stateJSON := req.AppStateBytes + stateJSON := req.GenesisBytes genesisState := new(types.GenesisState) err := app.cdc.UnmarshalJSON(stateJSON, genesisState) diff --git a/examples/democoin/app/app.go b/examples/democoin/app/app.go index 2075a64da0..b8b8642cf3 100644 --- a/examples/democoin/app/app.go +++ b/examples/democoin/app/app.go @@ -118,7 +118,7 @@ func MakeCodec() *wire.Codec { // custom logic for democoin initialization func (app *DemocoinApp) initChainerFn(coolKeeper cool.Keeper, powKeeper pow.Keeper) sdk.InitChainer { return func(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { - stateJSON := req.AppStateBytes + stateJSON := req.GenesisBytes genesisState := new(types.GenesisState) err := app.cdc.UnmarshalJSON(stateJSON, genesisState) diff --git a/examples/democoin/x/cool/keeper_test.go b/examples/democoin/x/cool/keeper_test.go index d497dee699..f632ae31ee 100644 --- a/examples/democoin/x/cool/keeper_test.go +++ b/examples/democoin/x/cool/keeper_test.go @@ -30,7 +30,7 @@ func TestCoolKeeper(t *testing.T) { auth.RegisterBaseAccount(cdc) am := auth.NewAccountMapper(cdc, capKey, &auth.BaseAccount{}) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, nil, nil) ck := bank.NewKeeper(am) keeper := NewKeeper(capKey, ck, DefaultCodespace) diff --git a/examples/democoin/x/pow/handler_test.go b/examples/democoin/x/pow/handler_test.go index 30aeafa2a5..867120eb84 100644 --- a/examples/democoin/x/pow/handler_test.go +++ b/examples/democoin/x/pow/handler_test.go @@ -20,7 +20,7 @@ func TestPowHandler(t *testing.T) { auth.RegisterBaseAccount(cdc) am := auth.NewAccountMapper(cdc, capKey, &auth.BaseAccount{}) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) config := NewConfig("pow", int64(1)) ck := bank.NewKeeper(am) keeper := NewKeeper(capKey, config, ck, DefaultCodespace) diff --git a/examples/democoin/x/pow/keeper_test.go b/examples/democoin/x/pow/keeper_test.go index a4afb876a9..98e8ebcfea 100644 --- a/examples/democoin/x/pow/keeper_test.go +++ b/examples/democoin/x/pow/keeper_test.go @@ -33,7 +33,7 @@ func TestPowKeeperGetSet(t *testing.T) { auth.RegisterBaseAccount(cdc) am := auth.NewAccountMapper(cdc, capKey, &auth.BaseAccount{}) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) config := NewConfig("pow", int64(1)) ck := bank.NewKeeper(am) keeper := NewKeeper(capKey, config, ck, DefaultCodespace) diff --git a/examples/democoin/x/simplestake/keeper_test.go b/examples/democoin/x/simplestake/keeper_test.go index 515c19cc59..ef34f3085c 100644 --- a/examples/democoin/x/simplestake/keeper_test.go +++ b/examples/democoin/x/simplestake/keeper_test.go @@ -35,9 +35,9 @@ func TestKeeperGetSet(t *testing.T) { cdc := wire.NewCodec() auth.RegisterBaseAccount(cdc) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) stakeKeeper := NewKeeper(capKey, bank.NewKeeper(accountMapper), DefaultCodespace) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) addr := sdk.Address([]byte("some-address")) bi := stakeKeeper.getBondInfo(ctx, addr) @@ -63,7 +63,7 @@ func TestBonding(t *testing.T) { cdc := wire.NewCodec() auth.RegisterBaseAccount(cdc) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) coinKeeper := bank.NewKeeper(accountMapper) diff --git a/mock/app.go b/mock/app.go index ab1a8447a5..09d7a658c7 100644 --- a/mock/app.go +++ b/mock/app.go @@ -88,7 +88,7 @@ type GenesisJSON struct { // with key/value pairs func InitChainer(key sdk.StoreKey) func(sdk.Context, abci.RequestInitChain) abci.ResponseInitChain { return func(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { - stateJSON := req.AppStateBytes + stateJSON := req.GenesisBytes genesisState := new(GenesisJSON) err := json.Unmarshal(stateJSON, genesisState) diff --git a/mock/app_test.go b/mock/app_test.go index be1d778295..50b0761c17 100644 --- a/mock/app_test.go +++ b/mock/app_test.go @@ -26,7 +26,7 @@ func TestInitApp(t *testing.T) { //TODO test validators in the init chain? req := abci.RequestInitChain{ - AppStateBytes: appState, + GenesisBytes: appState, } app.InitChain(req) app.Commit() diff --git a/types/context.go b/types/context.go index 4ab0a5d093..993c148ec5 100644 --- a/types/context.go +++ b/types/context.go @@ -30,7 +30,9 @@ type Context struct { } // create a new context -func NewContext(ms MultiStore, header abci.Header, isCheckTx bool, txBytes []byte, logger log.Logger) Context { +func NewContext(ms MultiStore, header abci.Header, isCheckTx bool, + txBytes []byte, logger log.Logger, absentValidators [][]byte) Context { + c := Context{ Context: context.Background(), pst: newThePast(), @@ -43,6 +45,7 @@ func NewContext(ms MultiStore, header abci.Header, isCheckTx bool, txBytes []byt c = c.WithIsCheckTx(isCheckTx) c = c.WithTxBytes(txBytes) c = c.WithLogger(logger) + c = c.WithAbsentValidators(absentValidators) c = c.WithGasMeter(NewInfiniteGasMeter()) return c } @@ -128,6 +131,7 @@ const ( contextKeyIsCheckTx contextKeyTxBytes contextKeyLogger + contextKeyAbsentValidators contextKeyGasMeter ) @@ -157,6 +161,9 @@ func (c Context) TxBytes() []byte { func (c Context) Logger() log.Logger { return c.Value(contextKeyLogger).(log.Logger) } +func (c Context) AbsentValidators() [][]byte { + return c.Value(contextKeyAbsentValidators).([][]byte) +} func (c Context) GasMeter() GasMeter { return c.Value(contextKeyGasMeter).(GasMeter) } @@ -182,6 +189,9 @@ func (c Context) WithTxBytes(txBytes []byte) Context { func (c Context) WithLogger(logger log.Logger) Context { return c.withValue(contextKeyLogger, logger) } +func (c Context) WithAbsentValidators(AbsentValidators [][]byte) Context { + return c.withValue(contextKeyAbsentValidators, AbsentValidators) +} func (c Context) WithGasMeter(meter GasMeter) Context { return c.withValue(contextKeyGasMeter, meter) } diff --git a/types/context_test.go b/types/context_test.go index ec5faab440..1eafdaf7e7 100644 --- a/types/context_test.go +++ b/types/context_test.go @@ -43,7 +43,7 @@ func (l MockLogger) With(kvs ...interface{}) log.Logger { func TestContextGetOpShouldNeverPanic(t *testing.T) { var ms types.MultiStore - ctx := types.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) + ctx := types.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) indices := []int64{ -10, 1, 0, 10, 20, } @@ -58,7 +58,7 @@ func defaultContext(key types.StoreKey) types.Context { cms := store.NewCommitMultiStore(db) cms.MountStoreWithDB(key, types.StoreTypeIAVL, db) cms.LoadLatestVersion() - ctx := types.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger()) + ctx := types.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger(), nil) return ctx } diff --git a/types/lib/mapper_test.go b/types/lib/mapper_test.go index e1759b06ac..a610f1e0fa 100644 --- a/types/lib/mapper_test.go +++ b/types/lib/mapper_test.go @@ -25,7 +25,7 @@ func defaultComponents(key sdk.StoreKey) (sdk.Context, *wire.Codec) { cms := store.NewCommitMultiStore(db) cms.MountStoreWithDB(key, sdk.StoreTypeIAVL, db) cms.LoadLatestVersion() - ctx := sdk.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger()) + ctx := sdk.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger(), nil) cdc := wire.NewCodec() return ctx, cdc } diff --git a/types/stake.go b/types/stake.go index df74a705b9..e60c4f43cb 100644 --- a/types/stake.go +++ b/types/stake.go @@ -17,11 +17,14 @@ const ( // validator for a delegated proof of stake system type Validator interface { - GetStatus() BondStatus // status of the validator - GetOwner() Address // owner address to receive/return validators coins - GetPubKey() crypto.PubKey // validation pubkey - GetPower() Rat // validation power - GetBondHeight() int64 // height in which the validator became active + GetStatus() BondStatus // status of the validator + GetOwner() Address // owner address to receive/return validators coins + GetPubKey() crypto.PubKey // validation pubkey + GetPower() Rat // validation power + GetBondHeight() int64 // height in which the validator became active + Slash(Context, int64, Rat) // slash the validator and delegators of the validator + // for an offense at a specified height by a specified fraction + ForceUnbond(Context, int64) // force unbond the validator, including a duration which must pass before they can rebond } // validator which fulfills abci validator interface for use in Tendermint diff --git a/types/tags.go b/types/tags.go index 95a826fd78..5a8eb1f473 100644 --- a/types/tags.go +++ b/types/tags.go @@ -25,6 +25,11 @@ func (t Tags) AppendTags(a Tags) Tags { return append(t, a...) } +// Turn tags into KVPair list +func (t Tags) ToKVPairs() []cmn.KVPair { + return []cmn.KVPair(t) +} + // New variadic tags, must be k string, v []byte repeating func NewTags(tags ...interface{}) Tags { var ret Tags diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index b7f22e5d54..729f0769ef 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -75,7 +75,7 @@ func TestAnteHandlerSigErrors(t *testing.T) { mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger(), nil) // keys and addresses priv1, addr1 := privAndAddr() @@ -117,7 +117,7 @@ func TestAnteHandlerSequences(t *testing.T) { mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger(), nil) // keys and addresses priv1, addr1 := privAndAddr() @@ -184,7 +184,7 @@ func TestAnteHandlerFees(t *testing.T) { mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger(), nil) // keys and addresses priv1, addr1 := privAndAddr() @@ -226,7 +226,7 @@ func TestAnteHandlerBadSignBytes(t *testing.T) { mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger(), nil) // keys and addresses priv1, addr1 := privAndAddr() @@ -302,7 +302,7 @@ func TestAnteHandlerSetPubKey(t *testing.T) { mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger(), nil) // keys and addresses priv1, addr1 := privAndAddr() diff --git a/x/auth/context_test.go b/x/auth/context_test.go index a93de44d0c..c4aaca269a 100644 --- a/x/auth/context_test.go +++ b/x/auth/context_test.go @@ -12,8 +12,8 @@ import ( ) func TestContextWithSigners(t *testing.T) { - ms, _, _ := setupMultiStore() - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) + ms, _ := setupMultiStore() + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger(), nil) _, _, addr1 := keyPubAddr() _, _, addr2 := keyPubAddr() diff --git a/x/auth/mapper_test.go b/x/auth/mapper_test.go index 7f6397069a..dc6afef57e 100644 --- a/x/auth/mapper_test.go +++ b/x/auth/mapper_test.go @@ -31,7 +31,7 @@ func TestAccountMapperGetSet(t *testing.T) { RegisterBaseAccount(cdc) // make context and mapper - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) addr := sdk.Address([]byte("some-address")) diff --git a/x/bank/keeper_test.go b/x/bank/keeper_test.go index 117c69e7ae..07ba91e0c5 100644 --- a/x/bank/keeper_test.go +++ b/x/bank/keeper_test.go @@ -31,7 +31,7 @@ func TestKeeper(t *testing.T) { cdc := wire.NewCodec() auth.RegisterBaseAccount(cdc) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) coinKeeper := NewKeeper(accountMapper) @@ -116,7 +116,7 @@ func TestSendKeeper(t *testing.T) { cdc := wire.NewCodec() auth.RegisterBaseAccount(cdc) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) coinKeeper := NewKeeper(accountMapper) sendKeeper := NewSendKeeper(accountMapper) @@ -185,7 +185,7 @@ func TestViewKeeper(t *testing.T) { cdc := wire.NewCodec() auth.RegisterBaseAccount(cdc) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) coinKeeper := NewKeeper(accountMapper) viewKeeper := NewViewKeeper(accountMapper) diff --git a/x/ibc/ibc_test.go b/x/ibc/ibc_test.go index e13df4f8dd..9ed4b38254 100644 --- a/x/ibc/ibc_test.go +++ b/x/ibc/ibc_test.go @@ -24,7 +24,7 @@ func defaultContext(key sdk.StoreKey) sdk.Context { cms := store.NewCommitMultiStore(db) cms.MountStoreWithDB(key, sdk.StoreTypeIAVL, db) cms.LoadLatestVersion() - ctx := sdk.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger()) + ctx := sdk.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger(), nil) return ctx } diff --git a/x/slashing/errors.go b/x/slashing/errors.go new file mode 100644 index 0000000000..bf57c337d7 --- /dev/null +++ b/x/slashing/errors.go @@ -0,0 +1,32 @@ +package slashing + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// Local code type +type CodeType = sdk.CodeType + +const ( + // Default slashing codespace + DefaultCodespace sdk.CodespaceType = 10 +) + +func codeToDefaultMsg(code CodeType) string { + switch code { + default: + return sdk.CodeToDefaultMsg(code) + } +} + +func msgOrDefaultMsg(msg string, code CodeType) string { + if msg != "" { + return msg + } + return codeToDefaultMsg(code) +} + +func newError(codespace sdk.CodespaceType, code CodeType, msg string) sdk.Error { + msg = msgOrDefaultMsg(msg, code) + return sdk.NewError(codespace, code, msg) +} diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go new file mode 100644 index 0000000000..f1aac7f586 --- /dev/null +++ b/x/slashing/keeper.go @@ -0,0 +1,148 @@ +package slashing + +import ( + "encoding/binary" + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/stake" + crypto "github.com/tendermint/go-crypto" +) + +const ( + // MaxEvidenceAge - Max age for evidence - 21 days (3 weeks) + // TODO Should this be a governance parameter or just modifiable with SoftwareUpgradeProposals? + // MaxEvidenceAge = 60 * 60 * 24 * 7 * 3 + // TODO Temporarily set to 2 minutes for testnets. + MaxEvidenceAge int64 = 60 * 2 + + // SignedBlocksWindow - sliding window for downtime slashing + // TODO Governance parameter? + // TODO Temporarily set to 100 blocks for testnets + SignedBlocksWindow int64 = 100 + + // Downtime slashing threshold - 50% + // TODO Governance parameter? + MinSignedPerWindow int64 = SignedBlocksWindow / 2 + + // Downtime unbond duration - 1 day + // TODO Governance parameter? + DowntimeUnbondDuration int64 = 86400 +) + +var ( + // SlashFractionDoubleSign - currently 5% + // TODO Governance parameter? + SlashFractionDoubleSign = sdk.NewRat(1).Quo(sdk.NewRat(20)) + + // SlashFractionDowntime - currently 0 + // TODO Governance parameter? + SlashFractionDowntime = sdk.ZeroRat() +) + +// Keeper of the slashing store +type Keeper struct { + storeKey sdk.StoreKey + cdc *wire.Codec + stakeKeeper stake.Keeper + + // codespace + codespace sdk.CodespaceType +} + +// NewKeeper creates a slashing keeper +func NewKeeper(cdc *wire.Codec, key sdk.StoreKey, sk stake.Keeper, codespace sdk.CodespaceType) Keeper { + keeper := Keeper{ + storeKey: key, + cdc: cdc, + stakeKeeper: sk, + codespace: codespace, + } + return keeper +} + +// handle a validator signing two blocks at the same height +func (k Keeper) handleDoubleSign(ctx sdk.Context, height int64, timestamp int64, pubkey crypto.PubKey) { + logger := ctx.Logger().With("module", "x/slashing") + age := ctx.BlockHeader().Time - timestamp + if age > MaxEvidenceAge { + logger.Info(fmt.Sprintf("Ignored double sign from %v at height %d, age of %d past max age of %d", pubkey.Address(), height, age, MaxEvidenceAge)) + return + } + logger.Info(fmt.Sprintf("Confirmed double sign from %v at height %d, age of %d less than max age of %d", pubkey.Address(), height, age, MaxEvidenceAge)) + validator := k.stakeKeeper.Validator(ctx, pubkey.Address()) + validator.Slash(ctx, height, SlashFractionDoubleSign) + logger.Info(fmt.Sprintf("Slashed validator %s by fraction %v for double-sign at height %d", pubkey.Address(), SlashFractionDoubleSign, height)) +} + +// handle a validator signature, must be called once per validator per block +func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, signed bool) { + logger := ctx.Logger().With("module", "x/slashing") + height := ctx.BlockHeight() + if !signed { + logger.Info(fmt.Sprintf("Absent validator %v at height %d", pubkey.Address(), height)) + } + index := height % SignedBlocksWindow + address := pubkey.Address() + signInfo := k.getValidatorSigningInfo(ctx, address) + previous := k.getValidatorSigningBitArray(ctx, address, index) + if previous && !signed { + k.setValidatorSigningBitArray(ctx, address, index, false) + signInfo.SignedBlocksCounter-- + k.setValidatorSigningInfo(ctx, address, signInfo) + } else if !previous && signed { + k.setValidatorSigningBitArray(ctx, address, index, true) + signInfo.SignedBlocksCounter++ + k.setValidatorSigningInfo(ctx, address, signInfo) + } + minHeight := signInfo.StartHeight + SignedBlocksWindow + if height > minHeight && signInfo.SignedBlocksCounter < MinSignedPerWindow { + validator := k.stakeKeeper.Validator(ctx, address) + validator.Slash(ctx, height, SlashFractionDowntime) + validator.ForceUnbond(ctx, DowntimeUnbondDuration) + logger.Info(fmt.Sprintf("Slashed validator %s by fraction %v and unbonded for downtime at height %d, cannot rebond for %ds", + address, SlashFractionDowntime, height, DowntimeUnbondDuration)) + } +} + +func (k Keeper) getValidatorSigningInfo(ctx sdk.Context, address sdk.Address) (info validatorSigningInfo) { + store := ctx.KVStore(k.storeKey) + bz := store.Get(validatorSigningInfoKey(address)) + k.cdc.MustUnmarshalBinary(bz, &info) + return +} + +func (k Keeper) setValidatorSigningInfo(ctx sdk.Context, address sdk.Address, info validatorSigningInfo) { + store := ctx.KVStore(k.storeKey) + bz := k.cdc.MustMarshalBinary(info) + store.Set(validatorSigningInfoKey(address), bz) +} + +func (k Keeper) getValidatorSigningBitArray(ctx sdk.Context, address sdk.Address, index int64) (signed bool) { + store := ctx.KVStore(k.storeKey) + bz := store.Get(validatorSigningBitArrayKey(address, index)) + k.cdc.MustUnmarshalBinary(bz, &signed) + return +} + +func (k Keeper) setValidatorSigningBitArray(ctx sdk.Context, address sdk.Address, index int64, signed bool) { + store := ctx.KVStore(k.storeKey) + bz := k.cdc.MustMarshalBinary(signed) + store.Set(validatorSigningBitArrayKey(address, index), bz) +} + +type validatorSigningInfo struct { + StartHeight int64 `json:"start_height"` + SignedBlocksCounter int64 `json:"signed_blocks_counter"` +} + +func validatorSigningInfoKey(v sdk.Address) []byte { + return append([]byte{0x01}, v.Bytes()...) +} + +func validatorSigningBitArrayKey(v sdk.Address, i int64) []byte { + b := make([]byte, 8) + binary.LittleEndian.PutUint64(b, uint64(i)) + return append([]byte{0x02}, append(v.Bytes(), b...)...) +} diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go new file mode 100644 index 0000000000..9085a7ae60 --- /dev/null +++ b/x/slashing/keeper_test.go @@ -0,0 +1,17 @@ +package slashing + +import ( + "testing" + + "github.com/stretchr/testify/require" + // sdk "github.com/cosmos/cosmos-sdk/types" +) + +func TestHandleDoubleSign(t *testing.T) { + require.Equal(t, true, true) + // TODO +} + +func TestHandleAbsentValidator(t *testing.T) { + // TODO +} diff --git a/x/slashing/tick.go b/x/slashing/tick.go new file mode 100644 index 0000000000..e76c06abe3 --- /dev/null +++ b/x/slashing/tick.go @@ -0,0 +1,44 @@ +package slashing + +import ( + "bytes" + "encoding/binary" + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + abci "github.com/tendermint/abci/types" + crypto "github.com/tendermint/go-crypto" +) + +func NewBeginBlocker(sk Keeper) sdk.BeginBlocker { + return func(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { + heightBytes := make([]byte, 8) + binary.LittleEndian.PutUint64(heightBytes, uint64(req.Header.Height)) + tags := sdk.NewTags("height", heightBytes) + for _, evidence := range req.ByzantineValidators { + var pk crypto.PubKey + sk.cdc.MustUnmarshalBinary(evidence.PubKey, &pk) + switch { + case bytes.Compare(evidence.Type, []byte("doubleSign")) == 0: + sk.handleDoubleSign(ctx, evidence.Height, evidence.Time, pk) + default: + ctx.Logger().With("module", "x/slashing").Error(fmt.Sprintf("Ignored unknown evidence type: %s", string(evidence.Type))) + } + } + absent := make(map[string]bool) + for _, pubkey := range req.AbsentValidators { + var pk crypto.PubKey + sk.cdc.MustUnmarshalBinary(pubkey, &pk) + absent[string(pk.Bytes())] = true + } + sk.stakeKeeper.IterateValidatorsBonded(ctx, func(_ int64, validator sdk.Validator) (stop bool) { + pubkey := validator.GetPubKey() + sk.handleValidatorSignature(ctx, pubkey, !absent[string(pubkey.Bytes())]) + return false + }) + // TODO Add some more tags so clients can track slashing + return abci.ResponseBeginBlock{ + Tags: tags.ToKVPairs(), + } + } +} diff --git a/x/stake/test_common.go b/x/stake/test_common.go index b7a5152c09..1cd46549b0 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -103,7 +103,7 @@ func createTestInput(t *testing.T, isCheckTx bool, initCoins int64) (sdk.Context err := ms.LoadLatestVersion() require.Nil(t, err) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "foochainid"}, isCheckTx, nil, log.NewNopLogger()) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "foochainid"}, isCheckTx, nil, log.NewNopLogger(), nil) cdc := makeTestCodec() accountMapper := auth.NewAccountMapper( cdc, // amino codec diff --git a/x/stake/validator.go b/x/stake/validator.go index 88f061f315..7848724fd6 100644 --- a/x/stake/validator.go +++ b/x/stake/validator.go @@ -236,3 +236,9 @@ func (v Validator) GetOwner() sdk.Address { return v.Owner } func (v Validator) GetPubKey() crypto.PubKey { return v.PubKey } func (v Validator) GetPower() sdk.Rat { return v.PoolShares.Bonded() } func (v Validator) GetBondHeight() int64 { return v.BondHeight } +func (v Validator) Slash(ctx sdk.Context, height int64, fraction sdk.Rat) { + panic("not implemented") +} +func (v Validator) ForceUnbond(ctx sdk.Context, jailDuration int64) { + panic("not implemented") +} From 67f7f31ba9bb3c19e7aec03aa27511f0ba63db48 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 23 May 2018 22:52:56 +0200 Subject: [PATCH 048/548] Fix testcases by mounting store --- cmd/gaia/app/app.go | 2 +- x/slashing/keeper.go | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index 7ad3709a10..28904e1ac9 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -87,8 +87,8 @@ func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { app.SetInitChainer(app.initChainer) app.SetBeginBlocker(slashing.NewBeginBlocker(app.slashingKeeper)) app.SetEndBlocker(stake.NewEndBlocker(app.stakeKeeper)) - app.MountStoresIAVL(app.keyMain, app.keyAccount, app.keyIBC, app.keyStake) app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, app.feeCollectionKeeper)) + app.MountStoresIAVL(app.keyMain, app.keyAccount, app.keyIBC, app.keyStake, app.keySlashing) err := app.LoadLatestVersion(app.keyMain) if err != nil { cmn.Exit(err.Error()) diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index f1aac7f586..4945da6a74 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -85,7 +85,7 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, } index := height % SignedBlocksWindow address := pubkey.Address() - signInfo := k.getValidatorSigningInfo(ctx, address) + signInfo, _ := k.getValidatorSigningInfo(ctx, address) previous := k.getValidatorSigningBitArray(ctx, address, index) if previous && !signed { k.setValidatorSigningBitArray(ctx, address, index, false) @@ -106,10 +106,15 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, } } -func (k Keeper) getValidatorSigningInfo(ctx sdk.Context, address sdk.Address) (info validatorSigningInfo) { +func (k Keeper) getValidatorSigningInfo(ctx sdk.Context, address sdk.Address) (info validatorSigningInfo, found bool) { store := ctx.KVStore(k.storeKey) bz := store.Get(validatorSigningInfoKey(address)) - k.cdc.MustUnmarshalBinary(bz, &info) + if bz == nil { + found = false + } else { + k.cdc.MustUnmarshalBinary(bz, &info) + found = true + } return } @@ -122,7 +127,12 @@ func (k Keeper) setValidatorSigningInfo(ctx sdk.Context, address sdk.Address, in func (k Keeper) getValidatorSigningBitArray(ctx sdk.Context, address sdk.Address, index int64) (signed bool) { store := ctx.KVStore(k.storeKey) bz := store.Get(validatorSigningBitArrayKey(address, index)) - k.cdc.MustUnmarshalBinary(bz, &signed) + if bz == nil { + // lazy: treat empty key as unsigned + signed = false + } else { + k.cdc.MustUnmarshalBinary(bz, &signed) + } return } From adec1cd7a956dad6d9a3050fee8d015f514ef262 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 24 May 2018 01:56:54 +0200 Subject: [PATCH 049/548] Fix dependencies, gaiacli build issue persists --- Gopkg.lock | 20 ++++++++++---------- Gopkg.toml | 13 +++++-------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 7f1f6185e6..286760d609 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -250,10 +250,10 @@ "leveldb/table", "leveldb/util" ] - revision = "e6d6b529196422703d54ff5c40e79809ec2020b3" + revision = "5d6fca44a948d2be89a9702de7717f0168403d3d" [[projects]] - branch = "cwgoes/timestamp-in-evidence" + branch = "develop" name = "github.com/tendermint/abci" packages = [ "client", @@ -262,7 +262,7 @@ "server", "types" ] - revision = "e196dacf804e3a4ab74252c27e99cb17b39bf501" + revision = "f9dce537281ffba5d1e047e6729429f7e5fb90c9" [[projects]] branch = "master" @@ -299,7 +299,7 @@ ".", "sha256truncated" ] - revision = "9b6f9c3f49d599cfcf43f1a56c3c22882d1f9f21" + revision = "c9206995e8f948e99927f5084a88a7e94ca256da" [[projects]] branch = "cwgoes/update-abci" @@ -357,8 +357,8 @@ "log", "merkle" ] - revision = "cc5f287c4798ffe88c04d02df219ecb6932080fd" - version = "v0.8.3-rc0" + revision = "d970af87248a4e162590300dbb74e102183a417d" + version = "v0.8.3" [[projects]] branch = "master" @@ -374,7 +374,7 @@ "ripemd160", "salsa20/salsa" ] - revision = "1a580b3eff7814fc9b40602fd35256c63b50f491" + revision = "75e913eb8a8e3d31a97b216de09de106a7b07681" [[projects]] branch = "master" @@ -388,13 +388,13 @@ "internal/timeseries", "trace" ] - revision = "57065200b4b034a1c8ad54ff77069408c2218ae6" + revision = "9ef9f5bb98a1fdc41f8cf6c250a4404b4085e389" [[projects]] branch = "master" name = "golang.org/x/sys" packages = ["unix"] - revision = "7c87d13f8e835d2fb3a70a2912c811ed0c1d241b" + revision = "77b0e4315053a57ed2962443614bdb28db152054" [[projects]] name = "golang.org/x/text" @@ -455,6 +455,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "2bb789b91c383e3a861979c83e61f5f8fd71ea5661837c092353aaacf3091de1" + inputs-digest = "bbc0ee39f39cb296960a5fcb2a3916a4acc48ecbb675758ea1f61def44e994bb" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 05b01bfaef..53dbabbbb3 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -54,29 +54,25 @@ [[override]] name = "github.com/tendermint/abci" - branch = "cwgoes/timestamp-in-evidence" + branch = "develop" [[constraint]] name = "github.com/tendermint/go-crypto" version = "~0.6.2" -[[override]] - name = "github.com/tendermint/go-wire" - version = "0.7.3" - [[constraint]] name = "github.com/tendermint/go-amino" version = "~0.9.9" -[[constraint]] +[[override]] name = "github.com/tendermint/iavl" branch = "develop" -[[constraint]] +[[override]] name = "github.com/tendermint/tendermint" branch = "cwgoes/update-abci" -[[override]] +[[constraint]] name = "github.com/tendermint/tmlibs" version = "~0.8.3-rc0" @@ -88,3 +84,4 @@ [prune] go-tests = true unused-packages = true + From b005f9f18d7116c7d4e17a5cd438d6ea2cebb746 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 24 May 2018 23:51:42 +0200 Subject: [PATCH 050/548] Validator by pubkey, tests work-in-progress --- types/stake.go | 5 +- x/slashing/keeper.go | 10 +++- x/slashing/keeper_test.go | 97 ++++++++++++++++++++++++++++++++++++++- x/stake/keeper.go | 22 +++++++++ x/stake/keeper_keys.go | 20 +++++--- 5 files changed, 141 insertions(+), 13 deletions(-) diff --git a/types/stake.go b/types/stake.go index e60c4f43cb..6e3d02c3d3 100644 --- a/types/stake.go +++ b/types/stake.go @@ -45,8 +45,9 @@ type ValidatorSet interface { IterateValidatorsBonded(Context, func(index int64, validator Validator) (stop bool)) - Validator(Context, Address) Validator // get a particular validator by owner address - TotalPower(Context) Rat // total power of the validator set + Validator(Context, Address) Validator // get a particular validator by owner address + ValidatorByPubKey(Context, crypto.PubKey) Validator // get a particular validator by public key + TotalPower(Context) Rat // total power of the validator set } //_______________________________________________________________________________ diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index 4945da6a74..686f84b65c 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -71,7 +71,10 @@ func (k Keeper) handleDoubleSign(ctx sdk.Context, height int64, timestamp int64, return } logger.Info(fmt.Sprintf("Confirmed double sign from %v at height %d, age of %d less than max age of %d", pubkey.Address(), height, age, MaxEvidenceAge)) - validator := k.stakeKeeper.Validator(ctx, pubkey.Address()) + validator := k.stakeKeeper.ValidatorByPubKey(ctx, pubkey) + if validator == nil { + panic(fmt.Errorf("Attempted to slash nonexistent validator with address %s", pubkey.Address())) + } validator.Slash(ctx, height, SlashFractionDoubleSign) logger.Info(fmt.Sprintf("Slashed validator %s by fraction %v for double-sign at height %d", pubkey.Address(), SlashFractionDoubleSign, height)) } @@ -98,7 +101,10 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, } minHeight := signInfo.StartHeight + SignedBlocksWindow if height > minHeight && signInfo.SignedBlocksCounter < MinSignedPerWindow { - validator := k.stakeKeeper.Validator(ctx, address) + validator := k.stakeKeeper.ValidatorByPubKey(ctx, pubkey) + if validator == nil { + panic(fmt.Errorf("Attempted to slash nonexistent validator with address %s", pubkey.Address())) + } validator.Slash(ctx, height, SlashFractionDowntime) validator.ForceUnbond(ctx, DowntimeUnbondDuration) logger.Info(fmt.Sprintf("Slashed validator %s by fraction %v and unbonded for downtime at height %d, cannot rebond for %ds", diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 9085a7ae60..f360fd9e99 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -1,17 +1,110 @@ package slashing import ( + "encoding/hex" "testing" "github.com/stretchr/testify/require" - // sdk "github.com/cosmos/cosmos-sdk/types" + + abci "github.com/tendermint/abci/types" + crypto "github.com/tendermint/go-crypto" + dbm "github.com/tendermint/tmlibs/db" + "github.com/tendermint/tmlibs/log" + + "github.com/cosmos/cosmos-sdk/store" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/cosmos/cosmos-sdk/x/stake" ) +var ( + addrs = []sdk.Address{ + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6160"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6161"), + } + pks = []crypto.PubKey{ + newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB50"), + newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB51"), + } + initCoins int64 = 100 +) + +func createTestCodec() *wire.Codec { + cdc := wire.NewCodec() + sdk.RegisterWire(cdc) + auth.RegisterWire(cdc) + bank.RegisterWire(cdc) + stake.RegisterWire(cdc) + wire.RegisterCrypto(cdc) + return cdc +} + +func createTestInput(t *testing.T) (sdk.Context, bank.Keeper, stake.Keeper, Keeper) { + keyAcc := sdk.NewKVStoreKey("acc") + keyStake := sdk.NewKVStoreKey("stake") + keySlashing := sdk.NewKVStoreKey("slashing") + db := dbm.NewMemDB() + ms := store.NewCommitMultiStore(db) + ms.MountStoreWithDB(keyAcc, sdk.StoreTypeIAVL, db) + ms.MountStoreWithDB(keyStake, sdk.StoreTypeIAVL, db) + ms.MountStoreWithDB(keySlashing, sdk.StoreTypeIAVL, db) + err := ms.LoadLatestVersion() + require.Nil(t, err) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) + cdc := createTestCodec() + accountMapper := auth.NewAccountMapper(cdc, keyAcc, &auth.BaseAccount{}) + ck := bank.NewKeeper(accountMapper) + sk := stake.NewKeeper(cdc, keyStake, ck, stake.DefaultCodespace) + stake.InitGenesis(ctx, sk, stake.DefaultGenesisState()) + for _, addr := range addrs { + ck.AddCoins(ctx, addr, sdk.Coins{ + {sk.GetParams(ctx).BondDenom, initCoins}, + }) + } + keeper := NewKeeper(cdc, keySlashing, sk, DefaultCodespace) + return ctx, ck, sk, keeper +} + func TestHandleDoubleSign(t *testing.T) { - require.Equal(t, true, true) + ctx, ck, sk, keeper := createTestInput(t) + addr, val, amt := addrs[0], pks[0], int64(10) + got := stake.NewHandler(sk)(ctx, newTestMsgDeclareCandidacy(addr, val, amt)) + require.True(t, got.IsOK()) + _ = sk.Tick(ctx) + require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) + keeper.handleDoubleSign(ctx, 0, 0, val) // TODO } func TestHandleAbsentValidator(t *testing.T) { // TODO } + +func newPubKey(pk string) (res crypto.PubKey) { + pkBytes, err := hex.DecodeString(pk) + if err != nil { + panic(err) + } + var pkEd crypto.PubKeyEd25519 + copy(pkEd[:], pkBytes[:]) + return pkEd +} + +func testAddr(addr string) sdk.Address { + res, err := sdk.GetAddress(addr) + if err != nil { + panic(err) + } + return res +} + +func newTestMsgDeclareCandidacy(address sdk.Address, pubKey crypto.PubKey, amt int64) stake.MsgDeclareCandidacy { + return stake.MsgDeclareCandidacy{ + Description: stake.Description{}, + ValidatorAddr: address, + PubKey: pubKey, + Bond: sdk.Coin{"steak", amt}, + } +} diff --git a/x/stake/keeper.go b/x/stake/keeper.go index ce84b1e177..f46cc6f23a 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -8,6 +8,7 @@ import ( "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/bank" abci "github.com/tendermint/abci/types" + crypto "github.com/tendermint/go-crypto" ) // keeper of the staking store @@ -38,6 +39,18 @@ func (k Keeper) GetValidator(ctx sdk.Context, addr sdk.Address) (validator Valid return k.getValidator(store, addr) } +// get a single validator by pubkey +func (k Keeper) GetValidatorByPubKey(ctx sdk.Context, pubkey crypto.PubKey) (validator Validator, found bool) { + store := ctx.KVStore(k.storeKey) + b := store.Get(GetValidatorByPubKeyKey(pubkey)) + if b == nil { + return validator, false + } + var addr sdk.Address + k.cdc.MustUnmarshalBinary(b, &addr) + return k.getValidator(store, addr) +} + // get a single validator (reuse store) func (k Keeper) getValidator(store sdk.KVStore, addr sdk.Address) (validator Validator, found bool) { b := store.Get(GetValidatorKey(addr)) @@ -710,6 +723,15 @@ func (k Keeper) Validator(ctx sdk.Context, addr sdk.Address) sdk.Validator { return val } +// get the sdk.validator for a particular pubkey +func (k Keeper) ValidatorByPubKey(ctx sdk.Context, pubkey crypto.PubKey) sdk.Validator { + val, found := k.GetValidatorByPubKey(ctx, pubkey) + if !found { + return nil + } + return val +} + // total power from the bond func (k Keeper) TotalPower(ctx sdk.Context) sdk.Rat { pool := k.GetPool(ctx) diff --git a/x/stake/keeper_keys.go b/x/stake/keeper_keys.go index 5a84d08f29..e09a47ecab 100644 --- a/x/stake/keeper_keys.go +++ b/x/stake/keeper_keys.go @@ -16,13 +16,14 @@ var ( ParamKey = []byte{0x00} // key for parameters relating to staking PoolKey = []byte{0x01} // key for the staking pools ValidatorsKey = []byte{0x02} // prefix for each key to a validator - ValidatorsBondedKey = []byte{0x03} // prefix for each key to bonded/actively validating validators - ValidatorsByPowerKey = []byte{0x04} // prefix for each key to a validator sorted by power - ValidatorCliffKey = []byte{0x05} // key for block-local tx index - ValidatorPowerCliffKey = []byte{0x06} // key for block-local tx index - TendermintUpdatesKey = []byte{0x07} // prefix for each key to a validator which is being updated - DelegationKey = []byte{0x08} // prefix for each key to a delegator's bond - IntraTxCounterKey = []byte{0x09} // key for block-local tx index + ValidatorsByPubKeyKey = []byte{0x03} // prefix for each key to a validator by pubkey + ValidatorsBondedKey = []byte{0x04} // prefix for each key to bonded/actively validating validators + ValidatorsByPowerKey = []byte{0x05} // prefix for each key to a validator sorted by power + ValidatorCliffKey = []byte{0x06} // key for block-local tx index + ValidatorPowerCliffKey = []byte{0x07} // key for block-local tx index + TendermintUpdatesKey = []byte{0x08} // prefix for each key to a validator which is being updated + DelegationKey = []byte{0x09} // prefix for each key to a delegator's bond + IntraTxCounterKey = []byte{0x10} // key for block-local tx index ) const maxDigitsForAccount = 12 // ~220,000,000 atoms created at launch @@ -32,6 +33,11 @@ func GetValidatorKey(ownerAddr sdk.Address) []byte { return append(ValidatorsKey, ownerAddr.Bytes()...) } +// get the key for the validator with pubkey +func GetValidatorByPubKeyKey(pubkey crypto.PubKey) []byte { + return append(ValidatorsByPubKeyKey, pubkey.Bytes()...) +} + // get the key for the current validator group, ordered like tendermint func GetValidatorsBondedKey(pk crypto.PubKey) []byte { addr := pk.Address() From 66b4461543ef3ccd9572ac558611647d7607b976 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 24 May 2018 23:55:13 +0200 Subject: [PATCH 051/548] Update pointer-by-pubkey store on set and delete --- x/stake/keeper.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/x/stake/keeper.go b/x/stake/keeper.go index f46cc6f23a..83c5b0a0e8 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -64,8 +64,12 @@ func (k Keeper) getValidator(store sdk.KVStore, addr sdk.Address) (validator Val // set the main record holding validator details func (k Keeper) setValidator(ctx sdk.Context, validator Validator) { store := ctx.KVStore(k.storeKey) + // set main store bz := k.cdc.MustMarshalBinary(validator) store.Set(GetValidatorKey(validator.Owner), bz) + // set pointer by pubkey + bz = k.cdc.MustMarshalBinary(validator.Owner) + store.Set(GetValidatorByPubKeyKey(validator.PubKey), bz) } // Get the set of all validators with no limits, used during genesis dump @@ -483,6 +487,7 @@ func (k Keeper) removeValidator(ctx sdk.Context, address sdk.Address) { store := ctx.KVStore(k.storeKey) pool := k.getPool(store) store.Delete(GetValidatorKey(address)) + store.Delete(GetValidatorByPubKeyKey(validator.PubKey)) store.Delete(GetValidatorsByPowerKey(validator, pool)) // delete from the current and power weighted validator groups if the validator From 366d8f932356f63e72888764c8fcd33d9889b4eb Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 25 May 2018 00:12:40 +0200 Subject: [PATCH 052/548] Slash() and ForceUnbond() are functions of ValidatorSet, not Validator --- types/stake.go | 15 +++++++-------- x/slashing/keeper.go | 14 +++----------- x/stake/keeper.go | 8 ++++++++ x/stake/validator.go | 6 ------ 4 files changed, 18 insertions(+), 25 deletions(-) diff --git a/types/stake.go b/types/stake.go index 6e3d02c3d3..fed241d014 100644 --- a/types/stake.go +++ b/types/stake.go @@ -17,14 +17,11 @@ const ( // validator for a delegated proof of stake system type Validator interface { - GetStatus() BondStatus // status of the validator - GetOwner() Address // owner address to receive/return validators coins - GetPubKey() crypto.PubKey // validation pubkey - GetPower() Rat // validation power - GetBondHeight() int64 // height in which the validator became active - Slash(Context, int64, Rat) // slash the validator and delegators of the validator - // for an offense at a specified height by a specified fraction - ForceUnbond(Context, int64) // force unbond the validator, including a duration which must pass before they can rebond + GetStatus() BondStatus // status of the validator + GetOwner() Address // owner address to receive/return validators coins + GetPubKey() crypto.PubKey // validation pubkey + GetPower() Rat // validation power + GetBondHeight() int64 // height in which the validator became active } // validator which fulfills abci validator interface for use in Tendermint @@ -48,6 +45,8 @@ type ValidatorSet interface { Validator(Context, Address) Validator // get a particular validator by owner address ValidatorByPubKey(Context, crypto.PubKey) Validator // get a particular validator by public key TotalPower(Context) Rat // total power of the validator set + Slash(Context, crypto.PubKey, int64, Rat) // slash the validator and delegators of the validator, specifying offence height & slash fraction + ForceUnbond(Context, crypto.PubKey, int64) // force unbond the validator, including a duration which must pass before they can rebond } //_______________________________________________________________________________ diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index 686f84b65c..17cf349ad3 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -71,11 +71,7 @@ func (k Keeper) handleDoubleSign(ctx sdk.Context, height int64, timestamp int64, return } logger.Info(fmt.Sprintf("Confirmed double sign from %v at height %d, age of %d less than max age of %d", pubkey.Address(), height, age, MaxEvidenceAge)) - validator := k.stakeKeeper.ValidatorByPubKey(ctx, pubkey) - if validator == nil { - panic(fmt.Errorf("Attempted to slash nonexistent validator with address %s", pubkey.Address())) - } - validator.Slash(ctx, height, SlashFractionDoubleSign) + k.stakeKeeper.Slash(ctx, pubkey, height, SlashFractionDoubleSign) logger.Info(fmt.Sprintf("Slashed validator %s by fraction %v for double-sign at height %d", pubkey.Address(), SlashFractionDoubleSign, height)) } @@ -101,12 +97,8 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, } minHeight := signInfo.StartHeight + SignedBlocksWindow if height > minHeight && signInfo.SignedBlocksCounter < MinSignedPerWindow { - validator := k.stakeKeeper.ValidatorByPubKey(ctx, pubkey) - if validator == nil { - panic(fmt.Errorf("Attempted to slash nonexistent validator with address %s", pubkey.Address())) - } - validator.Slash(ctx, height, SlashFractionDowntime) - validator.ForceUnbond(ctx, DowntimeUnbondDuration) + k.stakeKeeper.Slash(ctx, pubkey, height, SlashFractionDowntime) + k.stakeKeeper.ForceUnbond(ctx, pubkey, DowntimeUnbondDuration) logger.Info(fmt.Sprintf("Slashed validator %s by fraction %v and unbonded for downtime at height %d, cannot rebond for %ds", address, SlashFractionDowntime, height, DowntimeUnbondDuration)) } diff --git a/x/stake/keeper.go b/x/stake/keeper.go index 83c5b0a0e8..46790e8490 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -776,3 +776,11 @@ func (k Keeper) IterateDelegators(ctx sdk.Context, delAddr sdk.Address, fn func( } iterator.Close() } + +// slash a validator +func (k Keeper) Slash(ctx sdk.Context, pubkey crypto.PubKey, height int64, fraction sdk.Rat) { +} + +// force unbond a validator +func (k Keeper) ForceUnbond(ctx sdk.Context, pubkey crypto.PubKey, jailDuration int64) { +} diff --git a/x/stake/validator.go b/x/stake/validator.go index 7848724fd6..88f061f315 100644 --- a/x/stake/validator.go +++ b/x/stake/validator.go @@ -236,9 +236,3 @@ func (v Validator) GetOwner() sdk.Address { return v.Owner } func (v Validator) GetPubKey() crypto.PubKey { return v.PubKey } func (v Validator) GetPower() sdk.Rat { return v.PoolShares.Bonded() } func (v Validator) GetBondHeight() int64 { return v.BondHeight } -func (v Validator) Slash(ctx sdk.Context, height int64, fraction sdk.Rat) { - panic("not implemented") -} -func (v Validator) ForceUnbond(ctx sdk.Context, jailDuration int64) { - panic("not implemented") -} From 7da5833b8109e574e8e461827ff15785fb11b2da Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 25 May 2018 01:03:26 +0200 Subject: [PATCH 053/548] Implement ValidatorSet.Slash --- x/slashing/keeper.go | 3 --- x/slashing/keeper_test.go | 6 ++++-- x/stake/keeper.go | 20 ++++++++++++++++++++ x/stake/validator.go | 15 +++++++++++++++ 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index 17cf349ad3..6ec093dc65 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -72,7 +72,6 @@ func (k Keeper) handleDoubleSign(ctx sdk.Context, height int64, timestamp int64, } logger.Info(fmt.Sprintf("Confirmed double sign from %v at height %d, age of %d less than max age of %d", pubkey.Address(), height, age, MaxEvidenceAge)) k.stakeKeeper.Slash(ctx, pubkey, height, SlashFractionDoubleSign) - logger.Info(fmt.Sprintf("Slashed validator %s by fraction %v for double-sign at height %d", pubkey.Address(), SlashFractionDoubleSign, height)) } // handle a validator signature, must be called once per validator per block @@ -99,8 +98,6 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, if height > minHeight && signInfo.SignedBlocksCounter < MinSignedPerWindow { k.stakeKeeper.Slash(ctx, pubkey, height, SlashFractionDowntime) k.stakeKeeper.ForceUnbond(ctx, pubkey, DowntimeUnbondDuration) - logger.Info(fmt.Sprintf("Slashed validator %s by fraction %v and unbonded for downtime at height %d, cannot rebond for %ds", - address, SlashFractionDowntime, height, DowntimeUnbondDuration)) } } diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index f360fd9e99..54461aa31e 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -2,6 +2,7 @@ package slashing import ( "encoding/hex" + "os" "testing" "github.com/stretchr/testify/require" @@ -52,7 +53,7 @@ func createTestInput(t *testing.T) (sdk.Context, bank.Keeper, stake.Keeper, Keep ms.MountStoreWithDB(keySlashing, sdk.StoreTypeIAVL, db) err := ms.LoadLatestVersion() require.Nil(t, err) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewTMLogger(os.Stdout), nil) cdc := createTestCodec() accountMapper := auth.NewAccountMapper(cdc, keyAcc, &auth.BaseAccount{}) ck := bank.NewKeeper(accountMapper) @@ -74,8 +75,9 @@ func TestHandleDoubleSign(t *testing.T) { require.True(t, got.IsOK()) _ = sk.Tick(ctx) require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) + require.Equal(t, sdk.NewRat(amt), sk.Validator(ctx, addr).GetPower()) keeper.handleDoubleSign(ctx, 0, 0, val) - // TODO + require.Equal(t, sdk.NewRat(amt).Mul(sdk.NewRat(19).Quo(sdk.NewRat(20))), sk.Validator(ctx, addr).GetPower()) } func TestHandleAbsentValidator(t *testing.T) { diff --git a/x/stake/keeper.go b/x/stake/keeper.go index 46790e8490..7d5073399b 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -779,8 +779,28 @@ func (k Keeper) IterateDelegators(ctx sdk.Context, delAddr sdk.Address, fn func( // slash a validator func (k Keeper) Slash(ctx sdk.Context, pubkey crypto.PubKey, height int64, fraction sdk.Rat) { + // TODO height ignored for now, see https://github.com/cosmos/cosmos-sdk/pull/1011#issuecomment-390253957 + val, found := k.GetValidatorByPubKey(ctx, pubkey) + if !found { + panic(fmt.Errorf("Attempted to slash a nonexistent validator with pubkey %s", pubkey)) + } + sharesToRemove := val.PoolShares.Amount.Mul(fraction) + pool := k.GetPool(ctx) + val, pool, burned := val.removePoolShares(pool, sharesToRemove) + k.setPool(ctx, pool) // update the pool + k.updateValidator(ctx, val) // update the validator, possibly kicking it out + ctx.Logger().With("module", "x/stake").Info(fmt.Sprintf("Validator %v slashed by fraction %v, removed %v shares and burned %d tokens", pubkey, fraction, sharesToRemove, burned)) + return } // force unbond a validator func (k Keeper) ForceUnbond(ctx sdk.Context, pubkey crypto.PubKey, jailDuration int64) { + // TODO Implement + /* + val, found := k.GetValidatorByPubKey(ctx, pubkey) + if !found { + ctx.Logger().Info("Validator with pubkey %s not found, cannot force unbond", pubkey) + return + } + */ } diff --git a/x/stake/validator.go b/x/stake/validator.go index 88f061f315..31ef290618 100644 --- a/x/stake/validator.go +++ b/x/stake/validator.go @@ -153,6 +153,21 @@ func (v Validator) UpdateStatus(pool Pool, NewStatus sdk.BondStatus) (Validator, return v, pool } +// Remove & burn pool shares, e.g. when slashing a validator +func (v Validator) removePoolShares(pool Pool, amt sdk.Rat) (Validator, Pool, int64) { + var tokens int64 + switch v.Status() { + case sdk.Unbonded: + pool, tokens = pool.removeSharesUnbonded(amt) + case sdk.Unbonding: + pool, tokens = pool.removeSharesUnbonding(amt) + case sdk.Bonded: + pool, tokens = pool.removeSharesBonded(amt) + } + v.PoolShares.Amount = v.PoolShares.Amount.Sub(amt) + return v, pool, tokens +} + // XXX TEST // get the power or potential power for a validator // if bonded, the power is the BondedShares From 14744cff20df53e93ac89679371c76da58f9901e Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 25 May 2018 01:07:18 +0200 Subject: [PATCH 054/548] Update for new Tendermint RPC interface --- client/tx/search.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/client/tx/search.go b/client/tx/search.go index 527661626a..672f29ff14 100644 --- a/client/tx/search.go +++ b/client/tx/search.go @@ -61,15 +61,12 @@ func searchTx(ctx context.CoreContext, cdc *wire.Codec, tags []string) ([]byte, } prove := !viper.GetBool(client.FlagTrustNode) - // TODO: take these as args - page := 0 - perPage := 100 - res, err := node.TxSearch(query, prove, page, perPage) + txs, err := node.TxSearch(query, prove) if err != nil { return nil, err } - info, err := formatTxResults(cdc, res.Txs) + info, err := formatTxResults(cdc, txs) if err != nil { return nil, err } From be4b140003874980e86ab180432e5a2ca8c99650 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 25 May 2018 01:30:43 +0200 Subject: [PATCH 055/548] Add testcase past max evidence age --- x/slashing/keeper_test.go | 5 ++++- x/stake/keeper.go | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 54461aa31e..3204ea7aa8 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -76,7 +76,10 @@ func TestHandleDoubleSign(t *testing.T) { _ = sk.Tick(ctx) require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) require.Equal(t, sdk.NewRat(amt), sk.Validator(ctx, addr).GetPower()) - keeper.handleDoubleSign(ctx, 0, 0, val) + keeper.handleDoubleSign(ctx, 0, 0, val) // double sign less than max age + require.Equal(t, sdk.NewRat(amt).Mul(sdk.NewRat(19).Quo(sdk.NewRat(20))), sk.Validator(ctx, addr).GetPower()) + ctx = ctx.WithBlockHeader(abci.Header{Time: 300}) + keeper.handleDoubleSign(ctx, 0, 0, val) // double sign past max age require.Equal(t, sdk.NewRat(amt).Mul(sdk.NewRat(19).Quo(sdk.NewRat(20))), sk.Validator(ctx, addr).GetPower()) } diff --git a/x/stake/keeper.go b/x/stake/keeper.go index 7d5073399b..00930aaa64 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -780,6 +780,7 @@ func (k Keeper) IterateDelegators(ctx sdk.Context, delAddr sdk.Address, fn func( // slash a validator func (k Keeper) Slash(ctx sdk.Context, pubkey crypto.PubKey, height int64, fraction sdk.Rat) { // TODO height ignored for now, see https://github.com/cosmos/cosmos-sdk/pull/1011#issuecomment-390253957 + logger := ctx.Logger().With("module", "x/stake") val, found := k.GetValidatorByPubKey(ctx, pubkey) if !found { panic(fmt.Errorf("Attempted to slash a nonexistent validator with pubkey %s", pubkey)) @@ -789,7 +790,7 @@ func (k Keeper) Slash(ctx sdk.Context, pubkey crypto.PubKey, height int64, fract val, pool, burned := val.removePoolShares(pool, sharesToRemove) k.setPool(ctx, pool) // update the pool k.updateValidator(ctx, val) // update the validator, possibly kicking it out - ctx.Logger().With("module", "x/stake").Info(fmt.Sprintf("Validator %v slashed by fraction %v, removed %v shares and burned %d tokens", pubkey, fraction, sharesToRemove, burned)) + logger.Info(fmt.Sprintf("Validator %v slashed by fraction %v, removed %v shares and burned %d tokens", pubkey, fraction, sharesToRemove, burned)) return } From 796948b838efab3c5b709709cdc9689f778540e1 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 25 May 2018 03:30:17 +0200 Subject: [PATCH 056/548] Downtime slashing testcases --- x/slashing/keeper.go | 4 ++-- x/slashing/keeper_test.go | 41 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index 6ec093dc65..c940f60c31 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -36,9 +36,9 @@ var ( // TODO Governance parameter? SlashFractionDoubleSign = sdk.NewRat(1).Quo(sdk.NewRat(20)) - // SlashFractionDowntime - currently 0 + // SlashFractionDowntime - currently 1% // TODO Governance parameter? - SlashFractionDowntime = sdk.ZeroRat() + SlashFractionDowntime = sdk.NewRat(1).Quo(sdk.NewRat(100)) ) // Keeper of the slashing store diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 3204ea7aa8..429b14f937 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -84,7 +84,46 @@ func TestHandleDoubleSign(t *testing.T) { } func TestHandleAbsentValidator(t *testing.T) { - // TODO + ctx, ck, sk, keeper := createTestInput(t) + addr, val, amt := addrs[0], pks[0], int64(10) + got := stake.NewHandler(sk)(ctx, newTestMsgDeclareCandidacy(addr, val, amt)) + require.True(t, got.IsOK()) + _ = sk.Tick(ctx) + require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) + require.Equal(t, sdk.NewRat(amt), sk.Validator(ctx, addr).GetPower()) + info, found := keeper.getValidatorSigningInfo(ctx, val.Address()) + require.False(t, found) + require.Equal(t, int64(0), info.StartHeight) + require.Equal(t, int64(0), info.SignedBlocksCounter) + height := int64(0) + // 1000 blocks OK + for ; height < 1000; height++ { + ctx = ctx.WithBlockHeight(height) + keeper.handleValidatorSignature(ctx, val, true) + } + info, found = keeper.getValidatorSigningInfo(ctx, val.Address()) + require.True(t, found) + require.Equal(t, int64(0), info.StartHeight) + require.Equal(t, SignedBlocksWindow, info.SignedBlocksCounter) + // 50 blocks missed + for ; height < 1050; height++ { + ctx = ctx.WithBlockHeight(height) + keeper.handleValidatorSignature(ctx, val, false) + } + info, found = keeper.getValidatorSigningInfo(ctx, val.Address()) + require.True(t, found) + require.Equal(t, int64(0), info.StartHeight) + require.Equal(t, SignedBlocksWindow-50, info.SignedBlocksCounter) + // 51st block missed + ctx = ctx.WithBlockHeight(height) + keeper.handleValidatorSignature(ctx, val, false) + info, found = keeper.getValidatorSigningInfo(ctx, val.Address()) + require.True(t, found) + require.Equal(t, int64(0), info.StartHeight) + require.Equal(t, SignedBlocksWindow-51, info.SignedBlocksCounter) + height++ + // should have been slashed + require.Equal(t, sdk.NewRat(amt).Mul(sdk.NewRat(99).Quo(sdk.NewRat(100))), sk.Validator(ctx, addr).GetPower()) } func newPubKey(pk string) (res crypto.PubKey) { From e614799d0f16479aa16e7a91e088ef65eea2e318 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Sat, 26 May 2018 00:13:29 +0200 Subject: [PATCH 057/548] ForceUnbond() implementation WIP --- x/slashing/keeper.go | 9 +++++---- x/slashing/keeper_test.go | 20 ++++++++++++++++++-- x/stake/errors.go | 6 ++++++ x/stake/handler.go | 25 +++++++++++++++++++++++++ x/stake/keeper.go | 26 ++++++++++++++++---------- x/stake/msg.go | 33 +++++++++++++++++++++++++++++++++ x/stake/validator.go | 9 ++++++--- x/stake/wire.go | 1 + 8 files changed, 110 insertions(+), 19 deletions(-) diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index c940f60c31..b64bd6e06b 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -67,10 +67,10 @@ func (k Keeper) handleDoubleSign(ctx sdk.Context, height int64, timestamp int64, logger := ctx.Logger().With("module", "x/slashing") age := ctx.BlockHeader().Time - timestamp if age > MaxEvidenceAge { - logger.Info(fmt.Sprintf("Ignored double sign from %v at height %d, age of %d past max age of %d", pubkey.Address(), height, age, MaxEvidenceAge)) + logger.Info(fmt.Sprintf("Ignored double sign from %s at height %d, age of %d past max age of %d", pubkey.Address(), height, age, MaxEvidenceAge)) return } - logger.Info(fmt.Sprintf("Confirmed double sign from %v at height %d, age of %d less than max age of %d", pubkey.Address(), height, age, MaxEvidenceAge)) + logger.Info(fmt.Sprintf("Confirmed double sign from %s at height %d, age of %d less than max age of %d", pubkey.Address(), height, age, MaxEvidenceAge)) k.stakeKeeper.Slash(ctx, pubkey, height, SlashFractionDoubleSign) } @@ -79,7 +79,7 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, logger := ctx.Logger().With("module", "x/slashing") height := ctx.BlockHeight() if !signed { - logger.Info(fmt.Sprintf("Absent validator %v at height %d", pubkey.Address(), height)) + logger.Info(fmt.Sprintf("Absent validator %s at height %d", pubkey.Address(), height)) } index := height % SignedBlocksWindow address := pubkey.Address() @@ -96,8 +96,9 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, } minHeight := signInfo.StartHeight + SignedBlocksWindow if height > minHeight && signInfo.SignedBlocksCounter < MinSignedPerWindow { + logger.Info(fmt.Sprintf("Validator %s past min height of %d and below signed blocks threshold of %d", pubkey.Address(), minHeight, MinSignedPerWindow)) k.stakeKeeper.Slash(ctx, pubkey, height, SlashFractionDowntime) - k.stakeKeeper.ForceUnbond(ctx, pubkey, DowntimeUnbondDuration) + k.stakeKeeper.ForceUnbond(ctx, pubkey, DowntimeUnbondDuration) // TODO } } diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 429b14f937..dd4bb4cd69 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -58,7 +58,9 @@ func createTestInput(t *testing.T) (sdk.Context, bank.Keeper, stake.Keeper, Keep accountMapper := auth.NewAccountMapper(cdc, keyAcc, &auth.BaseAccount{}) ck := bank.NewKeeper(accountMapper) sk := stake.NewKeeper(cdc, keyStake, ck, stake.DefaultCodespace) - stake.InitGenesis(ctx, sk, stake.DefaultGenesisState()) + genesis := stake.DefaultGenesisState() + genesis.Pool.BondedTokens = initCoins * int64(len(addrs)) + stake.InitGenesis(ctx, sk, genesis) for _, addr := range addrs { ck.AddCoins(ctx, addr, sdk.Coins{ {sk.GetParams(ctx).BondDenom, initCoins}, @@ -86,7 +88,8 @@ func TestHandleDoubleSign(t *testing.T) { func TestHandleAbsentValidator(t *testing.T) { ctx, ck, sk, keeper := createTestInput(t) addr, val, amt := addrs[0], pks[0], int64(10) - got := stake.NewHandler(sk)(ctx, newTestMsgDeclareCandidacy(addr, val, amt)) + sh := stake.NewHandler(sk) + got := sh(ctx, newTestMsgDeclareCandidacy(addr, val, amt)) require.True(t, got.IsOK()) _ = sk.Tick(ctx) require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) @@ -114,6 +117,9 @@ func TestHandleAbsentValidator(t *testing.T) { require.True(t, found) require.Equal(t, int64(0), info.StartHeight) require.Equal(t, SignedBlocksWindow-50, info.SignedBlocksCounter) + // should be bonded still + validator := sk.ValidatorByPubKey(ctx, val) + require.Equal(t, sdk.Bonded, validator.GetStatus()) // 51st block missed ctx = ctx.WithBlockHeight(height) keeper.handleValidatorSignature(ctx, val, false) @@ -122,6 +128,16 @@ func TestHandleAbsentValidator(t *testing.T) { require.Equal(t, int64(0), info.StartHeight) require.Equal(t, SignedBlocksWindow-51, info.SignedBlocksCounter) height++ + // should have been revoked + validator = sk.ValidatorByPubKey(ctx, val) + require.Equal(t, sdk.Unbonded, validator.GetStatus()) + got = sh(ctx, stake.NewMsgUnrevoke(addr)) + require.False(t, got.IsOK()) // should fail prior to jail expiration + ctx = ctx.WithBlockHeader(abci.Header{Time: int64(86400 * 2)}) + got = sh(ctx, stake.NewMsgUnrevoke(addr)) + require.True(t, got.IsOK()) // should succeed after jail expiration + validator = sk.ValidatorByPubKey(ctx, val) + require.Equal(t, sdk.Bonded, validator.GetStatus()) // should have been slashed require.Equal(t, sdk.NewRat(amt).Mul(sdk.NewRat(99).Quo(sdk.NewRat(100))), sk.Validator(ctx, addr).GetPower()) } diff --git a/x/stake/errors.go b/x/stake/errors.go index 83c38d528d..2664a56cad 100644 --- a/x/stake/errors.go +++ b/x/stake/errors.go @@ -16,6 +16,7 @@ const ( CodeInvalidValidator CodeType = 201 CodeInvalidBond CodeType = 202 CodeInvalidInput CodeType = 203 + CodeValidatorJailed CodeType = 204 CodeUnauthorized CodeType = sdk.CodeUnauthorized CodeInternal CodeType = sdk.CodeInternal CodeUnknownRequest CodeType = sdk.CodeUnknownRequest @@ -30,6 +31,8 @@ func codeToDefaultMsg(code CodeType) string { return "Invalid Bond" case CodeInvalidInput: return "Invalid Input" + case CodeValidatorJailed: + return "Validator Jailed" case CodeUnauthorized: return "Unauthorized" case CodeInternal: @@ -98,6 +101,9 @@ func ErrBadShares(codespace sdk.CodespaceType) sdk.Error { func ErrBadRemoveValidator(codespace sdk.CodespaceType) sdk.Error { return newError(codespace, CodeInvalidValidator, "Error removing validator") } +func ErrValidatorJailed(codespace sdk.CodespaceType) sdk.Error { + return newError(codespace, CodeValidatorJailed, "Validator jailed, cannot yet be unrevoked") +} //---------------------------------------- diff --git a/x/stake/handler.go b/x/stake/handler.go index 53653557cc..62c4f27df4 100644 --- a/x/stake/handler.go +++ b/x/stake/handler.go @@ -19,6 +19,8 @@ func NewHandler(k Keeper) sdk.Handler { return handleMsgDelegate(ctx, msg, k) case MsgUnbond: return handleMsgUnbond(ctx, msg, k) + case MsgUnrevoke: + return handleMsgUnrevoke(ctx, msg, k) default: return sdk.ErrTxDecode("invalid message parse in staking module").Result() } @@ -247,3 +249,26 @@ func handleMsgUnbond(ctx sdk.Context, msg MsgUnbond, k Keeper) sdk.Result { Tags: tags, } } + +func handleMsgUnrevoke(ctx sdk.Context, msg MsgUnrevoke, k Keeper) sdk.Result { + validator, found := k.GetValidator(ctx, msg.ValidatorAddr) + if !found { + return ErrNoValidatorForAddress(k.codespace).Result() + } + + if ctx.BlockHeader().Time < validator.RevokedUntilTime { + return ErrValidatorJailed(k.codespace).Result() + } + + if ctx.IsCheckTx() { + return sdk.Result{} + } + + validator.Revoked = false + k.updateValidator(ctx, validator) + + tags := sdk.NewTags("action", []byte("unrevoke"), "validator", msg.ValidatorAddr.Bytes()) + return sdk.Result{ + Tags: tags, + } +} diff --git a/x/stake/keeper.go b/x/stake/keeper.go index 00930aaa64..887cdab192 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -220,7 +220,9 @@ func (k Keeper) updateValidator(ctx sdk.Context, validator Validator) Validator oldValidator, oldFound := k.GetValidator(ctx, ownerAddr) if validator.Revoked && oldValidator.Status() == sdk.Bonded { + fmt.Printf("val preupdate: %v\n", validator) validator, pool = validator.UpdateStatus(pool, sdk.Unbonded) + fmt.Printf("val postupdate: %v\n", validator) k.setPool(ctx, pool) } @@ -783,25 +785,29 @@ func (k Keeper) Slash(ctx sdk.Context, pubkey crypto.PubKey, height int64, fract logger := ctx.Logger().With("module", "x/stake") val, found := k.GetValidatorByPubKey(ctx, pubkey) if !found { - panic(fmt.Errorf("Attempted to slash a nonexistent validator with pubkey %s", pubkey)) + panic(fmt.Errorf("Attempted to slash a nonexistent validator with address %s", pubkey.Address())) } sharesToRemove := val.PoolShares.Amount.Mul(fraction) pool := k.GetPool(ctx) val, pool, burned := val.removePoolShares(pool, sharesToRemove) k.setPool(ctx, pool) // update the pool k.updateValidator(ctx, val) // update the validator, possibly kicking it out - logger.Info(fmt.Sprintf("Validator %v slashed by fraction %v, removed %v shares and burned %d tokens", pubkey, fraction, sharesToRemove, burned)) + logger.Info(fmt.Sprintf("Validator %s slashed by fraction %v, removed %v shares and burned %d tokens", pubkey.Address(), fraction, sharesToRemove, burned)) return } // force unbond a validator func (k Keeper) ForceUnbond(ctx sdk.Context, pubkey crypto.PubKey, jailDuration int64) { - // TODO Implement - /* - val, found := k.GetValidatorByPubKey(ctx, pubkey) - if !found { - ctx.Logger().Info("Validator with pubkey %s not found, cannot force unbond", pubkey) - return - } - */ + logger := ctx.Logger().With("module", "x/stake") + val, found := k.GetValidatorByPubKey(ctx, pubkey) + if !found { + ctx.Logger().Info("Validator with pubkey %s not found, cannot force unbond", pubkey) + return + } + val.Revoked = true + val.RevokedUntilTime = ctx.BlockHeader().Time + jailDuration + k.updateValidator(ctx, val) // update the validator, now revoked + val, _ = k.GetValidatorByPubKey(ctx, pubkey) + logger.Info(fmt.Sprintf("Validator %s revoked for minimum duration %d", pubkey.Address(), jailDuration)) + return } diff --git a/x/stake/msg.go b/x/stake/msg.go index 0adff84d9b..a668d47d18 100644 --- a/x/stake/msg.go +++ b/x/stake/msg.go @@ -209,3 +209,36 @@ func (msg MsgUnbond) ValidateBasic() sdk.Error { } return nil } + +//______________________________________________________________________ + +// MsgUnrevoke - struct for unrevoking revoked validator +type MsgUnrevoke struct { + ValidatorAddr sdk.Address `json:"address"` +} + +func NewMsgUnrevoke(validatorAddr sdk.Address) MsgUnrevoke { + return MsgUnrevoke{ + ValidatorAddr: validatorAddr, + } +} + +func (msg MsgUnrevoke) Type() string { return MsgType } +func (msg MsgUnrevoke) GetSigners() []sdk.Address { return []sdk.Address{msg.ValidatorAddr} } + +// get the bytes for the message signer to sign on +func (msg MsgUnrevoke) GetSignBytes() []byte { + b, err := json.Marshal(msg) + if err != nil { + panic(err) + } + return b +} + +// quick validity check +func (msg MsgUnrevoke) ValidateBasic() sdk.Error { + if msg.ValidatorAddr == nil { + return ErrBadValidatorAddr(DefaultCodespace) + } + return nil +} diff --git a/x/stake/validator.go b/x/stake/validator.go index 31ef290618..76905212f1 100644 --- a/x/stake/validator.go +++ b/x/stake/validator.go @@ -17,9 +17,10 @@ import ( // exchange rate. Voting power can be calculated as total bonds multiplied by // exchange rate. type Validator struct { - Owner sdk.Address `json:"owner"` // sender of BondTx - UnbondTx returns here - PubKey crypto.PubKey `json:"pub_key"` // pubkey of validator - Revoked bool `json:"revoked"` // has the validator been revoked from bonded status? + Owner sdk.Address `json:"owner"` // sender of BondTx - UnbondTx returns here + PubKey crypto.PubKey `json:"pub_key"` // pubkey of validator + Revoked bool `json:"revoked"` // has the validator been revoked from bonded status? + RevokedUntilTime int64 `json:"revoked_until_time"` // timestamp before which the validator cannot unrevoke PoolShares PoolShares `json:"pool_shares"` // total shares for tokens held in the pool DelegatorShares sdk.Rat `json:"delegator_shares"` // total shares issued to a validator's delegators @@ -46,6 +47,8 @@ func NewValidator(owner sdk.Address, pubKey crypto.PubKey, description Descripti return Validator{ Owner: owner, PubKey: pubKey, + Revoked: false, + RevokedUntilTime: int64(0), PoolShares: NewUnbondedShares(sdk.ZeroRat()), DelegatorShares: sdk.ZeroRat(), Description: description, diff --git a/x/stake/wire.go b/x/stake/wire.go index 6e6e382606..ac382ff14d 100644 --- a/x/stake/wire.go +++ b/x/stake/wire.go @@ -10,6 +10,7 @@ func RegisterWire(cdc *wire.Codec) { cdc.RegisterConcrete(MsgEditCandidacy{}, "cosmos-sdk/MsgEditCandidacy", nil) cdc.RegisterConcrete(MsgDelegate{}, "cosmos-sdk/MsgDelegate", nil) cdc.RegisterConcrete(MsgUnbond{}, "cosmos-sdk/MsgUnbond", nil) + cdc.RegisterConcrete(MsgUnrevoke{}, "cosmos-sdk/MsgUnrevoke", nil) } var cdcEmpty = wire.NewCodec() From 97b084b842f4b10369de78439531440168a8401a Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Sat, 26 May 2018 00:27:02 +0200 Subject: [PATCH 058/548] Fix ForceUnbond() testcase --- x/slashing/keeper_test.go | 5 ++++- x/stake/keeper.go | 2 -- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index dd4bb4cd69..7c7be34e8c 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -120,6 +120,8 @@ func TestHandleAbsentValidator(t *testing.T) { // should be bonded still validator := sk.ValidatorByPubKey(ctx, val) require.Equal(t, sdk.Bonded, validator.GetStatus()) + pool := sk.GetPool(ctx) + require.Equal(t, int64(210), pool.BondedTokens) // 51st block missed ctx = ctx.WithBlockHeight(height) keeper.handleValidatorSignature(ctx, val, false) @@ -138,8 +140,9 @@ func TestHandleAbsentValidator(t *testing.T) { require.True(t, got.IsOK()) // should succeed after jail expiration validator = sk.ValidatorByPubKey(ctx, val) require.Equal(t, sdk.Bonded, validator.GetStatus()) + pool = sk.GetPool(ctx) // should have been slashed - require.Equal(t, sdk.NewRat(amt).Mul(sdk.NewRat(99).Quo(sdk.NewRat(100))), sk.Validator(ctx, addr).GetPower()) + require.Equal(t, int64(208), pool.BondedTokens) } func newPubKey(pk string) (res crypto.PubKey) { diff --git a/x/stake/keeper.go b/x/stake/keeper.go index 887cdab192..e8ac6947c8 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -220,9 +220,7 @@ func (k Keeper) updateValidator(ctx sdk.Context, validator Validator) Validator oldValidator, oldFound := k.GetValidator(ctx, ownerAddr) if validator.Revoked && oldValidator.Status() == sdk.Bonded { - fmt.Printf("val preupdate: %v\n", validator) validator, pool = validator.UpdateStatus(pool, sdk.Unbonded) - fmt.Printf("val postupdate: %v\n", validator) k.setPool(ctx, pool) } From 8aaff4b96e29010d7013fa29757959f30331858a Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Sat, 26 May 2018 00:36:12 +0200 Subject: [PATCH 059/548] Cleanup testcase a bit --- x/slashing/keeper_test.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 7c7be34e8c..895be24e1b 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -29,7 +29,7 @@ var ( newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB50"), newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB51"), } - initCoins int64 = 100 + initCoins int64 = 200 ) func createTestCodec() *wire.Codec { @@ -59,7 +59,7 @@ func createTestInput(t *testing.T) (sdk.Context, bank.Keeper, stake.Keeper, Keep ck := bank.NewKeeper(accountMapper) sk := stake.NewKeeper(cdc, keyStake, ck, stake.DefaultCodespace) genesis := stake.DefaultGenesisState() - genesis.Pool.BondedTokens = initCoins * int64(len(addrs)) + genesis.Pool.LooseUnbondedTokens = initCoins * int64(len(addrs)) stake.InitGenesis(ctx, sk, genesis) for _, addr := range addrs { ck.AddCoins(ctx, addr, sdk.Coins{ @@ -72,7 +72,7 @@ func createTestInput(t *testing.T) (sdk.Context, bank.Keeper, stake.Keeper, Keep func TestHandleDoubleSign(t *testing.T) { ctx, ck, sk, keeper := createTestInput(t) - addr, val, amt := addrs[0], pks[0], int64(10) + addr, val, amt := addrs[0], pks[0], int64(100) got := stake.NewHandler(sk)(ctx, newTestMsgDeclareCandidacy(addr, val, amt)) require.True(t, got.IsOK()) _ = sk.Tick(ctx) @@ -87,7 +87,7 @@ func TestHandleDoubleSign(t *testing.T) { func TestHandleAbsentValidator(t *testing.T) { ctx, ck, sk, keeper := createTestInput(t) - addr, val, amt := addrs[0], pks[0], int64(10) + addr, val, amt := addrs[0], pks[0], int64(100) sh := stake.NewHandler(sk) got := sh(ctx, newTestMsgDeclareCandidacy(addr, val, amt)) require.True(t, got.IsOK()) @@ -121,7 +121,7 @@ func TestHandleAbsentValidator(t *testing.T) { validator := sk.ValidatorByPubKey(ctx, val) require.Equal(t, sdk.Bonded, validator.GetStatus()) pool := sk.GetPool(ctx) - require.Equal(t, int64(210), pool.BondedTokens) + require.Equal(t, int64(100), pool.BondedTokens) // 51st block missed ctx = ctx.WithBlockHeight(height) keeper.handleValidatorSignature(ctx, val, false) @@ -140,9 +140,9 @@ func TestHandleAbsentValidator(t *testing.T) { require.True(t, got.IsOK()) // should succeed after jail expiration validator = sk.ValidatorByPubKey(ctx, val) require.Equal(t, sdk.Bonded, validator.GetStatus()) - pool = sk.GetPool(ctx) // should have been slashed - require.Equal(t, int64(208), pool.BondedTokens) + pool = sk.GetPool(ctx) + require.Equal(t, int64(99), pool.BondedTokens) } func newPubKey(pk string) (res crypto.PubKey) { From 9cfc6de055b7704914ed4d0f613915e05472c77e Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Sat, 26 May 2018 01:34:16 +0200 Subject: [PATCH 060/548] Linter fix --- x/stake/msg.go | 1 + 1 file changed, 1 insertion(+) diff --git a/x/stake/msg.go b/x/stake/msg.go index a668d47d18..c0fdb4e5a1 100644 --- a/x/stake/msg.go +++ b/x/stake/msg.go @@ -223,6 +223,7 @@ func NewMsgUnrevoke(validatorAddr sdk.Address) MsgUnrevoke { } } +//nolint func (msg MsgUnrevoke) Type() string { return MsgType } func (msg MsgUnrevoke) GetSigners() []sdk.Address { return []sdk.Address{msg.ValidatorAddr} } From 6f3d81d5d6368af3d9059e55353a1037d228032d Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Sat, 26 May 2018 02:05:46 +0200 Subject: [PATCH 061/548] Swap to individual offset --- x/slashing/keeper.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index b64bd6e06b..87016b18f2 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -81,9 +81,10 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, if !signed { logger.Info(fmt.Sprintf("Absent validator %s at height %d", pubkey.Address(), height)) } - index := height % SignedBlocksWindow address := pubkey.Address() signInfo, _ := k.getValidatorSigningInfo(ctx, address) + signInfo.IndexOffset++ + index := signInfo.IndexOffset % SignedBlocksWindow previous := k.getValidatorSigningBitArray(ctx, address, index) if previous && !signed { k.setValidatorSigningBitArray(ctx, address, index, false) @@ -140,6 +141,7 @@ func (k Keeper) setValidatorSigningBitArray(ctx sdk.Context, address sdk.Address type validatorSigningInfo struct { StartHeight int64 `json:"start_height"` + IndexOffset int64 `json:"index_offset"` SignedBlocksCounter int64 `json:"signed_blocks_counter"` } From e4b0d0a618524d3040788b1d9cb8b3c33753a4c4 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 28 May 2018 21:38:02 +0200 Subject: [PATCH 062/548] Reorganization in progress --- cmd/gaia/app/app.go | 1 + types/stake.go | 3 ++- x/slashing/errors.go | 19 +++++++++++++++++ x/slashing/handler.go | 42 ++++++++++++++++++++++++++++++++++++ x/slashing/keeper.go | 2 +- x/slashing/keeper_test.go | 5 +++-- x/slashing/msg.go | 45 +++++++++++++++++++++++++++++++++++++++ x/slashing/wire.go | 12 +++++++++++ x/stake/errors.go | 5 ----- x/stake/handler.go | 25 ---------------------- x/stake/keeper.go | 22 ++++++++++++++----- x/stake/msg.go | 34 ----------------------------- x/stake/validator.go | 8 +++---- x/stake/wire.go | 1 - 14 files changed, 145 insertions(+), 79 deletions(-) create mode 100644 x/slashing/handler.go create mode 100644 x/slashing/msg.go create mode 100644 x/slashing/wire.go diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index 28904e1ac9..4fdb6a6c92 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -103,6 +103,7 @@ func MakeCodec() *wire.Codec { ibc.RegisterWire(cdc) bank.RegisterWire(cdc) stake.RegisterWire(cdc) + slashing.RegisterWire(cdc) auth.RegisterWire(cdc) sdk.RegisterWire(cdc) wire.RegisterCrypto(cdc) diff --git a/types/stake.go b/types/stake.go index fed241d014..a52dc9b071 100644 --- a/types/stake.go +++ b/types/stake.go @@ -46,7 +46,8 @@ type ValidatorSet interface { ValidatorByPubKey(Context, crypto.PubKey) Validator // get a particular validator by public key TotalPower(Context) Rat // total power of the validator set Slash(Context, crypto.PubKey, int64, Rat) // slash the validator and delegators of the validator, specifying offence height & slash fraction - ForceUnbond(Context, crypto.PubKey, int64) // force unbond the validator, including a duration which must pass before they can rebond + Revoke(Context, crypto.PubKey) // revoke a validator + Unrevoke(Context, crypto.PubKey) // unrevoke a validator } //_______________________________________________________________________________ diff --git a/x/slashing/errors.go b/x/slashing/errors.go index bf57c337d7..f61eff17e5 100644 --- a/x/slashing/errors.go +++ b/x/slashing/errors.go @@ -10,10 +10,29 @@ type CodeType = sdk.CodeType const ( // Default slashing codespace DefaultCodespace sdk.CodespaceType = 10 + + // Invalid validator + CodeInvalidValidator CodeType = 201 + // Validator jailed + CodeValidatorJailed CodeType = 202 ) +func ErrNoValidatorForAddress(codespace sdk.CodespaceType) sdk.Error { + return newError(codespace, CodeInvalidValidator, "That address is not associated with any known validator") +} +func ErrBadValidatorAddr(codespace sdk.CodespaceType) sdk.Error { + return newError(codespace, CodeInvalidValidator, "Validator does not exist for that address") +} +func ErrValidatorJailed(codespace sdk.CodespaceType) sdk.Error { + return newError(codespace, CodeValidatorJailed, "Validator jailed, cannot yet be unrevoked") +} + func codeToDefaultMsg(code CodeType) string { switch code { + case CodeInvalidValidator: + return "Invalid Validator" + case CodeValidatorJailed: + return "Validator Jailed" default: return sdk.CodeToDefaultMsg(code) } diff --git a/x/slashing/handler.go b/x/slashing/handler.go new file mode 100644 index 0000000000..931ef58465 --- /dev/null +++ b/x/slashing/handler.go @@ -0,0 +1,42 @@ +package slashing + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func NewHandler(k Keeper) sdk.Handler { + return func(ctx sdk.Context, msg sdk.Msg) sdk.Result { + // NOTE msg already has validate basic run + switch msg := msg.(type) { + case MsgUnrevoke: + return handleMsgUnrevoke(ctx, msg, k) + default: + return sdk.ErrTxDecode("invalid message parse in staking module").Result() + } + } +} + +func handleMsgUnrevoke(ctx sdk.Context, msg MsgUnrevoke, k Keeper) sdk.Result { + validator := k.stakeKeeper.Validator(ctx, msg.ValidatorAddr) + if validator == nil { + return ErrNoValidatorForAddress(k.codespace).Result() + } + + // TODO + /* + if ctx.BlockHeader().Time < validator.RevokedUntilTime { + return ErrValidatorJailed(k.codespace).Result() + } + */ + + if ctx.IsCheckTx() { + return sdk.Result{} + } + + k.stakeKeeper.Unrevoke(ctx, validator.GetPubKey()) + + tags := sdk.NewTags("action", []byte("unrevoke"), "validator", msg.ValidatorAddr.Bytes()) + return sdk.Result{ + Tags: tags, + } +} diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index 87016b18f2..918e85c2a3 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -99,7 +99,7 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, if height > minHeight && signInfo.SignedBlocksCounter < MinSignedPerWindow { logger.Info(fmt.Sprintf("Validator %s past min height of %d and below signed blocks threshold of %d", pubkey.Address(), minHeight, MinSignedPerWindow)) k.stakeKeeper.Slash(ctx, pubkey, height, SlashFractionDowntime) - k.stakeKeeper.ForceUnbond(ctx, pubkey, DowntimeUnbondDuration) // TODO + k.stakeKeeper.Revoke(ctx, pubkey) // , DowntimeUnbondDuration) // TODO } } diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 895be24e1b..9598b24f3c 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -89,6 +89,7 @@ func TestHandleAbsentValidator(t *testing.T) { ctx, ck, sk, keeper := createTestInput(t) addr, val, amt := addrs[0], pks[0], int64(100) sh := stake.NewHandler(sk) + slh := NewHandler(keeper) got := sh(ctx, newTestMsgDeclareCandidacy(addr, val, amt)) require.True(t, got.IsOK()) _ = sk.Tick(ctx) @@ -133,10 +134,10 @@ func TestHandleAbsentValidator(t *testing.T) { // should have been revoked validator = sk.ValidatorByPubKey(ctx, val) require.Equal(t, sdk.Unbonded, validator.GetStatus()) - got = sh(ctx, stake.NewMsgUnrevoke(addr)) + got = slh(ctx, NewMsgUnrevoke(addr)) require.False(t, got.IsOK()) // should fail prior to jail expiration ctx = ctx.WithBlockHeader(abci.Header{Time: int64(86400 * 2)}) - got = sh(ctx, stake.NewMsgUnrevoke(addr)) + got = slh(ctx, NewMsgUnrevoke(addr)) require.True(t, got.IsOK()) // should succeed after jail expiration validator = sk.ValidatorByPubKey(ctx, val) require.Equal(t, sdk.Bonded, validator.GetStatus()) diff --git a/x/slashing/msg.go b/x/slashing/msg.go new file mode 100644 index 0000000000..d67ddf70df --- /dev/null +++ b/x/slashing/msg.go @@ -0,0 +1,45 @@ +package slashing + +import ( + "encoding/json" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// name to identify transaction types +const MsgType = "slashing" + +// verify interface at compile time +var _ sdk.Msg = &MsgUnrevoke{} + +// MsgUnrevoke - struct for unrevoking revoked validator +type MsgUnrevoke struct { + ValidatorAddr sdk.Address `json:"address"` +} + +func NewMsgUnrevoke(validatorAddr sdk.Address) MsgUnrevoke { + return MsgUnrevoke{ + ValidatorAddr: validatorAddr, + } +} + +//nolint +func (msg MsgUnrevoke) Type() string { return MsgType } +func (msg MsgUnrevoke) GetSigners() []sdk.Address { return []sdk.Address{msg.ValidatorAddr} } + +// get the bytes for the message signer to sign on +func (msg MsgUnrevoke) GetSignBytes() []byte { + b, err := json.Marshal(msg) + if err != nil { + panic(err) + } + return b +} + +// quick validity check +func (msg MsgUnrevoke) ValidateBasic() sdk.Error { + if msg.ValidatorAddr == nil { + return ErrBadValidatorAddr(DefaultCodespace) + } + return nil +} diff --git a/x/slashing/wire.go b/x/slashing/wire.go new file mode 100644 index 0000000000..465a06587e --- /dev/null +++ b/x/slashing/wire.go @@ -0,0 +1,12 @@ +package slashing + +import ( + "github.com/cosmos/cosmos-sdk/wire" +) + +// Register concrete types on wire codec +func RegisterWire(cdc *wire.Codec) { + cdc.RegisterConcrete(MsgUnrevoke{}, "cosmos-sdk/MsgUnrevoke", nil) +} + +var cdcEmpty = wire.NewCodec() diff --git a/x/stake/errors.go b/x/stake/errors.go index 2664a56cad..77090d9dc3 100644 --- a/x/stake/errors.go +++ b/x/stake/errors.go @@ -31,8 +31,6 @@ func codeToDefaultMsg(code CodeType) string { return "Invalid Bond" case CodeInvalidInput: return "Invalid Input" - case CodeValidatorJailed: - return "Validator Jailed" case CodeUnauthorized: return "Unauthorized" case CodeInternal: @@ -101,9 +99,6 @@ func ErrBadShares(codespace sdk.CodespaceType) sdk.Error { func ErrBadRemoveValidator(codespace sdk.CodespaceType) sdk.Error { return newError(codespace, CodeInvalidValidator, "Error removing validator") } -func ErrValidatorJailed(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeValidatorJailed, "Validator jailed, cannot yet be unrevoked") -} //---------------------------------------- diff --git a/x/stake/handler.go b/x/stake/handler.go index 62c4f27df4..53653557cc 100644 --- a/x/stake/handler.go +++ b/x/stake/handler.go @@ -19,8 +19,6 @@ func NewHandler(k Keeper) sdk.Handler { return handleMsgDelegate(ctx, msg, k) case MsgUnbond: return handleMsgUnbond(ctx, msg, k) - case MsgUnrevoke: - return handleMsgUnrevoke(ctx, msg, k) default: return sdk.ErrTxDecode("invalid message parse in staking module").Result() } @@ -249,26 +247,3 @@ func handleMsgUnbond(ctx sdk.Context, msg MsgUnbond, k Keeper) sdk.Result { Tags: tags, } } - -func handleMsgUnrevoke(ctx sdk.Context, msg MsgUnrevoke, k Keeper) sdk.Result { - validator, found := k.GetValidator(ctx, msg.ValidatorAddr) - if !found { - return ErrNoValidatorForAddress(k.codespace).Result() - } - - if ctx.BlockHeader().Time < validator.RevokedUntilTime { - return ErrValidatorJailed(k.codespace).Result() - } - - if ctx.IsCheckTx() { - return sdk.Result{} - } - - validator.Revoked = false - k.updateValidator(ctx, validator) - - tags := sdk.NewTags("action", []byte("unrevoke"), "validator", msg.ValidatorAddr.Bytes()) - return sdk.Result{ - Tags: tags, - } -} diff --git a/x/stake/keeper.go b/x/stake/keeper.go index e8ac6947c8..aba118ed5a 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -794,8 +794,8 @@ func (k Keeper) Slash(ctx sdk.Context, pubkey crypto.PubKey, height int64, fract return } -// force unbond a validator -func (k Keeper) ForceUnbond(ctx sdk.Context, pubkey crypto.PubKey, jailDuration int64) { +// revoke a validator +func (k Keeper) Revoke(ctx sdk.Context, pubkey crypto.PubKey) { logger := ctx.Logger().With("module", "x/stake") val, found := k.GetValidatorByPubKey(ctx, pubkey) if !found { @@ -803,9 +803,21 @@ func (k Keeper) ForceUnbond(ctx sdk.Context, pubkey crypto.PubKey, jailDuration return } val.Revoked = true - val.RevokedUntilTime = ctx.BlockHeader().Time + jailDuration k.updateValidator(ctx, val) // update the validator, now revoked - val, _ = k.GetValidatorByPubKey(ctx, pubkey) - logger.Info(fmt.Sprintf("Validator %s revoked for minimum duration %d", pubkey.Address(), jailDuration)) + logger.Info(fmt.Sprintf("Validator %s revoked", pubkey.Address())) + return +} + +// unrevoke a validator +func (k Keeper) Unrevoke(ctx sdk.Context, pubkey crypto.PubKey) { + logger := ctx.Logger().With("module", "x/stake") + val, found := k.GetValidatorByPubKey(ctx, pubkey) + if !found { + ctx.Logger().Info("Validator with pubkey %s not found, cannot force unbond", pubkey) + return + } + val.Revoked = false + k.updateValidator(ctx, val) // update the validator, now unrevoked + logger.Info(fmt.Sprintf("Validator %s unrevoked", pubkey.Address())) return } diff --git a/x/stake/msg.go b/x/stake/msg.go index c0fdb4e5a1..0adff84d9b 100644 --- a/x/stake/msg.go +++ b/x/stake/msg.go @@ -209,37 +209,3 @@ func (msg MsgUnbond) ValidateBasic() sdk.Error { } return nil } - -//______________________________________________________________________ - -// MsgUnrevoke - struct for unrevoking revoked validator -type MsgUnrevoke struct { - ValidatorAddr sdk.Address `json:"address"` -} - -func NewMsgUnrevoke(validatorAddr sdk.Address) MsgUnrevoke { - return MsgUnrevoke{ - ValidatorAddr: validatorAddr, - } -} - -//nolint -func (msg MsgUnrevoke) Type() string { return MsgType } -func (msg MsgUnrevoke) GetSigners() []sdk.Address { return []sdk.Address{msg.ValidatorAddr} } - -// get the bytes for the message signer to sign on -func (msg MsgUnrevoke) GetSignBytes() []byte { - b, err := json.Marshal(msg) - if err != nil { - panic(err) - } - return b -} - -// quick validity check -func (msg MsgUnrevoke) ValidateBasic() sdk.Error { - if msg.ValidatorAddr == nil { - return ErrBadValidatorAddr(DefaultCodespace) - } - return nil -} diff --git a/x/stake/validator.go b/x/stake/validator.go index 76905212f1..20f5710569 100644 --- a/x/stake/validator.go +++ b/x/stake/validator.go @@ -17,10 +17,9 @@ import ( // exchange rate. Voting power can be calculated as total bonds multiplied by // exchange rate. type Validator struct { - Owner sdk.Address `json:"owner"` // sender of BondTx - UnbondTx returns here - PubKey crypto.PubKey `json:"pub_key"` // pubkey of validator - Revoked bool `json:"revoked"` // has the validator been revoked from bonded status? - RevokedUntilTime int64 `json:"revoked_until_time"` // timestamp before which the validator cannot unrevoke + Owner sdk.Address `json:"owner"` // sender of BondTx - UnbondTx returns here + PubKey crypto.PubKey `json:"pub_key"` // pubkey of validator + Revoked bool `json:"revoked"` // has the validator been revoked from bonded status? PoolShares PoolShares `json:"pool_shares"` // total shares for tokens held in the pool DelegatorShares sdk.Rat `json:"delegator_shares"` // total shares issued to a validator's delegators @@ -48,7 +47,6 @@ func NewValidator(owner sdk.Address, pubKey crypto.PubKey, description Descripti Owner: owner, PubKey: pubKey, Revoked: false, - RevokedUntilTime: int64(0), PoolShares: NewUnbondedShares(sdk.ZeroRat()), DelegatorShares: sdk.ZeroRat(), Description: description, diff --git a/x/stake/wire.go b/x/stake/wire.go index ac382ff14d..6e6e382606 100644 --- a/x/stake/wire.go +++ b/x/stake/wire.go @@ -10,7 +10,6 @@ func RegisterWire(cdc *wire.Codec) { cdc.RegisterConcrete(MsgEditCandidacy{}, "cosmos-sdk/MsgEditCandidacy", nil) cdc.RegisterConcrete(MsgDelegate{}, "cosmos-sdk/MsgDelegate", nil) cdc.RegisterConcrete(MsgUnbond{}, "cosmos-sdk/MsgUnbond", nil) - cdc.RegisterConcrete(MsgUnrevoke{}, "cosmos-sdk/MsgUnrevoke", nil) } var cdcEmpty = wire.NewCodec() From d03577a2fc312cc1b260a3d6a59dab1bfa1d56a4 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 28 May 2018 22:08:13 +0200 Subject: [PATCH 063/548] Fixes after rebase, jail in x/slashing --- x/auth/context_test.go | 2 +- x/auth/feekeeper_test.go | 6 +++--- x/slashing/handler.go | 14 ++++++++------ x/slashing/keeper.go | 5 ++++- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/x/auth/context_test.go b/x/auth/context_test.go index c4aaca269a..615b7d5196 100644 --- a/x/auth/context_test.go +++ b/x/auth/context_test.go @@ -12,7 +12,7 @@ import ( ) func TestContextWithSigners(t *testing.T) { - ms, _ := setupMultiStore() + ms, _, _ := setupMultiStore() ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger(), nil) _, _, addr1 := keyPubAddr() diff --git a/x/auth/feekeeper_test.go b/x/auth/feekeeper_test.go index 2f1ffc59bc..3c9190e4ec 100644 --- a/x/auth/feekeeper_test.go +++ b/x/auth/feekeeper_test.go @@ -23,7 +23,7 @@ func TestFeeCollectionKeeperGetSet(t *testing.T) { cdc := wire.NewCodec() // make context and keeper - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) fck := NewFeeCollectionKeeper(cdc, capKey2) // no coins initially @@ -42,7 +42,7 @@ func TestFeeCollectionKeeperAdd(t *testing.T) { cdc := wire.NewCodec() // make context and keeper - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) fck := NewFeeCollectionKeeper(cdc, capKey2) // no coins initially @@ -62,7 +62,7 @@ func TestFeeCollectionKeeperClear(t *testing.T) { cdc := wire.NewCodec() // make context and keeper - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) fck := NewFeeCollectionKeeper(cdc, capKey2) // set coins initially diff --git a/x/slashing/handler.go b/x/slashing/handler.go index 931ef58465..e1d6607898 100644 --- a/x/slashing/handler.go +++ b/x/slashing/handler.go @@ -22,12 +22,14 @@ func handleMsgUnrevoke(ctx sdk.Context, msg MsgUnrevoke, k Keeper) sdk.Result { return ErrNoValidatorForAddress(k.codespace).Result() } - // TODO - /* - if ctx.BlockHeader().Time < validator.RevokedUntilTime { - return ErrValidatorJailed(k.codespace).Result() - } - */ + info, found := k.getValidatorSigningInfo(ctx, validator.GetPubKey().Address()) + if !found { + return ErrNoValidatorForAddress(k.codespace).Result() + } + + if ctx.BlockHeader().Time < info.JailedUntil { + return ErrValidatorJailed(k.codespace).Result() + } if ctx.IsCheckTx() { return sdk.Result{} diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index 918e85c2a3..4c9d92a2fa 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -99,7 +99,9 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, if height > minHeight && signInfo.SignedBlocksCounter < MinSignedPerWindow { logger.Info(fmt.Sprintf("Validator %s past min height of %d and below signed blocks threshold of %d", pubkey.Address(), minHeight, MinSignedPerWindow)) k.stakeKeeper.Slash(ctx, pubkey, height, SlashFractionDowntime) - k.stakeKeeper.Revoke(ctx, pubkey) // , DowntimeUnbondDuration) // TODO + k.stakeKeeper.Revoke(ctx, pubkey) + signInfo.JailedUntil = ctx.BlockHeader().Time + DowntimeUnbondDuration + k.setValidatorSigningInfo(ctx, address, signInfo) } } @@ -142,6 +144,7 @@ func (k Keeper) setValidatorSigningBitArray(ctx sdk.Context, address sdk.Address type validatorSigningInfo struct { StartHeight int64 `json:"start_height"` IndexOffset int64 `json:"index_offset"` + JailedUntil int64 `json:"jailed_until"` SignedBlocksCounter int64 `json:"signed_blocks_counter"` } From bfa9d5f9142d1d196c3b56c4f64d3deef3f8932f Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 28 May 2018 22:12:45 +0200 Subject: [PATCH 064/548] Linter fixes --- x/slashing/errors.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/x/slashing/errors.go b/x/slashing/errors.go index f61eff17e5..8a923f7542 100644 --- a/x/slashing/errors.go +++ b/x/slashing/errors.go @@ -17,12 +17,17 @@ const ( CodeValidatorJailed CodeType = 202 ) +//nolint func ErrNoValidatorForAddress(codespace sdk.CodespaceType) sdk.Error { return newError(codespace, CodeInvalidValidator, "That address is not associated with any known validator") } + +//nolint func ErrBadValidatorAddr(codespace sdk.CodespaceType) sdk.Error { return newError(codespace, CodeInvalidValidator, "Validator does not exist for that address") } + +//nolint func ErrValidatorJailed(codespace sdk.CodespaceType) sdk.Error { return newError(codespace, CodeValidatorJailed, "Validator jailed, cannot yet be unrevoked") } From 93f1cb45cc242f55b1c5b683eab026354b8e9305 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 28 May 2018 23:24:58 +0200 Subject: [PATCH 065/548] Split slashing params & signing info into separate files --- x/slashing/keeper.go | 85 -------------------------------------- x/slashing/params.go | 37 +++++++++++++++++ x/slashing/signing_info.go | 60 +++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 85 deletions(-) create mode 100644 x/slashing/params.go create mode 100644 x/slashing/signing_info.go diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index 4c9d92a2fa..c8fcbe1b92 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -1,7 +1,6 @@ package slashing import ( - "encoding/binary" "fmt" sdk "github.com/cosmos/cosmos-sdk/types" @@ -10,37 +9,6 @@ import ( crypto "github.com/tendermint/go-crypto" ) -const ( - // MaxEvidenceAge - Max age for evidence - 21 days (3 weeks) - // TODO Should this be a governance parameter or just modifiable with SoftwareUpgradeProposals? - // MaxEvidenceAge = 60 * 60 * 24 * 7 * 3 - // TODO Temporarily set to 2 minutes for testnets. - MaxEvidenceAge int64 = 60 * 2 - - // SignedBlocksWindow - sliding window for downtime slashing - // TODO Governance parameter? - // TODO Temporarily set to 100 blocks for testnets - SignedBlocksWindow int64 = 100 - - // Downtime slashing threshold - 50% - // TODO Governance parameter? - MinSignedPerWindow int64 = SignedBlocksWindow / 2 - - // Downtime unbond duration - 1 day - // TODO Governance parameter? - DowntimeUnbondDuration int64 = 86400 -) - -var ( - // SlashFractionDoubleSign - currently 5% - // TODO Governance parameter? - SlashFractionDoubleSign = sdk.NewRat(1).Quo(sdk.NewRat(20)) - - // SlashFractionDowntime - currently 1% - // TODO Governance parameter? - SlashFractionDowntime = sdk.NewRat(1).Quo(sdk.NewRat(100)) -) - // Keeper of the slashing store type Keeper struct { storeKey sdk.StoreKey @@ -104,56 +72,3 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, k.setValidatorSigningInfo(ctx, address, signInfo) } } - -func (k Keeper) getValidatorSigningInfo(ctx sdk.Context, address sdk.Address) (info validatorSigningInfo, found bool) { - store := ctx.KVStore(k.storeKey) - bz := store.Get(validatorSigningInfoKey(address)) - if bz == nil { - found = false - } else { - k.cdc.MustUnmarshalBinary(bz, &info) - found = true - } - return -} - -func (k Keeper) setValidatorSigningInfo(ctx sdk.Context, address sdk.Address, info validatorSigningInfo) { - store := ctx.KVStore(k.storeKey) - bz := k.cdc.MustMarshalBinary(info) - store.Set(validatorSigningInfoKey(address), bz) -} - -func (k Keeper) getValidatorSigningBitArray(ctx sdk.Context, address sdk.Address, index int64) (signed bool) { - store := ctx.KVStore(k.storeKey) - bz := store.Get(validatorSigningBitArrayKey(address, index)) - if bz == nil { - // lazy: treat empty key as unsigned - signed = false - } else { - k.cdc.MustUnmarshalBinary(bz, &signed) - } - return -} - -func (k Keeper) setValidatorSigningBitArray(ctx sdk.Context, address sdk.Address, index int64, signed bool) { - store := ctx.KVStore(k.storeKey) - bz := k.cdc.MustMarshalBinary(signed) - store.Set(validatorSigningBitArrayKey(address, index), bz) -} - -type validatorSigningInfo struct { - StartHeight int64 `json:"start_height"` - IndexOffset int64 `json:"index_offset"` - JailedUntil int64 `json:"jailed_until"` - SignedBlocksCounter int64 `json:"signed_blocks_counter"` -} - -func validatorSigningInfoKey(v sdk.Address) []byte { - return append([]byte{0x01}, v.Bytes()...) -} - -func validatorSigningBitArrayKey(v sdk.Address, i int64) []byte { - b := make([]byte, 8) - binary.LittleEndian.PutUint64(b, uint64(i)) - return append([]byte{0x02}, append(v.Bytes(), b...)...) -} diff --git a/x/slashing/params.go b/x/slashing/params.go new file mode 100644 index 0000000000..5e611fa0b5 --- /dev/null +++ b/x/slashing/params.go @@ -0,0 +1,37 @@ +package slashing + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + +const ( + // MaxEvidenceAge - Max age for evidence - 21 days (3 weeks) + // TODO Should this be a governance parameter or just modifiable with SoftwareUpgradeProposals? + // MaxEvidenceAge = 60 * 60 * 24 * 7 * 3 + // TODO Temporarily set to 2 minutes for testnets. + MaxEvidenceAge int64 = 60 * 2 + + // SignedBlocksWindow - sliding window for downtime slashing + // TODO Governance parameter? + // TODO Temporarily set to 100 blocks for testnets + SignedBlocksWindow int64 = 100 + + // Downtime slashing threshold - 50% + // TODO Governance parameter? + MinSignedPerWindow int64 = SignedBlocksWindow / 2 + + // Downtime unbond duration + // TODO Governance parameter? + // TODO Temporarily set to 6 hours for testnets + DowntimeUnbondDuration int64 = 60 * 60 * 6 +) + +var ( + // SlashFractionDoubleSign - currently 5% + // TODO Governance parameter? + SlashFractionDoubleSign = sdk.NewRat(1).Quo(sdk.NewRat(20)) + + // SlashFractionDowntime - currently 1% + // TODO Governance parameter? + SlashFractionDowntime = sdk.NewRat(1).Quo(sdk.NewRat(100)) +) diff --git a/x/slashing/signing_info.go b/x/slashing/signing_info.go new file mode 100644 index 0000000000..8cb66318db --- /dev/null +++ b/x/slashing/signing_info.go @@ -0,0 +1,60 @@ +package slashing + +import ( + "encoding/binary" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func (k Keeper) getValidatorSigningInfo(ctx sdk.Context, address sdk.Address) (info validatorSigningInfo, found bool) { + store := ctx.KVStore(k.storeKey) + bz := store.Get(validatorSigningInfoKey(address)) + if bz == nil { + found = false + } else { + k.cdc.MustUnmarshalBinary(bz, &info) + found = true + } + return +} + +func (k Keeper) setValidatorSigningInfo(ctx sdk.Context, address sdk.Address, info validatorSigningInfo) { + store := ctx.KVStore(k.storeKey) + bz := k.cdc.MustMarshalBinary(info) + store.Set(validatorSigningInfoKey(address), bz) +} + +func (k Keeper) getValidatorSigningBitArray(ctx sdk.Context, address sdk.Address, index int64) (signed bool) { + store := ctx.KVStore(k.storeKey) + bz := store.Get(validatorSigningBitArrayKey(address, index)) + if bz == nil { + // lazy: treat empty key as unsigned + signed = false + } else { + k.cdc.MustUnmarshalBinary(bz, &signed) + } + return +} + +func (k Keeper) setValidatorSigningBitArray(ctx sdk.Context, address sdk.Address, index int64, signed bool) { + store := ctx.KVStore(k.storeKey) + bz := k.cdc.MustMarshalBinary(signed) + store.Set(validatorSigningBitArrayKey(address, index), bz) +} + +type validatorSigningInfo struct { + StartHeight int64 `json:"start_height"` + IndexOffset int64 `json:"index_offset"` + JailedUntil int64 `json:"jailed_until"` + SignedBlocksCounter int64 `json:"signed_blocks_counter"` +} + +func validatorSigningInfoKey(v sdk.Address) []byte { + return append([]byte{0x01}, v.Bytes()...) +} + +func validatorSigningBitArrayKey(v sdk.Address, i int64) []byte { + b := make([]byte, 8) + binary.LittleEndian.PutUint64(b, uint64(i)) + return append([]byte{0x02}, append(v.Bytes(), b...)...) +} From 02ab73e26690e08f25c9acb1c13a55e704930934 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 28 May 2018 23:39:57 +0200 Subject: [PATCH 066/548] Signing info slashing testcases --- x/slashing/keeper_test.go | 86 ----------------------------- x/slashing/signing_info.go | 8 +-- x/slashing/signing_info_test.go | 35 ++++++++++++ x/slashing/test_common.go | 98 +++++++++++++++++++++++++++++++++ 4 files changed, 137 insertions(+), 90 deletions(-) create mode 100644 x/slashing/signing_info_test.go create mode 100644 x/slashing/test_common.go diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 9598b24f3c..0919b0a20d 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -1,75 +1,16 @@ package slashing import ( - "encoding/hex" - "os" "testing" "github.com/stretchr/testify/require" abci "github.com/tendermint/abci/types" - crypto "github.com/tendermint/go-crypto" - dbm "github.com/tendermint/tmlibs/db" - "github.com/tendermint/tmlibs/log" - "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/wire" - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/bank" "github.com/cosmos/cosmos-sdk/x/stake" ) -var ( - addrs = []sdk.Address{ - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6160"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6161"), - } - pks = []crypto.PubKey{ - newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB50"), - newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB51"), - } - initCoins int64 = 200 -) - -func createTestCodec() *wire.Codec { - cdc := wire.NewCodec() - sdk.RegisterWire(cdc) - auth.RegisterWire(cdc) - bank.RegisterWire(cdc) - stake.RegisterWire(cdc) - wire.RegisterCrypto(cdc) - return cdc -} - -func createTestInput(t *testing.T) (sdk.Context, bank.Keeper, stake.Keeper, Keeper) { - keyAcc := sdk.NewKVStoreKey("acc") - keyStake := sdk.NewKVStoreKey("stake") - keySlashing := sdk.NewKVStoreKey("slashing") - db := dbm.NewMemDB() - ms := store.NewCommitMultiStore(db) - ms.MountStoreWithDB(keyAcc, sdk.StoreTypeIAVL, db) - ms.MountStoreWithDB(keyStake, sdk.StoreTypeIAVL, db) - ms.MountStoreWithDB(keySlashing, sdk.StoreTypeIAVL, db) - err := ms.LoadLatestVersion() - require.Nil(t, err) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewTMLogger(os.Stdout), nil) - cdc := createTestCodec() - accountMapper := auth.NewAccountMapper(cdc, keyAcc, &auth.BaseAccount{}) - ck := bank.NewKeeper(accountMapper) - sk := stake.NewKeeper(cdc, keyStake, ck, stake.DefaultCodespace) - genesis := stake.DefaultGenesisState() - genesis.Pool.LooseUnbondedTokens = initCoins * int64(len(addrs)) - stake.InitGenesis(ctx, sk, genesis) - for _, addr := range addrs { - ck.AddCoins(ctx, addr, sdk.Coins{ - {sk.GetParams(ctx).BondDenom, initCoins}, - }) - } - keeper := NewKeeper(cdc, keySlashing, sk, DefaultCodespace) - return ctx, ck, sk, keeper -} - func TestHandleDoubleSign(t *testing.T) { ctx, ck, sk, keeper := createTestInput(t) addr, val, amt := addrs[0], pks[0], int64(100) @@ -145,30 +86,3 @@ func TestHandleAbsentValidator(t *testing.T) { pool = sk.GetPool(ctx) require.Equal(t, int64(99), pool.BondedTokens) } - -func newPubKey(pk string) (res crypto.PubKey) { - pkBytes, err := hex.DecodeString(pk) - if err != nil { - panic(err) - } - var pkEd crypto.PubKeyEd25519 - copy(pkEd[:], pkBytes[:]) - return pkEd -} - -func testAddr(addr string) sdk.Address { - res, err := sdk.GetAddress(addr) - if err != nil { - panic(err) - } - return res -} - -func newTestMsgDeclareCandidacy(address sdk.Address, pubKey crypto.PubKey, amt int64) stake.MsgDeclareCandidacy { - return stake.MsgDeclareCandidacy{ - Description: stake.Description{}, - ValidatorAddr: address, - PubKey: pubKey, - Bond: sdk.Coin{"steak", amt}, - } -} diff --git a/x/slashing/signing_info.go b/x/slashing/signing_info.go index 8cb66318db..cadd6d5805 100644 --- a/x/slashing/signing_info.go +++ b/x/slashing/signing_info.go @@ -43,10 +43,10 @@ func (k Keeper) setValidatorSigningBitArray(ctx sdk.Context, address sdk.Address } type validatorSigningInfo struct { - StartHeight int64 `json:"start_height"` - IndexOffset int64 `json:"index_offset"` - JailedUntil int64 `json:"jailed_until"` - SignedBlocksCounter int64 `json:"signed_blocks_counter"` + StartHeight int64 `json:"start_height"` // height at which validator was first a candidate OR was unrevoked + IndexOffset int64 `json:"index_offset"` // index offset into signed block bit array + JailedUntil int64 `json:"jailed_until"` // timestamp validator cannot be unrevoked until + SignedBlocksCounter int64 `json:"signed_blocks_counter"` // signed blocks counter (to avoid scanning the array every time) } func validatorSigningInfoKey(v sdk.Address) []byte { diff --git a/x/slashing/signing_info_test.go b/x/slashing/signing_info_test.go new file mode 100644 index 0000000000..8000d67450 --- /dev/null +++ b/x/slashing/signing_info_test.go @@ -0,0 +1,35 @@ +package slashing + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestGetSetValidatorSigningInfo(t *testing.T) { + ctx, _, _, keeper := createTestInput(t) + info, found := keeper.getValidatorSigningInfo(ctx, addrs[0]) + require.False(t, found) + newInfo := validatorSigningInfo{ + StartHeight: int64(4), + IndexOffset: int64(3), + JailedUntil: int64(2), + SignedBlocksCounter: int64(10), + } + keeper.setValidatorSigningInfo(ctx, addrs[0], newInfo) + info, found = keeper.getValidatorSigningInfo(ctx, addrs[0]) + require.True(t, found) + require.Equal(t, info.StartHeight, int64(4)) + require.Equal(t, info.IndexOffset, int64(3)) + require.Equal(t, info.JailedUntil, int64(2)) + require.Equal(t, info.SignedBlocksCounter, int64(10)) +} + +func TestGetSetValidatorSigningBitArray(t *testing.T) { + ctx, _, _, keeper := createTestInput(t) + signed := keeper.getValidatorSigningBitArray(ctx, addrs[0], 0) + require.False(t, signed) // treat empty key as unsigned + keeper.setValidatorSigningBitArray(ctx, addrs[0], 0, true) + signed = keeper.getValidatorSigningBitArray(ctx, addrs[0], 0) + require.True(t, signed) // now should be signed +} diff --git a/x/slashing/test_common.go b/x/slashing/test_common.go new file mode 100644 index 0000000000..21274df1b8 --- /dev/null +++ b/x/slashing/test_common.go @@ -0,0 +1,98 @@ +package slashing + +import ( + "encoding/hex" + "os" + "testing" + + "github.com/stretchr/testify/require" + + abci "github.com/tendermint/abci/types" + crypto "github.com/tendermint/go-crypto" + dbm "github.com/tendermint/tmlibs/db" + "github.com/tendermint/tmlibs/log" + + "github.com/cosmos/cosmos-sdk/store" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/cosmos/cosmos-sdk/x/stake" +) + +var ( + addrs = []sdk.Address{ + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6160"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6161"), + } + pks = []crypto.PubKey{ + newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB50"), + newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB51"), + } + initCoins int64 = 200 +) + +func createTestCodec() *wire.Codec { + cdc := wire.NewCodec() + sdk.RegisterWire(cdc) + auth.RegisterWire(cdc) + bank.RegisterWire(cdc) + stake.RegisterWire(cdc) + wire.RegisterCrypto(cdc) + return cdc +} + +func createTestInput(t *testing.T) (sdk.Context, bank.Keeper, stake.Keeper, Keeper) { + keyAcc := sdk.NewKVStoreKey("acc") + keyStake := sdk.NewKVStoreKey("stake") + keySlashing := sdk.NewKVStoreKey("slashing") + db := dbm.NewMemDB() + ms := store.NewCommitMultiStore(db) + ms.MountStoreWithDB(keyAcc, sdk.StoreTypeIAVL, db) + ms.MountStoreWithDB(keyStake, sdk.StoreTypeIAVL, db) + ms.MountStoreWithDB(keySlashing, sdk.StoreTypeIAVL, db) + err := ms.LoadLatestVersion() + require.Nil(t, err) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewTMLogger(os.Stdout), nil) + cdc := createTestCodec() + accountMapper := auth.NewAccountMapper(cdc, keyAcc, &auth.BaseAccount{}) + ck := bank.NewKeeper(accountMapper) + sk := stake.NewKeeper(cdc, keyStake, ck, stake.DefaultCodespace) + genesis := stake.DefaultGenesisState() + genesis.Pool.LooseUnbondedTokens = initCoins * int64(len(addrs)) + stake.InitGenesis(ctx, sk, genesis) + for _, addr := range addrs { + ck.AddCoins(ctx, addr, sdk.Coins{ + {sk.GetParams(ctx).BondDenom, initCoins}, + }) + } + keeper := NewKeeper(cdc, keySlashing, sk, DefaultCodespace) + return ctx, ck, sk, keeper +} + +func newPubKey(pk string) (res crypto.PubKey) { + pkBytes, err := hex.DecodeString(pk) + if err != nil { + panic(err) + } + var pkEd crypto.PubKeyEd25519 + copy(pkEd[:], pkBytes[:]) + return pkEd +} + +func testAddr(addr string) sdk.Address { + res, err := sdk.GetAddress(addr) + if err != nil { + panic(err) + } + return res +} + +func newTestMsgDeclareCandidacy(address sdk.Address, pubKey crypto.PubKey, amt int64) stake.MsgDeclareCandidacy { + return stake.MsgDeclareCandidacy{ + Description: stake.Description{}, + ValidatorAddr: address, + PubKey: pubKey, + Bond: sdk.Coin{"steak", amt}, + } +} From c0487996abf709cfec6bb2b6b3bd256d1310fa3a Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 28 May 2018 23:46:08 +0200 Subject: [PATCH 067/548] Update slashing docs, slight index change --- docs/spec/staking/valset-changes.md | 18 ++++++++++++------ x/slashing/keeper.go | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/docs/spec/staking/valset-changes.md b/docs/spec/staking/valset-changes.md index e5979af39a..0e635fd047 100644 --- a/docs/spec/staking/valset-changes.md +++ b/docs/spec/staking/valset-changes.md @@ -156,25 +156,30 @@ The following information is stored with each validator candidate, and is only n ```go type ValidatorSigningInfo struct { StartHeight int64 - SignedBlocksBitArray BitArray + IndexOffset int64 + JailedUntil int64 SignedBlocksCounter int64 + SignedBlocksBitArray BitArray } ``` Where: * `StartHeight` is set to the height that the candidate became an active validator (with non-zero voting power). +* `IndexOffset` is incremented each time the candidate was a bonded validator in a block (and may have signed a precommit or not). +* `JailedUntil` is set whenever the candidate is revoked due to downtime +* `SignedBlocksCounter` is a counter kept to avoid unnecessary array reads. `SignedBlocksBitArray.Sum() == SignedBlocksCounter` always. * `SignedBlocksBitArray` is a bit-array of size `SIGNED_BLOCKS_WINDOW` that records, for each of the last `SIGNED_BLOCKS_WINDOW` blocks, whether or not this validator was included in the LastCommit. It uses a `1` if the validator was included, and a `0` if it was not. Note it is initialized with all 0s. -* `SignedBlocksCounter` is a counter kept to avoid unnecessary array reads. `SignedBlocksBitArray.Sum() == SignedBlocksCounter` always. At the beginning of each block, we update the signing info for each validator and check if they should be automatically unbonded: ``` -h = block.Height -index = h % SIGNED_BLOCKS_WINDOW +height := block.Height for val in block.Validators: signInfo = val.SignInfo + index := signInfo.IndexOffset % SIGNED_BLOCKS_WINDOW + signInfo.IndexOffset++ previous = signInfo.SignedBlocksBitArray.Get(index) // update counter if array has changed @@ -191,6 +196,7 @@ for val in block.Validators: // included in 50% of the recent LastCommits minHeight = signInfo.StartHeight + SIGNED_BLOCKS_WINDOW minSigned = SIGNED_BLOCKS_WINDOW / 2 - if h > minHeight AND signInfo.SignedBlocksCounter < minSigned: - unbond the validator + if height > minHeight AND signInfo.SignedBlocksCounter < minSigned: + signInfo.JailedUntil = block.Time + DOWNTIME_UNBOND_DURATION + slash & unbond the validator ``` diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index c8fcbe1b92..8b0d585ec5 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -51,8 +51,8 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, } address := pubkey.Address() signInfo, _ := k.getValidatorSigningInfo(ctx, address) - signInfo.IndexOffset++ index := signInfo.IndexOffset % SignedBlocksWindow + signInfo.IndexOffset++ previous := k.getValidatorSigningBitArray(ctx, address, index) if previous && !signed { k.setValidatorSigningBitArray(ctx, address, index, false) From 26f22dbe4dd712f1df1271aa478f81fffd583003 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 28 May 2018 23:55:39 +0200 Subject: [PATCH 068/548] Test start height update --- x/slashing/handler.go | 10 +++++++++- x/slashing/keeper_test.go | 20 +++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/x/slashing/handler.go b/x/slashing/handler.go index e1d6607898..a3218f6e63 100644 --- a/x/slashing/handler.go +++ b/x/slashing/handler.go @@ -22,7 +22,9 @@ func handleMsgUnrevoke(ctx sdk.Context, msg MsgUnrevoke, k Keeper) sdk.Result { return ErrNoValidatorForAddress(k.codespace).Result() } - info, found := k.getValidatorSigningInfo(ctx, validator.GetPubKey().Address()) + addr := validator.GetPubKey().Address() + + info, found := k.getValidatorSigningInfo(ctx, addr) if !found { return ErrNoValidatorForAddress(k.codespace).Result() } @@ -35,9 +37,15 @@ func handleMsgUnrevoke(ctx sdk.Context, msg MsgUnrevoke, k Keeper) sdk.Result { return sdk.Result{} } + // Update the starting height (so the validator can't be immediately revoked again) + info.StartHeight = ctx.BlockHeight() + k.setValidatorSigningInfo(ctx, addr, info) + + // Unrevoke the validator k.stakeKeeper.Unrevoke(ctx, validator.GetPubKey()) tags := sdk.NewTags("action", []byte("unrevoke"), "validator", msg.ValidatorAddr.Bytes()) + return sdk.Result{ Tags: tags, } diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 0919b0a20d..b6aad3e6ca 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -71,7 +71,6 @@ func TestHandleAbsentValidator(t *testing.T) { require.True(t, found) require.Equal(t, int64(0), info.StartHeight) require.Equal(t, SignedBlocksWindow-51, info.SignedBlocksCounter) - height++ // should have been revoked validator = sk.ValidatorByPubKey(ctx, val) require.Equal(t, sdk.Unbonded, validator.GetStatus()) @@ -85,4 +84,23 @@ func TestHandleAbsentValidator(t *testing.T) { // should have been slashed pool = sk.GetPool(ctx) require.Equal(t, int64(99), pool.BondedTokens) + // start height should have been changed + info, found = keeper.getValidatorSigningInfo(ctx, val.Address()) + require.True(t, found) + require.Equal(t, height, info.StartHeight) + require.Equal(t, SignedBlocksWindow-51, info.SignedBlocksCounter) + // should not be immediately revoked again + height++ + ctx = ctx.WithBlockHeight(height) + keeper.handleValidatorSignature(ctx, val, false) + validator = sk.ValidatorByPubKey(ctx, val) + require.Equal(t, sdk.Bonded, validator.GetStatus()) + // should be revoked again after 100 blocks + nextHeight := height + 100 + for ; height <= nextHeight; height++ { + ctx = ctx.WithBlockHeight(height) + keeper.handleValidatorSignature(ctx, val, false) + } + validator = sk.ValidatorByPubKey(ctx, val) + require.Equal(t, sdk.Unbonded, validator.GetStatus()) } From f4f8cc66d980db731f74d63d77cf62012dc4cae7 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 00:10:52 +0200 Subject: [PATCH 069/548] Add some explanatory comments --- x/slashing/handler.go | 6 ++++++ x/slashing/keeper.go | 10 ++++++++++ x/slashing/keeper_test.go | 21 +++++++++++++-------- x/slashing/tick.go | 12 +++++++++++- x/stake/keeper.go | 6 ++++-- 5 files changed, 44 insertions(+), 11 deletions(-) diff --git a/x/slashing/handler.go b/x/slashing/handler.go index a3218f6e63..cf83a6a992 100644 --- a/x/slashing/handler.go +++ b/x/slashing/handler.go @@ -16,7 +16,11 @@ func NewHandler(k Keeper) sdk.Handler { } } +// Validators must submit a transaction to unrevoke themselves after +// having been revoked (and thus unbonded) for downtime func handleMsgUnrevoke(ctx sdk.Context, msg MsgUnrevoke, k Keeper) sdk.Result { + + // Validator must exist validator := k.stakeKeeper.Validator(ctx, msg.ValidatorAddr) if validator == nil { return ErrNoValidatorForAddress(k.codespace).Result() @@ -24,11 +28,13 @@ func handleMsgUnrevoke(ctx sdk.Context, msg MsgUnrevoke, k Keeper) sdk.Result { addr := validator.GetPubKey().Address() + // Signing info must exist info, found := k.getValidatorSigningInfo(ctx, addr) if !found { return ErrNoValidatorForAddress(k.codespace).Result() } + // Cannot be unrevoked until out of jail if ctx.BlockHeader().Time < info.JailedUntil { return ErrValidatorJailed(k.codespace).Result() } diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index 8b0d585ec5..f003b33540 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -34,10 +34,14 @@ func NewKeeper(cdc *wire.Codec, key sdk.StoreKey, sk stake.Keeper, codespace sdk func (k Keeper) handleDoubleSign(ctx sdk.Context, height int64, timestamp int64, pubkey crypto.PubKey) { logger := ctx.Logger().With("module", "x/slashing") age := ctx.BlockHeader().Time - timestamp + + // Double sign too old if age > MaxEvidenceAge { logger.Info(fmt.Sprintf("Ignored double sign from %s at height %d, age of %d past max age of %d", pubkey.Address(), height, age, MaxEvidenceAge)) return } + + // Double sign confirmed logger.Info(fmt.Sprintf("Confirmed double sign from %s at height %d, age of %d less than max age of %d", pubkey.Address(), height, age, MaxEvidenceAge)) k.stakeKeeper.Slash(ctx, pubkey, height, SlashFractionDoubleSign) } @@ -50,9 +54,13 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, logger.Info(fmt.Sprintf("Absent validator %s at height %d", pubkey.Address(), height)) } address := pubkey.Address() + + // Local index, so counts blocks validator *should* have signed signInfo, _ := k.getValidatorSigningInfo(ctx, address) index := signInfo.IndexOffset % SignedBlocksWindow signInfo.IndexOffset++ + + // Update signed block bit array & counter previous := k.getValidatorSigningBitArray(ctx, address, index) if previous && !signed { k.setValidatorSigningBitArray(ctx, address, index, false) @@ -63,8 +71,10 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, signInfo.SignedBlocksCounter++ k.setValidatorSigningInfo(ctx, address, signInfo) } + minHeight := signInfo.StartHeight + SignedBlocksWindow if height > minHeight && signInfo.SignedBlocksCounter < MinSignedPerWindow { + // Downtime confirmed, slash, revoke, and jail the validator logger.Info(fmt.Sprintf("Validator %s past min height of %d and below signed blocks threshold of %d", pubkey.Address(), minHeight, MinSignedPerWindow)) k.stakeKeeper.Slash(ctx, pubkey, height, SlashFractionDowntime) k.stakeKeeper.Revoke(ctx, pubkey) diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index b6aad3e6ca..2fef0c974a 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -39,7 +39,9 @@ func TestHandleAbsentValidator(t *testing.T) { info, found := keeper.getValidatorSigningInfo(ctx, val.Address()) require.False(t, found) require.Equal(t, int64(0), info.StartHeight) + require.Equal(t, int64(0), info.IndexOffset) require.Equal(t, int64(0), info.SignedBlocksCounter) + require.Equal(t, int64(0), info.JailedUntil) height := int64(0) // 1000 blocks OK for ; height < 1000; height++ { @@ -59,7 +61,7 @@ func TestHandleAbsentValidator(t *testing.T) { require.True(t, found) require.Equal(t, int64(0), info.StartHeight) require.Equal(t, SignedBlocksWindow-50, info.SignedBlocksCounter) - // should be bonded still + // validator should be bonded still validator := sk.ValidatorByPubKey(ctx, val) require.Equal(t, sdk.Bonded, validator.GetStatus()) pool := sk.GetPool(ctx) @@ -71,31 +73,34 @@ func TestHandleAbsentValidator(t *testing.T) { require.True(t, found) require.Equal(t, int64(0), info.StartHeight) require.Equal(t, SignedBlocksWindow-51, info.SignedBlocksCounter) - // should have been revoked + // validator should have been revoked validator = sk.ValidatorByPubKey(ctx, val) require.Equal(t, sdk.Unbonded, validator.GetStatus()) + // unrevocation should fail prior to jail expiration got = slh(ctx, NewMsgUnrevoke(addr)) - require.False(t, got.IsOK()) // should fail prior to jail expiration + require.False(t, got.IsOK()) + // unrevocation should succeed after jail expiration ctx = ctx.WithBlockHeader(abci.Header{Time: int64(86400 * 2)}) got = slh(ctx, NewMsgUnrevoke(addr)) - require.True(t, got.IsOK()) // should succeed after jail expiration + require.True(t, got.IsOK()) + // validator should be rebonded now validator = sk.ValidatorByPubKey(ctx, val) require.Equal(t, sdk.Bonded, validator.GetStatus()) - // should have been slashed + // validator should have been slashed pool = sk.GetPool(ctx) require.Equal(t, int64(99), pool.BondedTokens) - // start height should have been changed + // validator start height should have been changed info, found = keeper.getValidatorSigningInfo(ctx, val.Address()) require.True(t, found) require.Equal(t, height, info.StartHeight) require.Equal(t, SignedBlocksWindow-51, info.SignedBlocksCounter) - // should not be immediately revoked again + // validator should not be immediately revoked again height++ ctx = ctx.WithBlockHeight(height) keeper.handleValidatorSignature(ctx, val, false) validator = sk.ValidatorByPubKey(ctx, val) require.Equal(t, sdk.Bonded, validator.GetStatus()) - // should be revoked again after 100 blocks + // validator should be revoked again after 100 unsigned blocks nextHeight := height + 100 for ; height <= nextHeight; height++ { ctx = ctx.WithBlockHeight(height) diff --git a/x/slashing/tick.go b/x/slashing/tick.go index e76c06abe3..abec2b3751 100644 --- a/x/slashing/tick.go +++ b/x/slashing/tick.go @@ -12,9 +12,12 @@ import ( func NewBeginBlocker(sk Keeper) sdk.BeginBlocker { return func(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { + // Tag the height heightBytes := make([]byte, 8) binary.LittleEndian.PutUint64(heightBytes, uint64(req.Header.Height)) tags := sdk.NewTags("height", heightBytes) + + // Deal with any equivocation evidence for _, evidence := range req.ByzantineValidators { var pk crypto.PubKey sk.cdc.MustUnmarshalBinary(evidence.PubKey, &pk) @@ -25,18 +28,25 @@ func NewBeginBlocker(sk Keeper) sdk.BeginBlocker { ctx.Logger().With("module", "x/slashing").Error(fmt.Sprintf("Ignored unknown evidence type: %s", string(evidence.Type))) } } + + // Figure out which validators were absent absent := make(map[string]bool) for _, pubkey := range req.AbsentValidators { var pk crypto.PubKey sk.cdc.MustUnmarshalBinary(pubkey, &pk) absent[string(pk.Bytes())] = true } + + // Iterate over all the validators which *should* have signed this block sk.stakeKeeper.IterateValidatorsBonded(ctx, func(_ int64, validator sdk.Validator) (stop bool) { pubkey := validator.GetPubKey() sk.handleValidatorSignature(ctx, pubkey, !absent[string(pubkey.Bytes())]) return false }) - // TODO Add some more tags so clients can track slashing + + // Return the begin block response + // TODO Return something composable, so other modules can also have BeginBlockers + // TODO Add some more tags so clients can track slashing events return abci.ResponseBeginBlock{ Tags: tags.ToKVPairs(), } diff --git a/x/stake/keeper.go b/x/stake/keeper.go index aba118ed5a..8775dbef53 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -799,7 +799,8 @@ func (k Keeper) Revoke(ctx sdk.Context, pubkey crypto.PubKey) { logger := ctx.Logger().With("module", "x/stake") val, found := k.GetValidatorByPubKey(ctx, pubkey) if !found { - ctx.Logger().Info("Validator with pubkey %s not found, cannot force unbond", pubkey) + // TODO Should we panic? + ctx.Logger().Info("Validator with pubkey %s not found, cannot revoke", pubkey) return } val.Revoked = true @@ -813,7 +814,8 @@ func (k Keeper) Unrevoke(ctx sdk.Context, pubkey crypto.PubKey) { logger := ctx.Logger().With("module", "x/stake") val, found := k.GetValidatorByPubKey(ctx, pubkey) if !found { - ctx.Logger().Info("Validator with pubkey %s not found, cannot force unbond", pubkey) + // TODO Should we panic? + ctx.Logger().Info("Validator with pubkey %s not found, cannot unrevoke", pubkey) return } val.Revoked = false From aed5d94b1ceba2969af993386f1bd9ebc827ac94 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 02:26:17 +0200 Subject: [PATCH 070/548] Remove absent validators from sdk.NewContext --- baseapp/baseapp.go | 8 ++++---- examples/democoin/x/cool/keeper_test.go | 2 +- examples/democoin/x/pow/handler_test.go | 2 +- examples/democoin/x/pow/keeper_test.go | 2 +- examples/democoin/x/simplestake/keeper_test.go | 4 ++-- types/context.go | 5 ++--- types/context_test.go | 4 ++-- types/lib/mapper_test.go | 2 +- x/auth/ante_test.go | 10 +++++----- x/auth/context_test.go | 2 +- x/auth/feekeeper_test.go | 6 +++--- x/auth/mapper_test.go | 2 +- x/bank/keeper_test.go | 6 +++--- x/ibc/ibc_test.go | 2 +- x/slashing/test_common.go | 2 +- x/stake/test_common.go | 2 +- 16 files changed, 30 insertions(+), 31 deletions(-) diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index baed1fb47d..cdc5ffcf7a 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -235,9 +235,9 @@ func (app *BaseApp) initFromStore(mainKey sdk.StoreKey) error { // NewContext returns a new Context with the correct store, the given header, and nil txBytes. func (app *BaseApp) NewContext(isCheckTx bool, header abci.Header) sdk.Context { if isCheckTx { - return sdk.NewContext(app.checkState.ms, header, true, nil, app.Logger, nil) + return sdk.NewContext(app.checkState.ms, header, true, nil, app.Logger) } - return sdk.NewContext(app.deliverState.ms, header, false, nil, app.Logger, nil) + return sdk.NewContext(app.deliverState.ms, header, false, nil, app.Logger) } type state struct { @@ -253,7 +253,7 @@ func (app *BaseApp) setCheckState(header abci.Header) { ms := app.cms.CacheMultiStore() app.checkState = &state{ ms: ms, - ctx: sdk.NewContext(ms, header, true, nil, app.Logger, nil), + ctx: sdk.NewContext(ms, header, true, nil, app.Logger), } } @@ -261,7 +261,7 @@ func (app *BaseApp) setDeliverState(header abci.Header) { ms := app.cms.CacheMultiStore() app.deliverState = &state{ ms: ms, - ctx: sdk.NewContext(ms, header, false, nil, app.Logger, nil), + ctx: sdk.NewContext(ms, header, false, nil, app.Logger), } } diff --git a/examples/democoin/x/cool/keeper_test.go b/examples/democoin/x/cool/keeper_test.go index f632ae31ee..d497dee699 100644 --- a/examples/democoin/x/cool/keeper_test.go +++ b/examples/democoin/x/cool/keeper_test.go @@ -30,7 +30,7 @@ func TestCoolKeeper(t *testing.T) { auth.RegisterBaseAccount(cdc) am := auth.NewAccountMapper(cdc, capKey, &auth.BaseAccount{}) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, nil, nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, nil) ck := bank.NewKeeper(am) keeper := NewKeeper(capKey, ck, DefaultCodespace) diff --git a/examples/democoin/x/pow/handler_test.go b/examples/democoin/x/pow/handler_test.go index 867120eb84..30aeafa2a5 100644 --- a/examples/democoin/x/pow/handler_test.go +++ b/examples/democoin/x/pow/handler_test.go @@ -20,7 +20,7 @@ func TestPowHandler(t *testing.T) { auth.RegisterBaseAccount(cdc) am := auth.NewAccountMapper(cdc, capKey, &auth.BaseAccount{}) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) config := NewConfig("pow", int64(1)) ck := bank.NewKeeper(am) keeper := NewKeeper(capKey, config, ck, DefaultCodespace) diff --git a/examples/democoin/x/pow/keeper_test.go b/examples/democoin/x/pow/keeper_test.go index 98e8ebcfea..a4afb876a9 100644 --- a/examples/democoin/x/pow/keeper_test.go +++ b/examples/democoin/x/pow/keeper_test.go @@ -33,7 +33,7 @@ func TestPowKeeperGetSet(t *testing.T) { auth.RegisterBaseAccount(cdc) am := auth.NewAccountMapper(cdc, capKey, &auth.BaseAccount{}) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) config := NewConfig("pow", int64(1)) ck := bank.NewKeeper(am) keeper := NewKeeper(capKey, config, ck, DefaultCodespace) diff --git a/examples/democoin/x/simplestake/keeper_test.go b/examples/democoin/x/simplestake/keeper_test.go index ef34f3085c..15bd14c79b 100644 --- a/examples/democoin/x/simplestake/keeper_test.go +++ b/examples/democoin/x/simplestake/keeper_test.go @@ -37,7 +37,7 @@ func TestKeeperGetSet(t *testing.T) { accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) stakeKeeper := NewKeeper(capKey, bank.NewKeeper(accountMapper), DefaultCodespace) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) addr := sdk.Address([]byte("some-address")) bi := stakeKeeper.getBondInfo(ctx, addr) @@ -63,7 +63,7 @@ func TestBonding(t *testing.T) { cdc := wire.NewCodec() auth.RegisterBaseAccount(cdc) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) coinKeeper := bank.NewKeeper(accountMapper) diff --git a/types/context.go b/types/context.go index 993c148ec5..10ae99724f 100644 --- a/types/context.go +++ b/types/context.go @@ -30,8 +30,7 @@ type Context struct { } // create a new context -func NewContext(ms MultiStore, header abci.Header, isCheckTx bool, - txBytes []byte, logger log.Logger, absentValidators [][]byte) Context { +func NewContext(ms MultiStore, header abci.Header, isCheckTx bool, txBytes []byte, logger log.Logger) Context { c := Context{ Context: context.Background(), @@ -45,7 +44,7 @@ func NewContext(ms MultiStore, header abci.Header, isCheckTx bool, c = c.WithIsCheckTx(isCheckTx) c = c.WithTxBytes(txBytes) c = c.WithLogger(logger) - c = c.WithAbsentValidators(absentValidators) + c = c.WithAbsentValidators(nil) c = c.WithGasMeter(NewInfiniteGasMeter()) return c } diff --git a/types/context_test.go b/types/context_test.go index 1eafdaf7e7..ec5faab440 100644 --- a/types/context_test.go +++ b/types/context_test.go @@ -43,7 +43,7 @@ func (l MockLogger) With(kvs ...interface{}) log.Logger { func TestContextGetOpShouldNeverPanic(t *testing.T) { var ms types.MultiStore - ctx := types.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) + ctx := types.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) indices := []int64{ -10, 1, 0, 10, 20, } @@ -58,7 +58,7 @@ func defaultContext(key types.StoreKey) types.Context { cms := store.NewCommitMultiStore(db) cms.MountStoreWithDB(key, types.StoreTypeIAVL, db) cms.LoadLatestVersion() - ctx := types.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger(), nil) + ctx := types.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger()) return ctx } diff --git a/types/lib/mapper_test.go b/types/lib/mapper_test.go index a610f1e0fa..e1759b06ac 100644 --- a/types/lib/mapper_test.go +++ b/types/lib/mapper_test.go @@ -25,7 +25,7 @@ func defaultComponents(key sdk.StoreKey) (sdk.Context, *wire.Codec) { cms := store.NewCommitMultiStore(db) cms.MountStoreWithDB(key, sdk.StoreTypeIAVL, db) cms.LoadLatestVersion() - ctx := sdk.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger()) cdc := wire.NewCodec() return ctx, cdc } diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index 729f0769ef..b7f22e5d54 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -75,7 +75,7 @@ func TestAnteHandlerSigErrors(t *testing.T) { mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses priv1, addr1 := privAndAddr() @@ -117,7 +117,7 @@ func TestAnteHandlerSequences(t *testing.T) { mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses priv1, addr1 := privAndAddr() @@ -184,7 +184,7 @@ func TestAnteHandlerFees(t *testing.T) { mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses priv1, addr1 := privAndAddr() @@ -226,7 +226,7 @@ func TestAnteHandlerBadSignBytes(t *testing.T) { mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses priv1, addr1 := privAndAddr() @@ -302,7 +302,7 @@ func TestAnteHandlerSetPubKey(t *testing.T) { mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses priv1, addr1 := privAndAddr() diff --git a/x/auth/context_test.go b/x/auth/context_test.go index 615b7d5196..a93de44d0c 100644 --- a/x/auth/context_test.go +++ b/x/auth/context_test.go @@ -13,7 +13,7 @@ import ( func TestContextWithSigners(t *testing.T) { ms, _, _ := setupMultiStore() - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) _, _, addr1 := keyPubAddr() _, _, addr2 := keyPubAddr() diff --git a/x/auth/feekeeper_test.go b/x/auth/feekeeper_test.go index 3c9190e4ec..2f1ffc59bc 100644 --- a/x/auth/feekeeper_test.go +++ b/x/auth/feekeeper_test.go @@ -23,7 +23,7 @@ func TestFeeCollectionKeeperGetSet(t *testing.T) { cdc := wire.NewCodec() // make context and keeper - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) fck := NewFeeCollectionKeeper(cdc, capKey2) // no coins initially @@ -42,7 +42,7 @@ func TestFeeCollectionKeeperAdd(t *testing.T) { cdc := wire.NewCodec() // make context and keeper - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) fck := NewFeeCollectionKeeper(cdc, capKey2) // no coins initially @@ -62,7 +62,7 @@ func TestFeeCollectionKeeperClear(t *testing.T) { cdc := wire.NewCodec() // make context and keeper - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) fck := NewFeeCollectionKeeper(cdc, capKey2) // set coins initially diff --git a/x/auth/mapper_test.go b/x/auth/mapper_test.go index dc6afef57e..7f6397069a 100644 --- a/x/auth/mapper_test.go +++ b/x/auth/mapper_test.go @@ -31,7 +31,7 @@ func TestAccountMapperGetSet(t *testing.T) { RegisterBaseAccount(cdc) // make context and mapper - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) addr := sdk.Address([]byte("some-address")) diff --git a/x/bank/keeper_test.go b/x/bank/keeper_test.go index 07ba91e0c5..117c69e7ae 100644 --- a/x/bank/keeper_test.go +++ b/x/bank/keeper_test.go @@ -31,7 +31,7 @@ func TestKeeper(t *testing.T) { cdc := wire.NewCodec() auth.RegisterBaseAccount(cdc) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) coinKeeper := NewKeeper(accountMapper) @@ -116,7 +116,7 @@ func TestSendKeeper(t *testing.T) { cdc := wire.NewCodec() auth.RegisterBaseAccount(cdc) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) coinKeeper := NewKeeper(accountMapper) sendKeeper := NewSendKeeper(accountMapper) @@ -185,7 +185,7 @@ func TestViewKeeper(t *testing.T) { cdc := wire.NewCodec() auth.RegisterBaseAccount(cdc) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) coinKeeper := NewKeeper(accountMapper) viewKeeper := NewViewKeeper(accountMapper) diff --git a/x/ibc/ibc_test.go b/x/ibc/ibc_test.go index 9ed4b38254..e13df4f8dd 100644 --- a/x/ibc/ibc_test.go +++ b/x/ibc/ibc_test.go @@ -24,7 +24,7 @@ func defaultContext(key sdk.StoreKey) sdk.Context { cms := store.NewCommitMultiStore(db) cms.MountStoreWithDB(key, sdk.StoreTypeIAVL, db) cms.LoadLatestVersion() - ctx := sdk.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger()) return ctx } diff --git a/x/slashing/test_common.go b/x/slashing/test_common.go index 21274df1b8..8ce654f338 100644 --- a/x/slashing/test_common.go +++ b/x/slashing/test_common.go @@ -53,7 +53,7 @@ func createTestInput(t *testing.T) (sdk.Context, bank.Keeper, stake.Keeper, Keep ms.MountStoreWithDB(keySlashing, sdk.StoreTypeIAVL, db) err := ms.LoadLatestVersion() require.Nil(t, err) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewTMLogger(os.Stdout), nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewTMLogger(os.Stdout)) cdc := createTestCodec() accountMapper := auth.NewAccountMapper(cdc, keyAcc, &auth.BaseAccount{}) ck := bank.NewKeeper(accountMapper) diff --git a/x/stake/test_common.go b/x/stake/test_common.go index 1cd46549b0..b7a5152c09 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -103,7 +103,7 @@ func createTestInput(t *testing.T, isCheckTx bool, initCoins int64) (sdk.Context err := ms.LoadLatestVersion() require.Nil(t, err) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "foochainid"}, isCheckTx, nil, log.NewNopLogger(), nil) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "foochainid"}, isCheckTx, nil, log.NewNopLogger()) cdc := makeTestCodec() accountMapper := auth.NewAccountMapper( cdc, // amino codec From 0dae7f8e4c2de90dd39e8f2932dd544c068dafa9 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 02:27:43 +0200 Subject: [PATCH 071/548] Panic on revoke/unrevoke nonexistent validator --- x/stake/keeper.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/x/stake/keeper.go b/x/stake/keeper.go index 8775dbef53..d943193a11 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -799,9 +799,7 @@ func (k Keeper) Revoke(ctx sdk.Context, pubkey crypto.PubKey) { logger := ctx.Logger().With("module", "x/stake") val, found := k.GetValidatorByPubKey(ctx, pubkey) if !found { - // TODO Should we panic? - ctx.Logger().Info("Validator with pubkey %s not found, cannot revoke", pubkey) - return + panic(fmt.Errorf("Validator with pubkey %s not found, cannot revoke", pubkey)) } val.Revoked = true k.updateValidator(ctx, val) // update the validator, now revoked @@ -814,9 +812,7 @@ func (k Keeper) Unrevoke(ctx sdk.Context, pubkey crypto.PubKey) { logger := ctx.Logger().With("module", "x/stake") val, found := k.GetValidatorByPubKey(ctx, pubkey) if !found { - // TODO Should we panic? - ctx.Logger().Info("Validator with pubkey %s not found, cannot unrevoke", pubkey) - return + panic(fmt.Errorf("Validator with pubkey %s not found, cannot unrevoke", pubkey)) } val.Revoked = false k.updateValidator(ctx, val) // update the validator, now unrevoked From b8b4fe24e3386a1b4a22c144cd812f5cdfd1c249 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 02:33:01 +0200 Subject: [PATCH 072/548] Absent validators map[crypto.PubKey]struct{} --- x/slashing/tick.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/x/slashing/tick.go b/x/slashing/tick.go index abec2b3751..0d200f5934 100644 --- a/x/slashing/tick.go +++ b/x/slashing/tick.go @@ -30,17 +30,21 @@ func NewBeginBlocker(sk Keeper) sdk.BeginBlocker { } // Figure out which validators were absent - absent := make(map[string]bool) + absent := make(map[crypto.PubKey]struct{}) for _, pubkey := range req.AbsentValidators { var pk crypto.PubKey sk.cdc.MustUnmarshalBinary(pubkey, &pk) - absent[string(pk.Bytes())] = true + absent[pk] = struct{}{} } // Iterate over all the validators which *should* have signed this block sk.stakeKeeper.IterateValidatorsBonded(ctx, func(_ int64, validator sdk.Validator) (stop bool) { pubkey := validator.GetPubKey() - sk.handleValidatorSignature(ctx, pubkey, !absent[string(pubkey.Bytes())]) + abs := false + if _, ok := absent[pubkey]; ok { + abs = true + } + sk.handleValidatorSignature(ctx, pubkey, abs) return false }) From 7fbecc6b727f83448aa2eae72d0a298fb8f5d279 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 02:35:42 +0200 Subject: [PATCH 073/548] Clarify default signing info --- x/slashing/keeper.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index f003b33540..b27fdb5927 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -56,6 +56,7 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, address := pubkey.Address() // Local index, so counts blocks validator *should* have signed + // Will use the 0-value default signing info if not present signInfo, _ := k.getValidatorSigningInfo(ctx, address) index := signInfo.IndexOffset % SignedBlocksWindow signInfo.IndexOffset++ @@ -65,11 +66,9 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, if previous && !signed { k.setValidatorSigningBitArray(ctx, address, index, false) signInfo.SignedBlocksCounter-- - k.setValidatorSigningInfo(ctx, address, signInfo) } else if !previous && signed { k.setValidatorSigningBitArray(ctx, address, index, true) signInfo.SignedBlocksCounter++ - k.setValidatorSigningInfo(ctx, address, signInfo) } minHeight := signInfo.StartHeight + SignedBlocksWindow @@ -79,6 +78,8 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, k.stakeKeeper.Slash(ctx, pubkey, height, SlashFractionDowntime) k.stakeKeeper.Revoke(ctx, pubkey) signInfo.JailedUntil = ctx.BlockHeader().Time + DowntimeUnbondDuration - k.setValidatorSigningInfo(ctx, address, signInfo) } + + // Set the updated signing info + k.setValidatorSigningInfo(ctx, address, signInfo) } From 65945c069c7cbc9fabbe6523fd0086054fd82a1b Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 02:48:29 +0200 Subject: [PATCH 074/548] Clarify counter logic --- x/slashing/keeper.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index b27fdb5927..46ed4591b2 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -63,10 +63,14 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, // Update signed block bit array & counter previous := k.getValidatorSigningBitArray(ctx, address, index) - if previous && !signed { + if previous == signed { + // No need to update counter + } else if previous && !signed { + // Signed => unsigned, decrement counter k.setValidatorSigningBitArray(ctx, address, index, false) signInfo.SignedBlocksCounter-- } else if !previous && signed { + // Unsigned => signed, increment counter k.setValidatorSigningBitArray(ctx, address, index, true) signInfo.SignedBlocksCounter++ } From 345b5b88a8bb357c047f990ded1b97fbb88e5c33 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 02:50:04 +0200 Subject: [PATCH 075/548] Add comment on MsgUnrevoke --- x/slashing/msg.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/slashing/msg.go b/x/slashing/msg.go index d67ddf70df..72d2255d61 100644 --- a/x/slashing/msg.go +++ b/x/slashing/msg.go @@ -14,7 +14,7 @@ var _ sdk.Msg = &MsgUnrevoke{} // MsgUnrevoke - struct for unrevoking revoked validator type MsgUnrevoke struct { - ValidatorAddr sdk.Address `json:"address"` + ValidatorAddr sdk.Address `json:"address"` // address of the validator owner } func NewMsgUnrevoke(validatorAddr sdk.Address) MsgUnrevoke { From 88e00257242c028f1f72e1b010deb33994e4f6ef Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 02:56:40 +0200 Subject: [PATCH 076/548] DowntimeUnbondDuration to 10 minutes --- x/slashing/params.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/slashing/params.go b/x/slashing/params.go index 5e611fa0b5..3bba85fa66 100644 --- a/x/slashing/params.go +++ b/x/slashing/params.go @@ -22,8 +22,8 @@ const ( // Downtime unbond duration // TODO Governance parameter? - // TODO Temporarily set to 6 hours for testnets - DowntimeUnbondDuration int64 = 60 * 60 * 6 + // TODO Temporarily set to 10 minutes for testnets + DowntimeUnbondDuration int64 = 60 * 10 ) var ( From 69af8b1a945fc8a42262b87bb06b451c0b38b76f Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 02:58:43 +0200 Subject: [PATCH 077/548] Clarify signing info stored by validator address --- x/slashing/signing_info.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/x/slashing/signing_info.go b/x/slashing/signing_info.go index cadd6d5805..fcbb0d1c7e 100644 --- a/x/slashing/signing_info.go +++ b/x/slashing/signing_info.go @@ -6,6 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) +// Stored by *validator* address (not owner address) func (k Keeper) getValidatorSigningInfo(ctx sdk.Context, address sdk.Address) (info validatorSigningInfo, found bool) { store := ctx.KVStore(k.storeKey) bz := store.Get(validatorSigningInfoKey(address)) @@ -18,12 +19,14 @@ func (k Keeper) getValidatorSigningInfo(ctx sdk.Context, address sdk.Address) (i return } +// Stored by *validator* address (not owner address) func (k Keeper) setValidatorSigningInfo(ctx sdk.Context, address sdk.Address, info validatorSigningInfo) { store := ctx.KVStore(k.storeKey) bz := k.cdc.MustMarshalBinary(info) store.Set(validatorSigningInfoKey(address), bz) } +// Stored by *validator* address (not owner address) func (k Keeper) getValidatorSigningBitArray(ctx sdk.Context, address sdk.Address, index int64) (signed bool) { store := ctx.KVStore(k.storeKey) bz := store.Get(validatorSigningBitArrayKey(address, index)) @@ -36,6 +39,7 @@ func (k Keeper) getValidatorSigningBitArray(ctx sdk.Context, address sdk.Address return } +// Stored by *validator* address (not owner address) func (k Keeper) setValidatorSigningBitArray(ctx sdk.Context, address sdk.Address, index int64, signed bool) { store := ctx.KVStore(k.storeKey) bz := k.cdc.MustMarshalBinary(signed) @@ -49,10 +53,12 @@ type validatorSigningInfo struct { SignedBlocksCounter int64 `json:"signed_blocks_counter"` // signed blocks counter (to avoid scanning the array every time) } +// Stored by *validator* address (not owner address) func validatorSigningInfoKey(v sdk.Address) []byte { return append([]byte{0x01}, v.Bytes()...) } +// Stored by *validator* address (not owner address) func validatorSigningBitArrayKey(v sdk.Address, i int64) []byte { b := make([]byte, 8) binary.LittleEndian.PutUint64(b, uint64(i)) From f946b630a44c0d0ffc879c90c9cd019d07f0ac92 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 28 May 2018 19:27:34 -0400 Subject: [PATCH 078/548] fixes from review --- client/keys/utils.go | 24 ++++++++++------- types/account.go | 64 +++++++++++++++++++++----------------------- types/stake.go | 2 +- 3 files changed, 46 insertions(+), 44 deletions(-) diff --git a/client/keys/utils.go b/client/keys/utils.go index eaf1e4c2fb..a49ac63c0e 100644 --- a/client/keys/utils.go +++ b/client/keys/utils.go @@ -74,15 +74,7 @@ func printInfo(info keys.Info) { switch viper.Get(cli.OutputFlag) { case "text": fmt.Printf("NAME:\tADDRESS:\t\t\t\t\tPUBKEY:\n") - bechAccount, err := sdk.Bech32CosmosifyAcc(ko.Address) - if err != nil { - panic(err) - } - bechPubKey, err := sdk.Bech32CosmosifyAccPub(ko.PubKey) - if err != nil { - panic(err) - } - fmt.Printf("%s\t%s\t%s\n", ko.Name, bechAccount, bechPubKey) + printKeyOutput(ko) case "json": out, err := json.MarshalIndent(ko, "", "\t") if err != nil { @@ -98,7 +90,7 @@ func printInfos(infos []keys.Info) { case "text": fmt.Printf("NAME:\tADDRESS:\t\t\t\t\tPUBKEY:\n") for _, ko := range kos { - fmt.Printf("%s\t%s\t%s\n", ko.Name, ko.Address, ko.PubKey) + printKeyOutput(ko) } case "json": out, err := json.MarshalIndent(kos, "", "\t") @@ -108,3 +100,15 @@ func printInfos(infos []keys.Info) { fmt.Println(string(out)) } } + +func printKeyOutput(ko KeyOutput) { + bechAccount, err := sdk.Bech32CosmosifyAcc(ko.Address) + if err != nil { + panic(err) + } + bechPubKey, err := sdk.Bech32CosmosifyAccPub(ko.PubKey) + if err != nil { + panic(err) + } + fmt.Printf("%s\t%s\t%s\n", ko.Name, bechAccount, bechPubKey) +} diff --git a/types/account.go b/types/account.go index 615fd30c17..b593dfb539 100644 --- a/types/account.go +++ b/types/account.go @@ -13,24 +13,32 @@ import ( //Address is a go crypto-style Address type Address = cmn.HexBytes +// Bech32 prefixes +const ( + Bech32PrefixAccAddr = "cosmosaccaddr" + Bech32PrefixAccPub = "cosmosaccpub" + Bech32PrefixValAddr = "cosmosvaladdr" + Bech32PrefixValPub = "cosmosvalpub" +) + // Bech32CosmosifyAcc takes Address and returns the Bech32Cosmos encoded string func Bech32CosmosifyAcc(addr Address) (string, error) { - return bech32cosmos.ConvertAndEncode("cosmosaccaddr", addr.Bytes()) + return bech32cosmos.ConvertAndEncode(Bech32PrefixAccAddr, addr.Bytes()) } // Bech32CosmosifyAccPub takes AccountPubKey and returns the Bech32Cosmos encoded string func Bech32CosmosifyAccPub(pub crypto.PubKey) (string, error) { - return bech32cosmos.ConvertAndEncode("cosmosaccpub", pub.Bytes()) + return bech32cosmos.ConvertAndEncode(Bech32PrefixAccPub, pub.Bytes()) } // Bech32CosmosifyVal returns the Bech32Cosmos encoded string for a validator address func Bech32CosmosifyVal(addr Address) (string, error) { - return bech32cosmos.ConvertAndEncode("cosmosvaladdr", addr.Bytes()) + return bech32cosmos.ConvertAndEncode(Bech32PrefixValAddr, addr.Bytes()) } // Bech32CosmosifyValPub returns the Bech32Cosmos encoded string for a validator pubkey func Bech32CosmosifyValPub(pub crypto.PubKey) (string, error) { - return bech32cosmos.ConvertAndEncode("cosmosvalpub", pub.Bytes()) + return bech32cosmos.ConvertAndEncode(Bech32PrefixValPub, pub.Bytes()) } // create an Address from a string @@ -47,16 +55,7 @@ func GetAccAddressHex(address string) (addr Address, err error) { // create an Address from a string func GetAccAddressBech32Cosmos(address string) (addr Address, err error) { - if len(address) == 0 { - return addr, errors.New("must use provide address") - } - - hrp, bz, err := bech32cosmos.DecodeAndConvert(address) - - if hrp != "cosmosaccaddr" { - return addr, fmt.Errorf("Invalid Address Prefix. Expected cosmosaccaddr, Got %s", hrp) - } - + bz, err := getFromBech32Cosmos(address, Bech32PrefixAccAddr) if err != nil { return nil, err } @@ -77,16 +76,7 @@ func GetValAddressHex(address string) (addr Address, err error) { // create an Address from a bech32cosmos string func GetValAddressBech32Cosmos(address string) (addr Address, err error) { - if len(address) == 0 { - return addr, errors.New("must use provide address") - } - - hrp, bz, err := bech32cosmos.DecodeAndConvert(address) - - if hrp != "cosmosvaladdr" { - return addr, fmt.Errorf("Invalid Address Prefix. Expected cosmosvaladdr, Got %s", hrp) - } - + bz, err := getFromBech32Cosmos(address, Bech32PrefixValAddr) if err != nil { return nil, err } @@ -95,15 +85,7 @@ func GetValAddressBech32Cosmos(address string) (addr Address, err error) { //Decode a validator publickey into a public key func GetValPubKeyBech32Cosmos(pubkey string) (pk crypto.PubKey, err error) { - if len(pubkey) == 0 { - return pk, errors.New("must use provide pubkey") - } - hrp, bz, err := bech32cosmos.DecodeAndConvert(pubkey) - - if hrp != "cosmosvalpub" { - return pk, fmt.Errorf("Invalid Validator Pubkey Prefix. Expected cosmosvalpub, Got %s", hrp) - } - + bz, err := getFromBech32Cosmos(pubkey, Bech32PrefixValPub) if err != nil { return nil, err } @@ -115,3 +97,19 @@ func GetValPubKeyBech32Cosmos(pubkey string) (pk crypto.PubKey, err error) { return pk, nil } + +func getFromBech32Cosmos(bech32, prefix string) ([]byte, error) { + if len(bech32) == 0 { + return nil, errors.New("must provide non-empty string") + } + hrp, bz, err := bech32cosmos.DecodeAndConvert(bech32) + if err != nil { + return nil, err + } + + if hrp != prefix { + return nil, fmt.Errorf("Invalid bech32 prefix. Expected %s, Got %s", prefix, hrp) + } + + return bz, nil +} diff --git a/types/stake.go b/types/stake.go index c640e98e77..6a1a3a95f6 100644 --- a/types/stake.go +++ b/types/stake.go @@ -19,7 +19,7 @@ const ( func BondStatusToString(b BondStatus) string { switch b { case 0x00: - return "Ubbonded" + return "Unbonded" case 0x01: return "Unbonding" case 0x02: From 5055a4af4531ba711a2c3cde065a25cb100f210c Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 04:51:11 +0200 Subject: [PATCH 079/548] Tiny indentation fix --- client/keys/utils.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/keys/utils.go b/client/keys/utils.go index a49ac63c0e..1a358cfc9c 100644 --- a/client/keys/utils.go +++ b/client/keys/utils.go @@ -73,7 +73,7 @@ func printInfo(info keys.Info) { ko := NewKeyOutput(info) switch viper.Get(cli.OutputFlag) { case "text": - fmt.Printf("NAME:\tADDRESS:\t\t\t\t\tPUBKEY:\n") + fmt.Printf("NAME:\tADDRESS:\t\t\t\t\t\tPUBKEY:\n") printKeyOutput(ko) case "json": out, err := json.MarshalIndent(ko, "", "\t") @@ -88,7 +88,7 @@ func printInfos(infos []keys.Info) { kos := NewKeyOutputs(infos) switch viper.Get(cli.OutputFlag) { case "text": - fmt.Printf("NAME:\tADDRESS:\t\t\t\t\tPUBKEY:\n") + fmt.Printf("NAME:\tADDRESS:\t\t\t\t\t\tPUBKEY:\n") for _, ko := range kos { printKeyOutput(ko) } From ef3e2200a5fca8313a3e0340224355d5722e51ef Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 05:00:47 +0200 Subject: [PATCH 080/548] Fix dependencies --- Gopkg.lock | 17 ++++++++--------- Gopkg.toml | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 286760d609..5fe7b1a876 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -11,7 +11,7 @@ branch = "master" name = "github.com/btcsuite/btcd" packages = ["btcec"] - revision = "1432d294a5b055c297457c25434efbf13384cc46" + revision = "bc0944904505aab55e089371a892be2f87883161" [[projects]] name = "github.com/davecgh/go-spew" @@ -253,7 +253,6 @@ revision = "5d6fca44a948d2be89a9702de7717f0168403d3d" [[projects]] - branch = "develop" name = "github.com/tendermint/abci" packages = [ "client", @@ -277,8 +276,8 @@ [[projects]] name = "github.com/tendermint/go-amino" packages = ["."] - revision = "ed62928576cfcaf887209dc96142cd79cdfff389" - version = "0.9.9" + revision = "3c22a7a539411f89a96738fcfa14c1027e24e5ec" + version = "0.9.10" [[projects]] name = "github.com/tendermint/go-crypto" @@ -342,7 +341,7 @@ "types/priv_validator", "version" ] - revision = "d3093426f455c4b33cee818e3bbf2d2b83e4b38d" + revision = "3b8c1ae119da990664f3b98bb2518032f5d837f9" [[projects]] name = "github.com/tendermint/tmlibs" @@ -374,7 +373,7 @@ "ripemd160", "salsa20/salsa" ] - revision = "75e913eb8a8e3d31a97b216de09de106a7b07681" + revision = "ab813273cd59e1333f7ae7bff5d027d4aadf528c" [[projects]] branch = "master" @@ -388,13 +387,13 @@ "internal/timeseries", "trace" ] - revision = "9ef9f5bb98a1fdc41f8cf6c250a4404b4085e389" + revision = "dfa909b99c79129e1100513e5cd36307665e5723" [[projects]] branch = "master" name = "golang.org/x/sys" packages = ["unix"] - revision = "77b0e4315053a57ed2962443614bdb28db152054" + revision = "c11f84a56e43e20a78cee75a7c034031ecf57d1f" [[projects]] name = "golang.org/x/text" @@ -455,6 +454,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "bbc0ee39f39cb296960a5fcb2a3916a4acc48ecbb675758ea1f61def44e994bb" + inputs-digest = "dc095a5d071dc8e1d7c3fd1208efbbe7d3c09551ecef76fdfafcdcdd88a49f50" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 53dbabbbb3..61d11f999b 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -54,7 +54,7 @@ [[override]] name = "github.com/tendermint/abci" - branch = "develop" + revision = "f9dce537281ffba5d1e047e6729429f7e5fb90c9" [[constraint]] name = "github.com/tendermint/go-crypto" From 5254a4aa1d847181d373144c1a283b5205909dd4 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 05:24:57 +0200 Subject: [PATCH 081/548] Dependency fix, try II --- Gopkg.lock | 6 +++--- Gopkg.toml | 4 ++-- client/tx/search.go | 7 +++++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 5fe7b1a876..e30a97fda3 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -276,8 +276,8 @@ [[projects]] name = "github.com/tendermint/go-amino" packages = ["."] - revision = "3c22a7a539411f89a96738fcfa14c1027e24e5ec" - version = "0.9.10" + revision = "ed62928576cfcaf887209dc96142cd79cdfff389" + version = "0.9.9" [[projects]] name = "github.com/tendermint/go-crypto" @@ -454,6 +454,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "dc095a5d071dc8e1d7c3fd1208efbbe7d3c09551ecef76fdfafcdcdd88a49f50" + inputs-digest = "5ec04e1fee08c36e90fd44ec2cdd217f41d80ef5b256fee07cf4030c6cdfd413" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 61d11f999b..ce6ecda982 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -62,9 +62,9 @@ [[constraint]] name = "github.com/tendermint/go-amino" - version = "~0.9.9" + version = "=0.9.9" -[[override]] +[[constraint]] name = "github.com/tendermint/iavl" branch = "develop" diff --git a/client/tx/search.go b/client/tx/search.go index 672f29ff14..527661626a 100644 --- a/client/tx/search.go +++ b/client/tx/search.go @@ -61,12 +61,15 @@ func searchTx(ctx context.CoreContext, cdc *wire.Codec, tags []string) ([]byte, } prove := !viper.GetBool(client.FlagTrustNode) - txs, err := node.TxSearch(query, prove) + // TODO: take these as args + page := 0 + perPage := 100 + res, err := node.TxSearch(query, prove, page, perPage) if err != nil { return nil, err } - info, err := formatTxResults(cdc, txs) + info, err := formatTxResults(cdc, res.Txs) if err != nil { return nil, err } From 4447440c2907d15d50ba26a9345856018dc3f3c4 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 05:47:28 +0200 Subject: [PATCH 082/548] Switch to tagged ABCI version --- Gopkg.lock | 3 ++- Gopkg.toml | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index e30a97fda3..f4da3a15cc 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -262,6 +262,7 @@ "types" ] revision = "f9dce537281ffba5d1e047e6729429f7e5fb90c9" + version = "v0.11.0-rc0" [[projects]] branch = "master" @@ -454,6 +455,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "5ec04e1fee08c36e90fd44ec2cdd217f41d80ef5b256fee07cf4030c6cdfd413" + inputs-digest = "ad811206ccd65d54f53041f1284d45d3645c1e89b77e1e6843af786630f0b587" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index ce6ecda982..74569e5082 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -52,9 +52,9 @@ name = "github.com/stretchr/testify" version = "~1.2.1" -[[override]] +[[constraint]] name = "github.com/tendermint/abci" - revision = "f9dce537281ffba5d1e047e6729429f7e5fb90c9" + version = "0.11.0-rc0" [[constraint]] name = "github.com/tendermint/go-crypto" From a5395f061925e87232589bb605b60ecc01671d20 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 06:07:55 +0200 Subject: [PATCH 083/548] Swap to tagged IAVL version --- Gopkg.lock | 6 +++--- Gopkg.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index f4da3a15cc..39e549b08f 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -293,13 +293,13 @@ version = "v0.6.2" [[projects]] - branch = "develop" name = "github.com/tendermint/iavl" packages = [ ".", "sha256truncated" ] revision = "c9206995e8f948e99927f5084a88a7e94ca256da" + version = "v0.8.0-rc0" [[projects]] branch = "cwgoes/update-abci" @@ -342,7 +342,7 @@ "types/priv_validator", "version" ] - revision = "3b8c1ae119da990664f3b98bb2518032f5d837f9" + revision = "3bf9a7dc503b8fd39bda3d64f2d039253afa6f8c" [[projects]] name = "github.com/tendermint/tmlibs" @@ -455,6 +455,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "ad811206ccd65d54f53041f1284d45d3645c1e89b77e1e6843af786630f0b587" + inputs-digest = "473825a42fdba2832156190a00251b6f06aa6f039e5931ec00219b1b7004a89e" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 74569e5082..8dc5a7a7f5 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -66,7 +66,7 @@ [[constraint]] name = "github.com/tendermint/iavl" - branch = "develop" + version = "0.8.0-rc0" [[override]] name = "github.com/tendermint/tendermint" From 99e5c5a18ff056f392462e3924a19bceeb71ffaf Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Tue, 29 May 2018 15:07:03 +0900 Subject: [PATCH 084/548] Restored validators query endpoint --- client/lcd/lcd_test.go | 47 +++++++++--------------------------- x/stake/client/rest/query.go | 43 +++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 35 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 0959a29c71..6c5bcfd711 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -313,6 +313,13 @@ func TestTxs(t *testing.T) { // assert.NotEqual(t, "[]", body) } +func TestValidatorsQuery(t *testing.T) { + validators := getValidators(t) + assert.Equal(t, len(validators), 2) + assert.Equal(t, hex.EncodeToString(validators[0].Owner), validatorAddr1) + assert.Equal(t, hex.EncodeToString(validators[1].Owner), validatorAddr2) +} + func TestBond(t *testing.T) { // create bond TX @@ -631,42 +638,12 @@ func doUnbond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastT return results[0] } -func doMultiBond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxCommit) { +func getValidators(t *testing.T) []stake.Validator { // get the account to get the sequence - acc := getAccount(t, sendAddr) - sequence := acc.GetSequence() - - // send - jsonStr := []byte(fmt.Sprintf(`{ - "name": "%s", - "password": "%s", - "sequence": %d, - "bond": [ - { - "delegator_addr": "%x", - "validator_addr": "%s", - "bond": { "denom": "%s", "amount": 1 } - }, - { - "delegator_addr": "%x", - "validator_addr": "%s", - "bond": { "denom": "%s", "amount": 1 } - }, - ], - "unbond": [ - { - "delegator_addr": "%x", - "validator_addr": "%s", - "shares": "1" - } - ] - }`, name, password, sequence, acc.GetAddress(), validatorAddr1, coinDenom, acc.GetAddress(), validatorAddr2, coinDenom, acc.GetAddress(), validatorAddr1)) - res, body := request(t, port, "POST", "/stake/delegations", jsonStr) + res, body := request(t, port, "GET", "/stake/validators", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - - var results []ctypes.ResultBroadcastTxCommit - err := cdc.UnmarshalJSON([]byte(body), &results) + var validators stake.Validators + err := cdc.UnmarshalJSON([]byte(body), &validators) require.Nil(t, err) - - return results[0] + return validators } diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index cbcf5f5e8e..0388467c44 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -18,6 +18,10 @@ func registerQueryRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec "/stake/{delegator}/bonding_status/{validator}", bondingStatusHandlerFn("stake", cdc, ctx), ).Methods("GET") + r.HandleFunc( + "/stake/validators", + validatorsHandlerFn("stake", cdc, ctx), + ).Methods("GET") } // http request handler to query delegator bonding status @@ -77,3 +81,42 @@ func bondingStatusHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreC w.Write(output) } } + +// http request handler to query list of validators +func validatorsHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + res, err := ctx.QuerySubspace(cdc, stake.ValidatorsKey, storeName) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf("Couldn't query validators. Error: %s", err.Error()))) + return + } + + // the query will return empty if there are no validators + if len(res) == 0 { + w.WriteHeader(http.StatusNoContent) + return + } + + validators := make(stake.Validators, 0, len(res)) + for _, kv := range res { + var validator stake.Validator + err = cdc.UnmarshalBinary(kv.Value, &validator) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf("Couldn't decode validator. Error: %s", err.Error()))) + return + } + validators = append(validators, validator) + } + + output, err := cdc.MarshalJSON(validators) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(err.Error())) + return + } + + w.Write(output) + } +} From 6712ea7f3a14d78be83b59eb45c3316ef99314c4 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 08:32:39 +0200 Subject: [PATCH 085/548] Present, not absent --- x/slashing/tick.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x/slashing/tick.go b/x/slashing/tick.go index 0d200f5934..8125522741 100644 --- a/x/slashing/tick.go +++ b/x/slashing/tick.go @@ -40,11 +40,11 @@ func NewBeginBlocker(sk Keeper) sdk.BeginBlocker { // Iterate over all the validators which *should* have signed this block sk.stakeKeeper.IterateValidatorsBonded(ctx, func(_ int64, validator sdk.Validator) (stop bool) { pubkey := validator.GetPubKey() - abs := false + present := true if _, ok := absent[pubkey]; ok { - abs = true + present = false } - sk.handleValidatorSignature(ctx, pubkey, abs) + sk.handleValidatorSignature(ctx, pubkey, present) return false }) From 74e8159c3ff1a9f14cd5eab8ee0289b81ff07028 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 08:49:37 +0200 Subject: [PATCH 086/548] Force update staking store --- x/stake/genesis.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/x/stake/genesis.go b/x/stake/genesis.go index d45adc3d7f..e8965dcf2f 100644 --- a/x/stake/genesis.go +++ b/x/stake/genesis.go @@ -32,11 +32,15 @@ func InitGenesis(ctx sdk.Context, k Keeper, data GenesisState) { k.setPool(ctx, data.Pool) k.setNewParams(ctx, data.Params) for _, validator := range data.Validators { + // Staking assumes bonded validators are already stored, need to force update + validator.PoolShares.Status = sdk.Unbonded k.updateValidator(ctx, validator) } for _, bond := range data.Bonds { k.setDelegation(ctx, bond) } + store := ctx.KVStore(k.storeKey) + k.updateBondedValidatorsFull(ctx, store) } // WriteGenesis - output genesis parameters From 9dfaf1797c89a385107cce7e6b5cd72d6dce928e Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 08:56:53 +0200 Subject: [PATCH 087/548] Staking InitGenesis fix II --- x/stake/genesis.go | 1 + 1 file changed, 1 insertion(+) diff --git a/x/stake/genesis.go b/x/stake/genesis.go index e8965dcf2f..e6baa099b5 100644 --- a/x/stake/genesis.go +++ b/x/stake/genesis.go @@ -34,6 +34,7 @@ func InitGenesis(ctx sdk.Context, k Keeper, data GenesisState) { for _, validator := range data.Validators { // Staking assumes bonded validators are already stored, need to force update validator.PoolShares.Status = sdk.Unbonded + k.setValidator(ctx, validator) k.updateValidator(ctx, validator) } for _, bond := range data.Bonds { From 5b2a5c948ce6142ec2262886aafdc2a6a982cc54 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Thu, 24 May 2018 18:00:59 -0400 Subject: [PATCH 088/548] update to tm v0.19.6 --- CHANGELOG.md | 6 ++++++ Gopkg.lock | 20 ++++++++++---------- Gopkg.toml | 4 ++-- version/version.go | 4 ++-- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b0853dc0c..1075450e20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.17.3 + +*May 29, 2018* + +Update to Tendermint v0.19.6 (fix fast-sync halt) + ## 0.17.2 *May 20, 2018* diff --git a/Gopkg.lock b/Gopkg.lock index 37a32820c2..3216a0f79e 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -11,7 +11,7 @@ branch = "master" name = "github.com/btcsuite/btcd" packages = ["btcec"] - revision = "1432d294a5b055c297457c25434efbf13384cc46" + revision = "bc0944904505aab55e089371a892be2f87883161" [[projects]] name = "github.com/davecgh/go-spew" @@ -250,7 +250,7 @@ "leveldb/table", "leveldb/util" ] - revision = "e6d6b529196422703d54ff5c40e79809ec2020b3" + revision = "5d6fca44a948d2be89a9702de7717f0168403d3d" [[projects]] name = "github.com/tendermint/abci" @@ -341,8 +341,8 @@ "types/priv_validator", "version" ] - revision = "018e096748bafe1d2d1e69b909e4158f3b26f6b2" - version = "v0.19.5-rc1" + revision = "fd6021876b017cbf45cdf6dd55a0d6cdf431e826" + version = "v0.19.6-rc2" [[projects]] name = "github.com/tendermint/tmlibs" @@ -359,8 +359,8 @@ "pubsub", "pubsub/query" ] - revision = "cc5f287c4798ffe88c04d02df219ecb6932080fd" - version = "v0.8.3-rc0" + revision = "d970af87248a4e162590300dbb74e102183a417d" + version = "v0.8.3" [[projects]] branch = "master" @@ -376,7 +376,7 @@ "ripemd160", "salsa20/salsa" ] - revision = "1a580b3eff7814fc9b40602fd35256c63b50f491" + revision = "ab813273cd59e1333f7ae7bff5d027d4aadf528c" [[projects]] branch = "master" @@ -390,13 +390,13 @@ "internal/timeseries", "trace" ] - revision = "57065200b4b034a1c8ad54ff77069408c2218ae6" + revision = "dfa909b99c79129e1100513e5cd36307665e5723" [[projects]] branch = "master" name = "golang.org/x/sys" packages = ["unix"] - revision = "7c87d13f8e835d2fb3a70a2912c811ed0c1d241b" + revision = "c11f84a56e43e20a78cee75a7c034031ecf57d1f" [[projects]] name = "golang.org/x/text" @@ -457,6 +457,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "7540d2ecdb5d7d5084ab4e6132e929bbd501bd6add3006d8f08a6b2c127e0c7d" + inputs-digest = "2e868c5ad771cb647fd85a357375c559287602e886b7a040ddde0fac7f4f3365" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 5480bc03fc..3a7ee9cfc9 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -66,7 +66,7 @@ [[constraint]] name = "github.com/tendermint/go-amino" - version = "~0.9.9" + version = "=0.9.9" [[constraint]] name = "github.com/tendermint/iavl" @@ -74,7 +74,7 @@ [[constraint]] name = "github.com/tendermint/tendermint" - version = "0.19.5-rc1" + version = "0.19.6-rc2" [[override]] name = "github.com/tendermint/tmlibs" diff --git a/version/version.go b/version/version.go index ea365bda9e..ae9433bcd0 100644 --- a/version/version.go +++ b/version/version.go @@ -7,9 +7,9 @@ package version const Maj = "0" const Min = "17" -const Fix = "2" +const Fix = "3" -const Version = "0.17.2" +const Version = "0.17.3" // GitCommit set by build flags var GitCommit = "" From 3b4aa4d0ae89165609223ad48595c1d829f7ed6b Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 29 May 2018 21:46:38 +0200 Subject: [PATCH 089/548] Minor test fix after merge --- x/slashing/test_common.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/x/slashing/test_common.go b/x/slashing/test_common.go index 8ce654f338..0228e9498b 100644 --- a/x/slashing/test_common.go +++ b/x/slashing/test_common.go @@ -81,10 +81,7 @@ func newPubKey(pk string) (res crypto.PubKey) { } func testAddr(addr string) sdk.Address { - res, err := sdk.GetAddress(addr) - if err != nil { - panic(err) - } + res := []byte(addr) return res } From 52cd8b8c1fe25dacb6910b84189755bd5bad4a7b Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Wed, 30 May 2018 07:42:59 -0700 Subject: [PATCH 090/548] fix endPath missing bug for query --- client/context/helpers.go | 2 +- client/lcd/lcd_test.go | 4 ++-- x/stake/client/cli/query.go | 12 ++++++------ x/stake/client/rest/query.go | 4 +++- x/stake/client/rest/tx.go | 2 -- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/client/context/helpers.go b/client/context/helpers.go index f4686befde..f47cc7ff41 100644 --- a/client/context/helpers.go +++ b/client/context/helpers.go @@ -59,7 +59,7 @@ func (ctx CoreContext) QuerySubspace(cdc *wire.Codec, subspace []byte, storeName // Query from Tendermint with the provided storename and path func (ctx CoreContext) query(key cmn.HexBytes, storeName, endPath string) (res []byte, err error) { - path := fmt.Sprintf("/store/%s/key", storeName) + path := fmt.Sprintf("/store/%s/%s", storeName, endPath) node, err := ctx.GetNode() if err != nil { return res, err diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 6c5bcfd711..289075bc9a 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -454,7 +454,7 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { if err != nil { return nil, nil, err } - lcd, err := startLCD(logger, listenAddr) + lcd, err := startLCD(logger, listenAddr, cdc) if err != nil { return nil, nil, err } @@ -493,7 +493,7 @@ func startTM(cfg *tmcfg.Config, logger log.Logger, genDoc *tmtypes.GenesisDoc, p } // start the LCD. note this blocks! -func startLCD(logger log.Logger, listenAddr string) (net.Listener, error) { +func startLCD(logger log.Logger, listenAddr string, cdc *wire.Codec) (net.Listener, error) { handler := createHandler(cdc) return tmrpc.StartHTTPServer(listenAddr, handler, logger) } diff --git a/x/stake/client/cli/query.go b/x/stake/client/cli/query.go index 079dd003d8..26b508e0d5 100644 --- a/x/stake/client/cli/query.go +++ b/x/stake/client/cli/query.go @@ -62,15 +62,15 @@ func GetCmdQueryValidators(storeName string, cdc *wire.Codec) *cobra.Command { return err } - // parse out the candidates - var candidates []stake.Validator + // parse out the validators + var validators []stake.Validator for _, KV := range resKVs { var validator stake.Validator cdc.MustUnmarshalBinary(KV.Value, &validator) - candidates = append(candidates, validator) + validators = append(validators, validator) } - output, err := wire.MarshalJSONIndent(cdc, candidates) + output, err := wire.MarshalJSONIndent(cdc, validators) if err != nil { return err } @@ -127,7 +127,7 @@ func GetCmdQueryDelegation(storeName string, cdc *wire.Codec) *cobra.Command { return cmd } -// get the command to query all the candidates bonded to a delegation +// get the command to query all the validators bonded to a delegation func GetCmdQueryDelegations(storeName string, cdc *wire.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "delegations [delegator-addr]", @@ -146,7 +146,7 @@ func GetCmdQueryDelegations(storeName string, cdc *wire.Codec) *cobra.Command { return err } - // parse out the candidates + // parse out the validators var delegations []stake.Delegation for _, KV := range resKVs { var delegation stake.Delegation diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index 0388467c44..1eda2ac532 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -27,6 +27,7 @@ func registerQueryRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec // http request handler to query delegator bonding status func bondingStatusHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + // read parameters vars := mux.Vars(r) delegator := vars["delegator"] @@ -98,7 +99,8 @@ func validatorsHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreCont return } - validators := make(stake.Validators, 0, len(res)) + // parse out the validators + var validators []stake.Validator for _, kv := range res { var validator stake.Validator err = cdc.UnmarshalBinary(kv.Value, &validator) diff --git a/x/stake/client/rest/tx.go b/x/stake/client/rest/tx.go index 2560fcc9f0..2718b3876e 100644 --- a/x/stake/client/rest/tx.go +++ b/x/stake/client/rest/tx.go @@ -24,8 +24,6 @@ func registerTxRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec, k } type editDelegationsBody struct { - // fees is not used currently - // Fees sdk.Coin `json="fees"` LocalAccountName string `json:"name"` Password string `json:"password"` ChainID string `json:"chain_id"` From 6207d4131c131bd6e1e662e80bf9c0b92883129c Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Wed, 30 May 2018 08:16:09 -0700 Subject: [PATCH 091/548] minor fixes --- x/stake/client/rest/query.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index 1eda2ac532..41b0fa0852 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -16,16 +16,16 @@ import ( func registerQueryRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec) { r.HandleFunc( "/stake/{delegator}/bonding_status/{validator}", - bondingStatusHandlerFn("stake", cdc, ctx), + bondingStatusHandlerFn(ctx, "stake", cdc), ).Methods("GET") r.HandleFunc( "/stake/validators", - validatorsHandlerFn("stake", cdc, ctx), + validatorsHandlerFn(ctx, "stake", cdc), ).Methods("GET") } // http request handler to query delegator bonding status -func bondingStatusHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreContext) http.HandlerFunc { +func bondingStatusHandlerFn(ctx context.CoreContext, storeName string, cdc *wire.Codec) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // read parameters @@ -84,9 +84,9 @@ func bondingStatusHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreC } // http request handler to query list of validators -func validatorsHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreContext) http.HandlerFunc { +func validatorsHandlerFn(ctx context.CoreContext, storeName string, cdc *wire.Codec) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - res, err := ctx.QuerySubspace(cdc, stake.ValidatorsKey, storeName) + kvs, err := ctx.QuerySubspace(cdc, stake.ValidatorsKey, storeName) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(fmt.Sprintf("Couldn't query validators. Error: %s", err.Error()))) @@ -94,14 +94,14 @@ func validatorsHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreCont } // the query will return empty if there are no validators - if len(res) == 0 { + if len(kvs) == 0 { w.WriteHeader(http.StatusNoContent) return } // parse out the validators var validators []stake.Validator - for _, kv := range res { + for _, kv := range kvs { var validator stake.Validator err = cdc.UnmarshalBinary(kv.Value, &validator) if err != nil { From ecf800810c338767a4e804401faae17ad2b556f1 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Wed, 30 May 2018 09:00:00 -0700 Subject: [PATCH 092/548] remove append usage from lcd, fix address order test issue in lcd --- client/lcd/lcd_test.go | 14 ++++++++++++-- x/stake/client/rest/query.go | 6 +++--- x/stake/client/rest/tx.go | 23 +++++++++++++---------- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index c8d493d1f6..8c6530dec2 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -319,8 +319,18 @@ func TestTxs(t *testing.T) { func TestValidatorsQuery(t *testing.T) { validators := getValidators(t) assert.Equal(t, len(validators), 2) - assert.Equal(t, hex.EncodeToString(validators[0].Owner), validatorAddr1) - assert.Equal(t, hex.EncodeToString(validators[1].Owner), validatorAddr2) + + // make sure all the validators were found (order unknown because sorted by owner addr) + foundVal1, foundVal2 := false, false + res1, res2 := hex.EncodeToString(validators[0].Owner), hex.EncodeToString(validators[1].Owner) + if res1 == validatorAddr1 || res2 == validatorAddr1 { + foundVal1 = true + } + if res1 == validatorAddr2 || res2 == validatorAddr2 { + foundVal2 = true + } + assert.True(t, foundVal1, "validatorAddr1 %v, res1 %v, res2 %v", validatorAddr1, res1, res2) + assert.True(t, foundVal2, "validatorAddr2 %v, res1 %v, res2 %v", validatorAddr2, res1, res2) } func TestBond(t *testing.T) { diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index 41b0fa0852..3e439c2b44 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -100,8 +100,8 @@ func validatorsHandlerFn(ctx context.CoreContext, storeName string, cdc *wire.Co } // parse out the validators - var validators []stake.Validator - for _, kv := range kvs { + validators := make([]stake.Validator, len(kvs)) + for i, kv := range kvs { var validator stake.Validator err = cdc.UnmarshalBinary(kv.Value, &validator) if err != nil { @@ -109,7 +109,7 @@ func validatorsHandlerFn(ctx context.CoreContext, storeName string, cdc *wire.Co w.Write([]byte(fmt.Sprintf("Couldn't decode validator. Error: %s", err.Error()))) return } - validators = append(validators, validator) + validators[i] = validator } output, err := cdc.MarshalJSON(validators) diff --git a/x/stake/client/rest/tx.go b/x/stake/client/rest/tx.go index 2718b3876e..eaf206bf6b 100644 --- a/x/stake/client/rest/tx.go +++ b/x/stake/client/rest/tx.go @@ -56,14 +56,16 @@ func editDelegationsRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx conte } // build messages - messages := make([]sdk.Msg, 0, len(m.Delegate)+len(m.Unbond)) + messages := make([]sdk.Msg, len(m.Delegate)+len(m.Unbond)) + i := 0 for _, msg := range m.Delegate { if !bytes.Equal(info.Address(), msg.DelegatorAddr) { w.WriteHeader(http.StatusUnauthorized) w.Write([]byte("Must use own delegator address")) return } - messages = append(messages, msg) + messages[i] = msg + i++ } for _, msg := range m.Unbond { if !bytes.Equal(info.Address(), msg.DelegatorAddr) { @@ -71,12 +73,13 @@ func editDelegationsRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx conte w.Write([]byte("Must use own delegator address")) return } - messages = append(messages, msg) + messages[i] = msg + i++ } // sign messages - signedTxs := make([][]byte, 0, len(messages)) - for _, msg := range messages { + signedTxs := make([][]byte, len(messages[:])) + for i, msg := range messages { // increment sequence for each message ctx = ctx.WithSequence(m.Sequence) m.Sequence++ @@ -88,24 +91,24 @@ func editDelegationsRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx conte return } - signedTxs = append(signedTxs, txBytes) + signedTxs[i] = txBytes } // send // XXX the operation might not be atomic if a tx fails // should we have a sdk.MultiMsg type to make sending atomic? - results := make([]*ctypes.ResultBroadcastTxCommit, 0, len(signedTxs)) - for _, txBytes := range signedTxs { + results := make([]*ctypes.ResultBroadcastTxCommit, len(signedTxs[:])) + for i, txBytes := range signedTxs { res, err := ctx.BroadcastTx(txBytes) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) return } - results = append(results, res) + results[i] = res } - output, err := json.MarshalIndent(results, "", " ") + output, err := json.MarshalIndent(results[:], "", " ") if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) From c8133a0f6a96bfddd3cf2398986b0a503dcf5f53 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Wed, 30 May 2018 14:43:22 -0700 Subject: [PATCH 093/548] fix revoke validator bug --- client/context/helpers.go | 2 +- x/stake/keeper.go | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/client/context/helpers.go b/client/context/helpers.go index f4686befde..f47cc7ff41 100644 --- a/client/context/helpers.go +++ b/client/context/helpers.go @@ -59,7 +59,7 @@ func (ctx CoreContext) QuerySubspace(cdc *wire.Codec, subspace []byte, storeName // Query from Tendermint with the provided storename and path func (ctx CoreContext) query(key cmn.HexBytes, storeName, endPath string) (res []byte, err error) { - path := fmt.Sprintf("/store/%s/key", storeName) + path := fmt.Sprintf("/store/%s/%s", storeName, endPath) node, err := ctx.GetNode() if err != nil { return res, err diff --git a/x/stake/keeper.go b/x/stake/keeper.go index d943193a11..a3991a6c60 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -220,8 +220,12 @@ func (k Keeper) updateValidator(ctx sdk.Context, validator Validator) Validator oldValidator, oldFound := k.GetValidator(ctx, ownerAddr) if validator.Revoked && oldValidator.Status() == sdk.Bonded { - validator, pool = validator.UpdateStatus(pool, sdk.Unbonded) - k.setPool(ctx, pool) + k.unbondValidator(ctx, store, validator) + + // need to also clear the cliff validator spot because the revoke has + // opened up a new spot which will be filled when + // updateValidatorsBonded is called + k.clearCliffValidator(ctx) } powerIncreasing := false @@ -674,6 +678,13 @@ func (k Keeper) setCliffValidator(ctx sdk.Context, validator Validator, pool Poo store.Set(ValidatorCliffKey, validator.Owner) } +// clear the current validator and power of the validator on the cliff +func (k Keeper) clearCliffValidator(ctx sdk.Context) { + store := ctx.KVStore(k.storeKey) + store.Set(ValidatorPowerCliffKey, nil) + store.Set(ValidatorCliffKey, nil) +} + //__________________________________________________________________________ // Implements ValidatorSet From 40526d3e770681fd0109659019df31a3c52d6665 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Wed, 30 May 2018 14:52:56 -0700 Subject: [PATCH 094/548] unbond validator return updated validator --- x/stake/keeper.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/x/stake/keeper.go b/x/stake/keeper.go index a3991a6c60..c97e7840e1 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -220,7 +220,7 @@ func (k Keeper) updateValidator(ctx sdk.Context, validator Validator) Validator oldValidator, oldFound := k.GetValidator(ctx, ownerAddr) if validator.Revoked && oldValidator.Status() == sdk.Bonded { - k.unbondValidator(ctx, store, validator) + validator = k.unbondValidator(ctx, store, validator) // need to also clear the cliff validator spot because the revoke has // opened up a new spot which will be filled when @@ -430,7 +430,7 @@ func (k Keeper) updateBondedValidatorsFull(ctx sdk.Context, store sdk.KVStore) { } // perform all the store operations for when a validator status becomes unbonded -func (k Keeper) unbondValidator(ctx sdk.Context, store sdk.KVStore, validator Validator) { +func (k Keeper) unbondValidator(ctx sdk.Context, store sdk.KVStore, validator Validator) Validator { pool := k.GetPool(ctx) // sanity check @@ -452,6 +452,7 @@ func (k Keeper) unbondValidator(ctx sdk.Context, store sdk.KVStore, validator Va // also remove from the Bonded Validators Store store.Delete(GetValidatorsBondedKey(validator.PubKey)) + return validator } // perform all the store operations for when a validator status becomes bonded From 4e266013a8ffcbf9a9a9a5545c2f8bbcbd0e2906 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 31 May 2018 00:13:13 +0200 Subject: [PATCH 095/548] store.Delete instead of store.Set to nil --- x/stake/keeper.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/stake/keeper.go b/x/stake/keeper.go index c97e7840e1..4f93308c73 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -682,8 +682,8 @@ func (k Keeper) setCliffValidator(ctx sdk.Context, validator Validator, pool Poo // clear the current validator and power of the validator on the cliff func (k Keeper) clearCliffValidator(ctx sdk.Context) { store := ctx.KVStore(k.storeKey) - store.Set(ValidatorPowerCliffKey, nil) - store.Set(ValidatorCliffKey, nil) + store.Delete(ValidatorPowerCliffKey) + store.Delete(ValidatorCliffKey) } //__________________________________________________________________________ From 5f03e370c313d492858615af2d61c9af9c0f4a5d Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 31 May 2018 00:19:23 +0200 Subject: [PATCH 096/548] Remove ValidatorByPubKey, don't marshal sdk.Address --- types/stake.go | 11 +++++------ x/slashing/keeper_test.go | 10 +++++----- x/stake/keeper.go | 18 +++--------------- 3 files changed, 13 insertions(+), 26 deletions(-) diff --git a/types/stake.go b/types/stake.go index cd1a68533f..bfcef7fa0c 100644 --- a/types/stake.go +++ b/types/stake.go @@ -56,12 +56,11 @@ type ValidatorSet interface { IterateValidatorsBonded(Context, func(index int64, validator Validator) (stop bool)) - Validator(Context, Address) Validator // get a particular validator by owner address - ValidatorByPubKey(Context, crypto.PubKey) Validator // get a particular validator by public key - TotalPower(Context) Rat // total power of the validator set - Slash(Context, crypto.PubKey, int64, Rat) // slash the validator and delegators of the validator, specifying offence height & slash fraction - Revoke(Context, crypto.PubKey) // revoke a validator - Unrevoke(Context, crypto.PubKey) // unrevoke a validator + Validator(Context, Address) Validator // get a particular validator by owner address + TotalPower(Context) Rat // total power of the validator set + Slash(Context, crypto.PubKey, int64, Rat) // slash the validator and delegators of the validator, specifying offence height & slash fraction + Revoke(Context, crypto.PubKey) // revoke a validator + Unrevoke(Context, crypto.PubKey) // unrevoke a validator } //_______________________________________________________________________________ diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 2fef0c974a..70f42b3243 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -62,7 +62,7 @@ func TestHandleAbsentValidator(t *testing.T) { require.Equal(t, int64(0), info.StartHeight) require.Equal(t, SignedBlocksWindow-50, info.SignedBlocksCounter) // validator should be bonded still - validator := sk.ValidatorByPubKey(ctx, val) + validator, _ := sk.GetValidatorByPubKey(ctx, val) require.Equal(t, sdk.Bonded, validator.GetStatus()) pool := sk.GetPool(ctx) require.Equal(t, int64(100), pool.BondedTokens) @@ -74,7 +74,7 @@ func TestHandleAbsentValidator(t *testing.T) { require.Equal(t, int64(0), info.StartHeight) require.Equal(t, SignedBlocksWindow-51, info.SignedBlocksCounter) // validator should have been revoked - validator = sk.ValidatorByPubKey(ctx, val) + validator, _ = sk.GetValidatorByPubKey(ctx, val) require.Equal(t, sdk.Unbonded, validator.GetStatus()) // unrevocation should fail prior to jail expiration got = slh(ctx, NewMsgUnrevoke(addr)) @@ -84,7 +84,7 @@ func TestHandleAbsentValidator(t *testing.T) { got = slh(ctx, NewMsgUnrevoke(addr)) require.True(t, got.IsOK()) // validator should be rebonded now - validator = sk.ValidatorByPubKey(ctx, val) + validator, _ = sk.GetValidatorByPubKey(ctx, val) require.Equal(t, sdk.Bonded, validator.GetStatus()) // validator should have been slashed pool = sk.GetPool(ctx) @@ -98,7 +98,7 @@ func TestHandleAbsentValidator(t *testing.T) { height++ ctx = ctx.WithBlockHeight(height) keeper.handleValidatorSignature(ctx, val, false) - validator = sk.ValidatorByPubKey(ctx, val) + validator, _ = sk.GetValidatorByPubKey(ctx, val) require.Equal(t, sdk.Bonded, validator.GetStatus()) // validator should be revoked again after 100 unsigned blocks nextHeight := height + 100 @@ -106,6 +106,6 @@ func TestHandleAbsentValidator(t *testing.T) { ctx = ctx.WithBlockHeight(height) keeper.handleValidatorSignature(ctx, val, false) } - validator = sk.ValidatorByPubKey(ctx, val) + validator, _ = sk.GetValidatorByPubKey(ctx, val) require.Equal(t, sdk.Unbonded, validator.GetStatus()) } diff --git a/x/stake/keeper.go b/x/stake/keeper.go index 4f93308c73..bab1328bed 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -42,12 +42,10 @@ func (k Keeper) GetValidator(ctx sdk.Context, addr sdk.Address) (validator Valid // get a single validator by pubkey func (k Keeper) GetValidatorByPubKey(ctx sdk.Context, pubkey crypto.PubKey) (validator Validator, found bool) { store := ctx.KVStore(k.storeKey) - b := store.Get(GetValidatorByPubKeyKey(pubkey)) - if b == nil { + addr := store.Get(GetValidatorByPubKeyKey(pubkey)) + if addr == nil { return validator, false } - var addr sdk.Address - k.cdc.MustUnmarshalBinary(b, &addr) return k.getValidator(store, addr) } @@ -68,8 +66,7 @@ func (k Keeper) setValidator(ctx sdk.Context, validator Validator) { bz := k.cdc.MustMarshalBinary(validator) store.Set(GetValidatorKey(validator.Owner), bz) // set pointer by pubkey - bz = k.cdc.MustMarshalBinary(validator.Owner) - store.Set(GetValidatorByPubKeyKey(validator.PubKey), bz) + store.Set(GetValidatorByPubKeyKey(validator.PubKey), validator.Owner) } // Get the set of all validators with no limits, used during genesis dump @@ -740,15 +737,6 @@ func (k Keeper) Validator(ctx sdk.Context, addr sdk.Address) sdk.Validator { return val } -// get the sdk.validator for a particular pubkey -func (k Keeper) ValidatorByPubKey(ctx sdk.Context, pubkey crypto.PubKey) sdk.Validator { - val, found := k.GetValidatorByPubKey(ctx, pubkey) - if !found { - return nil - } - return val -} - // total power from the bond func (k Keeper) TotalPower(ctx sdk.Context) sdk.Rat { pool := k.GetPool(ctx) From 1a3ef511298ef7891ea648e20a23944bb6e75a6b Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 31 May 2018 00:21:00 +0200 Subject: [PATCH 097/548] PubKeyKey => PubKeyIndexKey --- x/stake/keeper.go | 6 +++--- x/stake/keeper_keys.go | 26 +++++++++++++------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/x/stake/keeper.go b/x/stake/keeper.go index bab1328bed..21b58c1feb 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -42,7 +42,7 @@ func (k Keeper) GetValidator(ctx sdk.Context, addr sdk.Address) (validator Valid // get a single validator by pubkey func (k Keeper) GetValidatorByPubKey(ctx sdk.Context, pubkey crypto.PubKey) (validator Validator, found bool) { store := ctx.KVStore(k.storeKey) - addr := store.Get(GetValidatorByPubKeyKey(pubkey)) + addr := store.Get(GetValidatorByPubKeyIndexKey(pubkey)) if addr == nil { return validator, false } @@ -66,7 +66,7 @@ func (k Keeper) setValidator(ctx sdk.Context, validator Validator) { bz := k.cdc.MustMarshalBinary(validator) store.Set(GetValidatorKey(validator.Owner), bz) // set pointer by pubkey - store.Set(GetValidatorByPubKeyKey(validator.PubKey), validator.Owner) + store.Set(GetValidatorByPubKeyIndexKey(validator.PubKey), validator.Owner) } // Get the set of all validators with no limits, used during genesis dump @@ -489,7 +489,7 @@ func (k Keeper) removeValidator(ctx sdk.Context, address sdk.Address) { store := ctx.KVStore(k.storeKey) pool := k.getPool(store) store.Delete(GetValidatorKey(address)) - store.Delete(GetValidatorByPubKeyKey(validator.PubKey)) + store.Delete(GetValidatorByPubKeyIndexKey(validator.PubKey)) store.Delete(GetValidatorsByPowerKey(validator, pool)) // delete from the current and power weighted validator groups if the validator diff --git a/x/stake/keeper_keys.go b/x/stake/keeper_keys.go index e09a47ecab..632a86ec3c 100644 --- a/x/stake/keeper_keys.go +++ b/x/stake/keeper_keys.go @@ -13,17 +13,17 @@ import ( //nolint var ( // Keys for store prefixes - ParamKey = []byte{0x00} // key for parameters relating to staking - PoolKey = []byte{0x01} // key for the staking pools - ValidatorsKey = []byte{0x02} // prefix for each key to a validator - ValidatorsByPubKeyKey = []byte{0x03} // prefix for each key to a validator by pubkey - ValidatorsBondedKey = []byte{0x04} // prefix for each key to bonded/actively validating validators - ValidatorsByPowerKey = []byte{0x05} // prefix for each key to a validator sorted by power - ValidatorCliffKey = []byte{0x06} // key for block-local tx index - ValidatorPowerCliffKey = []byte{0x07} // key for block-local tx index - TendermintUpdatesKey = []byte{0x08} // prefix for each key to a validator which is being updated - DelegationKey = []byte{0x09} // prefix for each key to a delegator's bond - IntraTxCounterKey = []byte{0x10} // key for block-local tx index + ParamKey = []byte{0x00} // key for parameters relating to staking + PoolKey = []byte{0x01} // key for the staking pools + ValidatorsKey = []byte{0x02} // prefix for each key to a validator + ValidatorsByPubKeyIndexKey = []byte{0x03} // prefix for each key to a validator by pubkey + ValidatorsBondedKey = []byte{0x04} // prefix for each key to bonded/actively validating validators + ValidatorsByPowerKey = []byte{0x05} // prefix for each key to a validator sorted by power + ValidatorCliffKey = []byte{0x06} // key for block-local tx index + ValidatorPowerCliffKey = []byte{0x07} // key for block-local tx index + TendermintUpdatesKey = []byte{0x08} // prefix for each key to a validator which is being updated + DelegationKey = []byte{0x09} // prefix for each key to a delegator's bond + IntraTxCounterKey = []byte{0x10} // key for block-local tx index ) const maxDigitsForAccount = 12 // ~220,000,000 atoms created at launch @@ -34,8 +34,8 @@ func GetValidatorKey(ownerAddr sdk.Address) []byte { } // get the key for the validator with pubkey -func GetValidatorByPubKeyKey(pubkey crypto.PubKey) []byte { - return append(ValidatorsByPubKeyKey, pubkey.Bytes()...) +func GetValidatorByPubKeyIndexKey(pubkey crypto.PubKey) []byte { + return append(ValidatorsByPubKeyIndexKey, pubkey.Bytes()...) } // get the key for the current validator group, ordered like tendermint From 99bed49c8d3e5d695de2e4fe5c7e9199c8e79671 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 31 May 2018 00:25:18 +0200 Subject: [PATCH 098/548] Minor wording changes --- x/slashing/errors.go | 6 +----- x/slashing/handler.go | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/x/slashing/errors.go b/x/slashing/errors.go index 8a923f7542..087dc03141 100644 --- a/x/slashing/errors.go +++ b/x/slashing/errors.go @@ -1,3 +1,4 @@ +//nolint package slashing import ( @@ -17,17 +18,12 @@ const ( CodeValidatorJailed CodeType = 202 ) -//nolint func ErrNoValidatorForAddress(codespace sdk.CodespaceType) sdk.Error { return newError(codespace, CodeInvalidValidator, "That address is not associated with any known validator") } - -//nolint func ErrBadValidatorAddr(codespace sdk.CodespaceType) sdk.Error { return newError(codespace, CodeInvalidValidator, "Validator does not exist for that address") } - -//nolint func ErrValidatorJailed(codespace sdk.CodespaceType) sdk.Error { return newError(codespace, CodeValidatorJailed, "Validator jailed, cannot yet be unrevoked") } diff --git a/x/slashing/handler.go b/x/slashing/handler.go index cf83a6a992..98e9d30ada 100644 --- a/x/slashing/handler.go +++ b/x/slashing/handler.go @@ -16,7 +16,7 @@ func NewHandler(k Keeper) sdk.Handler { } } -// Validators must submit a transaction to unrevoke themselves after +// Validators must submit a transaction to unrevoke itself after // having been revoked (and thus unbonded) for downtime func handleMsgUnrevoke(ctx sdk.Context, msg MsgUnrevoke, k Keeper) sdk.Result { From 004e10ebcdc4228946eaf2b322205216ae527c7c Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 31 May 2018 00:32:08 +0200 Subject: [PATCH 099/548] More comments on counter logic --- x/slashing/keeper.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index 46ed4591b2..a37c5a07b8 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -62,15 +62,17 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, signInfo.IndexOffset++ // Update signed block bit array & counter + // This counter just tracks the sum of the bit array + // That way we avoid needing to read/write the whole array each time previous := k.getValidatorSigningBitArray(ctx, address, index) if previous == signed { - // No need to update counter + // Array value at this index has not changed, no need to update counter } else if previous && !signed { - // Signed => unsigned, decrement counter + // Array value has changed from signed to unsigned, decrement counter k.setValidatorSigningBitArray(ctx, address, index, false) signInfo.SignedBlocksCounter-- } else if !previous && signed { - // Unsigned => signed, increment counter + // Array value has changed from unsigned to signed, increment counter k.setValidatorSigningBitArray(ctx, address, index, true) signInfo.SignedBlocksCounter++ } From 0324be418951bfe098d4a7d112dc23ca9553b363 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 31 May 2018 00:38:20 +0200 Subject: [PATCH 100/548] Clarify comment on removePoolShares --- x/stake/validator.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/x/stake/validator.go b/x/stake/validator.go index 1edb8bb836..729a605a96 100644 --- a/x/stake/validator.go +++ b/x/stake/validator.go @@ -155,18 +155,20 @@ func (v Validator) UpdateStatus(pool Pool, NewStatus sdk.BondStatus) (Validator, return v, pool } -// Remove & burn pool shares, e.g. when slashing a validator -func (v Validator) removePoolShares(pool Pool, amt sdk.Rat) (Validator, Pool, int64) { +// Remove pool shares +// Returns corresponding tokens, which could be burned (e.g. when slashing +// a validator) or redistributed elsewhere +func (v Validator) removePoolShares(pool Pool, poolShares sdk.Rat) (Validator, Pool, int64) { var tokens int64 switch v.Status() { case sdk.Unbonded: - pool, tokens = pool.removeSharesUnbonded(amt) + pool, tokens = pool.removeSharesUnbonded(poolShares) case sdk.Unbonding: - pool, tokens = pool.removeSharesUnbonding(amt) + pool, tokens = pool.removeSharesUnbonding(poolShares) case sdk.Bonded: - pool, tokens = pool.removeSharesBonded(amt) + pool, tokens = pool.removeSharesBonded(poolShares) } - v.PoolShares.Amount = v.PoolShares.Amount.Sub(amt) + v.PoolShares.Amount = v.PoolShares.Amount.Sub(poolShares) return v, pool, tokens } From 7e9192f513c16d1c1fd93af3bee9a132f88adf50 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 31 May 2018 00:41:28 +0200 Subject: [PATCH 101/548] Separate validator pub key index updates --- x/stake/genesis.go | 1 + x/stake/handler.go | 1 + x/stake/keeper.go | 4 ++++ 3 files changed, 6 insertions(+) diff --git a/x/stake/genesis.go b/x/stake/genesis.go index e6baa099b5..a2cd58bdb5 100644 --- a/x/stake/genesis.go +++ b/x/stake/genesis.go @@ -35,6 +35,7 @@ func InitGenesis(ctx sdk.Context, k Keeper, data GenesisState) { // Staking assumes bonded validators are already stored, need to force update validator.PoolShares.Status = sdk.Unbonded k.setValidator(ctx, validator) + k.setValidatorByPubKeyIndex(ctx, validator) k.updateValidator(ctx, validator) } for _, bond := range data.Bonds { diff --git a/x/stake/handler.go b/x/stake/handler.go index 53653557cc..6f2360adf7 100644 --- a/x/stake/handler.go +++ b/x/stake/handler.go @@ -55,6 +55,7 @@ func handleMsgDeclareCandidacy(ctx sdk.Context, msg MsgDeclareCandidacy, k Keepe validator := NewValidator(msg.ValidatorAddr, msg.PubKey, msg.Description) k.setValidator(ctx, validator) + k.setValidatorByPubKeyIndex(ctx, validator) tags := sdk.NewTags( "action", []byte("declareCandidacy"), "validator", msg.ValidatorAddr.Bytes(), diff --git a/x/stake/keeper.go b/x/stake/keeper.go index 21b58c1feb..b94f392a63 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -65,6 +65,10 @@ func (k Keeper) setValidator(ctx sdk.Context, validator Validator) { // set main store bz := k.cdc.MustMarshalBinary(validator) store.Set(GetValidatorKey(validator.Owner), bz) +} + +func (k Keeper) setValidatorByPubKeyIndex(ctx sdk.Context, validator Validator) { + store := ctx.KVStore(k.storeKey) // set pointer by pubkey store.Set(GetValidatorByPubKeyIndexKey(validator.PubKey), validator.Owner) } From f5f53c0a8df6677f7f215d754c3b139e012d69b3 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 31 May 2018 00:55:16 +0200 Subject: [PATCH 102/548] Remove spec changes (now in #1048) --- docs/spec/staking/old/spec.md | 12 ++--- docs/spec/staking/old/spec2.md | 18 +++---- docs/spec/staking/transactions.md | 4 +- docs/spec/staking/valset-changes.md | 80 ++++++++++++----------------- 4 files changed, 51 insertions(+), 63 deletions(-) diff --git a/docs/spec/staking/old/spec.md b/docs/spec/staking/old/spec.md index 1eddc3e33d..bd87ec0285 100644 --- a/docs/spec/staking/old/spec.md +++ b/docs/spec/staking/old/spec.md @@ -297,12 +297,12 @@ type TxProveLive struct { ## Delegator bond Atom holders may delegate coins to validators, under this circumstance their -funds are held in a `Delegation`. It is owned by one delegator, and is +funds are held in a `DelegatorBond`. It is owned by one delegator, and is associated with the shares for one validator. The sender of the transaction is considered to be the owner of the bond, ``` golang -type Delegation struct { +type DelegatorBond struct { Candidate crypto.PubKey Shares rational.Rat AdjustmentFeePool coin.Coins @@ -318,11 +318,11 @@ Description: - AdjustmentRewardPool: Adjustment factor used to passively calculate each bonds entitled fees from `Candidate.ProposerRewardPool`` -Each `Delegation` is individually indexed within the store by delegator +Each `DelegatorBond` is individually indexed within the store by delegator address and candidate pubkey. - key: Delegator and Candidate-Pubkey - - value: Delegation + - value: DelegatorBond ### Delegating @@ -330,7 +330,7 @@ address and candidate pubkey. Delegator bonds are created using the TxDelegate transaction. Within this transaction the validator candidate queried with an amount of coins, whereby given the current exchange rate of candidate's delegator-shares-to-atoms the -candidate will return shares which are assigned in `Delegation.Shares`. +candidate will return shares which are assigned in `DelegatorBond.Shares`. ``` golang type TxDelegate struct { @@ -671,5 +671,5 @@ rate, all commission on fees must be simultaneously withdrawn. `candidate.Adjustment` must be set to the value of `canidate.Count` for the height which the candidate is added on the validator set. - The feePool of a new delegator bond will be 0 for the height at which the bond - was added. This is achieved by setting `Delegation.FeeWithdrawalHeight` to + was added. This is achieved by setting `DelegatorBond.FeeWithdrawalHeight` to the height which the bond was added. diff --git a/docs/spec/staking/old/spec2.md b/docs/spec/staking/old/spec2.md index 68f20703dc..72bb8a2e37 100644 --- a/docs/spec/staking/old/spec2.md +++ b/docs/spec/staking/old/spec2.md @@ -34,7 +34,7 @@ The staking module persists the following to the store: - `GlobalState`, describing the global pools - a `Candidate` for each candidate validator, indexed by public key - a `Candidate` for each candidate validator, indexed by shares in the global pool (ie. ordered) -- a `Delegation` for each delegation to a candidate by a delegator, indexed by delegator and candidate +- a `DelegatorBond` for each delegation to a candidate by a delegator, indexed by delegator and candidate public keys - a `Queue` of unbonding delegations (TODO) @@ -146,15 +146,15 @@ When validators are kicked from the validator set they are removed from this list. -### Delegation +### DelegatorBond Atom holders may delegate coins to validators, under this circumstance their -funds are held in a `Delegation`. It is owned by one delegator, and is +funds are held in a `DelegatorBond`. It is owned by one delegator, and is associated with the shares for one validator. The sender of the transaction is considered to be the owner of the bond, ``` golang -type Delegation struct { +type DelegatorBond struct { Candidate crypto.PubKey Shares rational.Rat AdjustmentFeePool coin.Coins @@ -170,11 +170,11 @@ Description: - AdjustmentRewardPool: Adjustment factor used to passively calculate each bonds entitled fees from `Candidate.ProposerRewardPool`` -Each `Delegation` is individually indexed within the store by delegator +Each `DelegatorBond` is individually indexed within the store by delegator address and candidate pubkey. - key: Delegator and Candidate-Pubkey - - value: Delegation + - value: DelegatorBond ### Unbonding Queue @@ -308,7 +308,7 @@ All bonding, whether self-bonding or delegation, is done via Delegator bonds are created using the TxDelegate transaction. Within this transaction the validator candidate queried with an amount of coins, whereby given the current exchange rate of candidate's delegator-shares-to-atoms the -candidate will return shares which are assigned in `Delegation.Shares`. +candidate will return shares which are assigned in `DelegatorBond.Shares`. ``` golang type TxDelegate struct { @@ -616,7 +616,7 @@ synced past the height of the oldest `powerChange`. This trim procedure will occur on an epoch basis. ```golang -type powerChange struct +type powerChange struct { height int64 // block height at change power rational.Rat // total power at change prevpower rational.Rat // total power at previous height-1 @@ -694,5 +694,5 @@ rate, all commission on fees must be simultaneously withdrawn. `candidate.Adjustment` must be set to the value of `canidate.Count` for the height which the candidate is added on the validator set. - The feePool of a new delegator bond will be 0 for the height at which the bond - was added. This is achieved by setting `Delegation.FeeWithdrawalHeight` to + was added. This is achieved by setting `DelegatorBond.FeeWithdrawalHeight` to the height which the bond was added. diff --git a/docs/spec/staking/transactions.md b/docs/spec/staking/transactions.md index eed082503b..52f324b0f7 100644 --- a/docs/spec/staking/transactions.md +++ b/docs/spec/staking/transactions.md @@ -203,7 +203,7 @@ unbond(tx TxUnbond): return removeShares(candidate Candidate, shares rational.Rat): - globalPoolSharesToRemove = DelegatorShareExRate(candidate) * shares + globalPoolSharesToRemove = delegatorShareExRate(candidate) * shares if candidate.Status == Bonded gs.BondedShares -= globalPoolSharesToRemove @@ -218,7 +218,7 @@ removeShares(candidate Candidate, shares rational.Rat): candidate.IssuedDelegatorShares -= shares return returnedCoins -DelegatorShareExRate(candidate Candidate): +delegatorShareExRate(candidate Candidate): if candidate.IssuedDelegatorShares.IsZero() then return rational.One return candidate.GlobalStakeShares / candidate.IssuedDelegatorShares diff --git a/docs/spec/staking/valset-changes.md b/docs/spec/staking/valset-changes.md index 0e635fd047..bc52b89980 100644 --- a/docs/spec/staking/valset-changes.md +++ b/docs/spec/staking/valset-changes.md @@ -31,8 +31,8 @@ tick(ctx Context): if time > unbondDelegationQueue.head().InitTime + UnbondingPeriod for each element elem in the unbondDelegationQueue where time > elem.InitTime + UnbondingPeriod do - transfer(unbondingQueueAddress, elem.Payout, elem.Tokens) - unbondDelegationQueue.remove(elem) + transfer(unbondingQueueAddress, elem.Payout, elem.Tokens) + unbondDelegationQueue.remove(elem) if time > reDelegationQueue.head().InitTime + UnbondingPeriod for each element elem in the unbondDelegationQueue where time > elem.InitTime + UnbondingPeriod do @@ -55,9 +55,9 @@ nextInflation(hrsPerYr rational.Rat): inflation = gs.Inflation + inflationRateChange if inflation > params.InflationMax then inflation = params.InflationMax - + if inflation < params.InflationMin then inflation = params.InflationMin - + return inflation UpdateValidatorSet(): @@ -71,26 +71,26 @@ UpdateValidatorSet(): updateVotingPower(candidates Candidates): foreach candidate in candidates do - candidate.VotingPower = (candidate.IssuedDelegatorShares - candidate.RedelegatingShares) * DelegatorShareExRate(candidate) - + candidate.VotingPower = (candidate.IssuedDelegatorShares - candidate.RedelegatingShares) * delegatorShareExRate(candidate) + candidates.Sort() - + foreach candidate in candidates do - if candidate is not in the first params.MaxVals - candidate.VotingPower = rational.Zero - if candidate.Status == Bonded then bondedToUnbondedPool(candidate Candidate) - - else if candidate.Status == UnBonded then unbondedToBondedPool(candidate) + if candidate is not in the first params.MaxVals + candidate.VotingPower = rational.Zero + if candidate.Status == Bonded then bondedToUnbondedPool(candidate Candidate) + + else if candidate.Status == UnBonded then unbondedToBondedPool(candidate) - saveCandidate(store, c) - + saveCandidate(store, c) + return candidates unbondedToBondedPool(candidate Candidate): removedTokens = exchangeRate(gs.UnbondedShares, gs.UnbondedPool) * candidate.GlobalStakeShares gs.UnbondedShares -= candidate.GlobalStakeShares gs.UnbondedPool -= removedTokens - + gs.BondedPool += removedTokens issuedShares = removedTokens / exchangeRate(gs.BondedShares, gs.BondedPool) gs.BondedShares += issuedShares @@ -155,48 +155,36 @@ The following information is stored with each validator candidate, and is only n ```go type ValidatorSigningInfo struct { - StartHeight int64 - IndexOffset int64 - JailedUntil int64 - SignedBlocksCounter int64 - SignedBlocksBitArray BitArray + StartHeight int64 + SignedBlocksBitArray BitArray } ``` Where: * `StartHeight` is set to the height that the candidate became an active validator (with non-zero voting power). -* `IndexOffset` is incremented each time the candidate was a bonded validator in a block (and may have signed a precommit or not). -* `JailedUntil` is set whenever the candidate is revoked due to downtime -* `SignedBlocksCounter` is a counter kept to avoid unnecessary array reads. `SignedBlocksBitArray.Sum() == SignedBlocksCounter` always. * `SignedBlocksBitArray` is a bit-array of size `SIGNED_BLOCKS_WINDOW` that records, for each of the last `SIGNED_BLOCKS_WINDOW` blocks, -whether or not this validator was included in the LastCommit. It uses a `1` if the validator was included, and a `0` if it was not. Note it is initialized with all 0s. +whether or not this validator was included in the LastCommit. It uses a `0` if the validator was included, and a `1` if it was not. +Note it is initialized with all 0s. At the beginning of each block, we update the signing info for each validator and check if they should be automatically unbonded: ``` -height := block.Height +h = block.Height +index = h % SIGNED_BLOCKS_WINDOW for val in block.Validators: - signInfo = val.SignInfo - index := signInfo.IndexOffset % SIGNED_BLOCKS_WINDOW - signInfo.IndexOffset++ - previous = signInfo.SignedBlocksBitArray.Get(index) + signInfo = val.SignInfo + if val in block.LastCommit: + signInfo.SignedBlocksBitArray.Set(index, 0) + else + signInfo.SignedBlocksBitArray.Set(index, 1) - // update counter if array has changed - if previous and val in block.AbsentValidators: - signInfo.SignedBlocksBitArray.Set(index, 0) - signInfo.SignedBlocksCounter-- - else if !previous and val not in block.AbsentValidators: - signInfo.SignedBlocksBitArray.Set(index, 1) - signInfo.SignedBlocksCounter++ - // else previous == val not in block.AbsentValidators, no change - - // validator must be active for at least SIGNED_BLOCKS_WINDOW - // before they can be automatically unbonded for failing to be - // included in 50% of the recent LastCommits - minHeight = signInfo.StartHeight + SIGNED_BLOCKS_WINDOW - minSigned = SIGNED_BLOCKS_WINDOW / 2 - if height > minHeight AND signInfo.SignedBlocksCounter < minSigned: - signInfo.JailedUntil = block.Time + DOWNTIME_UNBOND_DURATION - slash & unbond the validator + // validator must be active for at least SIGNED_BLOCKS_WINDOW + // before they can be automatically unbonded for failing to be + // included in 50% of the recent LastCommits + minHeight = signInfo.StartHeight + SIGNED_BLOCKS_WINDOW + minSigned = SIGNED_BLOCKS_WINDOW / 2 + blocksSigned = signInfo.SignedBlocksBitArray.Sum() + if h > minHeight AND blocksSigned < minSigned: + unbond the validator ``` From 604fd4c9a78f7397cf6e0629e6a5829c419c9132 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 31 May 2018 01:37:38 +0200 Subject: [PATCH 103/548] Address a few style comments --- x/slashing/keeper_test.go | 4 ++-- x/slashing/signing_info.go | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 70f42b3243..c14e063151 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -16,7 +16,7 @@ func TestHandleDoubleSign(t *testing.T) { addr, val, amt := addrs[0], pks[0], int64(100) got := stake.NewHandler(sk)(ctx, newTestMsgDeclareCandidacy(addr, val, amt)) require.True(t, got.IsOK()) - _ = sk.Tick(ctx) + sk.Tick(ctx) require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) require.Equal(t, sdk.NewRat(amt), sk.Validator(ctx, addr).GetPower()) keeper.handleDoubleSign(ctx, 0, 0, val) // double sign less than max age @@ -33,7 +33,7 @@ func TestHandleAbsentValidator(t *testing.T) { slh := NewHandler(keeper) got := sh(ctx, newTestMsgDeclareCandidacy(addr, val, amt)) require.True(t, got.IsOK()) - _ = sk.Tick(ctx) + sk.Tick(ctx) require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) require.Equal(t, sdk.NewRat(amt), sk.Validator(ctx, addr).GetPower()) info, found := keeper.getValidatorSigningInfo(ctx, val.Address()) diff --git a/x/slashing/signing_info.go b/x/slashing/signing_info.go index fcbb0d1c7e..05285b6809 100644 --- a/x/slashing/signing_info.go +++ b/x/slashing/signing_info.go @@ -12,10 +12,10 @@ func (k Keeper) getValidatorSigningInfo(ctx sdk.Context, address sdk.Address) (i bz := store.Get(validatorSigningInfoKey(address)) if bz == nil { found = false - } else { - k.cdc.MustUnmarshalBinary(bz, &info) - found = true + return } + k.cdc.MustUnmarshalBinary(bz, &info) + found = true return } @@ -33,9 +33,9 @@ func (k Keeper) getValidatorSigningBitArray(ctx sdk.Context, address sdk.Address if bz == nil { // lazy: treat empty key as unsigned signed = false - } else { - k.cdc.MustUnmarshalBinary(bz, &signed) + return } + k.cdc.MustUnmarshalBinary(bz, &signed) return } From 5c4c486e7b0ad51076a8e78f16f0f24a3767ad1d Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 31 May 2018 01:39:57 +0200 Subject: [PATCH 104/548] Add newlines to clarify testcase separation --- x/slashing/keeper_test.go | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index c14e063151..3d6da8c232 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -12,6 +12,8 @@ import ( ) func TestHandleDoubleSign(t *testing.T) { + + // initial setup ctx, ck, sk, keeper := createTestInput(t) addr, val, amt := addrs[0], pks[0], int64(100) got := stake.NewHandler(sk)(ctx, newTestMsgDeclareCandidacy(addr, val, amt)) @@ -19,14 +21,20 @@ func TestHandleDoubleSign(t *testing.T) { sk.Tick(ctx) require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) require.Equal(t, sdk.NewRat(amt), sk.Validator(ctx, addr).GetPower()) - keeper.handleDoubleSign(ctx, 0, 0, val) // double sign less than max age + + // double sign less than max age + keeper.handleDoubleSign(ctx, 0, 0, val) require.Equal(t, sdk.NewRat(amt).Mul(sdk.NewRat(19).Quo(sdk.NewRat(20))), sk.Validator(ctx, addr).GetPower()) ctx = ctx.WithBlockHeader(abci.Header{Time: 300}) - keeper.handleDoubleSign(ctx, 0, 0, val) // double sign past max age + + // double sign past max age + keeper.handleDoubleSign(ctx, 0, 0, val) require.Equal(t, sdk.NewRat(amt).Mul(sdk.NewRat(19).Quo(sdk.NewRat(20))), sk.Validator(ctx, addr).GetPower()) } func TestHandleAbsentValidator(t *testing.T) { + + // initial setup ctx, ck, sk, keeper := createTestInput(t) addr, val, amt := addrs[0], pks[0], int64(100) sh := stake.NewHandler(sk) @@ -43,7 +51,8 @@ func TestHandleAbsentValidator(t *testing.T) { require.Equal(t, int64(0), info.SignedBlocksCounter) require.Equal(t, int64(0), info.JailedUntil) height := int64(0) - // 1000 blocks OK + + // 1000 first blocks OK for ; height < 1000; height++ { ctx = ctx.WithBlockHeight(height) keeper.handleValidatorSignature(ctx, val, true) @@ -52,6 +61,7 @@ func TestHandleAbsentValidator(t *testing.T) { require.True(t, found) require.Equal(t, int64(0), info.StartHeight) require.Equal(t, SignedBlocksWindow, info.SignedBlocksCounter) + // 50 blocks missed for ; height < 1050; height++ { ctx = ctx.WithBlockHeight(height) @@ -61,11 +71,13 @@ func TestHandleAbsentValidator(t *testing.T) { require.True(t, found) require.Equal(t, int64(0), info.StartHeight) require.Equal(t, SignedBlocksWindow-50, info.SignedBlocksCounter) + // validator should be bonded still validator, _ := sk.GetValidatorByPubKey(ctx, val) require.Equal(t, sdk.Bonded, validator.GetStatus()) pool := sk.GetPool(ctx) require.Equal(t, int64(100), pool.BondedTokens) + // 51st block missed ctx = ctx.WithBlockHeight(height) keeper.handleValidatorSignature(ctx, val, false) @@ -73,33 +85,41 @@ func TestHandleAbsentValidator(t *testing.T) { require.True(t, found) require.Equal(t, int64(0), info.StartHeight) require.Equal(t, SignedBlocksWindow-51, info.SignedBlocksCounter) + // validator should have been revoked validator, _ = sk.GetValidatorByPubKey(ctx, val) require.Equal(t, sdk.Unbonded, validator.GetStatus()) + // unrevocation should fail prior to jail expiration got = slh(ctx, NewMsgUnrevoke(addr)) require.False(t, got.IsOK()) + // unrevocation should succeed after jail expiration ctx = ctx.WithBlockHeader(abci.Header{Time: int64(86400 * 2)}) got = slh(ctx, NewMsgUnrevoke(addr)) require.True(t, got.IsOK()) + // validator should be rebonded now validator, _ = sk.GetValidatorByPubKey(ctx, val) require.Equal(t, sdk.Bonded, validator.GetStatus()) + // validator should have been slashed pool = sk.GetPool(ctx) require.Equal(t, int64(99), pool.BondedTokens) + // validator start height should have been changed info, found = keeper.getValidatorSigningInfo(ctx, val.Address()) require.True(t, found) require.Equal(t, height, info.StartHeight) require.Equal(t, SignedBlocksWindow-51, info.SignedBlocksCounter) + // validator should not be immediately revoked again height++ ctx = ctx.WithBlockHeight(height) keeper.handleValidatorSignature(ctx, val, false) validator, _ = sk.GetValidatorByPubKey(ctx, val) require.Equal(t, sdk.Bonded, validator.GetStatus()) + // validator should be revoked again after 100 unsigned blocks nextHeight := height + 100 for ; height <= nextHeight; height++ { From 3d37d51795454c64c9468908af169505bbaccaf1 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 31 May 2018 01:47:24 +0200 Subject: [PATCH 105/548] Switch to evidence type enum --- Gopkg.lock | 5 ++--- Gopkg.toml | 4 ++-- x/slashing/tick.go | 5 ++--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 57986c440c..5e76a49cfd 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -267,8 +267,7 @@ "server", "types" ] - revision = "f9dce537281ffba5d1e047e6729429f7e5fb90c9" - version = "v0.11.0-rc0" + revision = "c67bb414c7ee617f18d81a50f8a837318bb6d7dc" [[projects]] branch = "master" @@ -461,6 +460,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "04b888e63be8b6999da76f98c44c12a21920b12186378957d6b874270f300aaf" + inputs-digest = "8f9c58893f04daef93d91512e658560cf076a766fc100c8bc4f718d7abf1ea9c" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index d30953da59..843b3c4618 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -52,9 +52,9 @@ name = "github.com/stretchr/testify" version = "~1.2.1" -[[constraint]] +[[override]] name = "github.com/tendermint/abci" - version = "0.11.0-rc0" + revision = "c67bb414c7ee617f18d81a50f8a837318bb6d7dc" [[constraint]] name = "github.com/tendermint/go-crypto" diff --git a/x/slashing/tick.go b/x/slashing/tick.go index 8125522741..14db48b379 100644 --- a/x/slashing/tick.go +++ b/x/slashing/tick.go @@ -1,7 +1,6 @@ package slashing import ( - "bytes" "encoding/binary" "fmt" @@ -21,8 +20,8 @@ func NewBeginBlocker(sk Keeper) sdk.BeginBlocker { for _, evidence := range req.ByzantineValidators { var pk crypto.PubKey sk.cdc.MustUnmarshalBinary(evidence.PubKey, &pk) - switch { - case bytes.Compare(evidence.Type, []byte("doubleSign")) == 0: + switch evidence.Type { + case abci.EvidenceType_DOUBLE_SIGN: sk.handleDoubleSign(ctx, evidence.Height, evidence.Time, pk) default: ctx.Logger().With("module", "x/slashing").Error(fmt.Sprintf("Ignored unknown evidence type: %s", string(evidence.Type))) From 141bc5fb1cffcd7ec191a501656e7ba8d39735ae Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 31 May 2018 01:52:07 +0200 Subject: [PATCH 106/548] amino.MarshalJSON instead of json.Marshal --- x/slashing/msg.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/x/slashing/msg.go b/x/slashing/msg.go index 72d2255d61..d2676af81a 100644 --- a/x/slashing/msg.go +++ b/x/slashing/msg.go @@ -1,11 +1,12 @@ package slashing import ( - "encoding/json" - sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" ) +var cdc = wire.NewCodec() + // name to identify transaction types const MsgType = "slashing" @@ -29,7 +30,7 @@ func (msg MsgUnrevoke) GetSigners() []sdk.Address { return []sdk.Address{msg.Val // get the bytes for the message signer to sign on func (msg MsgUnrevoke) GetSignBytes() []byte { - b, err := json.Marshal(msg) + b, err := cdc.MarshalJSON(msg) if err != nil { panic(err) } From e0b5118fce6726250e6ccd830bea6041fd509093 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 31 May 2018 03:00:11 +0200 Subject: [PATCH 107/548] Staking InitGenesis fixes --- x/stake/genesis.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/x/stake/genesis.go b/x/stake/genesis.go index a2cd58bdb5..cd1c0f9959 100644 --- a/x/stake/genesis.go +++ b/x/stake/genesis.go @@ -29,19 +29,20 @@ func DefaultGenesisState() GenesisState { // InitGenesis - store genesis parameters func InitGenesis(ctx sdk.Context, k Keeper, data GenesisState) { + store := ctx.KVStore(k.storeKey) k.setPool(ctx, data.Pool) k.setNewParams(ctx, data.Params) for _, validator := range data.Validators { - // Staking assumes bonded validators are already stored, need to force update - validator.PoolShares.Status = sdk.Unbonded - k.setValidator(ctx, validator) - k.setValidatorByPubKeyIndex(ctx, validator) k.updateValidator(ctx, validator) + k.setValidatorByPubKeyIndex(ctx, validator) + // manually set validator to bonded if necessary + if validator.Status() == sdk.Bonded { + store.Set(GetValidatorsBondedKey(validator.PubKey), validator.Owner) + } } for _, bond := range data.Bonds { k.setDelegation(ctx, bond) } - store := ctx.KVStore(k.storeKey) k.updateBondedValidatorsFull(ctx, store) } From 81e4a9797bccd4b7b036e9159d16c04919be0ec0 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Wed, 30 May 2018 18:28:02 -0700 Subject: [PATCH 108/548] genesis validator index setting --- x/stake/genesis.go | 8 ++++++-- x/stake/keeper.go | 5 +++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/x/stake/genesis.go b/x/stake/genesis.go index cd1c0f9959..4887a6002c 100644 --- a/x/stake/genesis.go +++ b/x/stake/genesis.go @@ -33,9 +33,13 @@ func InitGenesis(ctx sdk.Context, k Keeper, data GenesisState) { k.setPool(ctx, data.Pool) k.setNewParams(ctx, data.Params) for _, validator := range data.Validators { - k.updateValidator(ctx, validator) + + // set validator + k.setValidator(ctx, validator) + + // manually set indexes for the first time k.setValidatorByPubKeyIndex(ctx, validator) - // manually set validator to bonded if necessary + k.setValidatorByPowerIndex(ctx, validator, data.Pool) if validator.Status() == sdk.Bonded { store.Set(GetValidatorsBondedKey(validator.PubKey), validator.Owner) } diff --git a/x/stake/keeper.go b/x/stake/keeper.go index b94f392a63..9fd902053a 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -73,6 +73,11 @@ func (k Keeper) setValidatorByPubKeyIndex(ctx sdk.Context, validator Validator) store.Set(GetValidatorByPubKeyIndexKey(validator.PubKey), validator.Owner) } +func (k Keeper) setValidatorByPowerIndex(ctx sdk.Context, validator Validator, pool Pool) { + store := ctx.KVStore(k.storeKey) + store.Set(GetValidatorsByPowerKey(validator, pool), validator.Owner) +} + // Get the set of all validators with no limits, used during genesis dump func (k Keeper) getAllValidators(ctx sdk.Context) (validators Validators) { store := ctx.KVStore(k.storeKey) From f32093e9e3f4abf454ce896d2692de05b5f752cd Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 31 May 2018 05:43:54 +0200 Subject: [PATCH 109/548] Use evidence type constants from Tendermint --- Gopkg.lock | 10 +++++----- Gopkg.toml | 2 +- x/slashing/tick.go | 5 +++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 5e76a49cfd..e4ae15af4c 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -11,7 +11,7 @@ branch = "master" name = "github.com/btcsuite/btcd" packages = ["btcec"] - revision = "bc0944904505aab55e089371a892be2f87883161" + revision = "86fed781132ac890ee03e906e4ecd5d6fa180c64" [[projects]] branch = "master" @@ -267,7 +267,7 @@ "server", "types" ] - revision = "c67bb414c7ee617f18d81a50f8a837318bb6d7dc" + revision = "f9dce537281ffba5d1e047e6729429f7e5fb90c9" [[projects]] branch = "master" @@ -347,7 +347,7 @@ "types/priv_validator", "version" ] - revision = "3bf9a7dc503b8fd39bda3d64f2d039253afa6f8c" + revision = "9cc39a21ddbe8efd005aa5a001f54055a0d14fca" [[projects]] name = "github.com/tendermint/tmlibs" @@ -393,7 +393,7 @@ "internal/timeseries", "trace" ] - revision = "dfa909b99c79129e1100513e5cd36307665e5723" + revision = "1e491301e022f8f977054da4c2d852decd59571f" [[projects]] branch = "master" @@ -460,6 +460,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "8f9c58893f04daef93d91512e658560cf076a766fc100c8bc4f718d7abf1ea9c" + inputs-digest = "da12d07a753d17b8d9b834bb6b4b61617978c3c515fb38aa5dad10a66a8e78e8" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 843b3c4618..cb8fa2559c 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -54,7 +54,7 @@ [[override]] name = "github.com/tendermint/abci" - revision = "c67bb414c7ee617f18d81a50f8a837318bb6d7dc" + revision = "f9dce537281ffba5d1e047e6729429f7e5fb90c9" [[constraint]] name = "github.com/tendermint/go-crypto" diff --git a/x/slashing/tick.go b/x/slashing/tick.go index 14db48b379..402c8997b8 100644 --- a/x/slashing/tick.go +++ b/x/slashing/tick.go @@ -7,6 +7,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" + tmtypes "github.com/tendermint/tendermint/types" ) func NewBeginBlocker(sk Keeper) sdk.BeginBlocker { @@ -20,8 +21,8 @@ func NewBeginBlocker(sk Keeper) sdk.BeginBlocker { for _, evidence := range req.ByzantineValidators { var pk crypto.PubKey sk.cdc.MustUnmarshalBinary(evidence.PubKey, &pk) - switch evidence.Type { - case abci.EvidenceType_DOUBLE_SIGN: + switch string(evidence.Type) { + case tmtypes.DUPLICATE_VOTE: sk.handleDoubleSign(ctx, evidence.Height, evidence.Time, pk) default: ctx.Logger().With("module", "x/slashing").Error(fmt.Sprintf("Ignored unknown evidence type: %s", string(evidence.Type))) From 36b3e530abb706c85f5373116d80850972c58324 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Thu, 31 May 2018 09:31:42 -0400 Subject: [PATCH 110/548] update tm to 0.17.4 --- CHANGELOG.md | 6 ++++++ Gopkg.lock | 17 +++++++++-------- Gopkg.toml | 2 +- version/version.go | 4 ++-- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1075450e20..271be8fb9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.17.4 + +*May 31, 2018* + +Update to Tendermint v0.19.7 (WAL fixes and more) + ## 0.17.3 *May 29, 2018* diff --git a/Gopkg.lock b/Gopkg.lock index 3216a0f79e..3873b91550 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -11,7 +11,7 @@ branch = "master" name = "github.com/btcsuite/btcd" packages = ["btcec"] - revision = "bc0944904505aab55e089371a892be2f87883161" + revision = "86fed781132ac890ee03e906e4ecd5d6fa180c64" [[projects]] name = "github.com/davecgh/go-spew" @@ -313,6 +313,9 @@ "consensus", "consensus/types", "evidence", + "libs/events", + "libs/pubsub", + "libs/pubsub/query", "lite", "lite/client", "lite/errors", @@ -341,8 +344,8 @@ "types/priv_validator", "version" ] - revision = "fd6021876b017cbf45cdf6dd55a0d6cdf431e826" - version = "v0.19.6-rc2" + revision = "a017f2fdd41496a81e04a2216630a405189da6e2" + version = "v0.19.7-rc0" [[projects]] name = "github.com/tendermint/tmlibs" @@ -355,9 +358,7 @@ "db", "flowrate", "log", - "merkle", - "pubsub", - "pubsub/query" + "merkle" ] revision = "d970af87248a4e162590300dbb74e102183a417d" version = "v0.8.3" @@ -390,7 +391,7 @@ "internal/timeseries", "trace" ] - revision = "dfa909b99c79129e1100513e5cd36307665e5723" + revision = "1e491301e022f8f977054da4c2d852decd59571f" [[projects]] branch = "master" @@ -457,6 +458,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "2e868c5ad771cb647fd85a357375c559287602e886b7a040ddde0fac7f4f3365" + inputs-digest = "a3a75136fb6921c4c4d413e4c8366f203b77367762763c97b8669ea854fbd62d" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 3a7ee9cfc9..b8838920a5 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -74,7 +74,7 @@ [[constraint]] name = "github.com/tendermint/tendermint" - version = "0.19.6-rc2" + version = "0.19.7-rc0" [[override]] name = "github.com/tendermint/tmlibs" diff --git a/version/version.go b/version/version.go index ae9433bcd0..0871aee005 100644 --- a/version/version.go +++ b/version/version.go @@ -7,9 +7,9 @@ package version const Maj = "0" const Min = "17" -const Fix = "3" +const Fix = "4" -const Version = "0.17.3" +const Version = "0.17.4" // GitCommit set by build flags var GitCommit = "" From d82683ace581453594a058e244c1025fe01ef830 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 31 May 2018 19:54:36 +0200 Subject: [PATCH 111/548] Pin to upstream versions --- Gopkg.lock | 7 ++++--- Gopkg.toml | 18 ++++++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index e4ae15af4c..9c8b9f0ca3 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -268,6 +268,7 @@ "types" ] revision = "f9dce537281ffba5d1e047e6729429f7e5fb90c9" + version = "v0.11.0-rc0" [[projects]] branch = "master" @@ -307,7 +308,6 @@ version = "v0.8.0-rc0" [[projects]] - branch = "cwgoes/update-abci" name = "github.com/tendermint/tendermint" packages = [ "blockchain", @@ -347,7 +347,8 @@ "types/priv_validator", "version" ] - revision = "9cc39a21ddbe8efd005aa5a001f54055a0d14fca" + revision = "73de99ecab464208f6ea3a96525f4e4b78425e61" + version = "v0.20.0-rc0" [[projects]] name = "github.com/tendermint/tmlibs" @@ -460,6 +461,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "da12d07a753d17b8d9b834bb6b4b61617978c3c515fb38aa5dad10a66a8e78e8" + inputs-digest = "a6a5d886519fa9ca97a23715faa852ee14ecb5337e03641d19ea3d3d1c392fee" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index cb8fa2559c..deabcd6452 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -52,9 +52,9 @@ name = "github.com/stretchr/testify" version = "~1.2.1" -[[override]] +[[constraint]] name = "github.com/tendermint/abci" - revision = "f9dce537281ffba5d1e047e6729429f7e5fb90c9" + version = "0.11.0-rc0" [[constraint]] name = "github.com/tendermint/go-crypto" @@ -68,25 +68,23 @@ name = "github.com/tendermint/iavl" version = "0.8.0-rc0" -[[override]] +[[constraint]] name = "github.com/tendermint/tendermint" - branch = "cwgoes/update-abci" + version = "0.20.0-rc0" [[constraint]] name = "github.com/tendermint/tmlibs" version = "~0.8.3-rc0" + +[[constraint]] + name = "github.com/cosmos/bech32cosmos" + branch = "master" # this got updated and broke, so locked to an old working commit ... [[override]] name = "google.golang.org/genproto" revision = "7fd901a49ba6a7f87732eb344f6e3c5b19d1b200" - [[constraint]] - name = "github.com/cosmos/bech32cosmos" - branch = "master" - - [prune] go-tests = true unused-packages = true - From e9545d69ed0b692fefb19ba7c8f78039d3095f89 Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Thu, 31 May 2018 11:51:15 -0700 Subject: [PATCH 112/548] Switch the default modules to use wire.codec's MarshalJSON instead of json.Marshal --- x/auth/msgs.go | 4 +--- x/auth/stdtx.go | 6 ++---- x/auth/wire.go | 6 ++++++ x/bank/client/rest/sendtx.go | 9 ++++++++- x/bank/msgs.go | 6 ++---- x/bank/msgs_test.go | 6 ++---- x/bank/wire.go | 8 ++++---- x/stake/msg.go | 15 +++------------ x/stake/params.go | 4 ++-- x/stake/pool.go | 4 ++-- x/stake/wire.go | 6 +++++- 11 files changed, 37 insertions(+), 37 deletions(-) diff --git a/x/auth/msgs.go b/x/auth/msgs.go index c449b837b1..3eb5cc8ba2 100644 --- a/x/auth/msgs.go +++ b/x/auth/msgs.go @@ -1,8 +1,6 @@ package auth import ( - "encoding/json" - sdk "github.com/cosmos/cosmos-sdk/types" crypto "github.com/tendermint/go-crypto" ) @@ -30,7 +28,7 @@ func (msg MsgChangeKey) ValidateBasic() sdk.Error { // Implements Msg. func (msg MsgChangeKey) GetSignBytes() []byte { - b, err := json.Marshal(msg) // XXX: ensure some canonical form + b, err := msgCdc.MarshalJSON(msg) // XXX: ensure some canonical form if err != nil { panic(err) } diff --git a/x/auth/stdtx.go b/x/auth/stdtx.go index bc01b01490..4858ae0b43 100644 --- a/x/auth/stdtx.go +++ b/x/auth/stdtx.go @@ -1,8 +1,6 @@ package auth import ( - "encoding/json" - sdk "github.com/cosmos/cosmos-sdk/types" crypto "github.com/tendermint/go-crypto" ) @@ -70,7 +68,7 @@ func (fee StdFee) Bytes() []byte { if len(fee.Amount) == 0 { fee.Amount = sdk.Coins{} } - bz, err := json.Marshal(fee) // TODO + bz, err := msgCdc.MarshalJSON(fee) // TODO if err != nil { panic(err) } @@ -95,7 +93,7 @@ type StdSignDoc struct { // StdSignBytes returns the bytes to sign for a transaction. // TODO: change the API to just take a chainID and StdTx ? func StdSignBytes(chainID string, sequences []int64, fee StdFee, msg sdk.Msg) []byte { - bz, err := json.Marshal(StdSignDoc{ + bz, err := msgCdc.MarshalJSON(StdSignDoc{ ChainID: chainID, Sequences: sequences, FeeBytes: fee.Bytes(), diff --git a/x/auth/wire.go b/x/auth/wire.go index 42b34b96d5..12778bb39b 100644 --- a/x/auth/wire.go +++ b/x/auth/wire.go @@ -10,3 +10,9 @@ func RegisterWire(cdc *wire.Codec) { cdc.RegisterConcrete(&BaseAccount{}, "auth/Account", nil) cdc.RegisterConcrete(MsgChangeKey{}, "auth/ChangeKey", nil) } + +var msgCdc = wire.NewCodec() + +func init() { + RegisterWire(msgCdc) +} diff --git a/x/bank/client/rest/sendtx.go b/x/bank/client/rest/sendtx.go index 6ce472b6fd..4d957c16f4 100644 --- a/x/bank/client/rest/sendtx.go +++ b/x/bank/client/rest/sendtx.go @@ -12,6 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/bank" "github.com/cosmos/cosmos-sdk/x/bank/client" ) @@ -30,6 +31,12 @@ type sendBody struct { Sequence int64 `json:"sequence"` } +var msgCdc = wire.NewCodec() + +func init() { + bank.RegisterWire(msgCdc) +} + // SendRequestHandlerFn - http request handler to send coins to a address func SendRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx context.CoreContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { @@ -44,7 +51,7 @@ func SendRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx context.CoreCont w.Write([]byte(err.Error())) return } - err = json.Unmarshal(body, &m) + err = msgCdc.UnmarshalJSON(body, &m) if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) diff --git a/x/bank/msgs.go b/x/bank/msgs.go index c256b6de61..7836056de0 100644 --- a/x/bank/msgs.go +++ b/x/bank/msgs.go @@ -53,8 +53,7 @@ func (msg MsgSend) ValidateBasic() sdk.Error { // Implements Msg. func (msg MsgSend) GetSignBytes() []byte { - cdc := getCodec() - b, err := cdc.MarshalJSON(msg) // XXX: ensure some canonical form + b, err := msgCdc.MarshalJSON(msg) // XXX: ensure some canonical form if err != nil { panic(err) } @@ -103,8 +102,7 @@ func (msg MsgIssue) ValidateBasic() sdk.Error { // Implements Msg. func (msg MsgIssue) GetSignBytes() []byte { - cdc := getCodec() - b, err := cdc.MarshalJSON(msg) // XXX: ensure some canonical form + b, err := msgCdc.MarshalJSON(msg) // XXX: ensure some canonical form if err != nil { panic(err) } diff --git a/x/bank/msgs_test.go b/x/bank/msgs_test.go index fd1992e3c9..8f9791c8d7 100644 --- a/x/bank/msgs_test.go +++ b/x/bank/msgs_test.go @@ -187,9 +187,8 @@ func TestMsgSendGetSignBytes(t *testing.T) { } res := msg.GetSignBytes() - cdc := getCodec() unmarshaledMsg := &MsgSend{} - cdc.UnmarshalJSON(res, unmarshaledMsg) + msgCdc.UnmarshalJSON(res, unmarshaledMsg) assert.Equal(t, &msg, unmarshaledMsg) // TODO bad results @@ -263,9 +262,8 @@ func TestMsgIssueGetSignBytes(t *testing.T) { } res := msg.GetSignBytes() - cdc := getCodec() unmarshaledMsg := &MsgIssue{} - cdc.UnmarshalJSON(res, unmarshaledMsg) + msgCdc.UnmarshalJSON(res, unmarshaledMsg) assert.Equal(t, &msg, unmarshaledMsg) // TODO bad results diff --git a/x/bank/wire.go b/x/bank/wire.go index 49511ef0e5..f468d3e530 100644 --- a/x/bank/wire.go +++ b/x/bank/wire.go @@ -10,8 +10,8 @@ func RegisterWire(cdc *wire.Codec) { cdc.RegisterConcrete(MsgIssue{}, "cosmos-sdk/Issue", nil) } -func getCodec() *wire.Codec { - cdc := wire.NewCodec() - RegisterWire(cdc) - return cdc +var msgCdc = wire.NewCodec() + +func init() { + RegisterWire(msgCdc) } diff --git a/x/stake/msg.go b/x/stake/msg.go index 0adff84d9b..a4d47c7681 100644 --- a/x/stake/msg.go +++ b/x/stake/msg.go @@ -1,10 +1,7 @@ package stake import ( - "encoding/json" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/wire" crypto "github.com/tendermint/go-crypto" ) @@ -20,12 +17,6 @@ const StakingToken = "steak" //Verify interface at compile time var _, _, _, _ sdk.Msg = &MsgDeclareCandidacy{}, &MsgEditCandidacy{}, &MsgDelegate{}, &MsgUnbond{} -var msgCdc = wire.NewCodec() - -func init() { - wire.RegisterCrypto(msgCdc) -} - //______________________________________________________________________ // MsgDeclareCandidacy - struct for unbonding transactions @@ -94,7 +85,7 @@ func (msg MsgEditCandidacy) GetSigners() []sdk.Address { return []sdk.Address{ms // get the bytes for the message signer to sign on func (msg MsgEditCandidacy) GetSignBytes() []byte { - b, err := json.Marshal(msg) + b, err := msgCdc.MarshalJSON(msg) if err != nil { panic(err) } @@ -136,7 +127,7 @@ func (msg MsgDelegate) GetSigners() []sdk.Address { return []sdk.Address{msg.Del // get the bytes for the message signer to sign on func (msg MsgDelegate) GetSignBytes() []byte { - b, err := json.Marshal(msg) + b, err := msgCdc.MarshalJSON(msg) if err != nil { panic(err) } @@ -183,7 +174,7 @@ func (msg MsgUnbond) GetSigners() []sdk.Address { return []sdk.Address{msg.Deleg // get the bytes for the message signer to sign on func (msg MsgUnbond) GetSignBytes() []byte { - b, err := json.Marshal(msg) + b, err := msgCdc.MarshalJSON(msg) if err != nil { panic(err) } diff --git a/x/stake/params.go b/x/stake/params.go index 32b8c0ae83..d1e623658a 100644 --- a/x/stake/params.go +++ b/x/stake/params.go @@ -18,8 +18,8 @@ type Params struct { } func (p Params) equal(p2 Params) bool { - bz1 := cdcEmpty.MustMarshalBinary(&p) - bz2 := cdcEmpty.MustMarshalBinary(&p2) + bz1 := msgCdc.MustMarshalBinary(&p) + bz2 := msgCdc.MustMarshalBinary(&p2) return bytes.Equal(bz1, bz2) } diff --git a/x/stake/pool.go b/x/stake/pool.go index e2547b0503..44cb24652a 100644 --- a/x/stake/pool.go +++ b/x/stake/pool.go @@ -25,8 +25,8 @@ type Pool struct { } func (p Pool) equal(p2 Pool) bool { - bz1 := cdcEmpty.MustMarshalBinary(&p) - bz2 := cdcEmpty.MustMarshalBinary(&p2) + bz1 := msgCdc.MustMarshalBinary(&p) + bz2 := msgCdc.MustMarshalBinary(&p2) return bytes.Equal(bz1, bz2) } diff --git a/x/stake/wire.go b/x/stake/wire.go index 6e6e382606..b6df323c3c 100644 --- a/x/stake/wire.go +++ b/x/stake/wire.go @@ -12,4 +12,8 @@ func RegisterWire(cdc *wire.Codec) { cdc.RegisterConcrete(MsgUnbond{}, "cosmos-sdk/MsgUnbond", nil) } -var cdcEmpty = wire.NewCodec() +var msgCdc = wire.NewCodec() + +func init() { + wire.RegisterCrypto(msgCdc) +} From 037110903920070c9cb19f93d6cf902e92b97d29 Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Thu, 31 May 2018 12:55:21 -0700 Subject: [PATCH 113/548] Register crypto on amino codecs, update changelog --- CHANGELOG.md | 1 + x/auth/wire.go | 1 + x/stake/wire.go | 1 + 3 files changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2f68824ae..96944119e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ FEATURES IMPROVEMENTS * bank module uses go-wire codec instead of 'encoding/json' +* auth module uses go-wire codec instead of 'encoding/json' FIXES diff --git a/x/auth/wire.go b/x/auth/wire.go index 12778bb39b..309464c864 100644 --- a/x/auth/wire.go +++ b/x/auth/wire.go @@ -15,4 +15,5 @@ var msgCdc = wire.NewCodec() func init() { RegisterWire(msgCdc) + wire.RegisterCrypto(msgCdc) } diff --git a/x/stake/wire.go b/x/stake/wire.go index b6df323c3c..fb1a1c8867 100644 --- a/x/stake/wire.go +++ b/x/stake/wire.go @@ -15,5 +15,6 @@ func RegisterWire(cdc *wire.Codec) { var msgCdc = wire.NewCodec() func init() { + RegisterWire(msgCdc) wire.RegisterCrypto(msgCdc) } From 27ae1a14900be62d1980ea4f44af638cd8135ef7 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 31 May 2018 22:19:46 +0200 Subject: [PATCH 114/548] Match UnmarshalBinaryBare/MarshalBinaryBare --- Gopkg.lock | 2 +- x/slashing/tick.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 9c8b9f0ca3..a7aed3194e 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -380,7 +380,7 @@ "ripemd160", "salsa20/salsa" ] - revision = "ab813273cd59e1333f7ae7bff5d027d4aadf528c" + revision = "5ba7f63082460102a45837dbd1827e10f9479ac0" [[projects]] branch = "master" diff --git a/x/slashing/tick.go b/x/slashing/tick.go index 402c8997b8..82f76d802f 100644 --- a/x/slashing/tick.go +++ b/x/slashing/tick.go @@ -20,7 +20,7 @@ func NewBeginBlocker(sk Keeper) sdk.BeginBlocker { // Deal with any equivocation evidence for _, evidence := range req.ByzantineValidators { var pk crypto.PubKey - sk.cdc.MustUnmarshalBinary(evidence.PubKey, &pk) + sk.cdc.MustUnmarshalBinaryBare(evidence.PubKey, &pk) switch string(evidence.Type) { case tmtypes.DUPLICATE_VOTE: sk.handleDoubleSign(ctx, evidence.Height, evidence.Time, pk) @@ -33,7 +33,7 @@ func NewBeginBlocker(sk Keeper) sdk.BeginBlocker { absent := make(map[crypto.PubKey]struct{}) for _, pubkey := range req.AbsentValidators { var pk crypto.PubKey - sk.cdc.MustUnmarshalBinary(pubkey, &pk) + sk.cdc.MustUnmarshalBinaryBare(pubkey, &pk) absent[pk] = struct{}{} } From 871574888b5baea46ada824d4a0907f7d9a4f0ae Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Thu, 31 May 2018 04:16:05 -0700 Subject: [PATCH 115/548] Make Execute and GoExecute log better --- cmd/gaia/cli_test/cli_test.go | 37 +++--------- tests/gobash.go | 104 ++++++++++++++++++++++---------- tests/process.go | 109 ++++++++++++++++++++++++++++++++++ 3 files changed, 190 insertions(+), 60 deletions(-) create mode 100644 tests/process.go diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 0f549d6d6f..7efe07f91a 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -34,8 +34,8 @@ func TestGaiaCLISend(t *testing.T) { flags := fmt.Sprintf("--node=%v --chain-id=%v", servAddr, chainID) // start gaiad server - cmd, _, _ := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr)) - defer cmd.Process.Kill() + proc := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr)) + defer proc.Stop(false) fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json") barAddr, _ := executeGetAddrPK(t, "gaiacli keys show bar --output=json") @@ -83,8 +83,8 @@ func TestGaiaCLIDeclareCandidacy(t *testing.T) { flags := fmt.Sprintf("--node=%v --chain-id=%v", servAddr, chainID) // start gaiad server - cmd, _, _ := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr)) - defer cmd.Process.Kill() + proc := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr)) + defer proc.Stop(false) fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json") barAddr, _ := executeGetAddrPK(t, "gaiacli keys show bar --output=json") @@ -115,7 +115,7 @@ func TestGaiaCLIDeclareCandidacy(t *testing.T) { declStr += fmt.Sprintf(" --validator-address=%v", bechVal) declStr += fmt.Sprintf(" --amount=%v", "3steak") declStr += fmt.Sprintf(" --moniker=%v", "bar-vally") - fmt.Printf("debug declStr: %v\n", declStr) + t.Log(fmt.Sprintf("debug declStr: %v\n", declStr)) executeWrite(t, declStr, pass) time.Sleep(time.Second) // waiting for some blocks to pass barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barAddr, flags)) @@ -132,7 +132,7 @@ func TestGaiaCLIDeclareCandidacy(t *testing.T) { //unbondStr += fmt.Sprintf(" --address-delegator=%v", barAddr) //unbondStr += fmt.Sprintf(" --shares=%v", "1") //unbondStr += fmt.Sprintf(" --sequence=%v", "1") - //fmt.Printf("debug unbondStr: %v\n", unbondStr) + //t.Log(fmt.Sprintf("debug unbondStr: %v\n", unbondStr)) //executeWrite(t, unbondStr, pass) //time.Sleep(time.Second * 3) // waiting for some blocks to pass //barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barAddr, flags)) @@ -142,32 +142,13 @@ func TestGaiaCLIDeclareCandidacy(t *testing.T) { } func executeWrite(t *testing.T, cmdStr string, writes ...string) { - cmd, wc, _ := tests.GoExecuteT(t, cmdStr) + proc := tests.GoExecuteT(t, cmdStr) for _, write := range writes { - _, err := wc.Write([]byte(write + "\n")) - if err != nil { - fmt.Println(err) - } + _, err := proc.StdinPipe.Write([]byte(write + "\n")) require.NoError(t, err) } - fmt.Printf("debug waiting cmdStr: %v\n", cmdStr) - cmd.Wait() -} - -func executeWritePrint(t *testing.T, cmdStr string, writes ...string) { - cmd, wc, rc := tests.GoExecuteT(t, cmdStr) - - for _, write := range writes { - _, err := wc.Write([]byte(write + "\n")) - require.NoError(t, err) - } - fmt.Printf("debug waiting cmdStr: %v\n", cmdStr) - cmd.Wait() - - bz := make([]byte, 100000) - rc.Read(bz) - fmt.Printf("debug read: %v\n", string(bz)) + proc.Wait() } func executeInit(t *testing.T, cmdStr string) (chainID string) { diff --git a/tests/gobash.go b/tests/gobash.go index baa84f417f..f46bad3c1c 100644 --- a/tests/gobash.go +++ b/tests/gobash.go @@ -1,51 +1,91 @@ package tests import ( - "io" - "os/exec" "strings" "testing" - "time" "github.com/stretchr/testify/require" + cmn "github.com/tendermint/tmlibs/common" ) -func getCmd(t *testing.T, command string) *exec.Cmd { +// Execute the command, return stdout, logging stdout/err to t. +func ExecuteT(t *testing.T, cmd string) (out string) { + t.Log("Running", cmn.Cyan(cmd)) - //split command into command and args - split := strings.Split(command, " ") + // Split cmd to name and args. + split := strings.Split(cmd, " ") require.True(t, len(split) > 0, "no command provided") - - var cmd *exec.Cmd - if len(split) == 1 { - cmd = exec.Command(split[0]) - } else { - cmd = exec.Command(split[0], split[1:]...) + name, args := split[0], []string(nil) + if len(split) > 1 { + args = split[1:] } - return cmd -} -// Execute the command, return standard output and error, try a few times if requested -func ExecuteT(t *testing.T, command string) (out string) { - cmd := getCmd(t, command) - bz, err := cmd.CombinedOutput() - if err != nil { - panic(err) + // Start process and wait. + proc, err := StartProcess("", name, args, nil, nil) + require.NoError(t, err) + proc.Wait() + + // Get the output. + outbz := proc.StdoutBuffer.Bytes() + errbz := proc.StderrBuffer.Bytes() + + // Log output. + if len(outbz) > 0 { + t.Log("Stdout:", cmn.Green(string(outbz))) } - require.NoError(t, err, string(bz)) - out = strings.Trim(string(bz), "\n") //trim any new lines - time.Sleep(time.Second) + if len(errbz) > 0 { + t.Log("Stderr:", cmn.Red(string(errbz))) + } + + // Collect STDOUT output. + out = strings.Trim(string(outbz), "\n") //trim any new lines return out } -// Asynchronously execute the command, return standard output and error -func GoExecuteT(t *testing.T, command string) (cmd *exec.Cmd, pipeIn io.WriteCloser, pipeOut io.ReadCloser) { - cmd = getCmd(t, command) - pipeIn, err := cmd.StdinPipe() +// Execute the command, launch goroutines to log stdout/err to t. +// Caller should wait for .Wait() or .Stop() to terminate. +func GoExecuteT(t *testing.T, cmd string) (proc *Process) { + t.Log("Running", cmn.Cyan(cmd)) + + // Split cmd to name and args. + split := strings.Split(cmd, " ") + require.True(t, len(split) > 0, "no command provided") + name, args := split[0], []string(nil) + if len(split) > 1 { + args = split[1:] + } + + // Start process. + proc, err := StartProcess("", name, args, nil, nil) require.NoError(t, err) - pipeOut, err = cmd.StdoutPipe() - require.NoError(t, err) - cmd.Start() - time.Sleep(time.Second) - return cmd, pipeIn, pipeOut + + // Run goroutines to log stdout. + go func() { + buf := make([]byte, 10240) // TODO Document the effects. + for { + n, err := proc.StdoutBuffer.Read(buf) + if err != nil { + return + } + if n > 0 { + t.Log("Stdout:", cmn.Green(string(buf[:n]))) + } + } + }() + + // Run goroutines to log stderr. + go func() { + buf := make([]byte, 10240) // TODO Document the effects. + for { + n, err := proc.StderrBuffer.Read(buf) + if err != nil { + return + } + if n > 0 { + t.Log("Stderr:", cmn.Red(string(buf[:n]))) + } + } + }() + + return proc } diff --git a/tests/process.go b/tests/process.go new file mode 100644 index 0000000000..fcc6e3e0ea --- /dev/null +++ b/tests/process.go @@ -0,0 +1,109 @@ +package tests + +import ( + "bytes" + "io" + "os" + "os/exec" + "time" +) + +type Process struct { + ExecPath string + Args []string + Pid int + StartTime time.Time + EndTime time.Time + Cmd *exec.Cmd `json:"-"` + ExitState *os.ProcessState `json:"-"` + WaitCh chan struct{} `json:"-"` + StdinPipe io.WriteCloser `json:"-"` + StdoutBuffer *bytes.Buffer `json:"-"` + StderrBuffer *bytes.Buffer `json:"-"` +} + +// dir: The working directory. If "", os.Getwd() is used. +// name: Command name +// args: Args to command. (should not include name) +// outFile, errFile: If not nil, will use, otherwise new Buffers will be +// allocated. Either way, Process.Cmd.StdoutPipe and Process.Cmd.StderrPipe will be nil +// respectively. +func StartProcess(dir string, name string, args []string, outFile, errFile io.WriteCloser) (*Process, error) { + var cmd = exec.Command(name, args...) // is not yet started. + // cmd dir + if dir == "" { + pwd, err := os.Getwd() + if err != nil { + panic(err) + } + cmd.Dir = pwd + } else { + cmd.Dir = dir + } + // cmd stdin + stdin, err := cmd.StdinPipe() + if err != nil { + return nil, err + } + // cmd stdout, stderr + var outBuffer, errBuffer *bytes.Buffer + if outFile != nil { + cmd.Stdout = outFile + } else { + outBuffer = bytes.NewBuffer(nil) + cmd.Stdout = outBuffer + } + if errFile != nil { + cmd.Stderr = errFile + } else { + errBuffer = bytes.NewBuffer(nil) + cmd.Stderr = errBuffer + } + // cmd start + if err := cmd.Start(); err != nil { + return nil, err + } + proc := &Process{ + ExecPath: name, + Args: args, + Pid: cmd.Process.Pid, + StartTime: time.Now(), + Cmd: cmd, + ExitState: nil, + WaitCh: make(chan struct{}), + StdinPipe: stdin, + } + if outBuffer != nil { + proc.StdoutBuffer = outBuffer + } + if errBuffer != nil { + proc.StderrBuffer = errBuffer + } + go func() { + err := proc.Cmd.Wait() + if err != nil { + // fmt.Printf("Process exit: %v\n", err) + if exitError, ok := err.(*exec.ExitError); ok { + proc.ExitState = exitError.ProcessState + } + } + proc.ExitState = proc.Cmd.ProcessState + proc.EndTime = time.Now() // TODO make this goroutine-safe + close(proc.WaitCh) + }() + return proc, nil +} + +func (proc *Process) Stop(kill bool) error { + if kill { + // fmt.Printf("Killing process %v\n", proc.Cmd.Process) + return proc.Cmd.Process.Kill() + } else { + // fmt.Printf("Stopping process %v\n", proc.Cmd.Process) + return proc.Cmd.Process.Signal(os.Interrupt) + } +} + +func (proc *Process) Wait() { + <-proc.WaitCh +} From 94e78e060288a2296b890bcabfb9490ecb35b0ef Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 11:00:54 -0700 Subject: [PATCH 116/548] cech32 fixes for TestGaiaCLISend --- cmd/gaia/cli_test/cli_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 7efe07f91a..c76221c2d7 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -48,10 +48,11 @@ func TestGaiaCLISend(t *testing.T) { if err != nil { t.Error(err) } + time.Sleep(time.Second * 5) // Wait for RPC server to start. fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags)) assert.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak")) - executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barAddr), pass) + executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barBech), pass) time.Sleep(time.Second * 3) // waiting for some blocks to pass barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barBech, flags)) @@ -60,7 +61,7 @@ func TestGaiaCLISend(t *testing.T) { assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak")) // test autosequencing - executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barAddr), pass) + executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barBech), pass) time.Sleep(time.Second * 3) // waiting for some blocks to pass barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barBech, flags)) From afc2bbfe091a46154e271083369768d8032e9bba Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 12:10:12 -0700 Subject: [PATCH 117/548] working through cli --- client/keys/utils.go | 2 +- cmd/gaia/cli_test/cli_test.go | 118 +++++++++++++++++----------------- cmd/gaia/cmd/gaiacli/main.go | 4 +- x/stake/client/cli/tx.go | 4 +- 4 files changed, 65 insertions(+), 63 deletions(-) diff --git a/client/keys/utils.go b/client/keys/utils.go index 1a358cfc9c..7224294290 100644 --- a/client/keys/utils.go +++ b/client/keys/utils.go @@ -76,7 +76,7 @@ func printInfo(info keys.Info) { fmt.Printf("NAME:\tADDRESS:\t\t\t\t\t\tPUBKEY:\n") printKeyOutput(ko) case "json": - out, err := json.MarshalIndent(ko, "", "\t") + out, err := MarshalJSON(ko) if err != nil { panic(err) } diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index c76221c2d7..8d98486d72 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -36,41 +36,37 @@ func TestGaiaCLISend(t *testing.T) { // start gaiad server proc := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr)) defer proc.Stop(false) + time.Sleep(time.Second * 5) // Wait for RPC server to start. fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json") + fooCech, err := sdk.Bech32CosmosifyAcc(fooAddr) + require.NoError(t, err) barAddr, _ := executeGetAddrPK(t, "gaiacli keys show bar --output=json") + barCech, err := sdk.Bech32CosmosifyAcc(barAddr) + require.NoError(t, err) - fooBech, err := sdk.Bech32CosmosifyAcc(fooAddr) - if err != nil { - t.Error(err) - } - barBech, err := sdk.Bech32CosmosifyAcc(barAddr) - if err != nil { - t.Error(err) - } - time.Sleep(time.Second * 5) // Wait for RPC server to start. - fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags)) + fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooCech, flags)) assert.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak")) - executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barBech), pass) - time.Sleep(time.Second * 3) // waiting for some blocks to pass + executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barCech), pass) + time.Sleep(time.Second * 2) // waiting for some blocks to pass - barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barBech, flags)) + barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) assert.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak")) - fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags)) + fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooCech, flags)) assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak")) // test autosequencing - executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barBech), pass) - time.Sleep(time.Second * 3) // waiting for some blocks to pass + executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barCech), pass) + time.Sleep(time.Second * 2) // waiting for some blocks to pass - barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barBech, flags)) + barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) assert.Equal(t, int64(20), barAcc.GetCoins().AmountOf("steak")) - fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags)) + fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooCech, flags)) assert.Equal(t, int64(30), fooAcc.GetCoins().AmountOf("steak")) } -func TestGaiaCLIDeclareCandidacy(t *testing.T) { +func TestGaiaCLICreateValidator(t *testing.T) { tests.ExecuteT(t, "gaiad unsafe_reset_all") pass := "1234567890" @@ -86,62 +82,67 @@ func TestGaiaCLIDeclareCandidacy(t *testing.T) { // start gaiad server proc := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr)) defer proc.Stop(false) + time.Sleep(time.Second * 5) // Wait for RPC server to start. fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json") - barAddr, _ := executeGetAddrPK(t, "gaiacli keys show bar --output=json") + fooCech, err := sdk.Bech32CosmosifyAcc(fooAddr) + require.NoError(t, err) + barAddr, barPubKey := executeGetAddrPK(t, "gaiacli keys show bar --output=json") + barCech, err := sdk.Bech32CosmosifyAcc(barAddr) + require.NoError(t, err) + barCeshPubKey, err := sdk.Bech32CosmosifyValPub(barPubKey) + require.NoError(t, err) - fooBech, err := sdk.Bech32CosmosifyAcc(fooAddr) - if err != nil { - t.Error(err) - } - barBech, err := sdk.Bech32CosmosifyAcc(barAddr) - if err != nil { - t.Error(err) - } - valPrivkey := crypto.GenPrivKeyEd25519() - valAddr := sdk.Address((valPrivkey.PubKey().Address())) - bechVal, err := sdk.Bech32CosmosifyVal(valAddr) + executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barCech), pass) + time.Sleep(time.Second * 2) // waiting for some blocks to pass - executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barBech), pass) - time.Sleep(time.Second * 3) // waiting for some blocks to pass - - fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags)) - assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak")) - barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barBech, flags)) + barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) assert.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak")) + fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooCech, flags)) + assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak")) + + //valPrivkey := crypto.GenPrivKeyEd25519() + //valAddr := sdk.Address((valPrivkey.PubKey().Address())) + //bechVal, err := sdk.Bech32CosmosifyVal(valAddr) // declare candidacy - declStr := fmt.Sprintf("gaiacli create-validator %v", flags) - declStr += fmt.Sprintf(" --name=%v", "bar") - declStr += fmt.Sprintf(" --validator-address=%v", bechVal) - declStr += fmt.Sprintf(" --amount=%v", "3steak") - declStr += fmt.Sprintf(" --moniker=%v", "bar-vally") - t.Log(fmt.Sprintf("debug declStr: %v\n", declStr)) - executeWrite(t, declStr, pass) - time.Sleep(time.Second) // waiting for some blocks to pass - barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barAddr, flags)) + cvStr := fmt.Sprintf("gaiacli create-validator %v", flags) + cvStr += fmt.Sprintf(" --name=%v", "bar") + cvStr += fmt.Sprintf(" --validator-address=%v", barCech) + cvStr += fmt.Sprintf(" --pubkey=%v", barCeshPubKey) + cvStr += fmt.Sprintf(" --amount=%v", "3steak") + cvStr += fmt.Sprintf(" --moniker=%v", "bar-vally") + + executeWrite(t, cvStr, pass) + time.Sleep(time.Second * 5) // waiting for some blocks to pass + + barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) assert.Equal(t, int64(7), barAcc.GetCoins().AmountOf("steak")) - candidate := executeGetCandidate(t, fmt.Sprintf("gaiacli candidate %v --address-candidate=%v", flags, barAddr)) - assert.Equal(t, candidate.Owner.String(), barAddr) - assert.Equal(t, int64(3), candidate.PoolShares) + + validator := executeGetValidator(t, fmt.Sprintf("gaiacli validator %v %v", barCech, flags)) + assert.Equal(t, validator.Owner.String(), barCech) + assert.Equal(t, int64(3), validator.PoolShares) // TODO timeout issues if not connected to the internet // unbond a single share //unbondStr := fmt.Sprintf("gaiacli unbond %v", flags) //unbondStr += fmt.Sprintf(" --name=%v", "bar") - //unbondStr += fmt.Sprintf(" --address-candidate=%v", barAddr) - //unbondStr += fmt.Sprintf(" --address-delegator=%v", barAddr) + //unbondStr += fmt.Sprintf(" --address-validator=%v", barCech) + //unbondStr += fmt.Sprintf(" --address-delegator=%v", barCech) //unbondStr += fmt.Sprintf(" --shares=%v", "1") //unbondStr += fmt.Sprintf(" --sequence=%v", "1") //t.Log(fmt.Sprintf("debug unbondStr: %v\n", unbondStr)) //executeWrite(t, unbondStr, pass) //time.Sleep(time.Second * 3) // waiting for some blocks to pass - //barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barAddr, flags)) + //barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) //assert.Equal(t, int64(99998), barAcc.GetCoins().AmountOf("steak")) - //candidate = executeGetCandidate(t, fmt.Sprintf("gaiacli candidate %v --address-candidate=%v", flags, barAddr)) - //assert.Equal(t, int64(2), candidate.BondedShares.Evaluate()) + //validator = executeGetValidator(t, fmt.Sprintf("gaiacli validator %v --address-validator=%v", flags, barCech)) + //assert.Equal(t, int64(2), validator.BondedShares.Evaluate()) } +//___________________________________________________________________________________ +// executors + func executeWrite(t *testing.T, cmdStr string, writes ...string) { proc := tests.GoExecuteT(t, cmdStr) @@ -169,6 +170,7 @@ func executeGetAddrPK(t *testing.T, cmdStr string) (sdk.Address, crypto.PubKey) out := tests.ExecuteT(t, cmdStr) var ko keys.KeyOutput keys.UnmarshalJSON([]byte(out), &ko) + return ko.Address, ko.PubKey } @@ -186,11 +188,11 @@ func executeGetAccount(t *testing.T, cmdStr string) auth.BaseAccount { return acc } -func executeGetCandidate(t *testing.T, cmdStr string) stake.Validator { +func executeGetValidator(t *testing.T, cmdStr string) stake.Validator { out := tests.ExecuteT(t, cmdStr) - var candidate stake.Validator + var validator stake.Validator cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &candidate) + err := cdc.UnmarshalJSON([]byte(out), &validator) require.NoError(t, err, "out %v, err %v", out, err) - return candidate + return validator } diff --git a/cmd/gaia/cmd/gaiacli/main.go b/cmd/gaia/cmd/gaiacli/main.go index 2f36201b2f..51dab68e28 100644 --- a/cmd/gaia/cmd/gaiacli/main.go +++ b/cmd/gaia/cmd/gaiacli/main.go @@ -55,8 +55,8 @@ func main() { bankcmd.SendTxCmd(cdc), ibccmd.IBCTransferCmd(cdc), ibccmd.IBCRelayCmd(cdc), - stakecmd.GetCmdDeclareCandidacy(cdc), - stakecmd.GetCmdEditCandidacy(cdc), + stakecmd.GetCmdCreateValidator(cdc), + stakecmd.GetCmdEditValidator(cdc), stakecmd.GetCmdDelegate(cdc), stakecmd.GetCmdUnbond(cdc), )...) diff --git a/x/stake/client/cli/tx.go b/x/stake/client/cli/tx.go index dc88bfc209..5cd2656b62 100644 --- a/x/stake/client/cli/tx.go +++ b/x/stake/client/cli/tx.go @@ -14,7 +14,7 @@ import ( ) // create declare candidacy command -func GetCmdDeclareCandidacy(cdc *wire.Codec) *cobra.Command { +func GetCmdCreateValidator(cdc *wire.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "create-validator", Short: "create new validator initialized with a self-delegation to it", @@ -68,7 +68,7 @@ func GetCmdDeclareCandidacy(cdc *wire.Codec) *cobra.Command { } // create edit candidacy command -func GetCmdEditCandidacy(cdc *wire.Codec) *cobra.Command { +func GetCmdEditValidator(cdc *wire.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "edit-validator", Short: "edit and existing validator account", From 952aedc4f19c25cc92c5abc8fe7744341d0872d0 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 12:22:46 -0700 Subject: [PATCH 118/548] get rid of candidacy references --- CHANGELOG.md | 4 +- cmd/gaia/app/app_test.go | 12 +++--- cmd/gaia/cli_test/cli_test.go | 2 +- examples/basecoin/cmd/basecli/main.go | 4 +- examples/democoin/x/simplestake/msgs.go | 4 +- x/slashing/keeper_test.go | 4 +- x/slashing/test_common.go | 4 +- x/stake/client/cli/tx.go | 12 +++--- x/stake/errors.go | 4 +- x/stake/handler.go | 24 +++++------ x/stake/handler_test.go | 54 ++++++++++++------------- x/stake/msg.go | 40 +++++++++--------- x/stake/msg_test.go | 16 ++++---- x/stake/test_common.go | 4 +- x/stake/wire.go | 4 +- 15 files changed, 96 insertions(+), 96 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f12eaa4203..8a0bed5b18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -100,7 +100,7 @@ FEATURES * [gaiacli] Support queries for candidates, delegator-bonds * [gaiad] Added `gaiad export` command to export current state to JSON * [x/bank] Tx tags with sender/recipient for indexing & later retrieval -* [x/stake] Tx tags with delegator/candidate for delegation & unbonding, and candidate info for declare candidate / edit candidacy +* [x/stake] Tx tags with delegator/candidate for delegation & unbonding, and candidate info for declare candidate / edit validator IMPROVEMENTS @@ -134,7 +134,7 @@ BREAKING CHANGES FEATURES: -* Gaia stake commands include, DeclareCandidacy, EditCandidacy, Delegate, Unbond +* Gaia stake commands include, CreateValidator, EditValidator, Delegate, Unbond * MountStoreWithDB without providing a custom store works. * Repo is now lint compliant / GoMetaLinter with tendermint-lint integrated into CI * Better key output, pubkey go-amino hex bytes now output by default diff --git a/cmd/gaia/app/app_test.go b/cmd/gaia/app/app_test.go index b6f1c9e03c..13ffdc33b7 100644 --- a/cmd/gaia/app/app_test.go +++ b/cmd/gaia/app/app_test.go @@ -394,13 +394,13 @@ func TestStakeMsgs(t *testing.T) { require.Equal(t, acc1, res1) require.Equal(t, acc2, res2) - // Declare Candidacy + // Create Validator description := stake.NewDescription("foo_moniker", "", "", "") - declareCandidacyMsg := stake.NewMsgDeclareCandidacy( + createValidatorMsg := stake.NewMsgCreateValidator( addr1, priv1.PubKey(), bondCoin, description, ) - SignCheckDeliver(t, gapp, declareCandidacyMsg, []int64{0}, true, priv1) + SignCheckDeliver(t, gapp, createValidatorMsg, []int64{0}, true, priv1) ctxDeliver := gapp.BaseApp.NewContext(false, abci.Header{}) res1 = gapp.accountMapper.GetAccount(ctxDeliver, addr1) @@ -415,13 +415,13 @@ func TestStakeMsgs(t *testing.T) { bond, found := gapp.stakeKeeper.GetDelegation(ctxDeliver, addr1, addr1) require.True(sdk.RatEq(t, sdk.NewRat(10), bond.Shares)) - // Edit Candidacy + // Edit Validator description = stake.NewDescription("bar_moniker", "", "", "") - editCandidacyMsg := stake.NewMsgEditCandidacy( + editValidatorMsg := stake.NewMsgEditValidator( addr1, description, ) - SignDeliver(t, gapp, editCandidacyMsg, []int64{1}, true, priv1) + SignDeliver(t, gapp, editValidatorMsg, []int64{1}, true, priv1) validator, found = gapp.stakeKeeper.GetValidator(ctxDeliver, addr1) require.True(t, found) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 8d98486d72..79deaeb983 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -105,7 +105,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { //valAddr := sdk.Address((valPrivkey.PubKey().Address())) //bechVal, err := sdk.Bech32CosmosifyVal(valAddr) - // declare candidacy + // create validator cvStr := fmt.Sprintf("gaiacli create-validator %v", flags) cvStr += fmt.Sprintf(" --name=%v", "bar") cvStr += fmt.Sprintf(" --validator-address=%v", barCech) diff --git a/examples/basecoin/cmd/basecli/main.go b/examples/basecoin/cmd/basecli/main.go index f5385b5596..6540af38aa 100644 --- a/examples/basecoin/cmd/basecli/main.go +++ b/examples/basecoin/cmd/basecli/main.go @@ -59,8 +59,8 @@ func main() { bankcmd.SendTxCmd(cdc), ibccmd.IBCTransferCmd(cdc), ibccmd.IBCRelayCmd(cdc), - stakecmd.GetCmdDeclareCandidacy(cdc), - stakecmd.GetCmdEditCandidacy(cdc), + stakecmd.GetCmdCreateValidator(cdc), + stakecmd.GetCmdEditValidator(cdc), stakecmd.GetCmdDelegate(cdc), stakecmd.GetCmdUnbond(cdc), )...) diff --git a/examples/democoin/x/simplestake/msgs.go b/examples/democoin/x/simplestake/msgs.go index 01797a65bf..605f6f4e23 100644 --- a/examples/democoin/x/simplestake/msgs.go +++ b/examples/democoin/x/simplestake/msgs.go @@ -26,7 +26,7 @@ func NewMsgBond(addr sdk.Address, stake sdk.Coin, pubKey crypto.PubKey) MsgBond } //nolint -func (msg MsgBond) Type() string { return moduleName } //TODO update "stake/declarecandidacy" +func (msg MsgBond) Type() string { return moduleName } //TODO update "stake/createvalidator" func (msg MsgBond) GetSigners() []sdk.Address { return []sdk.Address{msg.Address} } // basic validation of the bond message @@ -65,7 +65,7 @@ func NewMsgUnbond(addr sdk.Address) MsgUnbond { } //nolint -func (msg MsgUnbond) Type() string { return moduleName } //TODO update "stake/declarecandidacy" +func (msg MsgUnbond) Type() string { return moduleName } //TODO update "stake/createvalidator" func (msg MsgUnbond) GetSigners() []sdk.Address { return []sdk.Address{msg.Address} } func (msg MsgUnbond) ValidateBasic() sdk.Error { return nil } diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 3d6da8c232..a385627737 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -16,7 +16,7 @@ func TestHandleDoubleSign(t *testing.T) { // initial setup ctx, ck, sk, keeper := createTestInput(t) addr, val, amt := addrs[0], pks[0], int64(100) - got := stake.NewHandler(sk)(ctx, newTestMsgDeclareCandidacy(addr, val, amt)) + got := stake.NewHandler(sk)(ctx, newTestMsgCreateValidator(addr, val, amt)) require.True(t, got.IsOK()) sk.Tick(ctx) require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) @@ -39,7 +39,7 @@ func TestHandleAbsentValidator(t *testing.T) { addr, val, amt := addrs[0], pks[0], int64(100) sh := stake.NewHandler(sk) slh := NewHandler(keeper) - got := sh(ctx, newTestMsgDeclareCandidacy(addr, val, amt)) + got := sh(ctx, newTestMsgCreateValidator(addr, val, amt)) require.True(t, got.IsOK()) sk.Tick(ctx) require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) diff --git a/x/slashing/test_common.go b/x/slashing/test_common.go index 0228e9498b..c76eaadde7 100644 --- a/x/slashing/test_common.go +++ b/x/slashing/test_common.go @@ -85,8 +85,8 @@ func testAddr(addr string) sdk.Address { return res } -func newTestMsgDeclareCandidacy(address sdk.Address, pubKey crypto.PubKey, amt int64) stake.MsgDeclareCandidacy { - return stake.MsgDeclareCandidacy{ +func newTestMsgCreateValidator(address sdk.Address, pubKey crypto.PubKey, amt int64) stake.MsgCreateValidator { + return stake.MsgCreateValidator{ Description: stake.Description{}, ValidatorAddr: address, PubKey: pubKey, diff --git a/x/stake/client/cli/tx.go b/x/stake/client/cli/tx.go index 5cd2656b62..3abd366ece 100644 --- a/x/stake/client/cli/tx.go +++ b/x/stake/client/cli/tx.go @@ -13,7 +13,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/stake" ) -// create declare candidacy command +// create create validator command func GetCmdCreateValidator(cdc *wire.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "create-validator", @@ -47,7 +47,7 @@ func GetCmdCreateValidator(cdc *wire.Codec) *cobra.Command { Website: viper.GetString(FlagWebsite), Details: viper.GetString(FlagDetails), } - msg := stake.NewMsgDeclareCandidacy(validatorAddr, pk, amount, description) + msg := stake.NewMsgCreateValidator(validatorAddr, pk, amount, description) // build and sign the transaction, then broadcast to Tendermint res, err := ctx.EnsureSignBuildBroadcast(ctx.FromAddressName, msg, cdc) @@ -67,7 +67,7 @@ func GetCmdCreateValidator(cdc *wire.Codec) *cobra.Command { return cmd } -// create edit candidacy command +// create edit validator command func GetCmdEditValidator(cdc *wire.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "edit-validator", @@ -84,7 +84,7 @@ func GetCmdEditValidator(cdc *wire.Codec) *cobra.Command { Website: viper.GetString(FlagWebsite), Details: viper.GetString(FlagDetails), } - msg := stake.NewMsgEditCandidacy(validatorAddr, description) + msg := stake.NewMsgEditValidator(validatorAddr, description) // build and sign the transaction, then broadcast to Tendermint ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) @@ -104,7 +104,7 @@ func GetCmdEditValidator(cdc *wire.Codec) *cobra.Command { return cmd } -// create edit candidacy command +// create edit validator command func GetCmdDelegate(cdc *wire.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "delegate", @@ -142,7 +142,7 @@ func GetCmdDelegate(cdc *wire.Codec) *cobra.Command { return cmd } -// create edit candidacy command +// create edit validator command func GetCmdUnbond(cdc *wire.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "unbond", diff --git a/x/stake/errors.go b/x/stake/errors.go index 77090d9dc3..0ae57530ad 100644 --- a/x/stake/errors.go +++ b/x/stake/errors.go @@ -73,10 +73,10 @@ func ErrBadDelegatorAddr(codespace sdk.CodespaceType) sdk.Error { return newError(codespace, CodeInvalidValidator, "Delegator does not exist for that address") } func ErrValidatorExistsAddr(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "Validator already exist, cannot re-declare candidacy") + return newError(codespace, CodeInvalidValidator, "Validator already exist, cannot re-create validator") } func ErrValidatorRevoked(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "Candidacy for this address is currently revoked") + return newError(codespace, CodeInvalidValidator, "Validator for this address is currently revoked") } func ErrMissingSignature(codespace sdk.CodespaceType) sdk.Error { return newError(codespace, CodeInvalidValidator, "Missing signature") diff --git a/x/stake/handler.go b/x/stake/handler.go index 6f2360adf7..b1c6a95b59 100644 --- a/x/stake/handler.go +++ b/x/stake/handler.go @@ -11,10 +11,10 @@ func NewHandler(k Keeper) sdk.Handler { return func(ctx sdk.Context, msg sdk.Msg) sdk.Result { // NOTE msg already has validate basic run switch msg := msg.(type) { - case MsgDeclareCandidacy: - return handleMsgDeclareCandidacy(ctx, msg, k) - case MsgEditCandidacy: - return handleMsgEditCandidacy(ctx, msg, k) + case MsgCreateValidator: + return handleMsgCreateValidator(ctx, msg, k) + case MsgEditValidator: + return handleMsgEditValidator(ctx, msg, k) case MsgDelegate: return handleMsgDelegate(ctx, msg, k) case MsgUnbond: @@ -39,7 +39,7 @@ func NewEndBlocker(k Keeper) sdk.EndBlocker { // These functions assume everything has been authenticated, // now we just perform action and save -func handleMsgDeclareCandidacy(ctx sdk.Context, msg MsgDeclareCandidacy, k Keeper) sdk.Result { +func handleMsgCreateValidator(ctx sdk.Context, msg MsgCreateValidator, k Keeper) sdk.Result { // check to see if the pubkey or sender has been registered before _, found := k.GetValidator(ctx, msg.ValidatorAddr) @@ -57,7 +57,7 @@ func handleMsgDeclareCandidacy(ctx sdk.Context, msg MsgDeclareCandidacy, k Keepe k.setValidator(ctx, validator) k.setValidatorByPubKeyIndex(ctx, validator) tags := sdk.NewTags( - "action", []byte("declareCandidacy"), + "action", []byte("createValidator"), "validator", msg.ValidatorAddr.Bytes(), "moniker", []byte(msg.Description.Moniker), "identity", []byte(msg.Description.Identity), @@ -75,7 +75,7 @@ func handleMsgDeclareCandidacy(ctx sdk.Context, msg MsgDeclareCandidacy, k Keepe } } -func handleMsgEditCandidacy(ctx sdk.Context, msg MsgEditCandidacy, k Keeper) sdk.Result { +func handleMsgEditValidator(ctx sdk.Context, msg MsgEditValidator, k Keeper) sdk.Result { // validator must already be registered validator, found := k.GetValidator(ctx, msg.ValidatorAddr) @@ -95,7 +95,7 @@ func handleMsgEditCandidacy(ctx sdk.Context, msg MsgEditCandidacy, k Keeper) sdk k.updateValidator(ctx, validator) tags := sdk.NewTags( - "action", []byte("editCandidacy"), + "action", []byte("editValidator"), "validator", msg.ValidatorAddr.Bytes(), "moniker", []byte(msg.Description.Moniker), "identity", []byte(msg.Description.Identity), @@ -207,14 +207,14 @@ func handleMsgUnbond(ctx sdk.Context, msg MsgUnbond, k Keeper) sdk.Result { bond.Shares = bond.Shares.Sub(delShares) // remove the bond - revokeCandidacy := false + revokeValidator := false if bond.Shares.IsZero() { // if the bond is the owner of the validator then - // trigger a revoke candidacy + // trigger a revoke validator if bytes.Equal(bond.DelegatorAddr, validator.Owner) && validator.Revoked == false { - revokeCandidacy = true + revokeValidator = true } k.removeDelegation(ctx, bond) @@ -233,7 +233,7 @@ func handleMsgUnbond(ctx sdk.Context, msg MsgUnbond, k Keeper) sdk.Result { ///////////////////////////////////// // revoke validator if necessary - if revokeCandidacy { + if revokeValidator { validator.Revoked = true } diff --git a/x/stake/handler_test.go b/x/stake/handler_test.go index 19848e8e6d..0c086f06db 100644 --- a/x/stake/handler_test.go +++ b/x/stake/handler_test.go @@ -14,8 +14,8 @@ import ( //______________________________________________________________________ -func newTestMsgDeclareCandidacy(address sdk.Address, pubKey crypto.PubKey, amt int64) MsgDeclareCandidacy { - return MsgDeclareCandidacy{ +func newTestMsgCreateValidator(address sdk.Address, pubKey crypto.PubKey, amt int64) MsgCreateValidator { + return MsgCreateValidator{ Description: Description{}, ValidatorAddr: address, PubKey: pubKey, @@ -33,13 +33,13 @@ func newTestMsgDelegate(delegatorAddr, validatorAddr sdk.Address, amt int64) Msg //______________________________________________________________________ -func TestDuplicatesMsgDeclareCandidacy(t *testing.T) { +func TestDuplicatesMsgCreateValidator(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 1000) validatorAddr := addrs[0] pk := pks[0] - msgDeclareCandidacy := newTestMsgDeclareCandidacy(validatorAddr, pk, 10) - got := handleMsgDeclareCandidacy(ctx, msgDeclareCandidacy, keeper) + msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pk, 10) + got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) assert.True(t, got.IsOK(), "%v", got) validator, found := keeper.GetValidator(ctx, validatorAddr) require.True(t, found) @@ -51,8 +51,8 @@ func TestDuplicatesMsgDeclareCandidacy(t *testing.T) { assert.Equal(t, Description{}, validator.Description) // one validator cannot bond twice - msgDeclareCandidacy.PubKey = pks[1] - got = handleMsgDeclareCandidacy(ctx, msgDeclareCandidacy, keeper) + msgCreateValidator.PubKey = pks[1] + got = handleMsgCreateValidator(ctx, msgCreateValidator, keeper) assert.False(t, got.IsOK(), "%v", got) } @@ -64,10 +64,10 @@ func TestIncrementsMsgDelegate(t *testing.T) { bondAmount := int64(10) validatorAddr, delegatorAddr := addrs[0], addrs[1] - // first declare candidacy - msgDeclareCandidacy := newTestMsgDeclareCandidacy(validatorAddr, pks[0], bondAmount) - got := handleMsgDeclareCandidacy(ctx, msgDeclareCandidacy, keeper) - assert.True(t, got.IsOK(), "expected declare candidacy msg to be ok, got %v", got) + // first create validator + msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pks[0], bondAmount) + got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) + assert.True(t, got.IsOK(), "expected create validator msg to be ok, got %v", got) validator, found := keeper.GetValidator(ctx, validatorAddr) require.True(t, found) @@ -134,12 +134,12 @@ func TestIncrementsMsgUnbond(t *testing.T) { ctx, accMapper, keeper := createTestInput(t, false, initBond) params := keeper.GetParams(ctx) - // declare candidacy, delegate + // create validator, delegate validatorAddr, delegatorAddr := addrs[0], addrs[1] - msgDeclareCandidacy := newTestMsgDeclareCandidacy(validatorAddr, pks[0], initBond) - got := handleMsgDeclareCandidacy(ctx, msgDeclareCandidacy, keeper) - assert.True(t, got.IsOK(), "expected declare-candidacy to be ok, got %v", got) + msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pks[0], initBond) + got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) + assert.True(t, got.IsOK(), "expected create-validator to be ok, got %v", got) msgDelegate := newTestMsgDelegate(delegatorAddr, validatorAddr, initBond) got = handleMsgDelegate(ctx, msgDelegate, keeper) @@ -216,7 +216,7 @@ func TestIncrementsMsgUnbond(t *testing.T) { "got: %v\nmsgUnbond: %v\nshares: %v\nleftBonded: %v\n", got, msgUnbond, unbondSharesStr, leftBonded) } -func TestMultipleMsgDeclareCandidacy(t *testing.T) { +func TestMultipleMsgCreateValidator(t *testing.T) { initBond := int64(1000) ctx, accMapper, keeper := createTestInput(t, false, initBond) params := keeper.GetParams(ctx) @@ -224,8 +224,8 @@ func TestMultipleMsgDeclareCandidacy(t *testing.T) { // bond them all for i, validatorAddr := range validatorAddrs { - msgDeclareCandidacy := newTestMsgDeclareCandidacy(validatorAddr, pks[i], 10) - got := handleMsgDeclareCandidacy(ctx, msgDeclareCandidacy, keeper) + msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pks[i], 10) + got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) require.True(t, got.IsOK(), "expected msg %d to be ok, got %v", i, got) //Check that the account is bonded @@ -266,8 +266,8 @@ func TestMultipleMsgDelegate(t *testing.T) { validatorAddr, delegatorAddrs := addrs[0], addrs[1:] //first make a validator - msgDeclareCandidacy := newTestMsgDeclareCandidacy(validatorAddr, pks[0], 10) - got := handleMsgDeclareCandidacy(ctx, msgDeclareCandidacy, keeper) + msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pks[0], 10) + got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) require.True(t, got.IsOK(), "expected msg to be ok, got %v", got) // delegate multiple parties @@ -294,14 +294,14 @@ func TestMultipleMsgDelegate(t *testing.T) { } } -func TestVoidCandidacy(t *testing.T) { +func TestRevokeValidator(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 1000) validatorAddr, delegatorAddr := addrs[0], addrs[1] // create the validator - msgDeclareCandidacy := newTestMsgDeclareCandidacy(validatorAddr, pks[0], 10) - got := handleMsgDeclareCandidacy(ctx, msgDeclareCandidacy, keeper) - require.True(t, got.IsOK(), "expected no error on runMsgDeclareCandidacy") + msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pks[0], 10) + got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) + require.True(t, got.IsOK(), "expected no error on runMsgCreateValidator") // bond a delegator msgDelegate := newTestMsgDelegate(delegatorAddr, validatorAddr, 10) @@ -311,7 +311,7 @@ func TestVoidCandidacy(t *testing.T) { // unbond the validators bond portion msgUnbondValidator := NewMsgUnbond(validatorAddr, validatorAddr, "10") got = handleMsgUnbond(ctx, msgUnbondValidator, keeper) - require.True(t, got.IsOK(), "expected no error on runMsgDeclareCandidacy") + require.True(t, got.IsOK(), "expected no error on runMsgCreateValidator") validator, found := keeper.GetValidator(ctx, validatorAddr) require.True(t, found) require.True(t, validator.Revoked) @@ -323,9 +323,9 @@ func TestVoidCandidacy(t *testing.T) { // test that the delegator can still withdraw their bonds msgUnbondDelegator := NewMsgUnbond(delegatorAddr, validatorAddr, "10") got = handleMsgUnbond(ctx, msgUnbondDelegator, keeper) - require.True(t, got.IsOK(), "expected no error on runMsgDeclareCandidacy") + require.True(t, got.IsOK(), "expected no error on runMsgCreateValidator") // verify that the pubkey can now be reused - got = handleMsgDeclareCandidacy(ctx, msgDeclareCandidacy, keeper) + got = handleMsgCreateValidator(ctx, msgCreateValidator, keeper) assert.True(t, got.IsOK(), "expected ok, got %v", got) } diff --git a/x/stake/msg.go b/x/stake/msg.go index 67d9597cac..40bf609eec 100644 --- a/x/stake/msg.go +++ b/x/stake/msg.go @@ -15,21 +15,21 @@ const MsgType = "stake" const StakingToken = "steak" //Verify interface at compile time -var _, _, _, _ sdk.Msg = &MsgDeclareCandidacy{}, &MsgEditCandidacy{}, &MsgDelegate{}, &MsgUnbond{} +var _, _, _, _ sdk.Msg = &MsgCreateValidator{}, &MsgEditValidator{}, &MsgDelegate{}, &MsgUnbond{} //______________________________________________________________________ -// MsgDeclareCandidacy - struct for unbonding transactions -type MsgDeclareCandidacy struct { +// MsgCreateValidator - struct for unbonding transactions +type MsgCreateValidator struct { Description ValidatorAddr sdk.Address `json:"address"` PubKey crypto.PubKey `json:"pubkey"` Bond sdk.Coin `json:"bond"` } -func NewMsgDeclareCandidacy(validatorAddr sdk.Address, pubkey crypto.PubKey, - bond sdk.Coin, description Description) MsgDeclareCandidacy { - return MsgDeclareCandidacy{ +func NewMsgCreateValidator(validatorAddr sdk.Address, pubkey crypto.PubKey, + bond sdk.Coin, description Description) MsgCreateValidator { + return MsgCreateValidator{ Description: description, ValidatorAddr: validatorAddr, PubKey: pubkey, @@ -38,18 +38,18 @@ func NewMsgDeclareCandidacy(validatorAddr sdk.Address, pubkey crypto.PubKey, } //nolint -func (msg MsgDeclareCandidacy) Type() string { return MsgType } //TODO update "stake/declarecandidacy" -func (msg MsgDeclareCandidacy) GetSigners() []sdk.Address { +func (msg MsgCreateValidator) Type() string { return MsgType } +func (msg MsgCreateValidator) GetSigners() []sdk.Address { return []sdk.Address{msg.ValidatorAddr} } // get the bytes for the message signer to sign on -func (msg MsgDeclareCandidacy) GetSignBytes() []byte { +func (msg MsgCreateValidator) GetSignBytes() []byte { return msgCdc.MustMarshalBinary(msg) } // quick validity check -func (msg MsgDeclareCandidacy) ValidateBasic() sdk.Error { +func (msg MsgCreateValidator) ValidateBasic() sdk.Error { if msg.ValidatorAddr == nil { return ErrValidatorEmpty(DefaultCodespace) } @@ -68,27 +68,27 @@ func (msg MsgDeclareCandidacy) ValidateBasic() sdk.Error { //______________________________________________________________________ -// MsgEditCandidacy - struct for editing a validator -type MsgEditCandidacy struct { +// MsgEditValidator - struct for editing a validator +type MsgEditValidator struct { Description ValidatorAddr sdk.Address `json:"address"` } -func NewMsgEditCandidacy(validatorAddr sdk.Address, description Description) MsgEditCandidacy { - return MsgEditCandidacy{ +func NewMsgEditValidator(validatorAddr sdk.Address, description Description) MsgEditValidator { + return MsgEditValidator{ Description: description, ValidatorAddr: validatorAddr, } } //nolint -func (msg MsgEditCandidacy) Type() string { return MsgType } //TODO update "stake/msgeditcandidacy" -func (msg MsgEditCandidacy) GetSigners() []sdk.Address { +func (msg MsgEditValidator) Type() string { return MsgType } +func (msg MsgEditValidator) GetSigners() []sdk.Address { return []sdk.Address{msg.ValidatorAddr} } // get the bytes for the message signer to sign on -func (msg MsgEditCandidacy) GetSignBytes() []byte { +func (msg MsgEditValidator) GetSignBytes() []byte { b, err := msgCdc.MarshalJSON(msg) if err != nil { panic(err) @@ -97,7 +97,7 @@ func (msg MsgEditCandidacy) GetSignBytes() []byte { } // quick validity check -func (msg MsgEditCandidacy) ValidateBasic() sdk.Error { +func (msg MsgEditValidator) ValidateBasic() sdk.Error { if msg.ValidatorAddr == nil { return ErrValidatorEmpty(DefaultCodespace) } @@ -126,7 +126,7 @@ func NewMsgDelegate(delegatorAddr, validatorAddr sdk.Address, bond sdk.Coin) Msg } //nolint -func (msg MsgDelegate) Type() string { return MsgType } //TODO update "stake/msgeditcandidacy" +func (msg MsgDelegate) Type() string { return MsgType } func (msg MsgDelegate) GetSigners() []sdk.Address { return []sdk.Address{msg.DelegatorAddr} } @@ -175,7 +175,7 @@ func NewMsgUnbond(delegatorAddr, validatorAddr sdk.Address, shares string) MsgUn } //nolint -func (msg MsgUnbond) Type() string { return MsgType } //TODO update "stake/msgeditcandidacy" +func (msg MsgUnbond) Type() string { return MsgType } func (msg MsgUnbond) GetSigners() []sdk.Address { return []sdk.Address{msg.DelegatorAddr} } // get the bytes for the message signer to sign on diff --git a/x/stake/msg_test.go b/x/stake/msg_test.go index 03a5fbf62f..863613a039 100644 --- a/x/stake/msg_test.go +++ b/x/stake/msg_test.go @@ -18,8 +18,8 @@ var ( coinNegNotAtoms = sdk.Coin{"foo", -10000} ) -// test ValidateBasic for MsgDeclareCandidacy -func TestMsgDeclareCandidacy(t *testing.T) { +// test ValidateBasic for MsgCreateValidator +func TestMsgCreateValidator(t *testing.T) { tests := []struct { name, moniker, identity, website, details string validatorAddr sdk.Address @@ -40,7 +40,7 @@ func TestMsgDeclareCandidacy(t *testing.T) { for _, tc := range tests { description := NewDescription(tc.moniker, tc.identity, tc.website, tc.details) - msg := NewMsgDeclareCandidacy(tc.validatorAddr, tc.pubkey, tc.bond, description) + msg := NewMsgCreateValidator(tc.validatorAddr, tc.pubkey, tc.bond, description) if tc.expectPass { assert.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) } else { @@ -49,8 +49,8 @@ func TestMsgDeclareCandidacy(t *testing.T) { } } -// test ValidateBasic for MsgEditCandidacy -func TestMsgEditCandidacy(t *testing.T) { +// test ValidateBasic for MsgEditValidator +func TestMsgEditValidator(t *testing.T) { tests := []struct { name, moniker, identity, website, details string validatorAddr sdk.Address @@ -64,7 +64,7 @@ func TestMsgEditCandidacy(t *testing.T) { for _, tc := range tests { description := NewDescription(tc.moniker, tc.identity, tc.website, tc.details) - msg := NewMsgEditCandidacy(tc.validatorAddr, description) + msg := NewMsgEditValidator(tc.validatorAddr, description) if tc.expectPass { assert.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) } else { @@ -139,8 +139,8 @@ func TestMsgUnbond(t *testing.T) { //tests := []struct { //tx sdk.Msg //}{ -//{NewMsgDeclareCandidacy(addrs[0], pks[0], bond, Description{})}, -//{NewMsgEditCandidacy(addrs[0], Description{})}, +//{NewMsgCreateValidator(addrs[0], pks[0], bond, Description{})}, +//{NewMsgEditValidator(addrs[0], Description{})}, //{NewMsgDelegate(addrs[0], addrs[1], bond)}, //{NewMsgUnbond(addrs[0], addrs[1], strconv.Itoa(bondAmt))}, //} diff --git a/x/stake/test_common.go b/x/stake/test_common.go index 9f52ad8de9..ae4adf4d8f 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -68,8 +68,8 @@ func makeTestCodec() *wire.Codec { cdc.RegisterInterface((*sdk.Msg)(nil), nil) cdc.RegisterConcrete(bank.MsgSend{}, "test/stake/Send", nil) cdc.RegisterConcrete(bank.MsgIssue{}, "test/stake/Issue", nil) - cdc.RegisterConcrete(MsgDeclareCandidacy{}, "test/stake/DeclareCandidacy", nil) - cdc.RegisterConcrete(MsgEditCandidacy{}, "test/stake/EditCandidacy", nil) + cdc.RegisterConcrete(MsgCreateValidator{}, "test/stake/CreateValidator", nil) + cdc.RegisterConcrete(MsgEditValidator{}, "test/stake/EditValidator", nil) cdc.RegisterConcrete(MsgUnbond{}, "test/stake/Unbond", nil) // Register AppAccount diff --git a/x/stake/wire.go b/x/stake/wire.go index fb1a1c8867..c0b0be71fa 100644 --- a/x/stake/wire.go +++ b/x/stake/wire.go @@ -6,8 +6,8 @@ import ( // Register concrete types on wire codec func RegisterWire(cdc *wire.Codec) { - cdc.RegisterConcrete(MsgDeclareCandidacy{}, "cosmos-sdk/MsgDeclareCandidacy", nil) - cdc.RegisterConcrete(MsgEditCandidacy{}, "cosmos-sdk/MsgEditCandidacy", nil) + cdc.RegisterConcrete(MsgCreateValidator{}, "cosmos-sdk/MsgCreateValidator", nil) + cdc.RegisterConcrete(MsgEditValidator{}, "cosmos-sdk/MsgEditValidator", nil) cdc.RegisterConcrete(MsgDelegate{}, "cosmos-sdk/MsgDelegate", nil) cdc.RegisterConcrete(MsgUnbond{}, "cosmos-sdk/MsgUnbond", nil) } From 17a861da43a0c2b06271bd936d494a55226098ea Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 12:29:39 -0700 Subject: [PATCH 119/548] key utils output with cdc --- client/keys/utils.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/keys/utils.go b/client/keys/utils.go index 7224294290..3d6d9807ba 100644 --- a/client/keys/utils.go +++ b/client/keys/utils.go @@ -1,7 +1,6 @@ package keys import ( - "encoding/json" "fmt" "path/filepath" @@ -77,6 +76,7 @@ func printInfo(info keys.Info) { printKeyOutput(ko) case "json": out, err := MarshalJSON(ko) + //out, err := json.MarshalIndent(kos, "", "\t") if err != nil { panic(err) } @@ -93,7 +93,8 @@ func printInfos(infos []keys.Info) { printKeyOutput(ko) } case "json": - out, err := json.MarshalIndent(kos, "", "\t") + out, err := MarshalJSON(ko) + //out, err := json.MarshalIndent(kos, "", "\t") if err != nil { panic(err) } From 1f1097c4d3fa33d17b0eececd81ac9e06203929b Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 13:33:52 -0700 Subject: [PATCH 120/548] cli test bugs --- client/keys/utils.go | 2 +- cmd/gaia/cli_test/cli_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/keys/utils.go b/client/keys/utils.go index 3d6d9807ba..f9990bf16d 100644 --- a/client/keys/utils.go +++ b/client/keys/utils.go @@ -93,7 +93,7 @@ func printInfos(infos []keys.Info) { printKeyOutput(ko) } case "json": - out, err := MarshalJSON(ko) + out, err := MarshalJSON(kos) //out, err := json.MarshalIndent(kos, "", "\t") if err != nil { panic(err) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 79deaeb983..17d14d053b 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -108,7 +108,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { // create validator cvStr := fmt.Sprintf("gaiacli create-validator %v", flags) cvStr += fmt.Sprintf(" --name=%v", "bar") - cvStr += fmt.Sprintf(" --validator-address=%v", barCech) + cvStr += fmt.Sprintf(" --address-validator=%v", barCech) cvStr += fmt.Sprintf(" --pubkey=%v", barCeshPubKey) cvStr += fmt.Sprintf(" --amount=%v", "3steak") cvStr += fmt.Sprintf(" --moniker=%v", "bar-vally") @@ -117,7 +117,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { time.Sleep(time.Second * 5) // waiting for some blocks to pass barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) - assert.Equal(t, int64(7), barAcc.GetCoins().AmountOf("steak")) + require.Equal(t, int64(7), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) validator := executeGetValidator(t, fmt.Sprintf("gaiacli validator %v %v", barCech, flags)) assert.Equal(t, validator.Owner.String(), barCech) From 0b6aa3c047b5d88d580831e6f6845dbbee0c63c5 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 14:45:07 -0700 Subject: [PATCH 121/548] add test_cli to ci --- .circleci/config.yml | 19 +++++++++++++++++++ cmd/gaia/cli_test/cli_test.go | 14 +++++++------- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index cd930d52ba..c8dc0b20ba 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -85,6 +85,22 @@ jobs: export PATH="$GOBIN:$PATH" make test_unit + test_cli: + <<: *defaults + parallelism: 1 + steps: + - attach_workspace: + at: /tmp/workspace + - restore_cache: + key: v1-pkg-cache + - restore_cache: + key: v1-tree-{{ .Environment.CIRCLE_SHA1 }} + - run: + name: Test cli + command: | + export PATH="$GOBIN:$PATH" + make test_cli + test_cover: <<: *defaults parallelism: 4 @@ -141,6 +157,9 @@ workflows: - test_unit: requires: - setup_dependencies + - test_cli: + requires: + - setup_dependencies - test_cover: requires: - setup_dependencies diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 17d14d053b..1e47572b14 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -110,18 +110,18 @@ func TestGaiaCLICreateValidator(t *testing.T) { cvStr += fmt.Sprintf(" --name=%v", "bar") cvStr += fmt.Sprintf(" --address-validator=%v", barCech) cvStr += fmt.Sprintf(" --pubkey=%v", barCeshPubKey) - cvStr += fmt.Sprintf(" --amount=%v", "3steak") + cvStr += fmt.Sprintf(" --amount=%v", "1steak") cvStr += fmt.Sprintf(" --moniker=%v", "bar-vally") executeWrite(t, cvStr, pass) - time.Sleep(time.Second * 5) // waiting for some blocks to pass + time.Sleep(time.Second * 3) // waiting for some blocks to pass barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) - require.Equal(t, int64(7), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) + require.Equal(t, int64(9), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) - validator := executeGetValidator(t, fmt.Sprintf("gaiacli validator %v %v", barCech, flags)) - assert.Equal(t, validator.Owner.String(), barCech) - assert.Equal(t, int64(3), validator.PoolShares) + validator := executeGetValidator(t, fmt.Sprintf("gaiacli validator --output=json %v %v", barCech, flags)) + assert.Equal(t, validator.Owner, barAddr) + assert.Equal(t, "1/1", validator.PoolShares.Amount.String()) // TODO timeout issues if not connected to the internet // unbond a single share @@ -193,6 +193,6 @@ func executeGetValidator(t *testing.T, cmdStr string) stake.Validator { var validator stake.Validator cdc := app.MakeCodec() err := cdc.UnmarshalJSON([]byte(out), &validator) - require.NoError(t, err, "out %v, err %v", out, err) + require.NoError(t, err, "out %v\n, err %v", out, err) return validator } From 6f7cabf779152ab452bec3e7d10291383b6437e5 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 14:59:03 -0700 Subject: [PATCH 122/548] fix tests/process.go lint --- tests/process.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/process.go b/tests/process.go index fcc6e3e0ea..d2459a0b5b 100644 --- a/tests/process.go +++ b/tests/process.go @@ -8,6 +8,7 @@ import ( "time" ) +// execution process type Process struct { ExecPath string Args []string @@ -94,16 +95,16 @@ func StartProcess(dir string, name string, args []string, outFile, errFile io.Wr return proc, nil } +// stop the process func (proc *Process) Stop(kill bool) error { if kill { // fmt.Printf("Killing process %v\n", proc.Cmd.Process) return proc.Cmd.Process.Kill() - } else { - // fmt.Printf("Stopping process %v\n", proc.Cmd.Process) - return proc.Cmd.Process.Signal(os.Interrupt) } + return proc.Cmd.Process.Signal(os.Interrupt) } +// wait for the process func (proc *Process) Wait() { <-proc.WaitCh } From 4150fe5ec955da3d7eeb0fe46ee31ab01de281de Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 15:02:24 -0700 Subject: [PATCH 123/548] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a0bed5b18..037cf63078 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ IMPROVEMENTS * auth module uses go-wire codec instead of 'encoding/json' FIXES +* [cli] fixed cli-bash tests +* [ci] added cli-bash tests ## 0.18.1 From 89df36e1d4d30813c3f7f9808c3be4a628b182dd Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 15:39:42 -0700 Subject: [PATCH 124/548] ... --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c8dc0b20ba..5545ae4d3f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,4 +1,4 @@ -version: 2 +tersion: 2 defaults: &defaults working_directory: /go/src/github.com/cosmos/cosmos-sdk @@ -154,10 +154,10 @@ workflows: - lint: requires: - setup_dependencies - - test_unit: + - test_cli: requires: - setup_dependencies - - test_cli: + - test_unit: requires: - setup_dependencies - test_cover: From a4e1e497cd6e30117182768a0f05701cb24e9a33 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 15:49:18 -0700 Subject: [PATCH 125/548] cwgoes comments --- client/keys/utils.go | 2 -- cmd/gaia/cli_test/cli_test.go | 41 ++++++++++++++++------------------- 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/client/keys/utils.go b/client/keys/utils.go index f9990bf16d..34e2ebcf37 100644 --- a/client/keys/utils.go +++ b/client/keys/utils.go @@ -76,7 +76,6 @@ func printInfo(info keys.Info) { printKeyOutput(ko) case "json": out, err := MarshalJSON(ko) - //out, err := json.MarshalIndent(kos, "", "\t") if err != nil { panic(err) } @@ -94,7 +93,6 @@ func printInfos(infos []keys.Info) { } case "json": out, err := MarshalJSON(kos) - //out, err := json.MarshalIndent(kos, "", "\t") if err != nil { panic(err) } diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 1e47572b14..f506a0d870 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -101,43 +101,40 @@ func TestGaiaCLICreateValidator(t *testing.T) { fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooCech, flags)) assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak")) - //valPrivkey := crypto.GenPrivKeyEd25519() - //valAddr := sdk.Address((valPrivkey.PubKey().Address())) - //bechVal, err := sdk.Bech32CosmosifyVal(valAddr) - // create validator cvStr := fmt.Sprintf("gaiacli create-validator %v", flags) cvStr += fmt.Sprintf(" --name=%v", "bar") cvStr += fmt.Sprintf(" --address-validator=%v", barCech) cvStr += fmt.Sprintf(" --pubkey=%v", barCeshPubKey) - cvStr += fmt.Sprintf(" --amount=%v", "1steak") + cvStr += fmt.Sprintf(" --amount=%v", "2steak") cvStr += fmt.Sprintf(" --moniker=%v", "bar-vally") executeWrite(t, cvStr, pass) time.Sleep(time.Second * 3) // waiting for some blocks to pass barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) - require.Equal(t, int64(9), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) + require.Equal(t, int64(8), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) - validator := executeGetValidator(t, fmt.Sprintf("gaiacli validator --output=json %v %v", barCech, flags)) + validator := executeGetValidator(t, fmt.Sprintf("gaiacli validator %v --output=json %v", barCech, flags)) assert.Equal(t, validator.Owner, barAddr) - assert.Equal(t, "1/1", validator.PoolShares.Amount.String()) + assert.Equal(t, "2/1", validator.PoolShares.Amount.String()) - // TODO timeout issues if not connected to the internet // unbond a single share - //unbondStr := fmt.Sprintf("gaiacli unbond %v", flags) - //unbondStr += fmt.Sprintf(" --name=%v", "bar") - //unbondStr += fmt.Sprintf(" --address-validator=%v", barCech) - //unbondStr += fmt.Sprintf(" --address-delegator=%v", barCech) - //unbondStr += fmt.Sprintf(" --shares=%v", "1") - //unbondStr += fmt.Sprintf(" --sequence=%v", "1") - //t.Log(fmt.Sprintf("debug unbondStr: %v\n", unbondStr)) - //executeWrite(t, unbondStr, pass) - //time.Sleep(time.Second * 3) // waiting for some blocks to pass - //barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) - //assert.Equal(t, int64(99998), barAcc.GetCoins().AmountOf("steak")) - //validator = executeGetValidator(t, fmt.Sprintf("gaiacli validator %v --address-validator=%v", flags, barCech)) - //assert.Equal(t, int64(2), validator.BondedShares.Evaluate()) + unbondStr := fmt.Sprintf("gaiacli unbond %v", flags) + unbondStr += fmt.Sprintf(" --name=%v", "bar") + unbondStr += fmt.Sprintf(" --address-validator=%v", barCech) + unbondStr += fmt.Sprintf(" --address-delegator=%v", barCech) + unbondStr += fmt.Sprintf(" --shares=%v", "1") + unbondStr += fmt.Sprintf(" --sequence=%v", "1") + t.Log(fmt.Sprintf("debug unbondStr: %v\n", unbondStr)) + + executeWrite(t, unbondStr, pass) + time.Sleep(time.Second * 3) // waiting for some blocks to pass + + barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) + require.Equal(t, int64(9), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) + validator = executeGetValidator(t, fmt.Sprintf("gaiacli validator %v --output=json %v", barCech, flags)) + assert.Equal(t, "1/1", validator.PoolShares.Amount.String()) } //___________________________________________________________________________________ From 5515b60b0a1f64fc8fd414d2366a45c159353442 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 18:46:25 -0700 Subject: [PATCH 126/548] better tooling for cli, couple lsd fixes --- client/lcd/lcd_test.go | 10 ++++-- cmd/gaia/cli_test/cli_test.go | 13 +++++--- server/start_test.go | 8 +++-- server/test_helpers.go | 13 +++++--- tests/tests.go | 7 ++-- tests/util.go | 61 +++++++++++++++++------------------ 6 files changed, 63 insertions(+), 49 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 8c6530dec2..7a9cdbc254 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -34,6 +34,7 @@ import ( client "github.com/cosmos/cosmos-sdk/client" keys "github.com/cosmos/cosmos-sdk/client/keys" gapp "github.com/cosmos/cosmos-sdk/cmd/gaia/app" + "github.com/cosmos/cosmos-sdk/server" tests "github.com/cosmos/cosmos-sdk/tests" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" @@ -51,7 +52,7 @@ var ( // XXX bad globals name = "test" password = "0123456789" - port string // XXX: but it's the int ... + port string seed string sendAddr string ) @@ -456,8 +457,11 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { genDoc.AppStateJSON = appState // LCD listen address - port = fmt.Sprintf("%d", 17377) // XXX - listenAddr := fmt.Sprintf("tcp://localhost:%s", port) // XXX + var listenAddr string + listenAddr, port, err = server.FreeTCPAddr() + if err != nil { + return nil, nil, err + } // XXX: need to set this so LCD knows the tendermint node address! viper.Set(client.FlagNode, config.RPC.ListenAddress) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index f506a0d870..9c42d5cf2f 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -21,6 +21,7 @@ import ( ) func TestGaiaCLISend(t *testing.T) { + fmt.Println("wackydebugoutput TestGaiaCLISend 0") tests.ExecuteT(t, "gaiad unsafe_reset_all") pass := "1234567890" @@ -30,13 +31,14 @@ func TestGaiaCLISend(t *testing.T) { executeWrite(t, "gaiacli keys add bar", pass) // get a free port, also setup some common flags - servAddr := server.FreeTCPAddr(t) + servAddr, port, err := server.FreeTCPAddr() + require.NoError(t, err) flags := fmt.Sprintf("--node=%v --chain-id=%v", servAddr, chainID) // start gaiad server proc := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr)) defer proc.Stop(false) - time.Sleep(time.Second * 5) // Wait for RPC server to start. + tests.WaitForStart(port) fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json") fooCech, err := sdk.Bech32CosmosifyAcc(fooAddr) @@ -49,6 +51,8 @@ func TestGaiaCLISend(t *testing.T) { assert.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak")) executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barCech), pass) + fmt.Println("wackydebugoutput TestGaiaCLISend 1") + fmt.Println("wackydebugoutput TestGaiaCLISend 2") time.Sleep(time.Second * 2) // waiting for some blocks to pass barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) @@ -76,13 +80,14 @@ func TestGaiaCLICreateValidator(t *testing.T) { executeWrite(t, "gaiacli keys add bar", pass) // get a free port, also setup some common flags - servAddr := server.FreeTCPAddr(t) + servAddr, port, err := server.FreeTCPAddr() + require.NoError(t, err) flags := fmt.Sprintf("--node=%v --chain-id=%v", servAddr, chainID) // start gaiad server proc := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr)) defer proc.Stop(false) - time.Sleep(time.Second * 5) // Wait for RPC server to start. + tests.WaitForStart(port) fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json") fooCech, err := sdk.Bech32CosmosifyAcc(fooAddr) diff --git a/server/start_test.go b/server/start_test.go index 3bf2eac7e4..454f2d4922 100644 --- a/server/start_test.go +++ b/server/start_test.go @@ -37,7 +37,9 @@ func TestStartStandAlone(t *testing.T) { app, err := mock.NewApp(home, logger) require.Nil(t, err) - svr, err := server.NewServer(FreeTCPAddr(t), "socket", app) + svrAddr, _, err := FreeTCPAddr() + require.Nil(t, err) + svr, err := server.NewServer(svrAddr, "socket", app) require.Nil(t, err, "Error creating listener") svr.SetLogger(logger.With("module", "abci-server")) svr.Start() @@ -69,7 +71,9 @@ func TestStartWithTendermint(t *testing.T) { // set up app and start up viper.Set(flagWithTendermint, true) startCmd := StartCmd(ctx, mock.NewApp) - startCmd.Flags().Set(flagAddress, FreeTCPAddr(t)) // set to a new free address + svrAddr, _, err := FreeTCPAddr() + require.NoError(t, err) + startCmd.Flags().Set(flagAddress, svrAddr) // set to a new free address timeout := time.Duration(5) * time.Second close(RunOrTimeout(startCmd, timeout, t)) diff --git a/server/test_helpers.go b/server/test_helpers.go index 382c778787..b1050bc6f3 100644 --- a/server/test_helpers.go +++ b/server/test_helpers.go @@ -16,14 +16,17 @@ import ( // Get a free address for a test tendermint server // protocol is either tcp, http, etc -func FreeTCPAddr(t *testing.T) string { +func FreeTCPAddr() (addr, port string, err error) { l, err := net.Listen("tcp", "0.0.0.0:0") defer l.Close() - require.Nil(t, err) + if err != nil { + return "", "", err + } - port := l.Addr().(*net.TCPAddr).Port - addr := fmt.Sprintf("tcp://0.0.0.0:%d", port) - return addr + portI := l.Addr().(*net.TCPAddr).Port + port = fmt.Sprintf("%d", portI) + addr = fmt.Sprintf("tcp://0.0.0.0:%s", port) + return } // setupViper creates a homedir to run inside, diff --git a/tests/tests.go b/tests/tests.go index 845ac69259..b4435659b3 100644 --- a/tests/tests.go +++ b/tests/tests.go @@ -9,7 +9,6 @@ import ( "path" "path/filepath" "strings" - //"strings" "testing" "time" @@ -239,7 +238,9 @@ func StartNodeServerForTest(t *testing.T, home string) *exec.Cmd { // expects TestInitBaseCoin to have been run func StartLCDServerForTest(t *testing.T, home, chainID string) (cmd *exec.Cmd, port string) { cmdName := whereIsBasecli() - port = strings.Split(server.FreeTCPAddr(t), ":")[2] + var err error + _, port, err = server.FreeTCPAddr() + require.NoError(t, err) cmdArgs := []string{ "rest-server", "--home", @@ -252,7 +253,7 @@ func StartLCDServerForTest(t *testing.T, home, chainID string) (cmd *exec.Cmd, p cmd = exec.Command(cmdName, cmdArgs...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr - err := cmd.Start() + err = cmd.Start() require.Nil(t, err) time.Sleep(time.Second * 2) // TODO: LOL return cmd, port diff --git a/tests/util.go b/tests/util.go index a6f026f242..292cbab060 100644 --- a/tests/util.go +++ b/tests/util.go @@ -11,16 +11,22 @@ import ( rpcclient "github.com/tendermint/tendermint/rpc/lib/client" ) -// TODO: these functions just print to Stdout. -// consider using the logger. - // Uses localhost func WaitForHeight(height int64, port string) { for { - var resultBlock ctypes.ResultBlock - url := fmt.Sprintf("http://localhost:%v%v", port, "/blocks/latest") - res, err := http.Get(url) + url := fmt.Sprintf("http://localhost:%v/blocks/latest", port) + + // get url, try a few times + var res *http.Response + var err error + for i := 0; i < 5; i++ { + res, err = http.Get(url) + if err == nil { + break + } + time.Sleep(time.Second) + } if err != nil { panic(err) } @@ -31,6 +37,7 @@ func WaitForHeight(height int64, port string) { } res.Body.Close() + var resultBlock ctypes.ResultBlock err = cdc.UnmarshalJSON([]byte(body), &resultBlock) if err != nil { fmt.Println("RES", res) @@ -45,45 +52,35 @@ func WaitForHeight(height int64, port string) { } } -// wait for 2 blocks. -// uses localhost +// wait for tendermint to start func WaitForStart(port string) { - waitHeight := int64(2) - for { + var err error + for i := 0; i < 5; i++ { time.Sleep(time.Second) - url := fmt.Sprintf("http://localhost:%v%v", port, "/blocks/latest") - res, err := http.Get(url) - if err != nil { - panic(err) + url := fmt.Sprintf("http://localhost:%v/blocks/latest", port) + + // get url, try a few times + var res *http.Response + res, err = http.Get(url) + if err == nil || res == nil { + continue } // waiting for server to start ... if res.StatusCode != http.StatusOK { res.Body.Close() - continue - } - - body, err := ioutil.ReadAll(res.Body) - if err != nil { - panic(err) - } - res.Body.Close() - - resultBlock := new(ctypes.ResultBlock) - err = cdc.UnmarshalJSON([]byte(body), &resultBlock) - if err != nil { - fmt.Println("RES", res) - fmt.Println("BODY", string(body)) - panic(err) - } - - if resultBlock.Block.Height >= waitHeight { return } } + if err != nil { + panic(err) + } } +// TODO: these functions just print to Stdout. +// consider using the logger. + // Wait for the RPC server to respond to /status func WaitForRPC(laddr string) { fmt.Println("LADDR", laddr) From ba44bf7c81c1988cdaab10f7cae73758d7d1ef7e Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 18:54:14 -0700 Subject: [PATCH 127/548] rm debug output --- cmd/gaia/cli_test/cli_test.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 9c42d5cf2f..8fa0ad71ec 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -21,7 +21,6 @@ import ( ) func TestGaiaCLISend(t *testing.T) { - fmt.Println("wackydebugoutput TestGaiaCLISend 0") tests.ExecuteT(t, "gaiad unsafe_reset_all") pass := "1234567890" @@ -51,8 +50,6 @@ func TestGaiaCLISend(t *testing.T) { assert.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak")) executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barCech), pass) - fmt.Println("wackydebugoutput TestGaiaCLISend 1") - fmt.Println("wackydebugoutput TestGaiaCLISend 2") time.Sleep(time.Second * 2) // waiting for some blocks to pass barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) From 7de746127e024433d8d9b4d836201ed6b36ea78c Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 1 Jun 2018 04:03:40 +0200 Subject: [PATCH 128/548] Fix minor typo --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5545ae4d3f..ceb9e78a8d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,4 +1,4 @@ -tersion: 2 +version: 2 defaults: &defaults working_directory: /go/src/github.com/cosmos/cosmos-sdk From cde91bd229440142382dae1da1efd05738c795a6 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 1 Jun 2018 03:02:10 +0200 Subject: [PATCH 129/548] gaiacli unrevoke --- cmd/gaia/cmd/gaiacli/main.go | 2 ++ x/slashing/client/cli/flags.go | 6 ++++ x/slashing/client/cli/query.go | 57 +++++++++++++++++++++++++++++++++ x/slashing/client/cli/tx.go | 42 ++++++++++++++++++++++++ x/slashing/signing_info.go | 26 +++++++++------ x/slashing/signing_info_test.go | 2 +- 6 files changed, 125 insertions(+), 10 deletions(-) create mode 100644 x/slashing/client/cli/flags.go create mode 100644 x/slashing/client/cli/query.go create mode 100644 x/slashing/client/cli/tx.go diff --git a/cmd/gaia/cmd/gaiacli/main.go b/cmd/gaia/cmd/gaiacli/main.go index 51dab68e28..32df02ce5e 100644 --- a/cmd/gaia/cmd/gaiacli/main.go +++ b/cmd/gaia/cmd/gaiacli/main.go @@ -14,6 +14,7 @@ import ( authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" bankcmd "github.com/cosmos/cosmos-sdk/x/bank/client/cli" ibccmd "github.com/cosmos/cosmos-sdk/x/ibc/client/cli" + slashingcmd "github.com/cosmos/cosmos-sdk/x/slashing/client/cli" stakecmd "github.com/cosmos/cosmos-sdk/x/stake/client/cli" "github.com/cosmos/cosmos-sdk/cmd/gaia/app" @@ -59,6 +60,7 @@ func main() { stakecmd.GetCmdEditValidator(cdc), stakecmd.GetCmdDelegate(cdc), stakecmd.GetCmdUnbond(cdc), + slashingcmd.GetCmdUnrevoke(cdc), )...) // add proxy, version and key info diff --git a/x/slashing/client/cli/flags.go b/x/slashing/client/cli/flags.go new file mode 100644 index 0000000000..43f8fa90a2 --- /dev/null +++ b/x/slashing/client/cli/flags.go @@ -0,0 +1,6 @@ +package cli + +// nolint +const ( + FlagAddressValidator = "address-validator" +) diff --git a/x/slashing/client/cli/query.go b/x/slashing/client/cli/query.go new file mode 100644 index 0000000000..968e626a99 --- /dev/null +++ b/x/slashing/client/cli/query.go @@ -0,0 +1,57 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" + "github.com/spf13/viper" + "github.com/tendermint/tmlibs/cli" + + "github.com/cosmos/cosmos-sdk/client/context" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" // XXX fix + "github.com/cosmos/cosmos-sdk/x/slashing" +) + +// get the command to query signing info +func GetCmdQuerySigningInfo(storeName string, cdc *wire.Codec) *cobra.Command { + cmd := &cobra.Command{ + Use: "signing_info [owner-addr]", + Short: "Query a validator's signing information", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + + addr, err := sdk.GetAccAddressBech32Cosmos(args[0]) + if err != nil { + return err + } + key := slashing.GetValidatorSigningInfoKey(addr) + ctx := context.NewCoreContextFromViper() + res, err := ctx.Query(key, storeName) + if err != nil { + return err + } + signingInfo := new(slashing.ValidatorSigningInfo) + cdc.MustUnmarshalBinary(res, signingInfo) + + switch viper.Get(cli.OutputFlag) { + + case "text": + human := signingInfo.HumanReadableString() + fmt.Println(human) + + case "json": + // parse out the signing info + output, err := wire.MarshalJSONIndent(cdc, signingInfo) + if err != nil { + return err + } + fmt.Println(string(output)) + } + + return nil + }, + } + + return cmd +} diff --git a/x/slashing/client/cli/tx.go b/x/slashing/client/cli/tx.go new file mode 100644 index 0000000000..13a5cb666f --- /dev/null +++ b/x/slashing/client/cli/tx.go @@ -0,0 +1,42 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client/context" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" + authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" + "github.com/cosmos/cosmos-sdk/x/slashing" +) + +// create unrevoke command +func GetCmdUnrevoke(cdc *wire.Codec) *cobra.Command { + cmd := &cobra.Command{ + Use: "unrevoke", + Args: cobra.ExactArgs(1), + Short: "unrevoke validator previously revoked for downtime", + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) + + validatorAddr, err := sdk.GetAccAddressBech32Cosmos(args[0]) + if err != nil { + return err + } + + msg := slashing.NewMsgUnrevoke(validatorAddr) + + // build and sign the transaction, then broadcast to Tendermint + res, err := ctx.EnsureSignBuildBroadcast(ctx.FromAddressName, msg, cdc) + if err != nil { + return err + } + + fmt.Printf("Committed at block %d. Hash: %s\n", res.Height, res.Hash.String()) + return nil + }, + } + return cmd +} diff --git a/x/slashing/signing_info.go b/x/slashing/signing_info.go index 05285b6809..a2df0505a7 100644 --- a/x/slashing/signing_info.go +++ b/x/slashing/signing_info.go @@ -2,14 +2,15 @@ package slashing import ( "encoding/binary" + "fmt" sdk "github.com/cosmos/cosmos-sdk/types" ) // Stored by *validator* address (not owner address) -func (k Keeper) getValidatorSigningInfo(ctx sdk.Context, address sdk.Address) (info validatorSigningInfo, found bool) { +func (k Keeper) getValidatorSigningInfo(ctx sdk.Context, address sdk.Address) (info ValidatorSigningInfo, found bool) { store := ctx.KVStore(k.storeKey) - bz := store.Get(validatorSigningInfoKey(address)) + bz := store.Get(GetValidatorSigningInfoKey(address)) if bz == nil { found = false return @@ -20,16 +21,16 @@ func (k Keeper) getValidatorSigningInfo(ctx sdk.Context, address sdk.Address) (i } // Stored by *validator* address (not owner address) -func (k Keeper) setValidatorSigningInfo(ctx sdk.Context, address sdk.Address, info validatorSigningInfo) { +func (k Keeper) setValidatorSigningInfo(ctx sdk.Context, address sdk.Address, info ValidatorSigningInfo) { store := ctx.KVStore(k.storeKey) bz := k.cdc.MustMarshalBinary(info) - store.Set(validatorSigningInfoKey(address), bz) + store.Set(GetValidatorSigningInfoKey(address), bz) } // Stored by *validator* address (not owner address) func (k Keeper) getValidatorSigningBitArray(ctx sdk.Context, address sdk.Address, index int64) (signed bool) { store := ctx.KVStore(k.storeKey) - bz := store.Get(validatorSigningBitArrayKey(address, index)) + bz := store.Get(GetValidatorSigningBitArrayKey(address, index)) if bz == nil { // lazy: treat empty key as unsigned signed = false @@ -43,23 +44,30 @@ func (k Keeper) getValidatorSigningBitArray(ctx sdk.Context, address sdk.Address func (k Keeper) setValidatorSigningBitArray(ctx sdk.Context, address sdk.Address, index int64, signed bool) { store := ctx.KVStore(k.storeKey) bz := k.cdc.MustMarshalBinary(signed) - store.Set(validatorSigningBitArrayKey(address, index), bz) + store.Set(GetValidatorSigningBitArrayKey(address, index), bz) } -type validatorSigningInfo struct { +// Signing info for a validator +type ValidatorSigningInfo struct { StartHeight int64 `json:"start_height"` // height at which validator was first a candidate OR was unrevoked IndexOffset int64 `json:"index_offset"` // index offset into signed block bit array JailedUntil int64 `json:"jailed_until"` // timestamp validator cannot be unrevoked until SignedBlocksCounter int64 `json:"signed_blocks_counter"` // signed blocks counter (to avoid scanning the array every time) } +// Return human readable signing info +func (i ValidatorSigningInfo) HumanReadableString() string { + return fmt.Sprintf("Start height: %d, index offset: %d, jailed until: %d, signed blocks counter: %d", + i.StartHeight, i.IndexOffset, i.JailedUntil, i.SignedBlocksCounter) +} + // Stored by *validator* address (not owner address) -func validatorSigningInfoKey(v sdk.Address) []byte { +func GetValidatorSigningInfoKey(v sdk.Address) []byte { return append([]byte{0x01}, v.Bytes()...) } // Stored by *validator* address (not owner address) -func validatorSigningBitArrayKey(v sdk.Address, i int64) []byte { +func GetValidatorSigningBitArrayKey(v sdk.Address, i int64) []byte { b := make([]byte, 8) binary.LittleEndian.PutUint64(b, uint64(i)) return append([]byte{0x02}, append(v.Bytes(), b...)...) diff --git a/x/slashing/signing_info_test.go b/x/slashing/signing_info_test.go index 8000d67450..26113e7153 100644 --- a/x/slashing/signing_info_test.go +++ b/x/slashing/signing_info_test.go @@ -10,7 +10,7 @@ func TestGetSetValidatorSigningInfo(t *testing.T) { ctx, _, _, keeper := createTestInput(t) info, found := keeper.getValidatorSigningInfo(ctx, addrs[0]) require.False(t, found) - newInfo := validatorSigningInfo{ + newInfo := ValidatorSigningInfo{ StartHeight: int64(4), IndexOffset: int64(3), JailedUntil: int64(2), From 9fa4a55012a4717ce7bbc412361a1cb4183b7f0d Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 1 Jun 2018 04:25:45 +0200 Subject: [PATCH 130/548] Add 'gaiacli signing_info' --- cmd/gaia/cmd/gaiacli/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/gaia/cmd/gaiacli/main.go b/cmd/gaia/cmd/gaiacli/main.go index 32df02ce5e..08663f6215 100644 --- a/cmd/gaia/cmd/gaiacli/main.go +++ b/cmd/gaia/cmd/gaiacli/main.go @@ -50,6 +50,7 @@ func main() { stakecmd.GetCmdQueryValidators("stake", cdc), stakecmd.GetCmdQueryDelegation("stake", cdc), stakecmd.GetCmdQueryDelegations("stake", cdc), + slashingcmd.GetCmdQuerySigningInfo("slashing", cdc), )...) rootCmd.AddCommand( client.PostCommands( From c7a9b53fae0808b50c0165dba7a71ca9fa51c4f7 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 1 Jun 2018 04:30:45 +0200 Subject: [PATCH 131/548] Use valpk.Address() --- x/slashing/client/cli/query.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/slashing/client/cli/query.go b/x/slashing/client/cli/query.go index 968e626a99..3354d62c14 100644 --- a/x/slashing/client/cli/query.go +++ b/x/slashing/client/cli/query.go @@ -21,11 +21,11 @@ func GetCmdQuerySigningInfo(storeName string, cdc *wire.Codec) *cobra.Command { Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - addr, err := sdk.GetAccAddressBech32Cosmos(args[0]) + pk, err := sdk.GetValPubKeyBech32Cosmos(args[0]) if err != nil { return err } - key := slashing.GetValidatorSigningInfoKey(addr) + key := slashing.GetValidatorSigningInfoKey(pk.Address()) ctx := context.NewCoreContextFromViper() res, err := ctx.Query(key, storeName) if err != nil { From 7ff6eebb32098d40d53744f147532254fa72bdd5 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 1 Jun 2018 04:54:17 +0200 Subject: [PATCH 132/548] Fix command documentation --- x/slashing/client/cli/query.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/slashing/client/cli/query.go b/x/slashing/client/cli/query.go index 3354d62c14..42c02cab03 100644 --- a/x/slashing/client/cli/query.go +++ b/x/slashing/client/cli/query.go @@ -16,7 +16,7 @@ import ( // get the command to query signing info func GetCmdQuerySigningInfo(storeName string, cdc *wire.Codec) *cobra.Command { cmd := &cobra.Command{ - Use: "signing_info [owner-addr]", + Use: "signing_info [validator-pubkey]", Short: "Query a validator's signing information", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { From 083ca8234bd6717130da5d68b97ac73f1c606917 Mon Sep 17 00:00:00 2001 From: Jeremiah Andrews Date: Mon, 28 May 2018 15:00:37 -0700 Subject: [PATCH 133/548] Refactored gaiacli and gaiad commands into subcommands --- client/rpc/block.go | 2 +- client/rpc/root.go | 2 -- client/rpc/validators.go | 2 +- cmd/gaia/cmd/gaiacli/main.go | 60 ++++++++++++++++++++++++++++++------ cmd/gaia/cmd/gaiad/main.go | 1 + server/util.go | 19 ++++++++++-- 6 files changed, 70 insertions(+), 16 deletions(-) diff --git a/client/rpc/block.go b/client/rpc/block.go index 3547270197..36327a722a 100644 --- a/client/rpc/block.go +++ b/client/rpc/block.go @@ -16,7 +16,7 @@ const ( flagSelect = "select" ) -func blockCommand() *cobra.Command { +func BlockCommand() *cobra.Command { cmd := &cobra.Command{ Use: "block [height]", Short: "Get verified data for a the block at given height", diff --git a/client/rpc/root.go b/client/rpc/root.go index f779bd7292..e89972c3c7 100644 --- a/client/rpc/root.go +++ b/client/rpc/root.go @@ -26,8 +26,6 @@ func AddCommands(cmd *cobra.Command) { cmd.AddCommand( initClientCommand(), statusCommand(), - blockCommand(), - validatorCommand(), ) } diff --git a/client/rpc/validators.go b/client/rpc/validators.go index 892d131ac3..bfd8a9582b 100644 --- a/client/rpc/validators.go +++ b/client/rpc/validators.go @@ -14,7 +14,7 @@ import ( // TODO these next two functions feel kinda hacky based on their placement -func validatorCommand() *cobra.Command { +func ValidatorCommand() *cobra.Command { cmd := &cobra.Command{ Use: "validatorset [height]", Short: "Get the full validator set at given height", diff --git a/cmd/gaia/cmd/gaiacli/main.go b/cmd/gaia/cmd/gaiacli/main.go index 51dab68e28..4f82d58ad3 100644 --- a/cmd/gaia/cmd/gaiacli/main.go +++ b/cmd/gaia/cmd/gaiacli/main.go @@ -35,31 +35,73 @@ func main() { // the below functions and eliminate global vars, like we do // with the cdc - // add standard rpc, and tx commands + // add standard rpc commands rpc.AddCommands(rootCmd) rootCmd.AddCommand(client.LineBreak) - tx.AddCommands(rootCmd, cdc) - rootCmd.AddCommand(client.LineBreak) - // add query/post commands (custom to binary) + //Add state commands + stateCmd := &cobra.Command{ + Use: "state", + Short: "State querying subcommands (validators, blocks, transactions)", + } + stateCmd.AddCommand( + rpc.BlockCommand(), + rpc.ValidatorCommand(), + ) + tx.AddCommands(stateCmd, cdc) rootCmd.AddCommand( + stateCmd, + client.LineBreak, + ) + + //Add stake commands + stakeCmd := &cobra.Command{ + Use: "stake", + Short: "Stake and validation subcommands", + } + stakeCmd.AddCommand( client.GetCommands( - authcmd.GetAccountCmd("acc", cdc, authcmd.GetAccountDecoder(cdc)), stakecmd.GetCmdQueryValidator("stake", cdc), stakecmd.GetCmdQueryValidators("stake", cdc), stakecmd.GetCmdQueryDelegation("stake", cdc), stakecmd.GetCmdQueryDelegations("stake", cdc), )...) - rootCmd.AddCommand( + stakeCmd.AddCommand( client.PostCommands( - bankcmd.SendTxCmd(cdc), - ibccmd.IBCTransferCmd(cdc), - ibccmd.IBCRelayCmd(cdc), stakecmd.GetCmdCreateValidator(cdc), stakecmd.GetCmdEditValidator(cdc), stakecmd.GetCmdDelegate(cdc), stakecmd.GetCmdUnbond(cdc), )...) + rootCmd.AddCommand( + stakeCmd, + client.LineBreak, + ) + + //Add IBC commands + ibcCmd := &cobra.Command{ + Use: "ibc", + Short: "Inter-Blockchain Communication subcommands", + } + ibcCmd.AddCommand( + client.PostCommands( + ibccmd.IBCTransferCmd(cdc), + ibccmd.IBCRelayCmd(cdc), + )...) + rootCmd.AddCommand( + ibcCmd, + client.LineBreak, + ) + + //Add auth and bank commands + rootCmd.AddCommand( + client.GetCommands( + authcmd.GetAccountCmd("acc", cdc, authcmd.GetAccountDecoder(cdc)), + )...) + rootCmd.AddCommand( + client.PostCommands( + bankcmd.SendTxCmd(cdc), + )...) // add proxy, version and key info rootCmd.AddCommand( diff --git a/cmd/gaia/cmd/gaiad/main.go b/cmd/gaia/cmd/gaiad/main.go index f64498d850..30cb276ee1 100644 --- a/cmd/gaia/cmd/gaiad/main.go +++ b/cmd/gaia/cmd/gaiad/main.go @@ -17,6 +17,7 @@ import ( func main() { cdc := app.MakeCodec() ctx := server.NewDefaultContext() + cobra.EnableCommandSorting = false rootCmd := &cobra.Command{ Use: "gaiad", Short: "Gaia Daemon (server)", diff --git a/server/util.go b/server/util.go index f44cc2d728..da43dabbb1 100644 --- a/server/util.go +++ b/server/util.go @@ -9,6 +9,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/wire" tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" @@ -72,13 +73,25 @@ func AddCommands( rootCmd.PersistentFlags().String("log_level", ctx.Config.LogLevel, "Log level") - rootCmd.AddCommand( - InitCmd(ctx, cdc, appInit), - StartCmd(ctx, appCreator), + tendCmd := &cobra.Command{ + Use: "tendermint", + Short: "Tendermint subcommands", + } + + tendCmd.AddCommand( UnsafeResetAllCmd(ctx), ShowNodeIDCmd(ctx), ShowValidatorCmd(ctx), + ) + + rootCmd.AddCommand( + InitCmd(ctx, cdc, appInit), + StartCmd(ctx, appCreator), + client.LineBreak, + tendCmd, + client.LineBreak, ExportCmd(ctx, cdc, appExport), + client.LineBreak, version.VersionCmd, ) } From a032386e876cb652a27b5b5563afcea16f5b6e0f Mon Sep 17 00:00:00 2001 From: Jeremiah Andrews Date: Mon, 28 May 2018 15:50:07 -0700 Subject: [PATCH 134/548] Added comments to newly exported functions --- client/rpc/block.go | 1 + client/rpc/validators.go | 1 + 2 files changed, 2 insertions(+) diff --git a/client/rpc/block.go b/client/rpc/block.go index 36327a722a..693298bb86 100644 --- a/client/rpc/block.go +++ b/client/rpc/block.go @@ -16,6 +16,7 @@ const ( flagSelect = "select" ) +//BlockCommand returns the verified block data for a given heights func BlockCommand() *cobra.Command { cmd := &cobra.Command{ Use: "block [height]", diff --git a/client/rpc/validators.go b/client/rpc/validators.go index bfd8a9582b..e05d1c4348 100644 --- a/client/rpc/validators.go +++ b/client/rpc/validators.go @@ -14,6 +14,7 @@ import ( // TODO these next two functions feel kinda hacky based on their placement +//ValidatorCommand returns the validator set for a given height func ValidatorCommand() *cobra.Command { cmd := &cobra.Command{ Use: "validatorset [height]", From 744f78573ea90873a8f24cda9c0cb1f55049a81e Mon Sep 17 00:00:00 2001 From: Jeremiah Andrews Date: Thu, 31 May 2018 18:38:15 -0700 Subject: [PATCH 135/548] small fixes --- client/rpc/validators.go | 2 +- cmd/gaia/cmd/gaiacli/main.go | 43 +++++++++++++++++++----------------- server/util.go | 6 ++--- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/client/rpc/validators.go b/client/rpc/validators.go index e05d1c4348..27b7fce99e 100644 --- a/client/rpc/validators.go +++ b/client/rpc/validators.go @@ -18,7 +18,7 @@ import ( func ValidatorCommand() *cobra.Command { cmd := &cobra.Command{ Use: "validatorset [height]", - Short: "Get the full validator set at given height", + Short: "Get the full tendermint validator set at given height", Args: cobra.MaximumNArgs(1), RunE: printValidators, } diff --git a/cmd/gaia/cmd/gaiacli/main.go b/cmd/gaia/cmd/gaiacli/main.go index 4f82d58ad3..136260c760 100644 --- a/cmd/gaia/cmd/gaiacli/main.go +++ b/cmd/gaia/cmd/gaiacli/main.go @@ -37,7 +37,6 @@ func main() { // add standard rpc commands rpc.AddCommands(rootCmd) - rootCmd.AddCommand(client.LineBreak) //Add state commands stateCmd := &cobra.Command{ @@ -49,8 +48,30 @@ func main() { rpc.ValidatorCommand(), ) tx.AddCommands(stateCmd, cdc) - rootCmd.AddCommand( + + //Add IBC commands + ibcCmd := &cobra.Command{ + Use: "ibc", + Short: "Inter-Blockchain Communication subcommands", + } + ibcCmd.AddCommand( + client.PostCommands( + ibccmd.IBCTransferCmd(cdc), + ibccmd.IBCRelayCmd(cdc), + )...) + + advancedCmd := &cobra.Command{ + Use: "advanced", + Short: "Advanced subcommands", + } + + advancedCmd.AddCommand( stateCmd, + ibcCmd, + lcd.ServeCommand(cdc), + ) + rootCmd.AddCommand( + advancedCmd, client.LineBreak, ) @@ -75,22 +96,6 @@ func main() { )...) rootCmd.AddCommand( stakeCmd, - client.LineBreak, - ) - - //Add IBC commands - ibcCmd := &cobra.Command{ - Use: "ibc", - Short: "Inter-Blockchain Communication subcommands", - } - ibcCmd.AddCommand( - client.PostCommands( - ibccmd.IBCTransferCmd(cdc), - ibccmd.IBCRelayCmd(cdc), - )...) - rootCmd.AddCommand( - ibcCmd, - client.LineBreak, ) //Add auth and bank commands @@ -105,8 +110,6 @@ func main() { // add proxy, version and key info rootCmd.AddCommand( - client.LineBreak, - lcd.ServeCommand(cdc), keys.Commands(), client.LineBreak, version.VersionCmd, diff --git a/server/util.go b/server/util.go index da43dabbb1..93dc73469f 100644 --- a/server/util.go +++ b/server/util.go @@ -73,12 +73,12 @@ func AddCommands( rootCmd.PersistentFlags().String("log_level", ctx.Config.LogLevel, "Log level") - tendCmd := &cobra.Command{ + tendermintCmd := &cobra.Command{ Use: "tendermint", Short: "Tendermint subcommands", } - tendCmd.AddCommand( + tendermintCmd.AddCommand( UnsafeResetAllCmd(ctx), ShowNodeIDCmd(ctx), ShowValidatorCmd(ctx), @@ -88,7 +88,7 @@ func AddCommands( InitCmd(ctx, cdc, appInit), StartCmd(ctx, appCreator), client.LineBreak, - tendCmd, + tendermintCmd, client.LineBreak, ExportCmd(ctx, cdc, appExport), client.LineBreak, From aa41cefb1ee73dc7aede05879fbb3698d6a07c33 Mon Sep 17 00:00:00 2001 From: Jeremiah Andrews Date: Thu, 31 May 2018 18:51:06 -0700 Subject: [PATCH 136/548] renamed state subcommand to tendermint --- cmd/gaia/cmd/gaiacli/main.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/gaia/cmd/gaiacli/main.go b/cmd/gaia/cmd/gaiacli/main.go index 136260c760..049c07b364 100644 --- a/cmd/gaia/cmd/gaiacli/main.go +++ b/cmd/gaia/cmd/gaiacli/main.go @@ -39,15 +39,15 @@ func main() { rpc.AddCommands(rootCmd) //Add state commands - stateCmd := &cobra.Command{ - Use: "state", - Short: "State querying subcommands (validators, blocks, transactions)", + tendermintCmd := &cobra.Command{ + Use: "tendermint", + Short: "Tendermint state querying subcommands", } - stateCmd.AddCommand( + tendermintCmd.AddCommand( rpc.BlockCommand(), rpc.ValidatorCommand(), ) - tx.AddCommands(stateCmd, cdc) + tx.AddCommands(tendermintCmd, cdc) //Add IBC commands ibcCmd := &cobra.Command{ @@ -66,7 +66,7 @@ func main() { } advancedCmd.AddCommand( - stateCmd, + tendermintCmd, ibcCmd, lcd.ServeCommand(cdc), ) From a03638d14af144ef252239e7175c31e425bf2040 Mon Sep 17 00:00:00 2001 From: Jeremiah Andrews Date: Thu, 31 May 2018 22:06:13 -0700 Subject: [PATCH 137/548] changed commands in cli_test to match refactor --- cmd/gaia/cli_test/cli_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 8fa0ad71ec..3ed5a1f4bc 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -22,7 +22,7 @@ import ( func TestGaiaCLISend(t *testing.T) { - tests.ExecuteT(t, "gaiad unsafe_reset_all") + tests.ExecuteT(t, "gaiad tendermint unsafe_reset_all") pass := "1234567890" executeWrite(t, "gaiacli keys delete foo", pass) executeWrite(t, "gaiacli keys delete bar", pass) @@ -69,7 +69,7 @@ func TestGaiaCLISend(t *testing.T) { func TestGaiaCLICreateValidator(t *testing.T) { - tests.ExecuteT(t, "gaiad unsafe_reset_all") + tests.ExecuteT(t, "gaiad tendermint unsafe_reset_all") pass := "1234567890" executeWrite(t, "gaiacli keys delete foo", pass) executeWrite(t, "gaiacli keys delete bar", pass) @@ -104,7 +104,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak")) // create validator - cvStr := fmt.Sprintf("gaiacli create-validator %v", flags) + cvStr := fmt.Sprintf("gaiacli stake create-validator %v", flags) cvStr += fmt.Sprintf(" --name=%v", "bar") cvStr += fmt.Sprintf(" --address-validator=%v", barCech) cvStr += fmt.Sprintf(" --pubkey=%v", barCeshPubKey) @@ -117,12 +117,12 @@ func TestGaiaCLICreateValidator(t *testing.T) { barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) require.Equal(t, int64(8), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) - validator := executeGetValidator(t, fmt.Sprintf("gaiacli validator %v --output=json %v", barCech, flags)) + validator := executeGetValidator(t, fmt.Sprintf("gaiacli stake validator %v --output=json %v", barCech, flags)) assert.Equal(t, validator.Owner, barAddr) assert.Equal(t, "2/1", validator.PoolShares.Amount.String()) // unbond a single share - unbondStr := fmt.Sprintf("gaiacli unbond %v", flags) + unbondStr := fmt.Sprintf("gaiacli stake unbond %v", flags) unbondStr += fmt.Sprintf(" --name=%v", "bar") unbondStr += fmt.Sprintf(" --address-validator=%v", barCech) unbondStr += fmt.Sprintf(" --address-delegator=%v", barCech) @@ -135,7 +135,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) require.Equal(t, int64(9), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) - validator = executeGetValidator(t, fmt.Sprintf("gaiacli validator %v --output=json %v", barCech, flags)) + validator = executeGetValidator(t, fmt.Sprintf("gaiacli stake validator %v --output=json %v", barCech, flags)) assert.Equal(t, "1/1", validator.PoolShares.Amount.String()) } From 7ce9e000b62403cc58b00ac98f465658153c7d52 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Fri, 1 Jun 2018 00:53:54 -0700 Subject: [PATCH 138/548] update changelog, minor update --- CHANGELOG.md | 1 + server/util.go | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 037cf63078..e23165799f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Pending BREAKING CHANGES +* [cli] rearranged commands under subcommands FEATURES diff --git a/server/util.go b/server/util.go index 93dc73469f..9c251aa4ce 100644 --- a/server/util.go +++ b/server/util.go @@ -89,7 +89,6 @@ func AddCommands( StartCmd(ctx, appCreator), client.LineBreak, tendermintCmd, - client.LineBreak, ExportCmd(ctx, cdc, appExport), client.LineBreak, version.VersionCmd, From 34686e8d61d25c04e82c46d57e433879e8091945 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Fri, 1 Jun 2018 01:35:39 -0700 Subject: [PATCH 139/548] unsafe_reset_all back to root --- server/util.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/util.go b/server/util.go index 9c251aa4ce..9e705f8792 100644 --- a/server/util.go +++ b/server/util.go @@ -79,7 +79,6 @@ func AddCommands( } tendermintCmd.AddCommand( - UnsafeResetAllCmd(ctx), ShowNodeIDCmd(ctx), ShowValidatorCmd(ctx), ) @@ -87,6 +86,7 @@ func AddCommands( rootCmd.AddCommand( InitCmd(ctx, cdc, appInit), StartCmd(ctx, appCreator), + UnsafeResetAllCmd(ctx), client.LineBreak, tendermintCmd, ExportCmd(ctx, cdc, appExport), From 823814dfce1c4e7051a7dbc470cc4f5de348cfc1 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Fri, 1 Jun 2018 01:47:44 -0700 Subject: [PATCH 140/548] fix cli test --- cmd/gaia/cli_test/cli_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 3ed5a1f4bc..f6dc50d43b 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -22,7 +22,7 @@ import ( func TestGaiaCLISend(t *testing.T) { - tests.ExecuteT(t, "gaiad tendermint unsafe_reset_all") + tests.ExecuteT(t, "gaiad unsafe_reset_all") pass := "1234567890" executeWrite(t, "gaiacli keys delete foo", pass) executeWrite(t, "gaiacli keys delete bar", pass) @@ -69,7 +69,7 @@ func TestGaiaCLISend(t *testing.T) { func TestGaiaCLICreateValidator(t *testing.T) { - tests.ExecuteT(t, "gaiad tendermint unsafe_reset_all") + tests.ExecuteT(t, "gaiad unsafe_reset_all") pass := "1234567890" executeWrite(t, "gaiacli keys delete foo", pass) executeWrite(t, "gaiacli keys delete bar", pass) From e1d9f00d2de4aa9c24111975b2538be753b9ac5e Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Fri, 1 Jun 2018 01:57:21 -0700 Subject: [PATCH 141/548] ... --- cmd/gaia/cli_test/cli_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index f6dc50d43b..a591c9903f 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -96,7 +96,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { require.NoError(t, err) executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barCech), pass) - time.Sleep(time.Second * 2) // waiting for some blocks to pass + time.Sleep(time.Second * 3) // waiting for some blocks to pass barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) assert.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak")) From 7b4c632066459795f8ff39ca52a71723b40a47e5 Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Fri, 1 Jun 2018 10:51:38 +0100 Subject: [PATCH 142/548] autogenerate testaddrs func created --- x/stake/keeper_test.go | 4 ++-- x/stake/test_common.go | 34 ++++++++++++++++++++++++++++++++++ x/stake/tick.go | 6 +++--- x/stake/tick_test.go | 2 +- 4 files changed, 40 insertions(+), 6 deletions(-) diff --git a/x/stake/keeper_test.go b/x/stake/keeper_test.go index f28a2cf684..6e232d4f95 100644 --- a/x/stake/keeper_test.go +++ b/x/stake/keeper_test.go @@ -115,8 +115,8 @@ func TestValidatorBasics(t *testing.T) { resVals = keeper.GetValidatorsBonded(ctx) require.Equal(t, 3, len(resVals)) - assert.True(ValEq(t, validators[0], resVals[2])) // order doesn't matter here - assert.True(ValEq(t, validators[1], resVals[0])) + assert.True(ValEq(t, validators[0], resVals[0])) // order doesn't matter here + assert.True(ValEq(t, validators[1], resVals[2])) assert.True(ValEq(t, validators[2], resVals[1])) // remove a record diff --git a/x/stake/test_common.go b/x/stake/test_common.go index bf3e665513..2c5785910e 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -3,6 +3,7 @@ package stake import ( "bytes" "encoding/hex" + "strconv" "testing" "github.com/stretchr/testify/require" @@ -162,3 +163,36 @@ func testAddr(addr string, bech string) sdk.Address { return res } + +func createTestAddrs(numAddrs int) []sdk.Address { + var addresses []sdk.Address + var buffer bytes.Buffer + + //start at 10 to avoid changing 1 to 01, 2 to 02, etc + for i := 10; i < numAddrs; i++ { + numString := strconv.Itoa(i) + buffer.WriteString("A58856F0FD53BF058B4909A21AEC019107BA61") //base address string + + buffer.WriteString(numString) //adding on final two digits to make addresses unique + res, _ := sdk.GetAccAddressHex(buffer.String()) + bech, _ := sdk.Bech32CosmosifyAcc(res) + addresses = append(addresses, testAddr(buffer.String(), bech)) + buffer.Reset() + } + return addresses +} + +func createTestPubKeys(numPubKeys int) []crypto.PubKey { + var publicKeys []crypto.PubKey + var buffer bytes.Buffer + + //start at 10 to avoid changing 1 to 01, 2 to 02, etc + for i := 10; i < numPubKeys; i++ { + numString := strconv.Itoa(i) + buffer.WriteString("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB") //base pubkey string + buffer.WriteString(numString) //adding on final two digits to make pubkeys unique + publicKeys = append(publicKeys, newPubKey(buffer.String())) + buffer.Reset() + } + return publicKeys +} diff --git a/x/stake/tick.go b/x/stake/tick.go index a8d9457347..70076c6910 100644 --- a/x/stake/tick.go +++ b/x/stake/tick.go @@ -6,8 +6,8 @@ import ( ) const ( - hrsPerYr = 8766 // as defined by a julian year of 365.25 days - precision = 1000000000 + hrsPerYr = 8766 // as defined by a julian year of 365.25 days + precision = 100000000000 // increased to this precision for accuracy with tests on tick_test.go ) var hrsPerYrRat = sdk.NewRat(hrsPerYr) // as defined by a julian year of 365.25 days @@ -57,7 +57,7 @@ func (k Keeper) nextInflation(ctx sdk.Context) (inflation sdk.Rat) { params := k.GetParams(ctx) pool := k.GetPool(ctx) // The target annual inflation rate is recalculated for each previsions cycle. The - // inflation is also subject to a rate change (positive of negative) depending or + // inflation is also subject to a rate change (positive or negative) depending on // the distance from the desired ratio (67%). The maximum rate change possible is // defined to be 13% per year, however the annual inflation is capped as between // 7% and 20%. diff --git a/x/stake/tick_test.go b/x/stake/tick_test.go index 4f0f6dc061..6be3cd59fb 100644 --- a/x/stake/tick_test.go +++ b/x/stake/tick_test.go @@ -112,7 +112,7 @@ func TestProcessProvisions(t *testing.T) { // process the provisions a year for hr := 0; hr < 8766; hr++ { pool := keeper.GetPool(ctx) - expInflation := keeper.nextInflation(ctx).Round(1000000000) + expInflation := keeper.nextInflation(ctx) expProvisions := (expInflation.Mul(sdk.NewRat(pool.TokenSupply())).Quo(hrsPerYrRat)).Evaluate() startBondedTokens := pool.BondedTokens startTotalSupply := pool.TokenSupply() From 424ce545ef408aad80b1fb96eb153aa64d41a4f0 Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Fri, 1 Jun 2018 11:39:23 +0100 Subject: [PATCH 143/548] autogen addr func updated for 999 addrs if needed --- x/stake/keeper_test.go | 6 +++--- x/stake/test_common.go | 41 ++++++++------------------------------- x/stake/validator_test.go | 8 ++++---- 3 files changed, 15 insertions(+), 40 deletions(-) diff --git a/x/stake/keeper_test.go b/x/stake/keeper_test.go index 6e232d4f95..0e62f0936b 100644 --- a/x/stake/keeper_test.go +++ b/x/stake/keeper_test.go @@ -115,9 +115,9 @@ func TestValidatorBasics(t *testing.T) { resVals = keeper.GetValidatorsBonded(ctx) require.Equal(t, 3, len(resVals)) - assert.True(ValEq(t, validators[0], resVals[0])) // order doesn't matter here - assert.True(ValEq(t, validators[1], resVals[2])) - assert.True(ValEq(t, validators[2], resVals[1])) + assert.True(ValEq(t, validators[0], resVals[2])) // order doesn't matter here + assert.True(ValEq(t, validators[1], resVals[1])) + assert.True(ValEq(t, validators[2], resVals[0])) // remove a record keeper.removeValidator(ctx, validators[1].Owner) diff --git a/x/stake/test_common.go b/x/stake/test_common.go index 2c5785910e..1091120869 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -22,33 +22,8 @@ import ( // dummy addresses used for testing var ( - addrs = []sdk.Address{ - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6160", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctqyxjnwh"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6161", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctpesxxn9"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6162", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctzhrnsa6"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6163", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctr2489qg"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6164", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctytvs4pd"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6165", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ct9k6yqul"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6166", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctxcf3kjq"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6167", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ct89l9r0j"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6168", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctg6jkls2"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6169", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctf8yz2dc"), - } - - // dummy pubkeys used for testing - pks = []crypto.PubKey{ - newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB50"), - newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB51"), - newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB52"), - newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB53"), - newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB54"), - newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB55"), - newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB56"), - newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB57"), - newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB58"), - newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB59"), - } - + addrs = createTestAddrs(100) + pks = createTestPubKeys(100) emptyAddr sdk.Address emptyPubkey crypto.PubKey ) @@ -168,10 +143,10 @@ func createTestAddrs(numAddrs int) []sdk.Address { var addresses []sdk.Address var buffer bytes.Buffer - //start at 10 to avoid changing 1 to 01, 2 to 02, etc - for i := 10; i < numAddrs; i++ { + // start at 100 so we can make up to 999 test addresses with valid test addresses + for i := 100; i < (numAddrs + 100); i++ { numString := strconv.Itoa(i) - buffer.WriteString("A58856F0FD53BF058B4909A21AEC019107BA61") //base address string + buffer.WriteString("A58856F0FD53BF058B4909A21AEC019107BA6") //base address string buffer.WriteString(numString) //adding on final two digits to make addresses unique res, _ := sdk.GetAccAddressHex(buffer.String()) @@ -187,10 +162,10 @@ func createTestPubKeys(numPubKeys int) []crypto.PubKey { var buffer bytes.Buffer //start at 10 to avoid changing 1 to 01, 2 to 02, etc - for i := 10; i < numPubKeys; i++ { + for i := 100; i < (numPubKeys + 100); i++ { numString := strconv.Itoa(i) - buffer.WriteString("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB") //base pubkey string - buffer.WriteString(numString) //adding on final two digits to make pubkeys unique + buffer.WriteString("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AF") //base pubkey string + buffer.WriteString(numString) //adding on final two digits to make pubkeys unique publicKeys = append(publicKeys, newPubKey(buffer.String())) buffer.Reset() } diff --git a/x/stake/validator_test.go b/x/stake/validator_test.go index 1ca5ba2f75..98a82d1dc1 100644 --- a/x/stake/validator_test.go +++ b/x/stake/validator_test.go @@ -148,7 +148,7 @@ func TestUpdateStatus(t *testing.T) { // TODO refactor this random setup // generate a random validator -func randomValidator(r *rand.Rand) Validator { +func randomValidator(r *rand.Rand, i int) Validator { poolSharesAmt := sdk.NewRat(int64(r.Int31n(10000))) delShares := sdk.NewRat(int64(r.Int31n(10000))) @@ -160,8 +160,8 @@ func randomValidator(r *rand.Rand) Validator { pShares = NewUnbondedShares(poolSharesAmt) } return Validator{ - Owner: addrs[0], - PubKey: pks[0], + Owner: addrs[i], + PubKey: pks[i], PoolShares: pShares, DelegatorShares: delShares, } @@ -173,7 +173,7 @@ func randomSetup(r *rand.Rand, numValidators int) (Pool, Validators) { validators := make([]Validator, numValidators) for i := 0; i < numValidators; i++ { - validator := randomValidator(r) + validator := randomValidator(r, i) if validator.Status() == sdk.Bonded { pool.BondedShares = pool.BondedShares.Add(validator.PoolShares.Bonded()) pool.BondedTokens += validator.PoolShares.Bonded().Evaluate() From ce850dca3b025e0625ad73faf605a53650638abc Mon Sep 17 00:00:00 2001 From: Zaki Manian Date: Fri, 1 Jun 2018 16:23:58 +0200 Subject: [PATCH 144/548] Switch from bech32cosmos to bech32 --- Gopkg.lock | 16 ++++++------ Gopkg.toml | 8 ++---- client/keys/utils.go | 4 +-- cmd/gaia/cli_test/cli_test.go | 10 ++++---- server/tm_cmds.go | 4 +-- types/account.go | 46 +++++++++++++++++------------------ x/auth/client/cli/account.go | 2 +- x/bank/client/cli/sendtx.go | 2 +- x/stake/client/cli/query.go | 7 +++--- x/stake/client/cli/tx.go | 14 +++++------ x/stake/delegation.go | 4 +-- x/stake/test_common.go | 24 +++++++++--------- x/stake/validator.go | 4 +-- 13 files changed, 71 insertions(+), 74 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index a7aed3194e..eefc701b02 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -15,9 +15,9 @@ [[projects]] branch = "master" - name = "github.com/cosmos/bech32cosmos" - packages = ["go"] - revision = "c12e4b6ed52acc1d35fea49acec35f980914dc95" + name = "github.com/btcsuite/btcutil" + packages = ["bech32"] + revision = "d4cc87b860166d00d6b5b9e0d3b3d71d6088d4d4" [[projects]] name = "github.com/davecgh/go-spew" @@ -351,9 +351,11 @@ version = "v0.20.0-rc0" [[projects]] + branch = "develop" name = "github.com/tendermint/tmlibs" packages = [ "autofile", + "bech32", "cli", "cli/flags", "clist", @@ -361,10 +363,10 @@ "db", "flowrate", "log", - "merkle" + "merkle", + "merkle/tmhash" ] - revision = "d970af87248a4e162590300dbb74e102183a417d" - version = "v0.8.3" + revision = "44f1bdb0d55cc6527e38d0a7aab406e2580f56a4" [[projects]] branch = "master" @@ -461,6 +463,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "a6a5d886519fa9ca97a23715faa852ee14ecb5337e03641d19ea3d3d1c392fee" + inputs-digest = "c8d0282dfa5b2bb7a0eb54fc24f42021e63f282265332678593658119bf5023b" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index deabcd6452..8c3f5131d0 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -72,14 +72,10 @@ name = "github.com/tendermint/tendermint" version = "0.20.0-rc0" -[[constraint]] +[[override]] name = "github.com/tendermint/tmlibs" - version = "~0.8.3-rc0" + branch = "develop" -[[constraint]] - name = "github.com/cosmos/bech32cosmos" - branch = "master" - # this got updated and broke, so locked to an old working commit ... [[override]] name = "google.golang.org/genproto" diff --git a/client/keys/utils.go b/client/keys/utils.go index 34e2ebcf37..1c1fd0979a 100644 --- a/client/keys/utils.go +++ b/client/keys/utils.go @@ -101,11 +101,11 @@ func printInfos(infos []keys.Info) { } func printKeyOutput(ko KeyOutput) { - bechAccount, err := sdk.Bech32CosmosifyAcc(ko.Address) + bechAccount, err := sdk.Bech32ifyAcc(ko.Address) if err != nil { panic(err) } - bechPubKey, err := sdk.Bech32CosmosifyAccPub(ko.PubKey) + bechPubKey, err := sdk.Bech32ifyAccPub(ko.PubKey) if err != nil { panic(err) } diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index a591c9903f..ae46a623cd 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -40,10 +40,10 @@ func TestGaiaCLISend(t *testing.T) { tests.WaitForStart(port) fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json") - fooCech, err := sdk.Bech32CosmosifyAcc(fooAddr) + fooCech, err := sdk.Bech32ifyAcc(fooAddr) require.NoError(t, err) barAddr, _ := executeGetAddrPK(t, "gaiacli keys show bar --output=json") - barCech, err := sdk.Bech32CosmosifyAcc(barAddr) + barCech, err := sdk.Bech32ifyAcc(barAddr) require.NoError(t, err) fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooCech, flags)) @@ -87,12 +87,12 @@ func TestGaiaCLICreateValidator(t *testing.T) { tests.WaitForStart(port) fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json") - fooCech, err := sdk.Bech32CosmosifyAcc(fooAddr) + fooCech, err := sdk.Bech32ifyAcc(fooAddr) require.NoError(t, err) barAddr, barPubKey := executeGetAddrPK(t, "gaiacli keys show bar --output=json") - barCech, err := sdk.Bech32CosmosifyAcc(barAddr) + barCech, err := sdk.Bech32ifyAcc(barAddr) require.NoError(t, err) - barCeshPubKey, err := sdk.Bech32CosmosifyValPub(barPubKey) + barCeshPubKey, err := sdk.Bech32ifyValPub(barPubKey) require.NoError(t, err) executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barCech), pass) diff --git a/server/tm_cmds.go b/server/tm_cmds.go index fcec57f090..60eb5a2fa6 100644 --- a/server/tm_cmds.go +++ b/server/tm_cmds.go @@ -53,11 +53,11 @@ func ShowValidatorCmd(ctx *Context) *cobra.Command { fmt.Println(string(pubKeyJSONBytes)) return nil } - addr, err := sdk.Bech32CosmosifyValPub(valPubKey) + pubkey, err := sdk.Bech32ifyValPub(valPubKey) if err != nil { return err } - fmt.Println(addr) + fmt.Println(pubkey) return nil }, } diff --git a/types/account.go b/types/account.go index b593dfb539..ad0c58231f 100644 --- a/types/account.go +++ b/types/account.go @@ -5,8 +5,8 @@ import ( "errors" "fmt" - bech32cosmos "github.com/cosmos/bech32cosmos/go" crypto "github.com/tendermint/go-crypto" + "github.com/tendermint/tmlibs/bech32" cmn "github.com/tendermint/tmlibs/common" ) @@ -21,24 +21,24 @@ const ( Bech32PrefixValPub = "cosmosvalpub" ) -// Bech32CosmosifyAcc takes Address and returns the Bech32Cosmos encoded string -func Bech32CosmosifyAcc(addr Address) (string, error) { - return bech32cosmos.ConvertAndEncode(Bech32PrefixAccAddr, addr.Bytes()) +// Bech32ifyAcc takes Address and returns the bech32 encoded string +func Bech32ifyAcc(addr Address) (string, error) { + return bech32.ConvertAndEncode(Bech32PrefixAccAddr, addr.Bytes()) } -// Bech32CosmosifyAccPub takes AccountPubKey and returns the Bech32Cosmos encoded string -func Bech32CosmosifyAccPub(pub crypto.PubKey) (string, error) { - return bech32cosmos.ConvertAndEncode(Bech32PrefixAccPub, pub.Bytes()) +// Bech32ifyAccPub takes AccountPubKey and returns the bech32 encoded string +func Bech32ifyAccPub(pub crypto.PubKey) (string, error) { + return bech32.ConvertAndEncode(Bech32PrefixAccPub, pub.Bytes()) } -// Bech32CosmosifyVal returns the Bech32Cosmos encoded string for a validator address -func Bech32CosmosifyVal(addr Address) (string, error) { - return bech32cosmos.ConvertAndEncode(Bech32PrefixValAddr, addr.Bytes()) +// Bech32ifyVal returns the bech32 encoded string for a validator address +func bech32ifyVal(addr Address) (string, error) { + return bech32.ConvertAndEncode(Bech32PrefixValAddr, addr.Bytes()) } -// Bech32CosmosifyValPub returns the Bech32Cosmos encoded string for a validator pubkey -func Bech32CosmosifyValPub(pub crypto.PubKey) (string, error) { - return bech32cosmos.ConvertAndEncode(Bech32PrefixValPub, pub.Bytes()) +// Bech32ifyValPub returns the bech32 encoded string for a validator pubkey +func Bech32ifyValPub(pub crypto.PubKey) (string, error) { + return bech32.ConvertAndEncode(Bech32PrefixValPub, pub.Bytes()) } // create an Address from a string @@ -54,8 +54,8 @@ func GetAccAddressHex(address string) (addr Address, err error) { } // create an Address from a string -func GetAccAddressBech32Cosmos(address string) (addr Address, err error) { - bz, err := getFromBech32Cosmos(address, Bech32PrefixAccAddr) +func GetAccAddressBech32(address string) (addr Address, err error) { + bz, err := getFromBech32(address, Bech32PrefixAccAddr) if err != nil { return nil, err } @@ -74,9 +74,9 @@ func GetValAddressHex(address string) (addr Address, err error) { return Address(bz), nil } -// create an Address from a bech32cosmos string -func GetValAddressBech32Cosmos(address string) (addr Address, err error) { - bz, err := getFromBech32Cosmos(address, Bech32PrefixValAddr) +// create an Address from a bech32 string +func GetValAddressBech32(address string) (addr Address, err error) { + bz, err := getFromBech32(address, Bech32PrefixValAddr) if err != nil { return nil, err } @@ -84,8 +84,8 @@ func GetValAddressBech32Cosmos(address string) (addr Address, err error) { } //Decode a validator publickey into a public key -func GetValPubKeyBech32Cosmos(pubkey string) (pk crypto.PubKey, err error) { - bz, err := getFromBech32Cosmos(pubkey, Bech32PrefixValPub) +func GetValPubKeyBech32(pubkey string) (pk crypto.PubKey, err error) { + bz, err := getFromBech32(pubkey, Bech32PrefixValPub) if err != nil { return nil, err } @@ -98,11 +98,11 @@ func GetValPubKeyBech32Cosmos(pubkey string) (pk crypto.PubKey, err error) { return pk, nil } -func getFromBech32Cosmos(bech32, prefix string) ([]byte, error) { - if len(bech32) == 0 { +func getFromBech32(bech32str, prefix string) ([]byte, error) { + if len(bech32str) == 0 { return nil, errors.New("must provide non-empty string") } - hrp, bz, err := bech32cosmos.DecodeAndConvert(bech32) + hrp, bz, err := bech32.DecodeAndConvert(bech32str) if err != nil { return nil, err } diff --git a/x/auth/client/cli/account.go b/x/auth/client/cli/account.go index 4006baa149..b5af6a686a 100644 --- a/x/auth/client/cli/account.go +++ b/x/auth/client/cli/account.go @@ -40,7 +40,7 @@ func GetAccountCmd(storeName string, cdc *wire.Codec, decoder auth.AccountDecode // find the key to look up the account addr := args[0] - key, err := sdk.GetAccAddressBech32Cosmos(addr) + key, err := sdk.GetAccAddressBech32(addr) if err != nil { return err } diff --git a/x/bank/client/cli/sendtx.go b/x/bank/client/cli/sendtx.go index 5ed56a85b4..817c9a1747 100644 --- a/x/bank/client/cli/sendtx.go +++ b/x/bank/client/cli/sendtx.go @@ -34,7 +34,7 @@ func SendTxCmd(cdc *wire.Codec) *cobra.Command { toStr := viper.GetString(flagTo) - to, err := sdk.GetAccAddressBech32Cosmos(toStr) + to, err := sdk.GetAccAddressBech32(toStr) if err != nil { return err } diff --git a/x/stake/client/cli/query.go b/x/stake/client/cli/query.go index 84ce9886aa..eac39b9efc 100644 --- a/x/stake/client/cli/query.go +++ b/x/stake/client/cli/query.go @@ -21,7 +21,7 @@ func GetCmdQueryValidator(storeName string, cdc *wire.Codec) *cobra.Command { Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - addr, err := sdk.GetAccAddressBech32Cosmos(args[0]) + addr, err := sdk.GetAccAddressBech32(args[0]) if err != nil { return err } @@ -80,7 +80,6 @@ func GetCmdQueryValidators(storeName string, cdc *wire.Codec) *cobra.Command { validators = append(validators, validator) } - switch viper.Get(cli.OutputFlag) { case "text": for _, validator := range validators { @@ -113,7 +112,7 @@ func GetCmdQueryDelegation(storeName string, cdc *wire.Codec) *cobra.Command { Short: "Query a delegations bond based on address and validator address", RunE: func(cmd *cobra.Command, args []string) error { - addr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) + addr, err := sdk.GetAccAddressBech32(viper.GetString(FlagAddressValidator)) if err != nil { return err } @@ -166,7 +165,7 @@ func GetCmdQueryDelegations(storeName string, cdc *wire.Codec) *cobra.Command { Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - delegatorAddr, err := sdk.GetAccAddressBech32Cosmos(args[0]) + delegatorAddr, err := sdk.GetAccAddressBech32(args[0]) if err != nil { return err } diff --git a/x/stake/client/cli/tx.go b/x/stake/client/cli/tx.go index 3abd366ece..daa4dd9ef7 100644 --- a/x/stake/client/cli/tx.go +++ b/x/stake/client/cli/tx.go @@ -25,7 +25,7 @@ func GetCmdCreateValidator(cdc *wire.Codec) *cobra.Command { if err != nil { return err } - validatorAddr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) + validatorAddr, err := sdk.GetAccAddressBech32(viper.GetString(FlagAddressValidator)) if err != nil { return err } @@ -34,7 +34,7 @@ func GetCmdCreateValidator(cdc *wire.Codec) *cobra.Command { if len(pkStr) == 0 { return fmt.Errorf("must use --pubkey flag") } - pk, err := sdk.GetValPubKeyBech32Cosmos(pkStr) + pk, err := sdk.GetValPubKeyBech32(pkStr) if err != nil { return err } @@ -74,7 +74,7 @@ func GetCmdEditValidator(cdc *wire.Codec) *cobra.Command { Short: "edit and existing validator account", RunE: func(cmd *cobra.Command, args []string) error { - validatorAddr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) + validatorAddr, err := sdk.GetAccAddressBech32(viper.GetString(FlagAddressValidator)) if err != nil { return err } @@ -115,8 +115,8 @@ func GetCmdDelegate(cdc *wire.Codec) *cobra.Command { return err } - delegatorAddr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressDelegator)) - validatorAddr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) + delegatorAddr, err := sdk.GetAccAddressBech32(viper.GetString(FlagAddressDelegator)) + validatorAddr, err := sdk.GetAccAddressBech32(viper.GetString(FlagAddressValidator)) if err != nil { return err } @@ -163,8 +163,8 @@ func GetCmdUnbond(cdc *wire.Codec) *cobra.Command { } } - delegatorAddr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressDelegator)) - validatorAddr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressValidator)) + delegatorAddr, err := sdk.GetAccAddressBech32(viper.GetString(FlagAddressDelegator)) + validatorAddr, err := sdk.GetAccAddressBech32(viper.GetString(FlagAddressValidator)) if err != nil { return err } diff --git a/x/stake/delegation.go b/x/stake/delegation.go index 6877034d71..dedac03e58 100644 --- a/x/stake/delegation.go +++ b/x/stake/delegation.go @@ -35,11 +35,11 @@ func (b Delegation) GetBondShares() sdk.Rat { return b.Shares } //Human Friendly pretty printer func (b Delegation) HumanReadableString() (string, error) { - bechAcc, err := sdk.Bech32CosmosifyAcc(b.DelegatorAddr) + bechAcc, err := sdk.Bech32ifyAcc(b.DelegatorAddr) if err != nil { return "", err } - bechVal, err := sdk.Bech32CosmosifyAcc(b.ValidatorAddr) + bechVal, err := sdk.Bech32ifyAcc(b.ValidatorAddr) if err != nil { return "", err } diff --git a/x/stake/test_common.go b/x/stake/test_common.go index ae4adf4d8f..d06ac8d0af 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -22,16 +22,16 @@ import ( // dummy addresses used for testing var ( addrs = []sdk.Address{ - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6160", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctqyxjnwh"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6161", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctpesxxn9"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6162", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctzhrnsa6"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6163", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctr2489qg"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6164", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctytvs4pd"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6165", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ct9k6yqul"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6166", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctxcf3kjq"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6167", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ct89l9r0j"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6168", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctg6jkls2"), - testAddr("A58856F0FD53BF058B4909A21AEC019107BA6169", "cosmosaccaddr:5ky9du8a2wlstz6fpx3p4mqpjyrm5ctf8yz2dc"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6160", "cosmosaccaddr15ky9du8a2wlstz6fpx3p4mqpjyrm5ctqyxjnwh"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6161", "cosmosaccaddr15ky9du8a2wlstz6fpx3p4mqpjyrm5ctpesxxn9"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6162", "cosmosaccaddr15ky9du8a2wlstz6fpx3p4mqpjyrm5ctzhrnsa6"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6163", "cosmosaccaddr15ky9du8a2wlstz6fpx3p4mqpjyrm5ctr2489qg"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6164", "cosmosaccaddr15ky9du8a2wlstz6fpx3p4mqpjyrm5ctytvs4pd"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6165", "cosmosaccaddr15ky9du8a2wlstz6fpx3p4mqpjyrm5ct9k6yqul"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6166", "cosmosaccaddr15ky9du8a2wlstz6fpx3p4mqpjyrm5ctxcf3kjq"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6167", "cosmosaccaddr15ky9du8a2wlstz6fpx3p4mqpjyrm5ct89l9r0j"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6168", "cosmosaccaddr15ky9du8a2wlstz6fpx3p4mqpjyrm5ctg6jkls2"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6169", "cosmosaccaddr15ky9du8a2wlstz6fpx3p4mqpjyrm5ctf8yz2dc"), } // dummy pubkeys used for testing @@ -144,7 +144,7 @@ func testAddr(addr string, bech string) sdk.Address { if err != nil { panic(err) } - bechexpected, err := sdk.Bech32CosmosifyAcc(res) + bechexpected, err := sdk.Bech32ifyAcc(res) if err != nil { panic(err) } @@ -152,7 +152,7 @@ func testAddr(addr string, bech string) sdk.Address { panic("Bech encoding doesn't match reference") } - bechres, err := sdk.GetAccAddressBech32Cosmos(bech) + bechres, err := sdk.GetAccAddressBech32(bech) if err != nil { panic(err) } diff --git a/x/stake/validator.go b/x/stake/validator.go index 729a605a96..1d9957d990 100644 --- a/x/stake/validator.go +++ b/x/stake/validator.go @@ -258,11 +258,11 @@ func (v Validator) GetBondHeight() int64 { return v.BondHeight } //Human Friendly pretty printer func (v Validator) HumanReadableString() (string, error) { - bechOwner, err := sdk.Bech32CosmosifyAcc(v.Owner) + bechOwner, err := sdk.Bech32ifyAcc(v.Owner) if err != nil { return "", err } - bechVal, err := sdk.Bech32CosmosifyValPub(v.PubKey) + bechVal, err := sdk.Bech32ifyValPub(v.PubKey) if err != nil { return "", err } From ad48f1b4a21b345389f96d52ad4433ccdde4538e Mon Sep 17 00:00:00 2001 From: Jeremiah Andrews Date: Fri, 1 Jun 2018 12:32:26 -0700 Subject: [PATCH 145/548] fix for slashing with bech32 change --- x/slashing/client/cli/query.go | 2 +- x/slashing/client/cli/tx.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x/slashing/client/cli/query.go b/x/slashing/client/cli/query.go index 42c02cab03..35f99d2fa3 100644 --- a/x/slashing/client/cli/query.go +++ b/x/slashing/client/cli/query.go @@ -21,7 +21,7 @@ func GetCmdQuerySigningInfo(storeName string, cdc *wire.Codec) *cobra.Command { Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - pk, err := sdk.GetValPubKeyBech32Cosmos(args[0]) + pk, err := sdk.GetValPubKeyBech32(args[0]) if err != nil { return err } diff --git a/x/slashing/client/cli/tx.go b/x/slashing/client/cli/tx.go index 13a5cb666f..19b1225bad 100644 --- a/x/slashing/client/cli/tx.go +++ b/x/slashing/client/cli/tx.go @@ -21,7 +21,7 @@ func GetCmdUnrevoke(cdc *wire.Codec) *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) - validatorAddr, err := sdk.GetAccAddressBech32Cosmos(args[0]) + validatorAddr, err := sdk.GetAccAddressBech32(args[0]) if err != nil { return err } From 0ef3259a399f1cda30c38486233f4474d2ef683e Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Fri, 1 Jun 2018 14:24:48 -0700 Subject: [PATCH 146/548] revised use of EndBlock/BeginBlock, basecoin updated for staking/slashing --- .github/PULL_REQUEST_TEMPLATE.md | 1 + CHANGELOG.md | 3 + cmd/gaia/app/app.go | 24 +++++- cmd/gaia/app/app_test.go | 27 +------ cmd/gaia/app/genesis.go | 2 +- examples/basecoin/app/app.go | 52 ++++++++++--- examples/basecoin/app/app_test.go | 86 +++++++++++++++------ examples/basecoin/types/account.go | 4 +- x/slashing/client/cli/query.go | 2 +- x/slashing/client/cli/tx.go | 2 +- x/slashing/keeper_test.go | 4 +- x/slashing/tick.go | 76 +++++++++--------- x/stake/handler.go | 26 +++++-- x/stake/{tick.go => inflation.go} | 25 ------ x/stake/{tick_test.go => inflation_test.go} | 0 x/stake/keeper.go | 4 +- 16 files changed, 194 insertions(+), 144 deletions(-) rename x/stake/{tick.go => inflation.go} (74%) rename x/stake/{tick_test.go => inflation_test.go} (100%) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 902469b41c..3ddec8d336 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -4,3 +4,4 @@ * [ ] Updated all code comments where relevant * [ ] Wrote tests * [ ] Updated CHANGELOG.md +* [ ] Updated Basecoin / other examples diff --git a/CHANGELOG.md b/CHANGELOG.md index e23165799f..86a344654e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,16 +4,19 @@ BREAKING CHANGES * [cli] rearranged commands under subcommands +* [stake] remove Tick and add EndBlocker FEATURES IMPROVEMENTS * bank module uses go-wire codec instead of 'encoding/json' * auth module uses go-wire codec instead of 'encoding/json' +* revised use of endblock and beginblock FIXES * [cli] fixed cli-bash tests * [ci] added cli-bash tests +* [basecoin] updated basecoin for stake and slashing ## 0.18.1 diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index 4fdb6a6c92..f8e71be293 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -85,8 +85,8 @@ func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { // initialize BaseApp app.SetInitChainer(app.initChainer) - app.SetBeginBlocker(slashing.NewBeginBlocker(app.slashingKeeper)) - app.SetEndBlocker(stake.NewEndBlocker(app.stakeKeeper)) + app.SetBeginBlocker(app.BeginBlocker) + app.SetEndBlocker(app.EndBlocker) app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, app.feeCollectionKeeper)) app.MountStoresIAVL(app.keyMain, app.keyAccount, app.keyIBC, app.keyStake, app.keySlashing) err := app.LoadLatestVersion(app.keyMain) @@ -110,6 +110,24 @@ func MakeCodec() *wire.Codec { return cdc } +// application updates every end block +func (app *GaiaApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { + tags := slashing.BeginBlocker(ctx, req, app.slashingKeeper) + + return abci.ResponseBeginBlock{ + Tags: tags.ToKVPairs(), + } +} + +// application updates every end block +func (app *GaiaApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { + validatorUpdates := stake.EndBlocker(ctx, app.stakeKeeper) + + return abci.ResponseEndBlock{ + ValidatorUpdates: validatorUpdates, + } +} + // custom logic for gaia initialization func (app *GaiaApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { stateJSON := req.GenesisBytes @@ -134,7 +152,7 @@ func (app *GaiaApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci return abci.ResponseInitChain{} } -// export the state of gaia for a genesis f +// export the state of gaia for a genesis file func (app *GaiaApp) ExportAppStateJSON() (appState json.RawMessage, err error) { ctx := app.NewContext(true, abci.Header{}) diff --git a/cmd/gaia/app/app_test.go b/cmd/gaia/app/app_test.go index 13ffdc33b7..7ba9752361 100644 --- a/cmd/gaia/app/app_test.go +++ b/cmd/gaia/app/app_test.go @@ -1,7 +1,6 @@ package app import ( - "encoding/json" "fmt" "os" "testing" @@ -139,30 +138,6 @@ func TestMsgs(t *testing.T) { } } -func setGenesisAccounts(gapp *GaiaApp, accs ...*auth.BaseAccount) error { - genaccs := make([]GenesisAccount, len(accs)) - for i, acc := range accs { - genaccs[i] = NewGenesisAccount(acc) - } - - genesisState := GenesisState{ - Accounts: genaccs, - StakeData: stake.DefaultGenesisState(), - } - - stateBytes, err := json.MarshalIndent(genesisState, "", "\t") - if err != nil { - return err - } - - // Initialize the chain - vals := []abci.Validator{} - gapp.InitChain(abci.RequestInitChain{vals, stateBytes}) - gapp.Commit() - - return nil -} - func TestGenesis(t *testing.T) { logger, dbs := loggerAndDB() gapp := NewGaiaApp(logger, dbs) @@ -178,7 +153,7 @@ func TestGenesis(t *testing.T) { } err = setGenesis(gapp, baseAcc) - assert.Nil(t, err) + require.Nil(t, err) // A checkTx context ctx := gapp.BaseApp.NewContext(true, abci.Header{}) diff --git a/cmd/gaia/app/genesis.go b/cmd/gaia/app/genesis.go index 4f76d6073b..813796c0d8 100644 --- a/cmd/gaia/app/genesis.go +++ b/cmd/gaia/app/genesis.go @@ -95,7 +95,7 @@ func GaiaAppGenTx(cdc *wire.Codec, pk crypto.PubKey) ( return nil, nil, tmtypes.GenesisValidator{}, errors.New("Must specify --name (validator moniker)") } - var addr sdk.Address + var addr sdk.Address var secret string addr, secret, err = server.GenerateSaveCoinKey(clientRoot, name, "1234567890", overwrite) if err != nil { diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index a0b1f86ad6..f079010923 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -14,6 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" "github.com/cosmos/cosmos-sdk/x/ibc" + "github.com/cosmos/cosmos-sdk/x/slashing" "github.com/cosmos/cosmos-sdk/x/stake" "github.com/cosmos/cosmos-sdk/examples/basecoin/types" @@ -29,10 +30,11 @@ type BasecoinApp struct { cdc *wire.Codec // keys to access the substores - keyMain *sdk.KVStoreKey - keyAccount *sdk.KVStoreKey - keyIBC *sdk.KVStoreKey - keyStake *sdk.KVStoreKey + keyMain *sdk.KVStoreKey + keyAccount *sdk.KVStoreKey + keyIBC *sdk.KVStoreKey + keyStake *sdk.KVStoreKey + keySlashing *sdk.KVStoreKey // Manage getting and setting accounts accountMapper auth.AccountMapper @@ -40,6 +42,7 @@ type BasecoinApp struct { coinKeeper bank.Keeper ibcMapper ibc.Mapper stakeKeeper stake.Keeper + slashingKeeper slashing.Keeper } func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { @@ -49,12 +52,13 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { // Create your application object. var app = &BasecoinApp{ - BaseApp: bam.NewBaseApp(appName, cdc, logger, db), - cdc: cdc, - keyMain: sdk.NewKVStoreKey("main"), - keyAccount: sdk.NewKVStoreKey("acc"), - keyIBC: sdk.NewKVStoreKey("ibc"), - keyStake: sdk.NewKVStoreKey("stake"), + BaseApp: bam.NewBaseApp(appName, cdc, logger, db), + cdc: cdc, + keyMain: sdk.NewKVStoreKey("main"), + keyAccount: sdk.NewKVStoreKey("acc"), + keyIBC: sdk.NewKVStoreKey("ibc"), + keyStake: sdk.NewKVStoreKey("stake"), + keySlashing: sdk.NewKVStoreKey("slashing"), } // Define the accountMapper. @@ -68,6 +72,7 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { app.coinKeeper = bank.NewKeeper(app.accountMapper) app.ibcMapper = ibc.NewMapper(app.cdc, app.keyIBC, app.RegisterCodespace(ibc.DefaultCodespace)) app.stakeKeeper = stake.NewKeeper(app.cdc, app.keyStake, app.coinKeeper, app.RegisterCodespace(stake.DefaultCodespace)) + app.slashingKeeper = slashing.NewKeeper(app.cdc, app.keySlashing, app.stakeKeeper, app.RegisterCodespace(slashing.DefaultCodespace)) // register message routes app.Router(). @@ -78,8 +83,10 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { // Initialize BaseApp. app.SetInitChainer(app.initChainer) - app.MountStoresIAVL(app.keyMain, app.keyAccount, app.keyIBC, app.keyStake) + app.SetBeginBlocker(app.BeginBlocker) + app.SetEndBlocker(app.EndBlocker) app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, app.feeCollectionKeeper)) + app.MountStoresIAVL(app.keyMain, app.keyAccount, app.keyIBC, app.keyStake, app.keySlashing) err := app.LoadLatestVersion(app.keyMain) if err != nil { cmn.Exit(err.Error()) @@ -94,6 +101,7 @@ func MakeCodec() *wire.Codec { sdk.RegisterWire(cdc) // Register Msgs bank.RegisterWire(cdc) stake.RegisterWire(cdc) + slashing.RegisterWire(cdc) ibc.RegisterWire(cdc) // register custom AppAccount @@ -102,6 +110,24 @@ func MakeCodec() *wire.Codec { return cdc } +// application updates every end block +func (app *BasecoinApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { + tags := slashing.BeginBlocker(ctx, req, app.slashingKeeper) + + return abci.ResponseBeginBlock{ + Tags: tags.ToKVPairs(), + } +} + +// application updates every end block +func (app *BasecoinApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { + validatorUpdates := stake.EndBlocker(ctx, app.stakeKeeper) + + return abci.ResponseEndBlock{ + ValidatorUpdates: validatorUpdates, + } +} + // Custom logic for basecoin initialization func (app *BasecoinApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { stateJSON := req.GenesisBytes @@ -121,6 +147,10 @@ func (app *BasecoinApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) } app.accountMapper.SetAccount(ctx, acc) } + + // load the initial stake information + stake.InitGenesis(ctx, app.stakeKeeper, genesisState.StakeData) + return abci.ResponseInitChain{} } diff --git a/examples/basecoin/app/app_test.go b/examples/basecoin/app/app_test.go index e297288d3f..4d445bda1d 100644 --- a/examples/basecoin/app/app_test.go +++ b/examples/basecoin/app/app_test.go @@ -11,9 +11,11 @@ import ( "github.com/cosmos/cosmos-sdk/examples/basecoin/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" "github.com/cosmos/cosmos-sdk/x/ibc" + "github.com/cosmos/cosmos-sdk/x/stake" abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" @@ -85,28 +87,18 @@ var ( } ) -func loggerAndDB() (log.Logger, dbm.DB) { - logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") - db := dbm.NewMemDB() - return logger, db -} - -func newBasecoinApp() *BasecoinApp { - logger, db := loggerAndDB() - return NewBasecoinApp(logger, db) -} - -func setGenesisAccounts(bapp *BasecoinApp, accs ...auth.BaseAccount) error { +func setGenesis(bapp *BasecoinApp, accs ...auth.BaseAccount) error { genaccs := make([]*types.GenesisAccount, len(accs)) for i, acc := range accs { genaccs[i] = types.NewGenesisAccount(&types.AppAccount{acc, accName}) } genesisState := types.GenesisState{ - Accounts: genaccs, + Accounts: genaccs, + StakeData: stake.DefaultGenesisState(), } - stateBytes, err := json.MarshalIndent(genesisState, "", "\t") + stateBytes, err := wire.MarshalJSONIndent(bapp.cdc, genesisState) if err != nil { return err } @@ -119,10 +111,46 @@ func setGenesisAccounts(bapp *BasecoinApp, accs ...auth.BaseAccount) error { return nil } +func loggerAndDB() (log.Logger, dbm.DB) { + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") + db := dbm.NewMemDB() + return logger, db +} + +func newBasecoinApp() *BasecoinApp { + logger, db := loggerAndDB() + return NewBasecoinApp(logger, db) +} + +//func setGenesisAccounts(bapp *BasecoinApp, accs ...auth.BaseAccount) error { +//genaccs := make([]*types.GenesisAccount, len(accs)) +//for i, acc := range accs { +//genaccs[i] = types.NewGenesisAccount(&types.AppAccount{acc, accName}) +//} + +//genesisState := types.GenesisState{ +//Accounts: genaccs, +//StakeData: stake.DefaultGenesisState(), +//} + +//stateBytes, err := json.MarshalIndent(genesisState, "", "\t") +//if err != nil { +//return err +//} + +//// Initialize the chain +//vals := []abci.Validator{} +//bapp.InitChain(abci.RequestInitChain{vals, stateBytes}) +//bapp.Commit() + +//return nil +//} + //_______________________________________________________________________ func TestMsgs(t *testing.T) { bapp := newBasecoinApp() + require.Nil(t, setGenesis(bapp)) msgs := []struct { msg sdk.Msg @@ -193,8 +221,8 @@ func TestGenesis(t *testing.T) { } acc := &types.AppAccount{baseAcc, "foobart"} - err = setGenesisAccounts(bapp, baseAcc) - assert.Nil(t, err) + err = setGenesis(bapp, baseAcc) + require.Nil(t, err) // A checkTx context ctx := bapp.BaseApp.NewContext(true, abci.Header{}) @@ -222,8 +250,9 @@ func TestMsgChangePubKey(t *testing.T) { } // Construct genesis state - err = setGenesisAccounts(bapp, baseAcc) - assert.Nil(t, err) + err = setGenesis(bapp, baseAcc) + require.Nil(t, err) + // A checkTx context (true) ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) @@ -276,8 +305,9 @@ func TestMsgSendWithAccounts(t *testing.T) { } // Construct genesis state - err = setGenesisAccounts(bapp, baseAcc) - assert.Nil(t, err) + err = setGenesis(bapp, baseAcc) + require.Nil(t, err) + // A checkTx context (true) ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) @@ -320,8 +350,9 @@ func TestMsgSendMultipleOut(t *testing.T) { Coins: genCoins, } - err = setGenesisAccounts(bapp, acc1, acc2) - assert.Nil(t, err) + // Construct genesis state + err = setGenesis(bapp, acc1, acc2) + require.Nil(t, err) // Simulate a Block SignCheckDeliver(t, bapp, sendMsg2, []int64{0}, true, priv1) @@ -353,7 +384,7 @@ func TestSengMsgMultipleInOut(t *testing.T) { Coins: genCoins, } - err = setGenesisAccounts(bapp, acc1, acc2, acc4) + err = setGenesis(bapp, acc1, acc2, acc4) assert.Nil(t, err) // CheckDeliver @@ -377,7 +408,11 @@ func TestMsgSendDependent(t *testing.T) { Coins: genCoins, } - err = setGenesisAccounts(bapp, acc1) + // Construct genesis state + err = setGenesis(bapp, acc1) + require.Nil(t, err) + + err = setGenesis(bapp, acc1) assert.Nil(t, err) // CheckDeliver @@ -438,8 +473,9 @@ func TestIBCMsgs(t *testing.T) { } acc1 := &types.AppAccount{baseAcc, "foobart"} - err := setGenesisAccounts(bapp, baseAcc) + err := setGenesis(bapp, baseAcc) assert.Nil(t, err) + // A checkTx context (true) ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) diff --git a/examples/basecoin/types/account.go b/examples/basecoin/types/account.go index 223e0b9eb1..43a8e2e389 100644 --- a/examples/basecoin/types/account.go +++ b/examples/basecoin/types/account.go @@ -4,6 +4,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/stake" ) var _ auth.Account = (*AppAccount)(nil) @@ -41,7 +42,8 @@ func GetAccountDecoder(cdc *wire.Codec) auth.AccountDecoder { // State to Unmarshal type GenesisState struct { - Accounts []*GenesisAccount `json:"accounts"` + Accounts []*GenesisAccount `json:"accounts"` + StakeData stake.GenesisState `json:"stake"` } // GenesisAccount doesn't need pubkey or sequence diff --git a/x/slashing/client/cli/query.go b/x/slashing/client/cli/query.go index 42c02cab03..35f99d2fa3 100644 --- a/x/slashing/client/cli/query.go +++ b/x/slashing/client/cli/query.go @@ -21,7 +21,7 @@ func GetCmdQuerySigningInfo(storeName string, cdc *wire.Codec) *cobra.Command { Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - pk, err := sdk.GetValPubKeyBech32Cosmos(args[0]) + pk, err := sdk.GetValPubKeyBech32(args[0]) if err != nil { return err } diff --git a/x/slashing/client/cli/tx.go b/x/slashing/client/cli/tx.go index 13a5cb666f..19b1225bad 100644 --- a/x/slashing/client/cli/tx.go +++ b/x/slashing/client/cli/tx.go @@ -21,7 +21,7 @@ func GetCmdUnrevoke(cdc *wire.Codec) *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) - validatorAddr, err := sdk.GetAccAddressBech32Cosmos(args[0]) + validatorAddr, err := sdk.GetAccAddressBech32(args[0]) if err != nil { return err } diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index a385627737..25ae1686d6 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -18,7 +18,7 @@ func TestHandleDoubleSign(t *testing.T) { addr, val, amt := addrs[0], pks[0], int64(100) got := stake.NewHandler(sk)(ctx, newTestMsgCreateValidator(addr, val, amt)) require.True(t, got.IsOK()) - sk.Tick(ctx) + stake.EndBlocker(ctx, sk) require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) require.Equal(t, sdk.NewRat(amt), sk.Validator(ctx, addr).GetPower()) @@ -41,7 +41,7 @@ func TestHandleAbsentValidator(t *testing.T) { slh := NewHandler(keeper) got := sh(ctx, newTestMsgCreateValidator(addr, val, amt)) require.True(t, got.IsOK()) - sk.Tick(ctx) + stake.EndBlocker(ctx, sk) require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) require.Equal(t, sdk.NewRat(amt), sk.Validator(ctx, addr).GetPower()) info, found := keeper.getValidatorSigningInfo(ctx, val.Address()) diff --git a/x/slashing/tick.go b/x/slashing/tick.go index 82f76d802f..c77e968871 100644 --- a/x/slashing/tick.go +++ b/x/slashing/tick.go @@ -10,49 +10,45 @@ import ( tmtypes "github.com/tendermint/tendermint/types" ) -func NewBeginBlocker(sk Keeper) sdk.BeginBlocker { - return func(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { - // Tag the height - heightBytes := make([]byte, 8) - binary.LittleEndian.PutUint64(heightBytes, uint64(req.Header.Height)) - tags := sdk.NewTags("height", heightBytes) +// slash begin blocker functionality +func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, sk Keeper) (tags sdk.Tags) { - // Deal with any equivocation evidence - for _, evidence := range req.ByzantineValidators { - var pk crypto.PubKey - sk.cdc.MustUnmarshalBinaryBare(evidence.PubKey, &pk) - switch string(evidence.Type) { - case tmtypes.DUPLICATE_VOTE: - sk.handleDoubleSign(ctx, evidence.Height, evidence.Time, pk) - default: - ctx.Logger().With("module", "x/slashing").Error(fmt.Sprintf("Ignored unknown evidence type: %s", string(evidence.Type))) - } - } + // Tag the height + heightBytes := make([]byte, 8) + binary.LittleEndian.PutUint64(heightBytes, uint64(req.Header.Height)) - // Figure out which validators were absent - absent := make(map[crypto.PubKey]struct{}) - for _, pubkey := range req.AbsentValidators { - var pk crypto.PubKey - sk.cdc.MustUnmarshalBinaryBare(pubkey, &pk) - absent[pk] = struct{}{} - } + // TODO Add some more tags so clients can track slashing events + tags = sdk.NewTags("height", heightBytes) - // Iterate over all the validators which *should* have signed this block - sk.stakeKeeper.IterateValidatorsBonded(ctx, func(_ int64, validator sdk.Validator) (stop bool) { - pubkey := validator.GetPubKey() - present := true - if _, ok := absent[pubkey]; ok { - present = false - } - sk.handleValidatorSignature(ctx, pubkey, present) - return false - }) - - // Return the begin block response - // TODO Return something composable, so other modules can also have BeginBlockers - // TODO Add some more tags so clients can track slashing events - return abci.ResponseBeginBlock{ - Tags: tags.ToKVPairs(), + // Deal with any equivocation evidence + for _, evidence := range req.ByzantineValidators { + var pk crypto.PubKey + sk.cdc.MustUnmarshalBinaryBare(evidence.PubKey, &pk) + switch string(evidence.Type) { + case tmtypes.DUPLICATE_VOTE: + sk.handleDoubleSign(ctx, evidence.Height, evidence.Time, pk) + default: + ctx.Logger().With("module", "x/slashing").Error(fmt.Sprintf("Ignored unknown evidence type: %s", string(evidence.Type))) } } + + // Figure out which validators were absent + absent := make(map[crypto.PubKey]struct{}) + for _, pubkey := range req.AbsentValidators { + var pk crypto.PubKey + sk.cdc.MustUnmarshalBinaryBare(pubkey, &pk) + absent[pk] = struct{}{} + } + + // Iterate over all the validators which *should* have signed this block + sk.stakeKeeper.IterateValidatorsBonded(ctx, func(_ int64, validator sdk.Validator) (stop bool) { + pubkey := validator.GetPubKey() + present := true + if _, ok := absent[pubkey]; ok { + present = false + } + sk.handleValidatorSignature(ctx, pubkey, present) + return false + }) + return } diff --git a/x/stake/handler.go b/x/stake/handler.go index b1c6a95b59..f366989b62 100644 --- a/x/stake/handler.go +++ b/x/stake/handler.go @@ -25,13 +25,27 @@ func NewHandler(k Keeper) sdk.Handler { } } -// NewEndBlocker generates sdk.EndBlocker -// Performs tick functionality -func NewEndBlocker(k Keeper) sdk.EndBlocker { - return func(ctx sdk.Context, req abci.RequestEndBlock) (res abci.ResponseEndBlock) { - res.ValidatorUpdates = k.Tick(ctx) - return +// Called every block, process inflation, update validator set +func EndBlocker(ctx sdk.Context, k Keeper) (ValidatorUpdates []abci.Validator) { + pool := k.GetPool(ctx) + + // Process Validator Provisions + blockTime := ctx.BlockHeader().Time // XXX assuming in seconds, confirm + if pool.InflationLastTime+blockTime >= 3600 { + pool.InflationLastTime = blockTime + pool = k.processProvisions(ctx) } + + // save the params + k.setPool(ctx, pool) + + // reset the intra-transaction counter + k.setIntraTxCounter(ctx, 0) + + // calculate validator set changes + ValidatorUpdates = k.getTendermintUpdates(ctx) + k.clearTendermintUpdates(ctx) + return } //_____________________________________________________________________ diff --git a/x/stake/tick.go b/x/stake/inflation.go similarity index 74% rename from x/stake/tick.go rename to x/stake/inflation.go index a8d9457347..f385e9d82c 100644 --- a/x/stake/tick.go +++ b/x/stake/inflation.go @@ -2,7 +2,6 @@ package stake import ( sdk "github.com/cosmos/cosmos-sdk/types" - abci "github.com/tendermint/abci/types" ) const ( @@ -12,30 +11,6 @@ const ( var hrsPerYrRat = sdk.NewRat(hrsPerYr) // as defined by a julian year of 365.25 days -// Tick - called at the end of every block -func (k Keeper) Tick(ctx sdk.Context) (change []abci.Validator) { - p := k.GetPool(ctx) - - // Process Validator Provisions - blockTime := ctx.BlockHeader().Time // XXX assuming in seconds, confirm - if p.InflationLastTime+blockTime >= 3600 { - p.InflationLastTime = blockTime - p = k.processProvisions(ctx) - } - - // save the params - k.setPool(ctx, p) - - // reset the intra-transaction counter - k.setIntraTxCounter(ctx, 0) - - // calculate validator set changes - change = k.getTendermintUpdates(ctx) - k.clearTendermintUpdates(ctx) - - return change -} - // process provisions for an hour period func (k Keeper) processProvisions(ctx sdk.Context) Pool { diff --git a/x/stake/tick_test.go b/x/stake/inflation_test.go similarity index 100% rename from x/stake/tick_test.go rename to x/stake/inflation_test.go diff --git a/x/stake/keeper.go b/x/stake/keeper.go index 9fd902053a..9f554c764f 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -636,9 +636,9 @@ func (k Keeper) getPool(store sdk.KVStore) (pool Pool) { return } -func (k Keeper) setPool(ctx sdk.Context, p Pool) { +func (k Keeper) setPool(ctx sdk.Context, pool Pool) { store := ctx.KVStore(k.storeKey) - b := k.cdc.MustMarshalBinary(p) + b := k.cdc.MustMarshalBinary(pool) store.Set(PoolKey, b) } From f2cf0bee14626211104b2f20371245b169e32a57 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 1 Jun 2018 23:45:30 +0200 Subject: [PATCH 147/548] Remove commented-out testcode --- examples/basecoin/app/app_test.go | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/examples/basecoin/app/app_test.go b/examples/basecoin/app/app_test.go index 4d445bda1d..8054baab27 100644 --- a/examples/basecoin/app/app_test.go +++ b/examples/basecoin/app/app_test.go @@ -122,30 +122,6 @@ func newBasecoinApp() *BasecoinApp { return NewBasecoinApp(logger, db) } -//func setGenesisAccounts(bapp *BasecoinApp, accs ...auth.BaseAccount) error { -//genaccs := make([]*types.GenesisAccount, len(accs)) -//for i, acc := range accs { -//genaccs[i] = types.NewGenesisAccount(&types.AppAccount{acc, accName}) -//} - -//genesisState := types.GenesisState{ -//Accounts: genaccs, -//StakeData: stake.DefaultGenesisState(), -//} - -//stateBytes, err := json.MarshalIndent(genesisState, "", "\t") -//if err != nil { -//return err -//} - -//// Initialize the chain -//vals := []abci.Validator{} -//bapp.InitChain(abci.RequestInitChain{vals, stateBytes}) -//bapp.Commit() - -//return nil -//} - //_______________________________________________________________________ func TestMsgs(t *testing.T) { From 024eaf6ac041c46a144b52756c58a54ab0b989cf Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Sat, 2 Jun 2018 00:27:37 +0200 Subject: [PATCH 148/548] Swap x/slashing to sdk.ValidatorSet --- x/slashing/handler.go | 4 ++-- x/slashing/keeper.go | 23 +++++++++++------------ x/slashing/tick.go | 2 +- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/x/slashing/handler.go b/x/slashing/handler.go index 98e9d30ada..5994bb8f19 100644 --- a/x/slashing/handler.go +++ b/x/slashing/handler.go @@ -21,7 +21,7 @@ func NewHandler(k Keeper) sdk.Handler { func handleMsgUnrevoke(ctx sdk.Context, msg MsgUnrevoke, k Keeper) sdk.Result { // Validator must exist - validator := k.stakeKeeper.Validator(ctx, msg.ValidatorAddr) + validator := k.validatorSet.Validator(ctx, msg.ValidatorAddr) if validator == nil { return ErrNoValidatorForAddress(k.codespace).Result() } @@ -48,7 +48,7 @@ func handleMsgUnrevoke(ctx sdk.Context, msg MsgUnrevoke, k Keeper) sdk.Result { k.setValidatorSigningInfo(ctx, addr, info) // Unrevoke the validator - k.stakeKeeper.Unrevoke(ctx, validator.GetPubKey()) + k.validatorSet.Unrevoke(ctx, validator.GetPubKey()) tags := sdk.NewTags("action", []byte("unrevoke"), "validator", msg.ValidatorAddr.Bytes()) diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index a37c5a07b8..d558cc04b0 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -5,27 +5,26 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" - "github.com/cosmos/cosmos-sdk/x/stake" crypto "github.com/tendermint/go-crypto" ) // Keeper of the slashing store type Keeper struct { - storeKey sdk.StoreKey - cdc *wire.Codec - stakeKeeper stake.Keeper + storeKey sdk.StoreKey + cdc *wire.Codec + validatorSet sdk.ValidatorSet // codespace codespace sdk.CodespaceType } // NewKeeper creates a slashing keeper -func NewKeeper(cdc *wire.Codec, key sdk.StoreKey, sk stake.Keeper, codespace sdk.CodespaceType) Keeper { +func NewKeeper(cdc *wire.Codec, key sdk.StoreKey, vs sdk.ValidatorSet, codespace sdk.CodespaceType) Keeper { keeper := Keeper{ - storeKey: key, - cdc: cdc, - stakeKeeper: sk, - codespace: codespace, + storeKey: key, + cdc: cdc, + validatorSet: vs, + codespace: codespace, } return keeper } @@ -43,7 +42,7 @@ func (k Keeper) handleDoubleSign(ctx sdk.Context, height int64, timestamp int64, // Double sign confirmed logger.Info(fmt.Sprintf("Confirmed double sign from %s at height %d, age of %d less than max age of %d", pubkey.Address(), height, age, MaxEvidenceAge)) - k.stakeKeeper.Slash(ctx, pubkey, height, SlashFractionDoubleSign) + k.validatorSet.Slash(ctx, pubkey, height, SlashFractionDoubleSign) } // handle a validator signature, must be called once per validator per block @@ -81,8 +80,8 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, if height > minHeight && signInfo.SignedBlocksCounter < MinSignedPerWindow { // Downtime confirmed, slash, revoke, and jail the validator logger.Info(fmt.Sprintf("Validator %s past min height of %d and below signed blocks threshold of %d", pubkey.Address(), minHeight, MinSignedPerWindow)) - k.stakeKeeper.Slash(ctx, pubkey, height, SlashFractionDowntime) - k.stakeKeeper.Revoke(ctx, pubkey) + k.validatorSet.Slash(ctx, pubkey, height, SlashFractionDowntime) + k.validatorSet.Revoke(ctx, pubkey) signInfo.JailedUntil = ctx.BlockHeader().Time + DowntimeUnbondDuration } diff --git a/x/slashing/tick.go b/x/slashing/tick.go index c77e968871..d7bb79e272 100644 --- a/x/slashing/tick.go +++ b/x/slashing/tick.go @@ -41,7 +41,7 @@ func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, sk Keeper) (tags } // Iterate over all the validators which *should* have signed this block - sk.stakeKeeper.IterateValidatorsBonded(ctx, func(_ int64, validator sdk.Validator) (stop bool) { + sk.validatorSet.IterateValidatorsBonded(ctx, func(_ int64, validator sdk.Validator) (stop bool) { pubkey := validator.GetPubKey() present := true if _, ok := absent[pubkey]; ok { From 17ab868af55ca6ac537c41b948333d73a75c0742 Mon Sep 17 00:00:00 2001 From: Adrian Brink Date: Fri, 1 Jun 2018 22:50:41 -0700 Subject: [PATCH 149/548] Correct graphviz command in Makefile --- .gitignore | 5 ++++- Makefile | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index b0684f2070..494e724528 100644 --- a/.gitignore +++ b/.gitignore @@ -19,8 +19,11 @@ baseapp/data/* coverage.txt profile.out -### Vagrant ### +# Vagrant .vagrant/ *.box *.log vagrant + +# Graphviz +dependency-graph.png \ No newline at end of file diff --git a/Makefile b/Makefile index 7d2d23ad63..f7e2083c76 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,7 @@ get_vendor_deps: draw_deps: @# requires brew install graphviz or apt-get install graphviz go get github.com/RobotsAndPencils/goviz - @goviz -i github.com/tendermint/tendermint/cmd/tendermint -d 3 | dot -Tpng -o dependency-graph.png + @goviz -i github.com/cosmos/cosmos-sdk/cmd/gaia/cmd/gaiad -d 2 | dot -Tpng -o dependency-graph.png ######################################## From 5d2e7e94e5cedc3fc0386524fcf8afc99417dfad Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Sat, 2 Jun 2018 04:41:34 -0700 Subject: [PATCH 150/548] Run CLI tests --- Makefile | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 7d2d23ad63..5cc9072304 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,4 @@ PACKAGES=$(shell go list ./... | grep -v '/vendor/') -PACKAGES_NOCLITEST=$(shell go list ./... | grep -v '/vendor/' | grep -v github.com/cosmos/cosmos-sdk/cmd/gaia/cli_test) COMMIT_HASH := $(shell git rev-parse --short HEAD) BUILD_FLAGS = -ldflags "-X github.com/cosmos/cosmos-sdk/version.GitCommit=${COMMIT_HASH}" @@ -86,11 +85,11 @@ godocs: test: test_unit -test_cli: - @go test -count 1 -p 1 `go list github.com/cosmos/cosmos-sdk/cmd/gaia/cli_test` - test_unit: - @go test $(PACKAGES_NOCLITEST) + @GOCACHE=off go test -p 1 $(PACKAGES) + +test100: + @for i in {1..100}; do make test; done test_cover: @bash tests/test_cover.sh @@ -99,7 +98,7 @@ test_lint: gometalinter --disable-all --enable='golint' --vendor ./... benchmark: - @go test -bench=. $(PACKAGES_NOCLITEST) + @go test -bench=. $(PACKAGES) ######################################## From b0c58c0b37bd3ba51f1842e84566adb785d0710c Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Sat, 2 Jun 2018 04:49:46 -0700 Subject: [PATCH 151/548] Revert "Run CLI tests" This reverts commit 5d2e7e94e5cedc3fc0386524fcf8afc99417dfad. --- Makefile | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 5cc9072304..7d2d23ad63 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ PACKAGES=$(shell go list ./... | grep -v '/vendor/') +PACKAGES_NOCLITEST=$(shell go list ./... | grep -v '/vendor/' | grep -v github.com/cosmos/cosmos-sdk/cmd/gaia/cli_test) COMMIT_HASH := $(shell git rev-parse --short HEAD) BUILD_FLAGS = -ldflags "-X github.com/cosmos/cosmos-sdk/version.GitCommit=${COMMIT_HASH}" @@ -85,11 +86,11 @@ godocs: test: test_unit -test_unit: - @GOCACHE=off go test -p 1 $(PACKAGES) +test_cli: + @go test -count 1 -p 1 `go list github.com/cosmos/cosmos-sdk/cmd/gaia/cli_test` -test100: - @for i in {1..100}; do make test; done +test_unit: + @go test $(PACKAGES_NOCLITEST) test_cover: @bash tests/test_cover.sh @@ -98,7 +99,7 @@ test_lint: gometalinter --disable-all --enable='golint' --vendor ./... benchmark: - @go test -bench=. $(PACKAGES) + @go test -bench=. $(PACKAGES_NOCLITEST) ######################################## From 781975d6a0f546b7ef3599709affbea6a51c492c Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 4 Jun 2018 17:39:28 +0200 Subject: [PATCH 152/548] Feedback on REST server start (closes #973) --- client/lcd/root.go | 1 + 1 file changed, 1 insertion(+) diff --git a/client/lcd/root.go b/client/lcd/root.go index df8be897c3..5071343021 100644 --- a/client/lcd/root.go +++ b/client/lcd/root.go @@ -56,6 +56,7 @@ func startRESTServerFn(cdc *wire.Codec) func(cmd *cobra.Command, args []string) if err != nil { return err } + logger.Info("REST server started") // Wait forever and cleanup cmn.TrapSignal(func() { From b9888d64ba005420f1065b458467f9aa3e5389ea Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 4 Jun 2018 21:04:17 +0200 Subject: [PATCH 153/548] Update PR checkboxes --- .github/PULL_REQUEST_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 3ddec8d336..9d234c3262 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -5,3 +5,4 @@ * [ ] Wrote tests * [ ] Updated CHANGELOG.md * [ ] Updated Basecoin / other examples +* [ ] Squashed related commits and prefixed with PR number per [coding standards](https://github.com/tendermint/coding/blob/master/README.md#merging-a-pr) From 3f4b041d0beaae6b2fcca456e8cfefc143c89ed0 Mon Sep 17 00:00:00 2001 From: Jeremiah Andrews Date: Mon, 4 Jun 2018 12:33:09 -0700 Subject: [PATCH 154/548] changed to new cli commands in docs --- docs/sdk/lcd-rest-api.yaml | 20 ++++++++++---------- docs/staking/intro.rst | 24 ++++++++++++------------ docs/staking/testnet.rst | 6 +++--- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/docs/sdk/lcd-rest-api.yaml b/docs/sdk/lcd-rest-api.yaml index 34ccaa0ac8..408b2a792b 100644 --- a/docs/sdk/lcd-rest-api.yaml +++ b/docs/sdk/lcd-rest-api.yaml @@ -2,9 +2,9 @@ swagger: '2.0' info: version: '1.1.0' title: Light client daemon to interface with Cosmos baseserver via REST - description: Specification for the LCD provided by `gaiacli rest-server` + description: Specification for the LCD provided by `gaiacli advanced rest-server` + - securityDefinitions: kms: type: basic @@ -58,7 +58,7 @@ paths: responses: 200: description: '"true" or "false"' - + /keys: get: summary: List of accounts stored locally @@ -199,7 +199,7 @@ paths: # description: Tx was send and will probably be added to the next block # 400: # description: The Tx was malformated - + /accounts/{address}: parameters: - in: path @@ -545,7 +545,7 @@ paths: # description: Tx was send and will probably be added to the next block # 400: # description: The Tx was malformated - + definitions: Address: type: string @@ -630,7 +630,7 @@ definitions: Sig: type: string default: '' - Pubkey: + Pubkey: type: string default: '' TxSigned: @@ -704,17 +704,17 @@ definitions: properties: header: type: object - properties: + properties: chain_id: type: string example: gaia-2 - height: + height: type: number example: 1 - time: + time: type: string example: '2017-12-30T05:53:09.287+01:00' - num_txs: + num_txs: type: number example: 0 last_block_id: diff --git a/docs/staking/intro.rst b/docs/staking/intro.rst index 7b5acb9863..5f7cdd950e 100644 --- a/docs/staking/intro.rst +++ b/docs/staking/intro.rst @@ -203,7 +203,7 @@ where the ``--sequence`` flag is to be incremented for each transaction, the ``- :: - Please enter passphrase for alice: + Please enter passphrase for alice: { "check_tx": { "gas": 30 @@ -250,7 +250,7 @@ First, we need the pub_key data: :: - cat $HOME/.gaia2/priv_validator.json + cat $HOME/.gaia2/priv_validator.json the first part will look like: @@ -264,13 +264,13 @@ Now ``bob`` can declare candidacy to that pubkey: :: - gaiacli declare-candidacy --amount=10mycoin --name=bob --pubkey= --moniker=bobby + gaiacli stake create-validator --amount=10mycoin --name=bob --pubkey= --moniker=bobby with an output like: :: - Please enter passphrase for bob: + Please enter passphrase for bob: { "check_tx": { "gas": 30 @@ -285,7 +285,7 @@ We should see ``bob``'s account balance decrease by 10 mycoin: :: - gaiacli account 5D93A6059B6592833CBC8FA3DA90EE0382198985 + gaiacli account 5D93A6059B6592833CBC8FA3DA90EE0382198985 To confirm for certain the new validator is active, ask the tendermint node: @@ -306,19 +306,19 @@ First let's have ``alice`` send some coins to ``charlie``: :: - gaiacli tx --amount=1000mycoin --sequence=2 --name=alice --to=48F74F48281C89E5E4BE9092F735EA519768E8EF + gaiacli send --amount=1000mycoin --sequence=2 --name=alice --to=48F74F48281C89E5E4BE9092F735EA519768E8EF Then ``charlie`` will delegate some mycoin to ``bob``: :: - gaiacli tx delegate --amount=10mycoin --name=charlie --pubkey= + gaiacli advanced tendermint tx delegate --amount=10mycoin --name=charlie --pubkey= You'll see output like: :: - Please enter passphrase for charlie: + Please enter passphrase for charlie: { "check_tx": { "gas": 30 @@ -334,7 +334,7 @@ To get more information about the candidate, try: :: - gaiacli query candidate --pubkey= + gaiacli stake validator --pubkey= and you'll see output similar to: @@ -367,7 +367,7 @@ It's also possible the query the delegator's bond like so: :: - gaiacli query delegator-bond --delegator-address 48F74F48281C89E5E4BE9092F735EA519768E8EF --pubkey 52D6FCD8C92A97F7CCB01205ADF310A18411EA8FDCC10E65BF2FCDB05AD1689B + gaiacli stake delegation --delegator-address 48F74F48281C89E5E4BE9092F735EA519768E8EF --pubkey 52D6FCD8C92A97F7CCB01205ADF310A18411EA8FDCC10E65BF2FCDB05AD1689B with an output similar to: @@ -383,7 +383,7 @@ with an output similar to: "Shares": 20 } } - + where the ``--delegator-address`` is ``charlie``'s address and the ``-pubkey`` is the same as we've been using. @@ -396,7 +396,7 @@ your VotingPower reduce and your account balance increase. :: - gaiacli unbond --amount=5mycoin --name=charlie --pubkey= + gaiacli stake unbond --amount=5mycoin --name=charlie --pubkey= gaiacli account 48F74F48281C89E5E4BE9092F735EA519768E8EF See the bond decrease with ``gaiacli query delegator-bond`` like above. diff --git a/docs/staking/testnet.rst b/docs/staking/testnet.rst index 92aa93eb26..c5341fee66 100644 --- a/docs/staking/testnet.rst +++ b/docs/staking/testnet.rst @@ -16,7 +16,7 @@ First, generate a couple of genesis transactions to be incorparated into the gen gaiacli keys list **Note:** If you've already run these tests you may need to overwrite keys using the ``--OWK`` flag -When you list the keys you should see two addresses, we'll need these later so take note. +When you list the keys you should see two addresses, we'll need these later so take note. Now let's actually create the genesis files for both nodes: :: @@ -44,7 +44,7 @@ Nice. We can also lookup the validator set: :: - gaiacli validatorset + gaiacli advanced tendermint validatorset Then, we try to transfer some ``steak`` to another account: @@ -72,7 +72,7 @@ Finally, to relinquish all your power, unbond some coins. You should see your Vo :: - gaiacli unbond --chain-id= --name=test + gaiacli stake unbond --chain-id= --name=test That's it! From be7ec5bc07e3dec3cbcf72c5050b9aeeb37d4452 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 5 Jun 2018 01:42:01 +0200 Subject: [PATCH 155/548] Merge PR #1115: Update SDK to ABCI v11 --- Gopkg.lock | 10 +-- Gopkg.toml | 4 +- baseapp/baseapp.go | 14 ++-- baseapp/baseapp_test.go | 18 +++-- cmd/gaia/app/app.go | 2 +- cmd/gaia/app/app_test.go | 2 +- examples/basecoin/app/app.go | 2 +- examples/basecoin/app/app_test.go | 6 +- examples/democoin/app/app.go | 2 +- examples/democoin/app/app_test.go | 10 +-- examples/democoin/x/simplestake/handler.go | 5 +- mock/app.go | 2 +- mock/app_test.go | 2 +- types/context.go | 12 ++-- types/stake.go | 3 +- x/slashing/test_common.go | 2 + x/slashing/tick.go | 38 ++++------- x/slashing/tick_test.go | 77 ++++++++++++++++++++++ x/stake/keeper_test.go | 5 +- x/stake/validator.go | 5 +- 20 files changed, 149 insertions(+), 72 deletions(-) create mode 100644 x/slashing/tick_test.go diff --git a/Gopkg.lock b/Gopkg.lock index eefc701b02..3e7d8c9d98 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -267,8 +267,8 @@ "server", "types" ] - revision = "f9dce537281ffba5d1e047e6729429f7e5fb90c9" - version = "v0.11.0-rc0" + revision = "9af8b7a7c87478869f8c280ed9539470b8f470b4" + version = "v0.11.0-rc4" [[projects]] branch = "master" @@ -347,8 +347,8 @@ "types/priv_validator", "version" ] - revision = "73de99ecab464208f6ea3a96525f4e4b78425e61" - version = "v0.20.0-rc0" + revision = "b5baab0238c9ec26e3b2d229b0243f9ff9220bdb" + version = "v0.20.0-rc3" [[projects]] branch = "develop" @@ -463,6 +463,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "c8d0282dfa5b2bb7a0eb54fc24f42021e63f282265332678593658119bf5023b" + inputs-digest = "ccb2ab7644a38c2d0326280582f758256e37fc98c3ef0403581e3b85cff42188" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 8c3f5131d0..05b14be60c 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -54,7 +54,7 @@ [[constraint]] name = "github.com/tendermint/abci" - version = "0.11.0-rc0" + version = "=0.11.0-rc4" [[constraint]] name = "github.com/tendermint/go-crypto" @@ -70,7 +70,7 @@ [[constraint]] name = "github.com/tendermint/tendermint" - version = "0.20.0-rc0" + version = "=0.20.0-rc3" [[override]] name = "github.com/tendermint/tmlibs" diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index cdc5ffcf7a..4d32b92f5c 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -65,10 +65,10 @@ type BaseApp struct { // See methods setCheckState and setDeliverState. // .valUpdates accumulate in DeliverTx and are reset in BeginBlock. // QUESTION: should we put valUpdates in the deliverState.ctx? - checkState *state // for CheckTx - deliverState *state // for DeliverTx - valUpdates []abci.Validator // cached validator changes from DeliverTx - absentValidators [][]byte // absent validators from begin block + checkState *state // for CheckTx + deliverState *state // for DeliverTx + valUpdates []abci.Validator // cached validator changes from DeliverTx + signedValidators []abci.SigningValidator // absent validators from begin block } var _ abci.Application = (*BaseApp)(nil) @@ -385,8 +385,8 @@ func (app *BaseApp) BeginBlock(req abci.RequestBeginBlock) (res abci.ResponseBeg if app.beginBlocker != nil { res = app.beginBlocker(app.deliverState.ctx, req) } - // set the absent validators for addition to context in deliverTx - app.absentValidators = req.AbsentValidators + // set the signed validators for addition to context in deliverTx + app.signedValidators = req.Validators return } @@ -496,7 +496,7 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte, tx sdk.Tx) (result sdk ctx = app.checkState.ctx.WithTxBytes(txBytes) } else { ctx = app.deliverState.ctx.WithTxBytes(txBytes) - ctx = ctx.WithAbsentValidators(app.absentValidators) + ctx = ctx.WithSigningValidators(app.signedValidators) } // Simulate a DeliverTx for gas calculation diff --git a/baseapp/baseapp_test.go b/baseapp/baseapp_test.go index 0b825e1ee8..a0b83d35cb 100644 --- a/baseapp/baseapp_test.go +++ b/baseapp/baseapp_test.go @@ -1,7 +1,6 @@ package baseapp import ( - "bytes" "encoding/json" "fmt" "os" @@ -12,6 +11,7 @@ import ( abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" + tmtypes "github.com/tendermint/tendermint/types" cmn "github.com/tendermint/tmlibs/common" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" @@ -183,7 +183,7 @@ func TestInitChainer(t *testing.T) { // set initChainer and try again - should see the value app.SetInitChainer(initChainer) - app.InitChain(abci.RequestInitChain{GenesisBytes: []byte("{}")}) // must have valid JSON genesis file, even if empty + app.InitChain(abci.RequestInitChain{AppStateBytes: []byte("{}")}) // must have valid JSON genesis file, even if empty app.Commit() res = app.Query(query) assert.Equal(t, value, res.Value) @@ -510,15 +510,20 @@ func TestValidatorChange(t *testing.T) { // Assert that validator updates are correct. for _, val := range valSet { + + pubkey, err := tmtypes.PB2TM.PubKey(val.PubKey) // Sanity - assert.NotEqual(t, len(val.PubKey), 0) + assert.Nil(t, err) // Find matching update and splice it out. - for j := 0; j < len(valUpdates); { + for j := 0; j < len(valUpdates); j++ { valUpdate := valUpdates[j] + updatePubkey, err := tmtypes.PB2TM.PubKey(valUpdate.PubKey) + assert.Nil(t, err) + // Matched. - if bytes.Equal(valUpdate.PubKey, val.PubKey) { + if updatePubkey.Equals(pubkey) { assert.Equal(t, valUpdate.Power, val.Power+1) if j < len(valUpdates)-1 { // Splice it out. @@ -528,7 +533,6 @@ func TestValidatorChange(t *testing.T) { } // Not matched. - j++ } } assert.Equal(t, len(valUpdates), 0, "Some validator updates were unexpected") @@ -542,7 +546,7 @@ func randPower() int64 { func makeVal(secret string) abci.Validator { return abci.Validator{ - PubKey: makePubKey(secret).Bytes(), + PubKey: tmtypes.TM2PB.PubKey(makePubKey(secret)), Power: randPower(), } } diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index f8e71be293..8f8ed281ed 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -130,7 +130,7 @@ func (app *GaiaApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.R // custom logic for gaia initialization func (app *GaiaApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { - stateJSON := req.GenesisBytes + stateJSON := req.AppStateBytes // TODO is this now the whole genesis file? var genesisState GenesisState diff --git a/cmd/gaia/app/app_test.go b/cmd/gaia/app/app_test.go index 7ba9752361..b6fffac32f 100644 --- a/cmd/gaia/app/app_test.go +++ b/cmd/gaia/app/app_test.go @@ -114,7 +114,7 @@ func setGenesis(gapp *GaiaApp, accs ...*auth.BaseAccount) error { // Initialize the chain vals := []abci.Validator{} - gapp.InitChain(abci.RequestInitChain{vals, stateBytes}) + gapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) gapp.Commit() return nil diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index f079010923..1718b8be23 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -130,7 +130,7 @@ func (app *BasecoinApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) ab // Custom logic for basecoin initialization func (app *BasecoinApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { - stateJSON := req.GenesisBytes + stateJSON := req.AppStateBytes genesisState := new(types.GenesisState) err := app.cdc.UnmarshalJSON(stateJSON, genesisState) diff --git a/examples/basecoin/app/app_test.go b/examples/basecoin/app/app_test.go index 8054baab27..3027a84707 100644 --- a/examples/basecoin/app/app_test.go +++ b/examples/basecoin/app/app_test.go @@ -105,7 +105,7 @@ func setGenesis(bapp *BasecoinApp, accs ...auth.BaseAccount) error { // Initialize the chain vals := []abci.Validator{} - bapp.InitChain(abci.RequestInitChain{vals, stateBytes}) + bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) bapp.Commit() return nil @@ -165,7 +165,7 @@ func TestSortGenesis(t *testing.T) { // Initialize the chain vals := []abci.Validator{} - bapp.InitChain(abci.RequestInitChain{vals, []byte(genState)}) + bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: []byte(genState)}) bapp.Commit() // Unsorted coins means invalid @@ -427,7 +427,7 @@ func TestMsgQuiz(t *testing.T) { // Initialize the chain (nil) vals := []abci.Validator{} - bapp.InitChain(abci.RequestInitChain{vals, stateBytes}) + bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) bapp.Commit() // A checkTx context (true) diff --git a/examples/democoin/app/app.go b/examples/democoin/app/app.go index b8b8642cf3..2075a64da0 100644 --- a/examples/democoin/app/app.go +++ b/examples/democoin/app/app.go @@ -118,7 +118,7 @@ func MakeCodec() *wire.Codec { // custom logic for democoin initialization func (app *DemocoinApp) initChainerFn(coolKeeper cool.Keeper, powKeeper pow.Keeper) sdk.InitChainer { return func(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { - stateJSON := req.GenesisBytes + stateJSON := req.AppStateBytes genesisState := new(types.GenesisState) err := app.cdc.UnmarshalJSON(stateJSON, genesisState) diff --git a/examples/democoin/app/app_test.go b/examples/democoin/app/app_test.go index e025c50627..ba041bcff1 100644 --- a/examples/democoin/app/app_test.go +++ b/examples/democoin/app/app_test.go @@ -142,7 +142,7 @@ func TestGenesis(t *testing.T) { stateBytes, err := json.MarshalIndent(genesisState, "", "\t") vals := []abci.Validator{} - bapp.InitChain(abci.RequestInitChain{vals, stateBytes}) + bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) bapp.Commit() // A checkTx context @@ -184,7 +184,7 @@ func TestMsgSendWithAccounts(t *testing.T) { // Initialize the chain vals := []abci.Validator{} - bapp.InitChain(abci.RequestInitChain{vals, stateBytes}) + bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) bapp.Commit() // A checkTx context (true) @@ -262,7 +262,7 @@ func TestMsgMine(t *testing.T) { // Initialize the chain (nil) vals := []abci.Validator{} - bapp.InitChain(abci.RequestInitChain{vals, stateBytes}) + bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) bapp.Commit() // A checkTx context (true) @@ -309,7 +309,7 @@ func TestMsgQuiz(t *testing.T) { // Initialize the chain (nil) vals := []abci.Validator{} - bapp.InitChain(abci.RequestInitChain{vals, stateBytes}) + bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) bapp.Commit() // A checkTx context (true) @@ -356,7 +356,7 @@ func TestHandler(t *testing.T) { } stateBytes, err := json.MarshalIndent(genesisState, "", "\t") require.Nil(t, err) - bapp.InitChain(abci.RequestInitChain{vals, stateBytes}) + bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) bapp.Commit() // A checkTx context (true) diff --git a/examples/democoin/x/simplestake/handler.go b/examples/democoin/x/simplestake/handler.go index a84e8b07bf..a94da3d5ea 100644 --- a/examples/democoin/x/simplestake/handler.go +++ b/examples/democoin/x/simplestake/handler.go @@ -2,6 +2,7 @@ package simplestake import ( abci "github.com/tendermint/abci/types" + tmtypes "github.com/tendermint/tendermint/types" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -27,7 +28,7 @@ func handleMsgBond(ctx sdk.Context, k Keeper, msg MsgBond) sdk.Result { } valSet := abci.Validator{ - PubKey: msg.PubKey.Bytes(), + PubKey: tmtypes.TM2PB.PubKey(msg.PubKey), Power: power, } @@ -44,7 +45,7 @@ func handleMsgUnbond(ctx sdk.Context, k Keeper, msg MsgUnbond) sdk.Result { } valSet := abci.Validator{ - PubKey: pubKey.Bytes(), + PubKey: tmtypes.TM2PB.PubKey(pubKey), Power: int64(0), } diff --git a/mock/app.go b/mock/app.go index 09d7a658c7..ab1a8447a5 100644 --- a/mock/app.go +++ b/mock/app.go @@ -88,7 +88,7 @@ type GenesisJSON struct { // with key/value pairs func InitChainer(key sdk.StoreKey) func(sdk.Context, abci.RequestInitChain) abci.ResponseInitChain { return func(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { - stateJSON := req.GenesisBytes + stateJSON := req.AppStateBytes genesisState := new(GenesisJSON) err := json.Unmarshal(stateJSON, genesisState) diff --git a/mock/app_test.go b/mock/app_test.go index 50b0761c17..be1d778295 100644 --- a/mock/app_test.go +++ b/mock/app_test.go @@ -26,7 +26,7 @@ func TestInitApp(t *testing.T) { //TODO test validators in the init chain? req := abci.RequestInitChain{ - GenesisBytes: appState, + AppStateBytes: appState, } app.InitChain(req) app.Commit() diff --git a/types/context.go b/types/context.go index 10ae99724f..c4fc385c70 100644 --- a/types/context.go +++ b/types/context.go @@ -44,7 +44,7 @@ func NewContext(ms MultiStore, header abci.Header, isCheckTx bool, txBytes []byt c = c.WithIsCheckTx(isCheckTx) c = c.WithTxBytes(txBytes) c = c.WithLogger(logger) - c = c.WithAbsentValidators(nil) + c = c.WithSigningValidators(nil) c = c.WithGasMeter(NewInfiniteGasMeter()) return c } @@ -130,7 +130,7 @@ const ( contextKeyIsCheckTx contextKeyTxBytes contextKeyLogger - contextKeyAbsentValidators + contextKeySigningValidators contextKeyGasMeter ) @@ -160,8 +160,8 @@ func (c Context) TxBytes() []byte { func (c Context) Logger() log.Logger { return c.Value(contextKeyLogger).(log.Logger) } -func (c Context) AbsentValidators() [][]byte { - return c.Value(contextKeyAbsentValidators).([][]byte) +func (c Context) SigningValidators() []abci.SigningValidator { + return c.Value(contextKeySigningValidators).([]abci.SigningValidator) } func (c Context) GasMeter() GasMeter { return c.Value(contextKeyGasMeter).(GasMeter) @@ -188,8 +188,8 @@ func (c Context) WithTxBytes(txBytes []byte) Context { func (c Context) WithLogger(logger log.Logger) Context { return c.withValue(contextKeyLogger, logger) } -func (c Context) WithAbsentValidators(AbsentValidators [][]byte) Context { - return c.withValue(contextKeyAbsentValidators, AbsentValidators) +func (c Context) WithSigningValidators(SigningValidators []abci.SigningValidator) Context { + return c.withValue(contextKeySigningValidators, SigningValidators) } func (c Context) WithGasMeter(meter GasMeter) Context { return c.withValue(contextKeyGasMeter, meter) diff --git a/types/stake.go b/types/stake.go index bfcef7fa0c..6a620db762 100644 --- a/types/stake.go +++ b/types/stake.go @@ -3,6 +3,7 @@ package types import ( abci "github.com/tendermint/abci/types" "github.com/tendermint/go-crypto" + tmtypes "github.com/tendermint/tendermint/types" ) // status of a validator @@ -41,7 +42,7 @@ type Validator interface { // validator which fulfills abci validator interface for use in Tendermint func ABCIValidator(v Validator) abci.Validator { return abci.Validator{ - PubKey: v.GetPubKey().Bytes(), + PubKey: tmtypes.TM2PB.PubKey(v.GetPubKey()), Power: v.GetPower().Evaluate(), } } diff --git a/x/slashing/test_common.go b/x/slashing/test_common.go index c76eaadde7..94d323d232 100644 --- a/x/slashing/test_common.go +++ b/x/slashing/test_common.go @@ -24,10 +24,12 @@ var ( addrs = []sdk.Address{ testAddr("A58856F0FD53BF058B4909A21AEC019107BA6160"), testAddr("A58856F0FD53BF058B4909A21AEC019107BA6161"), + testAddr("A58856F0FD53BF058B4909A21AEC019107BA6162"), } pks = []crypto.PubKey{ newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB50"), newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB51"), + newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB52"), } initCoins int64 = 200 ) diff --git a/x/slashing/tick.go b/x/slashing/tick.go index d7bb79e272..526baece08 100644 --- a/x/slashing/tick.go +++ b/x/slashing/tick.go @@ -6,49 +6,39 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" abci "github.com/tendermint/abci/types" - crypto "github.com/tendermint/go-crypto" tmtypes "github.com/tendermint/tendermint/types" ) -// slash begin blocker functionality +// slashing begin block functionality func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, sk Keeper) (tags sdk.Tags) { - // Tag the height heightBytes := make([]byte, 8) binary.LittleEndian.PutUint64(heightBytes, uint64(req.Header.Height)) - - // TODO Add some more tags so clients can track slashing events tags = sdk.NewTags("height", heightBytes) // Deal with any equivocation evidence for _, evidence := range req.ByzantineValidators { - var pk crypto.PubKey - sk.cdc.MustUnmarshalBinaryBare(evidence.PubKey, &pk) + pk, err := tmtypes.PB2TM.PubKey(evidence.Validator.PubKey) + if err != nil { + panic(err) + } switch string(evidence.Type) { - case tmtypes.DUPLICATE_VOTE: + case tmtypes.ABCIEvidenceTypeDuplicateVote: sk.handleDoubleSign(ctx, evidence.Height, evidence.Time, pk) default: ctx.Logger().With("module", "x/slashing").Error(fmt.Sprintf("Ignored unknown evidence type: %s", string(evidence.Type))) } } - // Figure out which validators were absent - absent := make(map[crypto.PubKey]struct{}) - for _, pubkey := range req.AbsentValidators { - var pk crypto.PubKey - sk.cdc.MustUnmarshalBinaryBare(pubkey, &pk) - absent[pk] = struct{}{} - } - - // Iterate over all the validators which *should* have signed this block - sk.validatorSet.IterateValidatorsBonded(ctx, func(_ int64, validator sdk.Validator) (stop bool) { - pubkey := validator.GetPubKey() - present := true - if _, ok := absent[pubkey]; ok { - present = false + // Iterate over all the validators which *should* have signed this block + for _, validator := range req.Validators { + present := validator.SignedLastBlock + pubkey, err := tmtypes.PB2TM.PubKey(validator.Validator.PubKey) + if err != nil { + panic(err) } sk.handleValidatorSignature(ctx, pubkey, present) - return false - }) + } + return } diff --git a/x/slashing/tick_test.go b/x/slashing/tick_test.go new file mode 100644 index 0000000000..adf2e5e5b9 --- /dev/null +++ b/x/slashing/tick_test.go @@ -0,0 +1,77 @@ +package slashing + +import ( + "testing" + + "github.com/stretchr/testify/require" + + abci "github.com/tendermint/abci/types" + tmtypes "github.com/tendermint/tendermint/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/stake" +) + +func TestBeginBlocker(t *testing.T) { + ctx, ck, sk, keeper := createTestInput(t) + addr, pk, amt := addrs[2], pks[2], int64(100) + + // bond the validator + got := stake.NewHandler(sk)(ctx, newTestMsgCreateValidator(addr, pk, amt)) + require.True(t, got.IsOK()) + stake.EndBlocker(ctx, sk) + require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) + require.Equal(t, sdk.NewRat(amt), sk.Validator(ctx, addr).GetPower()) + + val := abci.Validator{ + PubKey: tmtypes.TM2PB.PubKey(pk), + Power: amt, + } + + // mark the validator as having signed + req := abci.RequestBeginBlock{ + Validators: []abci.SigningValidator{{ + Validator: val, + SignedLastBlock: true, + }}, + } + BeginBlocker(ctx, req, keeper) + + info, found := keeper.getValidatorSigningInfo(ctx, pk.Address()) + require.True(t, found) + require.Equal(t, ctx.BlockHeight(), info.StartHeight) + require.Equal(t, int64(1), info.IndexOffset) + require.Equal(t, int64(0), info.JailedUntil) + require.Equal(t, int64(1), info.SignedBlocksCounter) + + height := int64(0) + + // for 50 blocks, mark the validator as having signed + for ; height < 50; height++ { + ctx = ctx.WithBlockHeight(height) + req = abci.RequestBeginBlock{ + Validators: []abci.SigningValidator{{ + Validator: val, + SignedLastBlock: true, + }}, + } + BeginBlocker(ctx, req, keeper) + } + + // for 51 blocks, mark the validator as having not signed + for ; height < 102; height++ { + ctx = ctx.WithBlockHeight(height) + req = abci.RequestBeginBlock{ + Validators: []abci.SigningValidator{{ + Validator: val, + SignedLastBlock: false, + }}, + } + BeginBlocker(ctx, req, keeper) + } + + // validator should be revoked + validator, found := sk.GetValidatorByPubKey(ctx, pk) + require.True(t, found) + require.Equal(t, sdk.Unbonded, validator.GetStatus()) +} diff --git a/x/stake/keeper_test.go b/x/stake/keeper_test.go index 01d4434e83..69a2144283 100644 --- a/x/stake/keeper_test.go +++ b/x/stake/keeper_test.go @@ -4,6 +4,7 @@ import ( "testing" sdk "github.com/cosmos/cosmos-sdk/types" + tmtypes "github.com/tendermint/tendermint/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -463,8 +464,8 @@ func TestGetTendermintUpdatesAllNone(t *testing.T) { updates = keeper.getTendermintUpdates(ctx) require.Equal(t, 2, len(updates)) - assert.Equal(t, validators[0].PubKey.Bytes(), updates[0].PubKey) - assert.Equal(t, validators[1].PubKey.Bytes(), updates[1].PubKey) + assert.Equal(t, tmtypes.TM2PB.PubKey(validators[0].PubKey), updates[0].PubKey) + assert.Equal(t, tmtypes.TM2PB.PubKey(validators[1].PubKey), updates[1].PubKey) assert.Equal(t, int64(0), updates[0].Power) assert.Equal(t, int64(0), updates[1].Power) } diff --git a/x/stake/validator.go b/x/stake/validator.go index 1d9957d990..a0b484d712 100644 --- a/x/stake/validator.go +++ b/x/stake/validator.go @@ -8,6 +8,7 @@ import ( "github.com/cosmos/cosmos-sdk/wire" abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" + tmtypes "github.com/tendermint/tendermint/types" ) // Validator defines the total amount of bond shares and their exchange rate to @@ -101,7 +102,7 @@ func NewDescription(moniker, identity, website, details string) Description { // abci validator from stake validator type func (v Validator) abciValidator(cdc *wire.Codec) abci.Validator { return abci.Validator{ - PubKey: v.PubKey.Bytes(), + PubKey: tmtypes.TM2PB.PubKey(v.PubKey), Power: v.PoolShares.Bonded().Evaluate(), } } @@ -110,7 +111,7 @@ func (v Validator) abciValidator(cdc *wire.Codec) abci.Validator { // with zero power used for validator updates func (v Validator) abciValidatorZero(cdc *wire.Codec) abci.Validator { return abci.Validator{ - PubKey: v.PubKey.Bytes(), + PubKey: tmtypes.TM2PB.PubKey(v.PubKey), Power: 0, } } From 5a831bd0f89c15ebe5d6a8d3f55d0779daf7308f Mon Sep 17 00:00:00 2001 From: Jeremiah Andrews Date: Mon, 4 Jun 2018 18:35:07 -0700 Subject: [PATCH 156/548] additional changes --- client/rpc/validators.go | 2 +- docs/staking/intro.rst | 16 ++++++++-------- docs/staking/testnet.rst | 2 +- x/slashing/client/cli/query.go | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/client/rpc/validators.go b/client/rpc/validators.go index 27b7fce99e..d1aa6c9c18 100644 --- a/client/rpc/validators.go +++ b/client/rpc/validators.go @@ -17,7 +17,7 @@ import ( //ValidatorCommand returns the validator set for a given height func ValidatorCommand() *cobra.Command { cmd := &cobra.Command{ - Use: "validatorset [height]", + Use: "validator-set [height]", Short: "Get the full tendermint validator set at given height", Args: cobra.MaximumNArgs(1), RunE: printValidators, diff --git a/docs/staking/intro.rst b/docs/staking/intro.rst index 5f7cdd950e..00a68811a8 100644 --- a/docs/staking/intro.rst +++ b/docs/staking/intro.rst @@ -260,11 +260,11 @@ the first part will look like: and you want the ``pub_key`` ``data`` that starts with ``96864CE``. -Now ``bob`` can declare candidacy to that pubkey: +Now ``bob`` can create a validator with that pubkey. :: - gaiacli stake create-validator --amount=10mycoin --name=bob --pubkey= --moniker=bobby + gaiacli stake create-validator --amount=10mycoin --name=bob --address-validator=
--pub-key= --moniker=bobby with an output like: @@ -312,7 +312,7 @@ Then ``charlie`` will delegate some mycoin to ``bob``: :: - gaiacli advanced tendermint tx delegate --amount=10mycoin --name=charlie --pubkey= + gaiacli stake delegate --amount=10mycoin --address-delegator= --address-validator= --name=charlie You'll see output like: @@ -334,7 +334,7 @@ To get more information about the candidate, try: :: - gaiacli stake validator --pubkey= + gaiacli stake validator
and you'll see output similar to: @@ -367,7 +367,7 @@ It's also possible the query the delegator's bond like so: :: - gaiacli stake delegation --delegator-address 48F74F48281C89E5E4BE9092F735EA519768E8EF --pubkey 52D6FCD8C92A97F7CCB01205ADF310A18411EA8FDCC10E65BF2FCDB05AD1689B + gaiacli stake delegation --address-delegator=
--address-validator=
with an output similar to: @@ -385,7 +385,7 @@ with an output similar to: } -where the ``--delegator-address`` is ``charlie``'s address and the ``-pubkey`` is the same as we've been using. +where the ``--address-delegator`` is ``charlie``'s address and the ``--address-validator`` is ``bob``'s address. Unbonding @@ -396,7 +396,7 @@ your VotingPower reduce and your account balance increase. :: - gaiacli stake unbond --amount=5mycoin --name=charlie --pubkey= + gaiacli stake unbond --amount=5mycoin --name=charlie --address-delegator=
--address-validator=
gaiacli account 48F74F48281C89E5E4BE9092F735EA519768E8EF -See the bond decrease with ``gaiacli query delegator-bond`` like above. +See the bond decrease with ``gaiacli stake delegation`` like above. diff --git a/docs/staking/testnet.rst b/docs/staking/testnet.rst index c5341fee66..4fca09c4ad 100644 --- a/docs/staking/testnet.rst +++ b/docs/staking/testnet.rst @@ -44,7 +44,7 @@ Nice. We can also lookup the validator set: :: - gaiacli advanced tendermint validatorset + gaiacli advanced tendermint validator-set Then, we try to transfer some ``steak`` to another account: diff --git a/x/slashing/client/cli/query.go b/x/slashing/client/cli/query.go index 35f99d2fa3..948e756675 100644 --- a/x/slashing/client/cli/query.go +++ b/x/slashing/client/cli/query.go @@ -16,7 +16,7 @@ import ( // get the command to query signing info func GetCmdQuerySigningInfo(storeName string, cdc *wire.Codec) *cobra.Command { cmd := &cobra.Command{ - Use: "signing_info [validator-pubkey]", + Use: "signing-info [validator-pubkey]", Short: "Query a validator's signing information", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { From 91c89627402897e77e3ff183afbcd46e6a03c76b Mon Sep 17 00:00:00 2001 From: Jeremiah Andrews Date: Mon, 4 Jun 2018 18:38:50 -0700 Subject: [PATCH 157/548] changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86a344654e..22969a4037 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ FIXES * [cli] fixed cli-bash tests * [ci] added cli-bash tests * [basecoin] updated basecoin for stake and slashing +* [docs] fixed references to old cli commands ## 0.18.1 @@ -32,7 +33,7 @@ BREAKING CHANGES * [x/auth] removed the FeeHandler function from the AnteHandler, Replaced with FeeKeeper * [x/auth] Removed GetSignatures() from Tx interface (as different Tx styles might use something different than StdSignature) * [store] Removed SubspaceIterator and ReverseSubspaceIterator from KVStore interface and replaced them with helper functions in /types -* Switch to bech32cosmos on all human readable inputs and outputs +* Switch to bech32cosmos on all human readable inputs and outputs BUG FIXES From fefd1d2d8b593812404e52d201e6060e893d4d14 Mon Sep 17 00:00:00 2001 From: Dev Ojha Date: Mon, 4 Jun 2018 21:55:02 -0700 Subject: [PATCH 158/548] Merge PR #1075: Add more baseapp tests * Complete TestCheckTx * Add a test for delivering invalid transaction types * Add test for loading of older versions --- baseapp/baseapp_test.go | 158 ++++++++++++++++++++++++++++++++-------- 1 file changed, 128 insertions(+), 30 deletions(-) diff --git a/baseapp/baseapp_test.go b/baseapp/baseapp_test.go index a0b83d35cb..532d39f1e6 100644 --- a/baseapp/baseapp_test.go +++ b/baseapp/baseapp_test.go @@ -83,18 +83,36 @@ func TestLoadVersion(t *testing.T) { header := abci.Header{Height: 1} app.BeginBlock(abci.RequestBeginBlock{Header: header}) res := app.Commit() - commitID := sdk.CommitID{1, res.Data} + commitID1 := sdk.CommitID{1, res.Data} + header = abci.Header{Height: 2} + app.BeginBlock(abci.RequestBeginBlock{Header: header}) + res = app.Commit() + commitID2 := sdk.CommitID{2, res.Data} - // reload + // reload with LoadLatestVersion app = NewBaseApp(name, nil, logger, db) app.MountStoresIAVL(capKey) - err = app.LoadLatestVersion(capKey) // needed to make stores non-nil + err = app.LoadLatestVersion(capKey) assert.Nil(t, err) + testLoadVersionHelper(t, app, int64(2), commitID2) - lastHeight = app.LastBlockHeight() - lastID = app.LastCommitID() - assert.Equal(t, int64(1), lastHeight) - assert.Equal(t, commitID, lastID) + // reload with LoadVersion, see if you can commit the same block and get + // the same result + app = NewBaseApp(name, nil, logger, db) + app.MountStoresIAVL(capKey) + err = app.LoadVersion(1, capKey) + assert.Nil(t, err) + testLoadVersionHelper(t, app, int64(1), commitID1) + app.BeginBlock(abci.RequestBeginBlock{Header: header}) + app.Commit() + testLoadVersionHelper(t, app, int64(2), commitID2) +} + +func testLoadVersionHelper(t *testing.T, app *BaseApp, expectedHeight int64, expectedID sdk.CommitID) { + lastHeight := app.LastBlockHeight() + lastID := app.LastCommitID() + assert.Equal(t, expectedHeight, lastHeight) + assert.Equal(t, expectedID, lastID) } // Test that the app hash is static @@ -206,11 +224,91 @@ func TestInitChainer(t *testing.T) { assert.Equal(t, value, res.Value) } +func getStateCheckingHandler(t *testing.T, capKey *sdk.KVStoreKey, txPerHeight int, checkHeader bool) func(ctx sdk.Context, msg sdk.Msg) sdk.Result { + counter := 0 + return func(ctx sdk.Context, msg sdk.Msg) sdk.Result { + store := ctx.KVStore(capKey) + // Checking state gets updated between checkTx's / DeliverTx's + // on the store within a block. + if counter > 0 { + // check previous value in store + counterBytes := []byte{byte(counter - 1)} + prevBytes := store.Get(counterBytes) + assert.Equal(t, counterBytes, prevBytes) + } + + // set the current counter in the store + counterBytes := []byte{byte(counter)} + store.Set(counterBytes, counterBytes) + + // check that we can see the current header + // wrapped in an if, so it can be reused between CheckTx and DeliverTx tests. + if checkHeader { + thisHeader := ctx.BlockHeader() + height := int64((counter / txPerHeight) + 1) + assert.Equal(t, height, thisHeader.Height) + } + + counter++ + return sdk.Result{} + } +} + +// A mock transaction that has a validation which can fail. +type testTx struct { + positiveNum int64 +} + +const msgType2 = "testTx" + +func (tx testTx) Type() string { return msgType2 } +func (tx testTx) GetMsg() sdk.Msg { return tx } +func (tx testTx) GetSignBytes() []byte { return nil } +func (tx testTx) GetSigners() []sdk.Address { return nil } +func (tx testTx) GetSignatures() []auth.StdSignature { return nil } +func (tx testTx) ValidateBasic() sdk.Error { + if tx.positiveNum >= 0 { + return nil + } + return sdk.ErrTxDecode("positiveNum should be a non-negative integer.") +} + // Test that successive CheckTx can see each others' effects // on the store within a block, and that the CheckTx state // gets reset to the latest Committed state during Commit func TestCheckTx(t *testing.T) { - // TODO + // Initialize an app for testing + app := newBaseApp(t.Name()) + // make a cap key and mount the store + capKey := sdk.NewKVStoreKey("main") + app.MountStoresIAVL(capKey) + err := app.LoadLatestVersion(capKey) // needed to make stores non-nil + assert.Nil(t, err) + app.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx) (newCtx sdk.Context, res sdk.Result, abort bool) { return }) + + txPerHeight := 3 + app.Router().AddRoute(msgType, getStateCheckingHandler(t, capKey, txPerHeight, false)). + AddRoute(msgType2, func(ctx sdk.Context, msg sdk.Msg) (res sdk.Result) { return }) + tx := testUpdatePowerTx{} // doesn't matter + for i := 0; i < txPerHeight; i++ { + app.Check(tx) + } + // If it gets to this point, then successive CheckTx's can see the effects of + // other CheckTx's on the block. The following checks that if another block + // is committed, the CheckTx State will reset. + app.BeginBlock(abci.RequestBeginBlock{}) + tx2 := testTx{} + for i := 0; i < txPerHeight; i++ { + app.Deliver(tx2) + } + app.EndBlock(abci.RequestEndBlock{}) + app.Commit() + + checkStateStore := app.checkState.ctx.KVStore(capKey) + for i := 0; i < txPerHeight; i++ { + storedValue := checkStateStore.Get([]byte{byte(i)}) + assert.Nil(t, storedValue) + } } // Test that successive DeliverTx can see each others' effects @@ -224,30 +322,9 @@ func TestDeliverTx(t *testing.T) { err := app.LoadLatestVersion(capKey) // needed to make stores non-nil assert.Nil(t, err) - counter := 0 txPerHeight := 2 app.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx) (newCtx sdk.Context, res sdk.Result, abort bool) { return }) - app.Router().AddRoute(msgType, func(ctx sdk.Context, msg sdk.Msg) sdk.Result { - store := ctx.KVStore(capKey) - if counter > 0 { - // check previous value in store - counterBytes := []byte{byte(counter - 1)} - prevBytes := store.Get(counterBytes) - assert.Equal(t, prevBytes, counterBytes) - } - - // set the current counter in the store - counterBytes := []byte{byte(counter)} - store.Set(counterBytes, counterBytes) - - // check we can see the current header - thisHeader := ctx.BlockHeader() - height := int64((counter / txPerHeight) + 1) - assert.Equal(t, height, thisHeader.Height) - - counter++ - return sdk.Result{} - }) + app.Router().AddRoute(msgType, getStateCheckingHandler(t, capKey, txPerHeight, true)) tx := testUpdatePowerTx{} // doesn't matter header := abci.Header{AppHash: []byte("apphash")} @@ -325,6 +402,27 @@ func TestSimulateTx(t *testing.T) { } } +func TestRunInvalidTransaction(t *testing.T) { + // Initialize an app for testing + app := newBaseApp(t.Name()) + // make a cap key and mount the store + capKey := sdk.NewKVStoreKey("main") + app.MountStoresIAVL(capKey) + err := app.LoadLatestVersion(capKey) // needed to make stores non-nil + assert.Nil(t, err) + app.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx) (newCtx sdk.Context, res sdk.Result, abort bool) { return }) + app.Router().AddRoute(msgType2, func(ctx sdk.Context, msg sdk.Msg) (res sdk.Result) { return }) + app.BeginBlock(abci.RequestBeginBlock{}) + // Transaction where validate fails + invalidTx := testTx{-1} + err1 := app.Deliver(invalidTx) + assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeTxDecode), err1.Code) + // Transaction with no known route + unknownRouteTx := testUpdatePowerTx{} + err2 := app.Deliver(unknownRouteTx) + assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnknownRequest), err2.Code) +} + // Test that transactions exceeding gas limits fail func TestTxGasLimits(t *testing.T) { logger := defaultLogger() From 18aa9a990986a562962bd4b0850c057059cb0f17 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 17 May 2018 13:32:13 -0400 Subject: [PATCH 159/548] stake/fees spec updates --- .../FeeDistributionModel.xlsx} | Bin docs/spec/fee_distribution/overview.md | 194 ++++++++++++++++++ 2 files changed, 194 insertions(+) rename docs/spec/{staking/AbsoluteFeeDistrModel.xlsx => fee_distribution/FeeDistributionModel.xlsx} (100%) create mode 100644 docs/spec/fee_distribution/overview.md diff --git a/docs/spec/staking/AbsoluteFeeDistrModel.xlsx b/docs/spec/fee_distribution/FeeDistributionModel.xlsx similarity index 100% rename from docs/spec/staking/AbsoluteFeeDistrModel.xlsx rename to docs/spec/fee_distribution/FeeDistributionModel.xlsx diff --git a/docs/spec/fee_distribution/overview.md b/docs/spec/fee_distribution/overview.md new file mode 100644 index 0000000000..2ed0fe050f --- /dev/null +++ b/docs/spec/fee_distribution/overview.md @@ -0,0 +1,194 @@ +# Fee Distribution + +## Overview + +Fees are pooled separately and withdrawn lazily, at any time. They are not +bonded, and can be paid in multiple tokens. An adjustment factor is maintained +for each validator and delegator to determine the true proportion of fees in +the pool they are entitled too. Adjustment factors are updated every time a +validator or delegator's voting power changes. Validators and delegators must +withdraw all fees they are entitled too before they can bond or unbond Atoms. + +## Affect on Staking + +Because fees are optimized to note + +Commission on Atom Provisions and having atoms autobonded are mutually exclusive (we can’t have both). The reason +for this is that + +if there are atoms commissions and autobonding, the portion of +atoms the fee distribution calculation would become very large as the atom +portion for each delegator would change each block making a withdrawal of fees +for a delegator require a calculation for every single block since the last +withdrawal. Conclusion we can only have atom commission and unbonded atoms +provisions, or bonded atom provisions and no atom commission + +## Fee Calculations + +Collected fees are pooled globally and divided out passively to validators and +delegators. Each validator has the opportunity to charge commission to the +delegators on the fees collected on behalf of the delegators by the validators. +Fees are paid directly into a global fee pool. Due to the nature of of passive +accounting whenever changes to parameters which affect the rate of fee +distribution occurs, withdrawal of fees must also occur. + + - when withdrawing one must withdrawal the maximum amount they are entitled + too, leaving nothing in the pool, + - when bonding, unbonding, or re-delegating tokens to an existing account a + full withdrawal of the fees must occur (as the rules for lazy accounting + change), + - when a candidate chooses to change the commission on fees, all accumulated + commission fees must be simultaneously withdrawn. + +When the validator is the proposer of the round, that validator (and their +delegators) receives between 1% and 5% of fee rewards, the reserve tax is then +charged, then the remainder is distributed socially by voting power to all +validators including the proposer validator. The amount of proposer reward is +calculated from pre-commits Tendermint messages. All provision rewards are +added to a provision reward pool which validator holds individually. Here note +that `BondedShares` represents the sum of all voting power saved in the +`GlobalState` (denoted `gs`). + +``` +proposerReward = feesCollected * (0.01 + 0.04 + * sumOfVotingPowerOfPrecommitValidators / gs.BondedShares) +candidate.ProposerRewardPool += proposerReward + +reserveTaxed = feesCollected * params.ReserveTax +gs.ReservePool += reserveTaxed + +distributedReward = feesCollected - proposerReward - reserveTaxed +gs.FeePool += distributedReward +gs.SumFeesReceived += distributedReward +gs.RecentFee = distributedReward +``` + +The entitlement to the fee pool held by the each validator can be accounted for +lazily. First we must account for a candidate's `count` and `adjustment`. The +`count` represents a lazy accounting of what that candidates entitlement to the +fee pool would be if there `VotingPower` was to never change and they were to +never withdraw fees. + +``` +candidate.count = candidate.VotingPower * BlockHeight +``` + +Similarly the GlobalState count can be passively calculated whenever needed, +where `BondedShares` is the updated sum of voting powers from all validators. + +``` +gs.count = gs.BondedShares * BlockHeight +``` + +The `adjustment` term accounts for changes in voting power and withdrawals of +fees. The adjustment factor must be persisted with the candidate and modified +whenever fees are withdrawn from the candidate or the voting power of the +candidate changes. When the voting power of the candidate changes the +`Adjustment` factor is increased/decreased by the cumulative difference in the +voting power if the voting power has been the new voting power as opposed to +the old voting power for the entire duration of the blockchain up the previous +block. Each time there is an adjustment change the GlobalState (denoted `gs`) +`Adjustment` must also be updated. + +``` +simplePool = candidate.count / gs.count * gs.SumFeesReceived +projectedPool = candidate.PrevPower * (height-1) + / (gs.PrevPower * (height-1)) * gs.PrevFeesReceived + + candidate.Power / gs.Power * gs.RecentFee + +AdjustmentChange = simplePool - projectedPool +candidate.AdjustmentRewardPool += AdjustmentChange +gs.Adjustment += AdjustmentChange +``` + +Every instance that the voting power changes, information about the state of +the validator set during the change must be recorded as a `powerChange` for +other validators to run through. Before any validator modifies its voting power +it must first run through the above calculation to determine the change in +their `caandidate.AdjustmentRewardPool` for all historical changes in the set +of `powerChange` which they have not yet synced to. The set of all +`powerChange` may be trimmed from its oldest members once all validators have +synced past the height of the oldest `powerChange`. This trim procedure will +occur on an epoch basis. + +```golang +type powerChange struct { + height int64 // block height at change + power rational.Rat // total power at change + prevpower rational.Rat // total power at previous height-1 + feesin coins.Coin // fees in at block height + prevFeePool coins.Coin // total fees in at previous block height +} +``` + +Note that the adjustment factor may result as negative if the voting power of a +different candidate has decreased. + +``` +candidate.AdjustmentRewardPool += withdrawn +gs.Adjustment += withdrawn +``` + +Now the entitled fee pool of each candidate can be lazily accounted for at +any given block: + +``` +candidate.feePool = candidate.simplePool - candidate.Adjustment +``` + +So far we have covered two sources fees which can be withdrawn from: Fees from +proposer rewards (`candidate.ProposerRewardPool`), and fees from the fee pool +(`candidate.feePool`). However we should note that all fees from fee pool are +subject to commission rate from the owner of the candidate. These next +calculations outline the math behind withdrawing fee rewards as either a +delegator to a candidate providing commission, or as the owner of a candidate +who is receiving commission. + +### Calculations For Delegators and Candidates + +The same mechanism described to calculate the fees which an entire validator is +entitled to is be applied to delegator level to determine the entitled fees for +each delegator and the candidates entitled commission from `gs.FeesPool` and +`candidate.ProposerRewardPool`. + +The calculations are identical with a few modifications to the parameters: + - Delegator's entitlement to `gs.FeePool`: + - entitled party voting power should be taken as the effective voting power + after commission is retrieved, + `bond.Shares/candidate.TotalDelegatorShares * candidate.VotingPower * (1 - candidate.Commission)` + - Delegator's entitlement to `candidate.ProposerFeePool` + - global power in this context is actually shares + `candidate.TotalDelegatorShares` + - entitled party voting power should be taken as the effective shares after + commission is retrieved, `bond.Shares * (1 - candidate.Commission)` + - Candidate's commission entitlement to `gs.FeePool` + - entitled party voting power should be taken as the effective voting power + of commission portion of total voting power, + `candidate.VotingPower * candidate.Commission` + - Candidate's commission entitlement to `candidate.ProposerFeePool` + - global power in this context is actually shares + `candidate.TotalDelegatorShares` + - entitled party voting power should be taken as the of commission portion + of total delegators shares, + `candidate.TotalDelegatorShares * candidate.Commission` + +For more implementation ideas see spreadsheet `spec/AbsoluteFeeDistrModel.xlsx` + +As mentioned earlier, every time the voting power of a delegator bond is +changing either by unbonding or further bonding, all fees must be +simultaneously withdrawn. Similarly if the validator changes the commission +rate, all commission on fees must be simultaneously withdrawn. + +### Other general notes on fees accounting + +- When a delegator chooses to re-delegate shares, fees continue to accumulate + until the re-delegation queue reaches maturity. At the block which the queue + reaches maturity and shares are re-delegated all available fees are + simultaneously withdrawn. +- Whenever a totally new validator is added to the validator set, the `accum` + of the entire candidate must be 0, meaning that the initial value for + `candidate.Adjustment` must be set to the value of `canidate.Count` for the + height which the candidate is added on the validator set. +- The feePool of a new delegator bond will be 0 for the height at which the bond + was added. This is achieved by setting `DelegatorBond.FeeWithdrawalHeight` to + the height which the bond was added. From c66ded76467dbcf48a19cd8b60f313c1aec514f4 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Fri, 18 May 2018 14:26:32 -0400 Subject: [PATCH 160/548] staking overview.md revisions, moving files --- .../old/spec.md => old/stakingSpec1.md} | 0 .../old/spec2.md => old/stakingSpec2.md} | 0 .../fee_distribution_model.xlsx} | Bin .../{fee_distribution => rewards}/overview.md | 106 +++++--- docs/spec/slashing/transactions.md | 19 ++ docs/spec/staking/README.md | 36 ++- docs/spec/staking/overview.md | 239 +++++++++--------- docs/spec/staking/state.md | 66 ++--- docs/spec/staking/transactions.md | 118 ++++----- docs/spec/staking/valset-changes.md | 50 ++-- 10 files changed, 346 insertions(+), 288 deletions(-) rename docs/{spec/staking/old/spec.md => old/stakingSpec1.md} (100%) rename docs/{spec/staking/old/spec2.md => old/stakingSpec2.md} (100%) rename docs/spec/{fee_distribution/FeeDistributionModel.xlsx => rewards/fee_distribution_model.xlsx} (100%) rename docs/spec/{fee_distribution => rewards}/overview.md (68%) create mode 100644 docs/spec/slashing/transactions.md diff --git a/docs/spec/staking/old/spec.md b/docs/old/stakingSpec1.md similarity index 100% rename from docs/spec/staking/old/spec.md rename to docs/old/stakingSpec1.md diff --git a/docs/spec/staking/old/spec2.md b/docs/old/stakingSpec2.md similarity index 100% rename from docs/spec/staking/old/spec2.md rename to docs/old/stakingSpec2.md diff --git a/docs/spec/fee_distribution/FeeDistributionModel.xlsx b/docs/spec/rewards/fee_distribution_model.xlsx similarity index 100% rename from docs/spec/fee_distribution/FeeDistributionModel.xlsx rename to docs/spec/rewards/fee_distribution_model.xlsx diff --git a/docs/spec/fee_distribution/overview.md b/docs/spec/rewards/overview.md similarity index 68% rename from docs/spec/fee_distribution/overview.md rename to docs/spec/rewards/overview.md index 2ed0fe050f..a8ffac398c 100644 --- a/docs/spec/fee_distribution/overview.md +++ b/docs/spec/rewards/overview.md @@ -37,7 +37,7 @@ distribution occurs, withdrawal of fees must also occur. - when bonding, unbonding, or re-delegating tokens to an existing account a full withdrawal of the fees must occur (as the rules for lazy accounting change), - - when a candidate chooses to change the commission on fees, all accumulated + - when a validator chooses to change the commission on fees, all accumulated commission fees must be simultaneously withdrawn. When the validator is the proposer of the round, that validator (and their @@ -52,7 +52,7 @@ that `BondedShares` represents the sum of all voting power saved in the ``` proposerReward = feesCollected * (0.01 + 0.04 * sumOfVotingPowerOfPrecommitValidators / gs.BondedShares) -candidate.ProposerRewardPool += proposerReward +validator.ProposerRewardPool += proposerReward reserveTaxed = feesCollected * params.ReserveTax gs.ReservePool += reserveTaxed @@ -64,13 +64,13 @@ gs.RecentFee = distributedReward ``` The entitlement to the fee pool held by the each validator can be accounted for -lazily. First we must account for a candidate's `count` and `adjustment`. The -`count` represents a lazy accounting of what that candidates entitlement to the +lazily. First we must account for a validator's `count` and `adjustment`. The +`count` represents a lazy accounting of what that validators entitlement to the fee pool would be if there `VotingPower` was to never change and they were to never withdraw fees. ``` -candidate.count = candidate.VotingPower * BlockHeight +validator.count = validator.VotingPower * BlockHeight ``` Similarly the GlobalState count can be passively calculated whenever needed, @@ -81,9 +81,9 @@ gs.count = gs.BondedShares * BlockHeight ``` The `adjustment` term accounts for changes in voting power and withdrawals of -fees. The adjustment factor must be persisted with the candidate and modified -whenever fees are withdrawn from the candidate or the voting power of the -candidate changes. When the voting power of the candidate changes the +fees. The adjustment factor must be persisted with the validator and modified +whenever fees are withdrawn from the validator or the voting power of the +validator changes. When the voting power of the validator changes the `Adjustment` factor is increased/decreased by the cumulative difference in the voting power if the voting power has been the new voting power as opposed to the old voting power for the entire duration of the blockchain up the previous @@ -91,13 +91,13 @@ block. Each time there is an adjustment change the GlobalState (denoted `gs`) `Adjustment` must also be updated. ``` -simplePool = candidate.count / gs.count * gs.SumFeesReceived -projectedPool = candidate.PrevPower * (height-1) +simplePool = validator.count / gs.count * gs.SumFeesReceived +projectedPool = validator.PrevPower * (height-1) / (gs.PrevPower * (height-1)) * gs.PrevFeesReceived - + candidate.Power / gs.Power * gs.RecentFee + + validator.Power / gs.Power * gs.RecentFee AdjustmentChange = simplePool - projectedPool -candidate.AdjustmentRewardPool += AdjustmentChange +validator.AdjustmentRewardPool += AdjustmentChange gs.Adjustment += AdjustmentChange ``` @@ -122,55 +122,55 @@ type powerChange struct { ``` Note that the adjustment factor may result as negative if the voting power of a -different candidate has decreased. +different validator has decreased. ``` -candidate.AdjustmentRewardPool += withdrawn +validator.AdjustmentRewardPool += withdrawn gs.Adjustment += withdrawn ``` -Now the entitled fee pool of each candidate can be lazily accounted for at +Now the entitled fee pool of each validator can be lazily accounted for at any given block: ``` -candidate.feePool = candidate.simplePool - candidate.Adjustment +validator.feePool = validator.simplePool - validator.Adjustment ``` So far we have covered two sources fees which can be withdrawn from: Fees from -proposer rewards (`candidate.ProposerRewardPool`), and fees from the fee pool -(`candidate.feePool`). However we should note that all fees from fee pool are -subject to commission rate from the owner of the candidate. These next +proposer rewards (`validator.ProposerRewardPool`), and fees from the fee pool +(`validator.feePool`). However we should note that all fees from fee pool are +subject to commission rate from the owner of the validator. These next calculations outline the math behind withdrawing fee rewards as either a -delegator to a candidate providing commission, or as the owner of a candidate +delegator to a validator providing commission, or as the owner of a validator who is receiving commission. -### Calculations For Delegators and Candidates +### Calculations For Delegators and Validators The same mechanism described to calculate the fees which an entire validator is entitled to is be applied to delegator level to determine the entitled fees for -each delegator and the candidates entitled commission from `gs.FeesPool` and -`candidate.ProposerRewardPool`. +each delegator and the validators entitled commission from `gs.FeesPool` and +`validator.ProposerRewardPool`. The calculations are identical with a few modifications to the parameters: - Delegator's entitlement to `gs.FeePool`: - entitled party voting power should be taken as the effective voting power after commission is retrieved, - `bond.Shares/candidate.TotalDelegatorShares * candidate.VotingPower * (1 - candidate.Commission)` - - Delegator's entitlement to `candidate.ProposerFeePool` + `bond.Shares/validator.TotalDelegatorShares * validator.VotingPower * (1 - validator.Commission)` + - Delegator's entitlement to `validator.ProposerFeePool` - global power in this context is actually shares - `candidate.TotalDelegatorShares` + `validator.TotalDelegatorShares` - entitled party voting power should be taken as the effective shares after - commission is retrieved, `bond.Shares * (1 - candidate.Commission)` - - Candidate's commission entitlement to `gs.FeePool` + commission is retrieved, `bond.Shares * (1 - validator.Commission)` + - Validator's commission entitlement to `gs.FeePool` - entitled party voting power should be taken as the effective voting power of commission portion of total voting power, - `candidate.VotingPower * candidate.Commission` - - Candidate's commission entitlement to `candidate.ProposerFeePool` + `validator.VotingPower * validator.Commission` + - Validator's commission entitlement to `validator.ProposerFeePool` - global power in this context is actually shares - `candidate.TotalDelegatorShares` + `validator.TotalDelegatorShares` - entitled party voting power should be taken as the of commission portion of total delegators shares, - `candidate.TotalDelegatorShares * candidate.Commission` + `validator.TotalDelegatorShares * validator.Commission` For more implementation ideas see spreadsheet `spec/AbsoluteFeeDistrModel.xlsx` @@ -186,9 +186,45 @@ rate, all commission on fees must be simultaneously withdrawn. reaches maturity and shares are re-delegated all available fees are simultaneously withdrawn. - Whenever a totally new validator is added to the validator set, the `accum` - of the entire candidate must be 0, meaning that the initial value for - `candidate.Adjustment` must be set to the value of `canidate.Count` for the - height which the candidate is added on the validator set. + of the entire validator must be 0, meaning that the initial value for + `validator.Adjustment` must be set to the value of `canidate.Count` for the + height which the validator is added on the validator set. - The feePool of a new delegator bond will be 0 for the height at which the bond was added. This is achieved by setting `DelegatorBond.FeeWithdrawalHeight` to the height which the bond was added. + +### Atom provisions + +Validator provisions are minted on an hourly basis (the first block of a new +hour). The annual target of between 7% and 20%. The long-term target ratio of +bonded tokens to unbonded tokens is 67%. + +The target annual inflation rate is recalculated for each provisions cycle. The +inflation is also subject to a rate change (positive or negative) depending on +the distance from the desired ratio (67%). The maximum rate change possible is +defined to be 13% per year, however the annual inflation is capped as between +7% and 20%. + +```go +inflationRateChange(0) = 0 +Inflation(0) = 0.07 + +bondedRatio = Pool.BondedTokens / Pool.TotalSupplyTokens +AnnualInflationRateChange = (1 - bondedRatio / 0.67) * 0.13 + +annualInflation += AnnualInflationRateChange + +if annualInflation > 0.20 then Inflation = 0.20 +if annualInflation < 0.07 then Inflation = 0.07 + +provisionTokensHourly = Pool.TotalSupplyTokens * Inflation / (365.25*24) +``` + +Because the validators hold a relative bonded share (`GlobalStakeShares`), when +more bonded tokens are added proportionally to all validators, the only term +which needs to be updated is the `GlobalState.BondedPool`. So for each +provisions cycle: + +```go +Pool.BondedPool += provisionTokensHourly +``` diff --git a/docs/spec/slashing/transactions.md b/docs/spec/slashing/transactions.md new file mode 100644 index 0000000000..cdf495e4d2 --- /dev/null +++ b/docs/spec/slashing/transactions.md @@ -0,0 +1,19 @@ + +### TxProveLive + +If a validator was automatically unbonded due to liveness issues and wishes to +assert it is still online, it can send `TxProveLive`: + +```golang +type TxProveLive struct { + PubKey crypto.PubKey +} +``` + +All delegators in the temporary unbonding pool which have not +transacted to move will be bonded back to the now-live validator and begin to +once again collect provisions and rewards. + +``` +TODO: pseudo-code +``` diff --git a/docs/spec/staking/README.md b/docs/spec/staking/README.md index 82604e2de2..30dbf1dd31 100644 --- a/docs/spec/staking/README.md +++ b/docs/spec/staking/README.md @@ -2,30 +2,38 @@ ## Abstract -This paper specifies the Staking module of the Cosmos-SDK, which was first described in the [Cosmos Whitepaper](https://cosmos.network/about/whitepaper) in June 2016. +This paper specifies the Staking module of the Cosmos-SDK, which was first +described in the [Cosmos Whitepaper](https://cosmos.network/about/whitepaper) +in June 2016. -The module enables Cosmos-SDK based blockchain to support an advanced Proof-of-Stake system. In this system, holders of the native staking token of the chain can become candidate validators and can delegate tokens to candidate validators, ultimately determining the effective validator set for the system. +The module enables Cosmos-SDK based blockchain to support an advanced +Proof-of-Stake system. In this system, holders of the native staking token of +the chain can become validators and can delegate tokens to validator +validators, ultimately determining the effective validator set for the system. -This module will be used in the Cosmos Hub, the first Hub in the Cosmos network. +This module will be used in the Cosmos Hub, the first Hub in the Cosmos +network. ## Contents -The following specification uses *Atom* as the native staking token. The module can be adapted to any Proof-Of-Stake blockchain by replacing *Atom* with the native staking token of the chain. +The following specification uses *Atom* as the native staking token. The module +can be adapted to any Proof-Of-Stake blockchain by replacing *Atom* with the +native staking token of the chain. 1. **[Design overview](overview.md)** 2. **Implementation** 1. **[State](state.md)** - 1. Global State - 2. Validator Candidates - 3. Delegator Bonds - 4. Unbond and Rebond Queue + 1. Params + 1. Pool + 2. Validators + 3. Delegations 2. **[Transactions](transactions.md)** - 1. Declare Candidacy - 2. Edit Candidacy - 3. Delegate - 4. Unbond - 5. Redelegate - 6. ProveLive + 1. Create-Validator + 2. Edit-Validator + 3. Repeal-Revocation + 4. Delegate + 5. Unbond + 6. Redelegate 3. **[Validator Set Changes](valset-changes.md)** 1. Validator set updates 2. Slashing diff --git a/docs/spec/staking/overview.md b/docs/spec/staking/overview.md index a202fbc119..053d59d7ab 100644 --- a/docs/spec/staking/overview.md +++ b/docs/spec/staking/overview.md @@ -2,100 +2,125 @@ ## Overview -The Cosmos Hub is a Tendermint-based Proof of Stake blockchain system that -serves as a backbone of the Cosmos ecosystem. It is operated and secured by an -open and globally decentralized set of validators. Tendermint consensus is a -Byzantine fault-tolerant distributed protocol that involves all validators in -the process of exchanging protocol messages in the production of each block. To -avoid Nothing-at-Stake problem, a validator in Tendermint needs to lock up -coins in a bond deposit. Tendermint protocol messages are signed by the -validator's private key, and this is a basis for Tendermint strict -accountability that allows punishing misbehaving validators by slashing -(burning) their bonded Atoms. On the other hand, validators are rewarded for +The Cosmos Hub is a Tendermint-based Delegated Proof of Stake (DPos) blockchain +system that serves as a backbone of the Cosmos ecosystem. It is operated and +secured by an open and globally decentralized set of validators. Tendermint +consensus is a Byzantine fault-tolerant distributed protocol that involves all +validators in the process of exchanging protocol messages in the production of +each block. To avoid Nothing-at-Stake problem, a validator in Tendermint needs +to lock up coins in a bond deposit. Tendermint protocol messages are signed by +the validator's private key, and this is a basis for Tendermint strict +accountability that allows punishing misbehaving validators by slashing +(burning) their bonded Atoms. On the other hand, validators are rewarded for their service of securing blockchain network by the inflationary provisions and -transactions fees. This incentives correct behavior of the validators and +transactions fees. This incentives correct behavior of the validators and provides the economic security of the network. -The native token of the Cosmos Hub is called Atom; becoming a validator of the +The native token of the Cosmos Hub is called Atom; becoming a validator of the Cosmos Hub requires holding Atoms. However, not all Atom holders are validators of the Cosmos Hub. More precisely, there is a selection process that determines -the validator set as a subset of all validator candidates (Atom holders that -wants to become a validator). The other option for Atom holder is to delegate -their atoms to validators, i.e., being a delegator. A delegator is an Atom -holder that has bonded its Atoms by delegating it to a validator (or validator -candidate). By bonding Atoms to secure the network (and taking a risk of being -slashed in case of misbehaviour), a user is rewarded with inflationary -provisions and transaction fees proportional to the amount of its bonded Atoms. -The Cosmos Hub is designed to efficiently facilitate a small numbers of -validators (hundreds), and large numbers of delegators (tens of thousands). -More precisely, it is the role of the Staking module of the Cosmos Hub to -support various staking functionality including validator set selection, -delegating, bonding and withdrawing Atoms, and the distribution of inflationary -provisions and transaction fees. +the validator set as a subset of all validators (Atom holders that +wants to become a validator). The other option for Atom holder is to delegate +their atoms to validators, i.e., being a delegator. A delegator is an Atom +holder that has bonded its Atoms by delegating it to a validator. By bonding +Atoms to secure the network (and taking a risk of being slashed in case of +misbehaviour), a user is rewarded with inflationary provisions and transaction +fees proportional to the amount of its bonded Atoms. The Cosmos Hub is +designed to efficiently facilitate a small numbers of validators (hundreds), +and large numbers of delegators (tens of thousands). More precisely, it is the +role of the Staking module of the Cosmos Hub to support various staking +functionality including validator set selection, delegating, bonding and +withdrawing Atoms, and the distribution of inflationary provisions and +transaction fees. ## Basic Terms and Definitions -* Cosmsos Hub - a Tendermint-based Proof of Stake blockchain system +* Cosmsos Hub - a Tendermint-based Delegated Proof of Stake (DPos) + blockchain system * Atom - native token of the Cosmsos Hub * Atom holder - an entity that holds some amount of Atoms -* Candidate - an Atom holder that is actively involved in the Tendermint - blockchain protocol (running Tendermint Full Node (TODO: add link to Full - Node definition) and is competing with other candidates to be elected as a - validator (TODO: add link to Validator definition)) -* Validator - a candidate that is currently selected among a set of candidates - to be able to sign protocol messages in the Tendermint consensus protocol -* Delegator - an Atom holder that has bonded some of its Atoms by delegating - them to a validator (or a candidate) -* Bonding Atoms - a process of locking Atoms in a bond deposit (putting Atoms - under protocol control). Atoms are always bonded through a validator (or - candidate) process. Bonded atoms can be slashed (burned) in case a validator - process misbehaves (does not behave according to the protocol specification). - Atom holders can regain access to their bonded Atoms if they have not been - slashed by waiting an Unbonding period. -* Unbonding period - a period of time after which Atom holder gains access to - its bonded Atoms (they can be withdrawn to a user account) or they can be - re-delegated. -* Inflationary provisions - inflation is the process of increasing the Atom supply. - Atoms are periodically created on the Cosmos Hub and issued to bonded Atom holders. - The goal of inflation is to incentize most of the Atoms in existence to be bonded. +* Pool - Global object within the Cosmos Hub which accounts global state + including the total amount of bonded, unbonding, and unbonded atoms +* Validator Share - Share which a validator holds to represent its portion of + bonded, unbonding or unbonded atoms in the pool +* Delegation Share - Shares which a delegation bond holds to represent its + portion of bonded, unbonding or unbonded shares in a validator +* Bond Atoms - a process of locking Atoms in a delegation share which holds them + under protocol control. +* Slash Atoms - the process of burning atoms in the pool and assoiated + validator shares of a misbehaving validator, (not behaving according to the + protocol specification). This process devalues the worth of delegation shares + of the given validator +* Unbond Shares - Process of retrieving atoms from shares. If the shares are + bonded the shares must first remain in an inbetween unbonding state for the + duration of the unbonding period +* Redelegating Shares - Process of redelegating atoms from one validator to + another. This process is instantanious, the redelegated delegation is + slashible to the old validator for all blocks before the redelegation and to + the new validator for all new blocks. +* Validator - entity with atoms which is either actively validating the Tendermint + protocol (bonded validator) or vying to validate . +* Bonded Validator - a validator whose atoms are currently bonded and liable to + be slashed. These validators are to be able to sign protocol messages in the + Tendermint consensus protocol. There are limited number of bonded validators + at Cosmos Hub genesis there is a maximum of 100 bonded validators. Only Bonded + Validators receive atom provisions and fee rewards. +* Delegator - an Atom holder that has bonded Atoms to a validator +* Unbonding period - time required in the unbonding state when unbonding + shares. Time slashable to old validator after a redelegation. Time for which + validators can be slashed after an infraction +* Atom provisions - The process of increasing the Atom supply. Atoms are + periodically created on the Cosmos Hub and issued to bonded Atom holders. + The goal of inflation is to incentize most of the Atoms in existence to be + bonded. Atoms are distributed unbonded and using the fee_distribution mechanism * Transaction fees - transaction fee is a fee that is included in a Cosmsos Hub - transaction. The fees are collected by the current validator set and - distributed among validators and delegators in proportion to their bonded - Atom share. + transaction. The fees are collected by the current validator set and + distributed among validators and delegators in proportion to their bonded + Atom share * Commission fee - a fee taken from the transaction fees by a validator for - their service + their service ## The pool and the share At the core of the Staking module is the concept of a pool which denotes a -collection of Atoms contributed by different Atom holders. There are two global -pools in the Staking module: the bonded pool and unbonding pool. Bonded Atoms -are part of the global bonded pool. If a candidate or delegator wants to unbond -its Atoms, those Atoms are moved to the the unbonding pool for the duration of -the unbonding period. In the Staking module, a pool is a logical concept, i.e., -there is no pool data structure that would be responsible for managing pool -resources. Instead, it is managed in a distributed way. More precisely, at the -global level, for each pool, we track only the total amount of bonded or unbonded -Atoms and the current amount of issued shares. A share is a unit of Atom distribution -and the value of the share (share-to-atom exchange rate) changes during -system execution. The share-to-atom exchange rate can be computed as: +collection of Atoms contributed by different Atom holders. There are three +pools in the Staking module: the bonded, unbonding, and unbonded pool. Bonded +Atoms are part of the global bonded pool. If a validator or delegator wants to +unbond its Shares, these Shares are moved to the the unbonding pool for the +duration of the unbonding period. From here normally Atoms will be moved +directly into the delegators wallet, however under the situation thatn an +entire validator gets unbonded, the Atoms of the delegations will remain with +the validator and moved to the unbonded pool. For each pool, the total amount +of bonded, unbonding, or unbonded Atoms are tracked as well as the current +amount of issued pool-shares, the specific holdings of these shares by +validators are tracked in protocol by the validator object. + +A share is a unit of Atom distribution and the value of the share +(share-to-atom exchange rate) can change during system execution. The +share-to-atom exchange rate can be computed as: `share-to-atom-exchange-rate = size of the pool / ammount of issued shares` -Then for each validator candidate (in a per candidate data structure) we keep track of -the amount of shares the candidate owns in a pool. At any point in time, -the exact amount of Atoms a candidate has in the pool can be computed as the -number of shares it owns multiplied with the current share-to-atom exchange rate: +Then for each validator (in a per validator data structure) the protocol keeps +track of the amount of shares the validator owns in a pool. At any point in +time, the exact amount of Atoms a validator has in the pool can be computed as +the number of shares it owns multiplied with the current share-to-atom exchange +rate: -`candidate-coins = candidate.Shares * share-to-atom-exchange-rate` +`validator-coins = validator.Shares * share-to-atom-exchange-rate` -The benefit of such accounting of the pool resources is the fact that a -modification to the pool from bonding/unbonding/slashing/provisioning of -Atoms affects only global data (size of the pool and the number of shares) and -not the related validator/candidate data structure, i.e., the data structure of -other validators do not need to be modified. This has the advantage that -modifying global data is much cheaper computationally than modifying data of -every validator. Let's explain this further with several small examples: +The benefit of such accounting of the pool resources is the fact that a +modification to the pool from bonding/unbonding/slashing of Atoms affects only +global data (size of the pool and the number of shares) and not the related +validator data structure, i.e., the data structure of other validators do not +need to be modified. This has the advantage that modifying global data is much +cheaper computationally than modifying data of every validator. Let's explain +this further with several small examples: + +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXX TODO make way less verbose lets use bullet points to describe the example +XXX Also need to update to not include bonded atom provisions all atoms are +XXX redistributed with the fee pool now We consider initially 4 validators p1, p2, p3 and p4, and that each validator has bonded 10 Atoms to the bonded pool. Furthermore, let's assume that we have @@ -140,33 +165,38 @@ delegators (we will explain this in section X). #### Delegator shares -A candidate is, depending on it's status, contributing Atoms to either the -bonded or unbonding pool, and in return gets some amount of (global) pool -shares. Note that not all those Atoms (and respective shares) are owned by the -candidate as some Atoms could be delegated to a candidate. The mechanism for -distribution of Atoms (and shares) between a candidate and it's delegators is -based on a notion of delegator shares. More precisely, every candidate is -issuing (local) delegator shares (`Candidate.IssuedDelegatorShares`) that -represents some portion of global shares managed by the candidate -(`Candidate.GlobalStakeShares`). The principle behind managing delegator shares -is the same as described in [Section](#The pool and the share). We now +A validator is, depending on its status, contributing Atoms to either the bond, +unbonding or unbonded pool - the validator in turn holds some amount of pool +shares. Not all of a validators Atoms (and respective shares) are owned by the +validator, some may be owned by delegators to that validator. The mechanism for +distribution of Atoms (and shares) between a validator and its delegators is +based on a notion of delegator shares. More precisely, every validator is +issuing (local) delegator shares (`Validator.IssuedDelegatorShares`) that +represents some portion of global shares managed by the validator +(`Validator.GlobalStakeShares`). The principle behind managing delegator shares +is the same as described in [Section](#The pool and the share). We now illustrate it with an example. +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +XXX TODO make way less verbose lets use bullet points to describe the example +XXX Also need to update to not include bonded atom provisions all atoms are +XXX redistributed with the fee pool now + Let's consider 4 validators p1, p2, p3 and p4, and assume that each validator has bonded 10 Atoms to the bonded pool. Furthermore, let's assume that we have issued initially 40 global shares, i.e., that `share-to-atom-exchange-rate = 1 atom per share`. So we will set `GlobalState.BondedPool = 40` and `GlobalState.BondedShares = 40` and in the -Candidate data structure of each validator `Candidate.GlobalStakeShares = 10`. +Validator data structure of each validator `Validator.GlobalStakeShares = 10`. Furthermore, each validator issued 10 delegator shares which are initially -owned by itself, i.e., `Candidate.IssuedDelegatorShares = 10`, where +owned by itself, i.e., `Validator.IssuedDelegatorShares = 10`, where `delegator-share-to-global-share-ex-rate = 1 global share per delegator share`. Now lets assume that a delegator d1 delegates 5 atoms to a validator p1 and consider what are the updates we need to make to the data structures. First, `GlobalState.BondedPool = 45` and `GlobalState.BondedShares = 45`. Then, for -validator p1 we have `Candidate.GlobalStakeShares = 15`, but we also need to +validator p1 we have `Validator.GlobalStakeShares = 15`, but we also need to issue also additional delegator shares, i.e., -`Candidate.IssuedDelegatorShares = 15` as the delegator d1 now owns 5 delegator +`Validator.IssuedDelegatorShares = 15` as the delegator d1 now owns 5 delegator shares of validator p1, where each delegator share is worth 1 global shares, i.e, 1 Atom. Lets see now what happens after 5 new Atoms are created due to inflation. In that case, we only need to update `GlobalState.BondedPool` which @@ -177,38 +207,3 @@ Therefore, a delegator d1 now owns: `delegatorCoins = 5 (delegator shares) * 1 (delegator-share-to-global-share-ex-rate) * 50/45 (share-to-atom-ex-rate) = 5.55 Atoms` -### Inflation provisions - -Validator provisions are minted on an hourly basis (the first block of a new -hour). The annual target of between 7% and 20%. The long-term target ratio of -bonded tokens to unbonded tokens is 67%. - -The target annual inflation rate is recalculated for each provisions cycle. The -inflation is also subject to a rate change (positive or negative) depending on -the distance from the desired ratio (67%). The maximum rate change possible is -defined to be 13% per year, however the annual inflation is capped as between -7% and 20%. - -```go -inflationRateChange(0) = 0 -GlobalState.Inflation(0) = 0.07 - -bondedRatio = GlobalState.BondedPool / GlobalState.TotalSupply -AnnualInflationRateChange = (1 - bondedRatio / 0.67) * 0.13 - -annualInflation += AnnualInflationRateChange - -if annualInflation > 0.20 then GlobalState.Inflation = 0.20 -if annualInflation < 0.07 then GlobalState.Inflation = 0.07 - -provisionTokensHourly = GlobalState.TotalSupply * GlobalState.Inflation / (365.25*24) -``` - -Because the validators hold a relative bonded share (`GlobalStakeShares`), when -more bonded tokens are added proportionally to all validators, the only term -which needs to be updated is the `GlobalState.BondedPool`. So for each -provisions cycle: - -```go -GlobalState.BondedPool += provisionTokensHourly -``` diff --git a/docs/spec/staking/state.md b/docs/spec/staking/state.md index 2bcf13dea0..28e4faaf2c 100644 --- a/docs/spec/staking/state.md +++ b/docs/spec/staking/state.md @@ -4,10 +4,10 @@ The staking module persists the following information to the store: * `GlobalState`, a struct describing the global pools, inflation, and fees -* `ValidatorCandidates: => `, a map of all candidates (including current validators) in the store, +* `ValidatorValidators: => `, a map of all validators (including current validators) in the store, indexed by their public key and shares in the global pool. -* `DelegatorBonds: < delegator-address | candidate-pubkey > => `. a map of all delegations by a delegator to a candidate, -indexed by delegator address and candidate pubkey. +* `DelegatorBonds: < delegator-address | validator-pubkey > => `. a map of all delegations by a delegator to a validator, +indexed by delegator address and validator pubkey. public key * `UnbondQueue`, the queue of unbonding delegations * `RedelegateQueue`, the queue of re-delegations @@ -25,7 +25,7 @@ type GlobalState struct { TotalSupply int64 // total supply of Atoms BondedPool int64 // reserve of bonded tokens BondedShares rational.Rat // sum of all shares distributed for the BondedPool - UnbondedPool int64 // reserve of unbonding tokens held with candidates + UnbondedPool int64 // reserve of unbonding tokens held with validators UnbondedShares rational.Rat // sum of all shares distributed for the UnbondedPool InflationLastTime int64 // timestamp of last processing of inflation Inflation rational.Rat // current annual inflation rate @@ -57,22 +57,22 @@ type Params struct { } ``` -### Candidate +### Validator -The `Candidate` holds the current state and some historical -actions of validators or candidate-validators. +The `Validator` holds the current state and some historical +actions of validators. ``` go -type CandidateStatus byte +type ValidatorStatus byte const ( - Bonded CandidateStatus = 0x01 - Unbonded CandidateStatus = 0x02 - Revoked CandidateStatus = 0x03 + Bonded ValidatorStatus = 0x01 + Unbonded ValidatorStatus = 0x02 + Revoked ValidatorStatus = 0x03 ) -type Candidate struct { - Status CandidateStatus +type Validator struct { + Status ValidatorStatus ConsensusPubKey crypto.PubKey GovernancePubKey crypto.PubKey Owner crypto.Address @@ -98,30 +98,30 @@ type Description struct { } ``` -Candidate parameters are described: -* Status: it can be Bonded (active validator), Unbonding (validator candidate) +Validator parameters are described: +* Status: it can be Bonded (active validator), Unbonding (validator) or Revoked -* ConsensusPubKey: candidate public key that is used strictly for participating in +* ConsensusPubKey: validator public key that is used strictly for participating in consensus * GovernancePubKey: public key used by the validator for governance voting * Owner: Address that is allowed to unbond coins. * GlobalStakeShares: Represents shares of `GlobalState.BondedPool` if - `Candidate.Status` is `Bonded`; or shares of `GlobalState.Unbondingt Pool` + `Validator.Status` is `Bonded`; or shares of `GlobalState.Unbondingt Pool` otherwise -* IssuedDelegatorShares: Sum of all shares a candidate issued to delegators - (which includes the candidate's self-bond); a delegator share represents - their stake in the Candidate's `GlobalStakeShares` +* IssuedDelegatorShares: Sum of all shares a validator issued to delegators + (which includes the validator's self-bond); a delegator share represents + their stake in the Validator's `GlobalStakeShares` * RedelegatingShares: The portion of `IssuedDelegatorShares` which are currently re-delegating to a new validator * VotingPower: Proportional to the amount of bonded tokens which the validator - has if `Candidate.Status` is `Bonded`; otherwise it is equal to `0` + has if `Validator.Status` is `Bonded`; otherwise it is equal to `0` * Commission: The commission rate of fees charged to any delegators -* CommissionMax: The maximum commission rate this candidate can charge each +* CommissionMax: The maximum commission rate this validator can charge each day from the date `GlobalState.DateLastCommissionReset` -* CommissionChangeRate: The maximum daily increase of the candidate commission +* CommissionChangeRate: The maximum daily increase of the validator commission * CommissionChangeToday: Counter for the amount of change to commission rate which has occurred today, reset on the first block of each day (UTC time) -* ProposerRewardPool: reward pool for extra fees collected when this candidate +* ProposerRewardPool: reward pool for extra fees collected when this validator is the proposer of a block * Adjustment factor used to passively calculate each validators entitled fees from `GlobalState.FeePool` @@ -135,14 +135,14 @@ Candidate parameters are described: ### DelegatorBond -Atom holders may delegate coins to candidates; under this circumstance their +Atom holders may delegate coins to validators; under this circumstance their funds are held in a `DelegatorBond` data structure. It is owned by one -delegator, and is associated with the shares for one candidate. The sender of +delegator, and is associated with the shares for one validator. The sender of the transaction is the owner of the bond. ``` go type DelegatorBond struct { - Candidate crypto.PubKey + Validator crypto.PubKey Shares rational.Rat AdjustmentFeePool coin.Coins AdjustmentRewardPool coin.Coins @@ -150,12 +150,12 @@ type DelegatorBond struct { ``` Description: -* Candidate: the public key of the validator candidate: bonding too -* Shares: the number of delegator shares received from the validator candidate +* Validator: the public key of the validator: bonding too +* Shares: the number of delegator shares received from the validator * AdjustmentFeePool: Adjustment factor used to passively calculate each bonds entitled fees from `GlobalState.FeePool` * AdjustmentRewardPool: Adjustment factor used to passively calculate each - bonds entitled fees from `Candidate.ProposerRewardPool` + bonds entitled fees from `Validator.ProposerRewardPool` ### QueueElem @@ -165,7 +165,7 @@ data structure. All queue elements share a common structure: ```golang type QueueElem struct { - Candidate crypto.PubKey + Validator crypto.PubKey InitTime int64 // when the element was added to the queue } ``` @@ -185,7 +185,7 @@ type QueueElemUnbondDelegation struct { QueueElem Payout Address // account to pay out to Tokens coin.Coins // the value in Atoms of the amount of delegator shares which are unbonding - StartSlashRatio rational.Rat // candidate slash ratio + StartSlashRatio rational.Rat // validator slash ratio } ``` @@ -198,7 +198,7 @@ type QueueElemReDelegate struct { QueueElem Payout Address // account to pay out to Shares rational.Rat // amount of shares which are unbonding - NewCandidate crypto.PubKey // validator to bond to after unbond + NewValidator crypto.PubKey // validator to bond to after unbond } ``` diff --git a/docs/spec/staking/transactions.md b/docs/spec/staking/transactions.md index 52f324b0f7..c80ddc7a9b 100644 --- a/docs/spec/staking/transactions.md +++ b/docs/spec/staking/transactions.md @@ -18,8 +18,8 @@ reference to the queue of unbond delegations, `reDelegationQueue` is the reference for the queue of redelegations. We use `tx` to denote a reference to a transaction that is being processed, and `sender` to denote the address of the sender of the transaction. We use function -`loadCandidate(store, PubKey)` to obtain a Candidate structure from the store, -and `saveCandidate(store, candidate)` to save it. Similarly, we use +`loadValidator(store, PubKey)` to obtain a Validator structure from the store, +and `saveValidator(store, validator)` to save it. Similarly, we use `loadDelegatorBond(store, sender, PubKey)` to load a delegator bond with the key (sender and PubKey) from the store, and `saveDelegatorBond(store, sender, bond)` to save it. @@ -42,23 +42,23 @@ type TxDeclareCandidacy struct { } declareCandidacy(tx TxDeclareCandidacy): - candidate = loadCandidate(store, tx.PubKey) - if candidate != nil return // candidate with that public key already exists + validator = loadValidator(store, tx.PubKey) + if validator != nil return // validator with that public key already exists - candidate = NewCandidate(tx.PubKey) - candidate.Status = Unbonded - candidate.Owner = sender - init candidate VotingPower, GlobalStakeShares, IssuedDelegatorShares, RedelegatingShares and Adjustment to rational.Zero + validator = NewValidator(tx.PubKey) + validator.Status = Unbonded + validator.Owner = sender + init validator VotingPower, GlobalStakeShares, IssuedDelegatorShares, RedelegatingShares and Adjustment to rational.Zero init commision related fields based on the values from tx - candidate.ProposerRewardPool = Coin(0) - candidate.Description = tx.Description + validator.ProposerRewardPool = Coin(0) + validator.Description = tx.Description - saveCandidate(store, candidate) + saveValidator(store, validator) txDelegate = TxDelegate(tx.PubKey, tx.Amount) - return delegateWithCandidate(txDelegate, candidate) + return delegateWithValidator(txDelegate, validator) -// see delegateWithCandidate function in [TxDelegate](TxDelegate) +// see delegateWithValidator function in [TxDelegate](TxDelegate) ``` ### TxEditCandidacy @@ -75,14 +75,14 @@ type TxEditCandidacy struct { } editCandidacy(tx TxEditCandidacy): - candidate = loadCandidate(store, tx.PubKey) - if candidate == nil or candidate.Status == Revoked return + validator = loadValidator(store, tx.PubKey) + if validator == nil or validator.Status == Revoked return - if tx.GovernancePubKey != nil candidate.GovernancePubKey = tx.GovernancePubKey - if tx.Commission >= 0 candidate.Commission = tx.Commission - if tx.Description != nil candidate.Description = tx.Description + if tx.GovernancePubKey != nil validator.GovernancePubKey = tx.GovernancePubKey + if tx.Commission >= 0 validator.Commission = tx.Commission + if tx.Description != nil validator.Description = tx.Description - saveCandidate(store, candidate) + saveValidator(store, validator) return ``` @@ -90,7 +90,7 @@ editCandidacy(tx TxEditCandidacy): Delegator bonds are created using the `TxDelegate` transaction. Within this transaction the delegator provides an amount of coins, and in return receives -some amount of candidate's delegator shares that are assigned to +some amount of validator's delegator shares that are assigned to `DelegatorBond.Shares`. ```golang @@ -100,14 +100,14 @@ type TxDelegate struct { } delegate(tx TxDelegate): - candidate = loadCandidate(store, tx.PubKey) - if candidate == nil return - return delegateWithCandidate(tx, candidate) + validator = loadValidator(store, tx.PubKey) + if validator == nil return + return delegateWithValidator(tx, validator) -delegateWithCandidate(tx TxDelegate, candidate Candidate): - if candidate.Status == Revoked return +delegateWithValidator(tx TxDelegate, validator Validator): + if validator.Status == Revoked return - if candidate.Status == Bonded + if validator.Status == Bonded poolAccount = params.HoldBonded else poolAccount = params.HoldUnbonded @@ -118,16 +118,16 @@ delegateWithCandidate(tx TxDelegate, candidate Candidate): bond = loadDelegatorBond(store, sender, tx.PubKey) if bond == nil then bond = DelegatorBond(tx.PubKey, rational.Zero, Coin(0), Coin(0)) - issuedDelegatorShares = addTokens(tx.Amount, candidate) + issuedDelegatorShares = addTokens(tx.Amount, validator) bond.Shares += issuedDelegatorShares - saveCandidate(store, candidate) + saveValidator(store, validator) saveDelegatorBond(store, sender, bond) saveGlobalState(store, gs) return -addTokens(amount coin.Coin, candidate Candidate): - if candidate.Status == Bonded +addTokens(amount coin.Coin, validator Validator): + if validator.Status == Bonded gs.BondedPool += amount issuedShares = amount / exchangeRate(gs.BondedShares, gs.BondedPool) gs.BondedShares += issuedShares @@ -136,15 +136,15 @@ addTokens(amount coin.Coin, candidate Candidate): issuedShares = amount / exchangeRate(gs.UnbondedShares, gs.UnbondedPool) gs.UnbondedShares += issuedShares - candidate.GlobalStakeShares += issuedShares + validator.GlobalStakeShares += issuedShares - if candidate.IssuedDelegatorShares.IsZero() + if validator.IssuedDelegatorShares.IsZero() exRate = rational.One else - exRate = candidate.GlobalStakeShares / candidate.IssuedDelegatorShares + exRate = validator.GlobalStakeShares / validator.IssuedDelegatorShares issuedDelegatorShares = issuedShares / exRate - candidate.IssuedDelegatorShares += issuedDelegatorShares + validator.IssuedDelegatorShares += issuedDelegatorShares return issuedDelegatorShares exchangeRate(shares rational.Rat, tokenAmount int64): @@ -170,20 +170,20 @@ unbond(tx TxUnbond): bond.Shares -= tx.Shares - candidate = loadCandidate(store, tx.PubKey) + validator = loadValidator(store, tx.PubKey) revokeCandidacy = false if bond.Shares.IsZero() - if sender == candidate.Owner and candidate.Status != Revoked then revokeCandidacy = true then removeDelegatorBond(store, sender, bond) + if sender == validator.Owner and validator.Status != Revoked then revokeCandidacy = true then removeDelegatorBond(store, sender, bond) else saveDelegatorBond(store, sender, bond) - if candidate.Status == Bonded + if validator.Status == Bonded poolAccount = params.HoldBonded else poolAccount = params.HoldUnbonded - returnedCoins = removeShares(candidate, shares) + returnedCoins = removeShares(validator, shares) unbondDelegationElem = QueueElemUnbondDelegation(tx.PubKey, currentHeight(), sender, returnedCoins, startSlashRatio) unbondDelegationQueue.add(unbondDelegationElem) @@ -191,21 +191,21 @@ unbond(tx TxUnbond): transfer(poolAccount, unbondingPoolAddress, returnCoins) if revokeCandidacy - if candidate.Status == Bonded then bondedToUnbondedPool(candidate) - candidate.Status = Revoked + if validator.Status == Bonded then bondedToUnbondedPool(validator) + validator.Status = Revoked - if candidate.IssuedDelegatorShares.IsZero() - removeCandidate(store, tx.PubKey) + if validator.IssuedDelegatorShares.IsZero() + removeValidator(store, tx.PubKey) else - saveCandidate(store, candidate) + saveValidator(store, validator) saveGlobalState(store, gs) return -removeShares(candidate Candidate, shares rational.Rat): - globalPoolSharesToRemove = delegatorShareExRate(candidate) * shares +removeShares(validator Validator, shares rational.Rat): + globalPoolSharesToRemove = delegatorShareExRate(validator) * shares - if candidate.Status == Bonded + if validator.Status == Bonded gs.BondedShares -= globalPoolSharesToRemove removedTokens = exchangeRate(gs.BondedShares, gs.BondedPool) * globalPoolSharesToRemove gs.BondedPool -= removedTokens @@ -214,25 +214,25 @@ removeShares(candidate Candidate, shares rational.Rat): removedTokens = exchangeRate(gs.UnbondedShares, gs.UnbondedPool) * globalPoolSharesToRemove gs.UnbondedPool -= removedTokens - candidate.GlobalStakeShares -= removedTokens - candidate.IssuedDelegatorShares -= shares + validator.GlobalStakeShares -= removedTokens + validator.IssuedDelegatorShares -= shares return returnedCoins -delegatorShareExRate(candidate Candidate): - if candidate.IssuedDelegatorShares.IsZero() then return rational.One - return candidate.GlobalStakeShares / candidate.IssuedDelegatorShares +delegatorShareExRate(validator Validator): + if validator.IssuedDelegatorShares.IsZero() then return rational.One + return validator.GlobalStakeShares / validator.IssuedDelegatorShares -bondedToUnbondedPool(candidate Candidate): - removedTokens = exchangeRate(gs.BondedShares, gs.BondedPool) * candidate.GlobalStakeShares - gs.BondedShares -= candidate.GlobalStakeShares +bondedToUnbondedPool(validator Validator): + removedTokens = exchangeRate(gs.BondedShares, gs.BondedPool) * validator.GlobalStakeShares + gs.BondedShares -= validator.GlobalStakeShares gs.BondedPool -= removedTokens gs.UnbondedPool += removedTokens issuedShares = removedTokens / exchangeRate(gs.UnbondedShares, gs.UnbondedPool) gs.UnbondedShares += issuedShares - candidate.GlobalStakeShares = issuedShares - candidate.Status = Unbonded + validator.GlobalStakeShares = issuedShares + validator.Status = Unbonded return transfer(address of the bonded pool, address of the unbonded pool, removedTokens) ``` @@ -254,10 +254,10 @@ redelegate(tx TxRedelegate): if bond == nil then return if bond.Shares < tx.Shares return - candidate = loadCandidate(store, tx.PubKeyFrom) - if candidate == nil return + validator = loadValidator(store, tx.PubKeyFrom) + if validator == nil return - candidate.RedelegatingShares += tx.Shares + validator.RedelegatingShares += tx.Shares reDelegationElem = QueueElemReDelegate(tx.PubKeyFrom, currentHeight(), sender, tx.Shares, tx.PubKeyTo) redelegationQueue.add(reDelegationElem) return diff --git a/docs/spec/staking/valset-changes.md b/docs/spec/staking/valset-changes.md index bc52b89980..0547b171f5 100644 --- a/docs/spec/staking/valset-changes.md +++ b/docs/spec/staking/valset-changes.md @@ -36,10 +36,10 @@ tick(ctx Context): if time > reDelegationQueue.head().InitTime + UnbondingPeriod for each element elem in the unbondDelegationQueue where time > elem.InitTime + UnbondingPeriod do - candidate = getCandidate(store, elem.PubKey) - returnedCoins = removeShares(candidate, elem.Shares) - candidate.RedelegatingShares -= elem.Shares - delegateWithCandidate(TxDelegate(elem.NewCandidate, returnedCoins), candidate) + validator = getValidator(store, elem.PubKey) + returnedCoins = removeShares(validator, elem.Shares) + validator.RedelegatingShares -= elem.Shares + delegateWithValidator(TxDelegate(elem.NewValidator, returnedCoins), validator) reDelegationQueue.remove(elem) return UpdateValidatorSet() @@ -61,42 +61,42 @@ nextInflation(hrsPerYr rational.Rat): return inflation UpdateValidatorSet(): - candidates = loadCandidates(store) + validators = loadValidators(store) - v1 = candidates.Validators() - v2 = updateVotingPower(candidates).Validators() + v1 = validators.Validators() + v2 = updateVotingPower(validators).Validators() change = v1.validatorsUpdated(v2) // determine all updated validators between two validator sets return change -updateVotingPower(candidates Candidates): - foreach candidate in candidates do - candidate.VotingPower = (candidate.IssuedDelegatorShares - candidate.RedelegatingShares) * delegatorShareExRate(candidate) +updateVotingPower(validators Validators): + foreach validator in validators do + validator.VotingPower = (validator.IssuedDelegatorShares - validator.RedelegatingShares) * delegatorShareExRate(validator) - candidates.Sort() + validators.Sort() - foreach candidate in candidates do - if candidate is not in the first params.MaxVals - candidate.VotingPower = rational.Zero - if candidate.Status == Bonded then bondedToUnbondedPool(candidate Candidate) + foreach validator in validators do + if validator is not in the first params.MaxVals + validator.VotingPower = rational.Zero + if validator.Status == Bonded then bondedToUnbondedPool(validator Validator) - else if candidate.Status == UnBonded then unbondedToBondedPool(candidate) + else if validator.Status == UnBonded then unbondedToBondedPool(validator) - saveCandidate(store, c) + saveValidator(store, c) - return candidates + return validators -unbondedToBondedPool(candidate Candidate): - removedTokens = exchangeRate(gs.UnbondedShares, gs.UnbondedPool) * candidate.GlobalStakeShares - gs.UnbondedShares -= candidate.GlobalStakeShares +unbondedToBondedPool(validator Validator): + removedTokens = exchangeRate(gs.UnbondedShares, gs.UnbondedPool) * validator.GlobalStakeShares + gs.UnbondedShares -= validator.GlobalStakeShares gs.UnbondedPool -= removedTokens gs.BondedPool += removedTokens issuedShares = removedTokens / exchangeRate(gs.BondedShares, gs.BondedPool) gs.BondedShares += issuedShares - candidate.GlobalStakeShares = issuedShares - candidate.Status = Bonded + validator.GlobalStakeShares = issuedShares + validator.Status = Bonded return transfer(address of the unbonded pool, address of the bonded pool, removedTokens) ``` @@ -151,7 +151,7 @@ LastCommit and +2/3 (see [TODO](https://github.com/cosmos/cosmos-sdk/issues/967) Validators are penalized for failing to be included in the LastCommit for some number of blocks by being automatically unbonded. -The following information is stored with each validator candidate, and is only non-zero if the candidate becomes an active validator: +The following information is stored with each validator, and is only non-zero if the validator becomes an active validator: ```go type ValidatorSigningInfo struct { @@ -161,7 +161,7 @@ type ValidatorSigningInfo struct { ``` Where: -* `StartHeight` is set to the height that the candidate became an active validator (with non-zero voting power). +* `StartHeight` is set to the height that the validator became an active validator (with non-zero voting power). * `SignedBlocksBitArray` is a bit-array of size `SIGNED_BLOCKS_WINDOW` that records, for each of the last `SIGNED_BLOCKS_WINDOW` blocks, whether or not this validator was included in the LastCommit. It uses a `0` if the validator was included, and a `1` if it was not. Note it is initialized with all 0s. From 55cc086f55fa0bffd03b8df72aacfd2a6d3cbb11 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Fri, 18 May 2018 15:08:12 -0400 Subject: [PATCH 161/548] docs reorganization --- docs/{old => _attic}/basecoin/basics.rst | 0 docs/{old => _attic}/basecoin/extensions.rst | 0 docs/{old => _attic}/glossary.rst | 0 docs/{old => _attic}/ibc.rst | 0 docs/{old => _attic}/keys.md | 0 docs/{old => _attic}/replay-protection.rst | 0 docs/{old => _attic}/staking/key-management.rst | 0 docs/{old => _attic}/staking/local-testnet.rst | 0 docs/{old => _attic}/staking/public-testnet.rst | 0 docs/{old => _attic}/stakingSpec1.md | 0 docs/{old => _attic}/stakingSpec2.md | 0 docs/{ => guides}/Makefile | 0 docs/{ => guides}/conf.py | 0 docs/{ => guides}/guide.md | 0 docs/{ => guides}/index.rst | 0 docs/{ => guides}/make.bat | 0 docs/{ => guides}/sdk/apps.md | 0 docs/{ => guides}/sdk/install.rst | 0 docs/{ => guides}/sdk/key-management.rst | 0 docs/{ => guides}/sdk/lcd-rest-api.yaml | 0 docs/{ => guides}/sdk/overview.rst | 0 docs/{ => guides}/staking/intro.rst | 0 docs/{spec => guides}/staking/overview.md | 2 ++ docs/{ => guides}/staking/testnet.rst | 0 .../fee_distribution_model.xlsx | Bin docs/spec/{rewards => provisioning}/overview.md | 0 docs/spec/staking/state.md | 6 ++---- 27 files changed, 4 insertions(+), 4 deletions(-) rename docs/{old => _attic}/basecoin/basics.rst (100%) rename docs/{old => _attic}/basecoin/extensions.rst (100%) rename docs/{old => _attic}/glossary.rst (100%) rename docs/{old => _attic}/ibc.rst (100%) rename docs/{old => _attic}/keys.md (100%) rename docs/{old => _attic}/replay-protection.rst (100%) rename docs/{old => _attic}/staking/key-management.rst (100%) rename docs/{old => _attic}/staking/local-testnet.rst (100%) rename docs/{old => _attic}/staking/public-testnet.rst (100%) rename docs/{old => _attic}/stakingSpec1.md (100%) rename docs/{old => _attic}/stakingSpec2.md (100%) rename docs/{ => guides}/Makefile (100%) rename docs/{ => guides}/conf.py (100%) rename docs/{ => guides}/guide.md (100%) rename docs/{ => guides}/index.rst (100%) rename docs/{ => guides}/make.bat (100%) rename docs/{ => guides}/sdk/apps.md (100%) rename docs/{ => guides}/sdk/install.rst (100%) rename docs/{ => guides}/sdk/key-management.rst (100%) rename docs/{ => guides}/sdk/lcd-rest-api.yaml (100%) rename docs/{ => guides}/sdk/overview.rst (100%) rename docs/{ => guides}/staking/intro.rst (100%) rename docs/{spec => guides}/staking/overview.md (99%) rename docs/{ => guides}/staking/testnet.rst (100%) rename docs/spec/{rewards => provisioning}/fee_distribution_model.xlsx (100%) rename docs/spec/{rewards => provisioning}/overview.md (100%) diff --git a/docs/old/basecoin/basics.rst b/docs/_attic/basecoin/basics.rst similarity index 100% rename from docs/old/basecoin/basics.rst rename to docs/_attic/basecoin/basics.rst diff --git a/docs/old/basecoin/extensions.rst b/docs/_attic/basecoin/extensions.rst similarity index 100% rename from docs/old/basecoin/extensions.rst rename to docs/_attic/basecoin/extensions.rst diff --git a/docs/old/glossary.rst b/docs/_attic/glossary.rst similarity index 100% rename from docs/old/glossary.rst rename to docs/_attic/glossary.rst diff --git a/docs/old/ibc.rst b/docs/_attic/ibc.rst similarity index 100% rename from docs/old/ibc.rst rename to docs/_attic/ibc.rst diff --git a/docs/old/keys.md b/docs/_attic/keys.md similarity index 100% rename from docs/old/keys.md rename to docs/_attic/keys.md diff --git a/docs/old/replay-protection.rst b/docs/_attic/replay-protection.rst similarity index 100% rename from docs/old/replay-protection.rst rename to docs/_attic/replay-protection.rst diff --git a/docs/old/staking/key-management.rst b/docs/_attic/staking/key-management.rst similarity index 100% rename from docs/old/staking/key-management.rst rename to docs/_attic/staking/key-management.rst diff --git a/docs/old/staking/local-testnet.rst b/docs/_attic/staking/local-testnet.rst similarity index 100% rename from docs/old/staking/local-testnet.rst rename to docs/_attic/staking/local-testnet.rst diff --git a/docs/old/staking/public-testnet.rst b/docs/_attic/staking/public-testnet.rst similarity index 100% rename from docs/old/staking/public-testnet.rst rename to docs/_attic/staking/public-testnet.rst diff --git a/docs/old/stakingSpec1.md b/docs/_attic/stakingSpec1.md similarity index 100% rename from docs/old/stakingSpec1.md rename to docs/_attic/stakingSpec1.md diff --git a/docs/old/stakingSpec2.md b/docs/_attic/stakingSpec2.md similarity index 100% rename from docs/old/stakingSpec2.md rename to docs/_attic/stakingSpec2.md diff --git a/docs/Makefile b/docs/guides/Makefile similarity index 100% rename from docs/Makefile rename to docs/guides/Makefile diff --git a/docs/conf.py b/docs/guides/conf.py similarity index 100% rename from docs/conf.py rename to docs/guides/conf.py diff --git a/docs/guide.md b/docs/guides/guide.md similarity index 100% rename from docs/guide.md rename to docs/guides/guide.md diff --git a/docs/index.rst b/docs/guides/index.rst similarity index 100% rename from docs/index.rst rename to docs/guides/index.rst diff --git a/docs/make.bat b/docs/guides/make.bat similarity index 100% rename from docs/make.bat rename to docs/guides/make.bat diff --git a/docs/sdk/apps.md b/docs/guides/sdk/apps.md similarity index 100% rename from docs/sdk/apps.md rename to docs/guides/sdk/apps.md diff --git a/docs/sdk/install.rst b/docs/guides/sdk/install.rst similarity index 100% rename from docs/sdk/install.rst rename to docs/guides/sdk/install.rst diff --git a/docs/sdk/key-management.rst b/docs/guides/sdk/key-management.rst similarity index 100% rename from docs/sdk/key-management.rst rename to docs/guides/sdk/key-management.rst diff --git a/docs/sdk/lcd-rest-api.yaml b/docs/guides/sdk/lcd-rest-api.yaml similarity index 100% rename from docs/sdk/lcd-rest-api.yaml rename to docs/guides/sdk/lcd-rest-api.yaml diff --git a/docs/sdk/overview.rst b/docs/guides/sdk/overview.rst similarity index 100% rename from docs/sdk/overview.rst rename to docs/guides/sdk/overview.rst diff --git a/docs/staking/intro.rst b/docs/guides/staking/intro.rst similarity index 100% rename from docs/staking/intro.rst rename to docs/guides/staking/intro.rst diff --git a/docs/spec/staking/overview.md b/docs/guides/staking/overview.md similarity index 99% rename from docs/spec/staking/overview.md rename to docs/guides/staking/overview.md index 053d59d7ab..9867dc95e3 100644 --- a/docs/spec/staking/overview.md +++ b/docs/guides/staking/overview.md @@ -1,3 +1,5 @@ +//TODO update .rst + # Staking Module ## Overview diff --git a/docs/staking/testnet.rst b/docs/guides/staking/testnet.rst similarity index 100% rename from docs/staking/testnet.rst rename to docs/guides/staking/testnet.rst diff --git a/docs/spec/rewards/fee_distribution_model.xlsx b/docs/spec/provisioning/fee_distribution_model.xlsx similarity index 100% rename from docs/spec/rewards/fee_distribution_model.xlsx rename to docs/spec/provisioning/fee_distribution_model.xlsx diff --git a/docs/spec/rewards/overview.md b/docs/spec/provisioning/overview.md similarity index 100% rename from docs/spec/rewards/overview.md rename to docs/spec/provisioning/overview.md diff --git a/docs/spec/staking/state.md b/docs/spec/staking/state.md index 28e4faaf2c..397ce1c1c7 100644 --- a/docs/spec/staking/state.md +++ b/docs/spec/staking/state.md @@ -2,15 +2,13 @@ ## State The staking module persists the following information to the store: -* `GlobalState`, a struct describing the global pools, inflation, and - fees +* `Params`, a struct describing the global pools, inflation, and fees +* `Pool`, a struct describing the global pools, inflation, and fees * `ValidatorValidators: => `, a map of all validators (including current validators) in the store, indexed by their public key and shares in the global pool. * `DelegatorBonds: < delegator-address | validator-pubkey > => `. a map of all delegations by a delegator to a validator, indexed by delegator address and validator pubkey. public key -* `UnbondQueue`, the queue of unbonding delegations -* `RedelegateQueue`, the queue of re-delegations ### Global State From 35956c1c789ef8ca0bce766fb25e41f0d4f9e9a8 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Wed, 23 May 2018 15:42:37 -0400 Subject: [PATCH 162/548] staking spec state revisions --- docs/spec/slashing/state.md | 13 ++ docs/spec/staking/state.md | 240 ++++++++++++++---------------------- x/stake/delegation.go | 1 - x/stake/shares.go | 3 - x/stake/validator.go | 8 +- 5 files changed, 110 insertions(+), 155 deletions(-) create mode 100644 docs/spec/slashing/state.md diff --git a/docs/spec/slashing/state.md b/docs/spec/slashing/state.md new file mode 100644 index 0000000000..0711b01aac --- /dev/null +++ b/docs/spec/slashing/state.md @@ -0,0 +1,13 @@ + + +Validator + +* Adjustment factor used to passively calculate each validators entitled fees + from `GlobalState.FeePool` + +Delegation Shares + +* AdjustmentFeePool: Adjustment factor used to passively calculate each bonds + entitled fees from `GlobalState.FeePool` +* AdjustmentRewardPool: Adjustment factor used to passively calculate each + bonds entitled fees from `Validator.ProposerRewardPool` diff --git a/docs/spec/staking/state.md b/docs/spec/staking/state.md index 397ce1c1c7..c5601d0445 100644 --- a/docs/spec/staking/state.md +++ b/docs/spec/staking/state.md @@ -10,193 +10,139 @@ indexed by their public key and shares in the global pool. indexed by delegator address and validator pubkey. public key -### Global State +### Pool -The GlobalState contains information about the total amount of Atoms, the -global bonded/unbonded position, the Atom inflation rate, and the fees. +The pool is a space for all dynamic global state of the Cosmos Hub. It tracks +information about the total amounts of Atoms in all states, representative +validator shares for stake in the global pools, moving Atom inflation +information, etc. -`Params` is global data structure that stores system parameters and defines overall functioning of the -module. +```golang +type Pool struct { + LooseUnbondedTokens int64 // tokens not associated with any validator + UnbondedTokens int64 // reserve of unbonded tokens held with validators + UnbondingTokens int64 // tokens moving from bonded to unbonded pool + BondedTokens int64 // reserve of bonded tokens + UnbondedShares sdk.Rat // sum of all shares distributed for the Unbonded Pool + UnbondingShares sdk.Rat // shares moving from Bonded to Unbonded Pool + BondedShares sdk.Rat // sum of all shares distributed for the Bonded Pool + InflationLastTime int64 // block which the last inflation was processed // TODO make time + Inflation sdk.Rat // current annual inflation rate -``` go -type GlobalState struct { - TotalSupply int64 // total supply of Atoms - BondedPool int64 // reserve of bonded tokens - BondedShares rational.Rat // sum of all shares distributed for the BondedPool - UnbondedPool int64 // reserve of unbonding tokens held with validators - UnbondedShares rational.Rat // sum of all shares distributed for the UnbondedPool - InflationLastTime int64 // timestamp of last processing of inflation - Inflation rational.Rat // current annual inflation rate - DateLastCommissionReset int64 // unix timestamp for last commission accounting reset - FeePool coin.Coins // fee pool for all the fee shares which have already been distributed - ReservePool coin.Coins // pool of reserve taxes collected on all fees for governance use - Adjustment rational.Rat // Adjustment factor for calculating global fee accum + DateLastCommissionReset int64 // unix timestamp for last commission accounting reset (daily) } +type PoolShares struct { + Status sdk.BondStatus // either: unbonded, unbonding, or bonded + Amount sdk.Rat // total shares of type ShareKind +} +``` + +### Params + +Params is global data structure that stores system parameters and defines +overall functioning of the stake module. + +```golang type Params struct { - HoldBonded Address // account where all bonded coins are held - HoldUnbonding Address // account where all delegated but unbonding coins are held + InflationRateChange sdk.Rat // maximum annual change in inflation rate + InflationMax sdk.Rat // maximum inflation rate + InflationMin sdk.Rat // minimum inflation rate + GoalBonded sdk.Rat // Goal of percent bonded atoms - InflationRateChange rational.Rational // maximum annual change in inflation rate - InflationMax rational.Rational // maximum inflation rate - InflationMin rational.Rational // minimum inflation rate - GoalBonded rational.Rational // Goal of percent bonded atoms - ReserveTax rational.Rational // Tax collected on all fees - - MaxVals uint16 // maximum number of validators - AllowedBondDenom string // bondable coin denomination - - // gas costs for txs - GasDeclareCandidacy int64 - GasEditCandidacy int64 - GasDelegate int64 - GasRedelegate int64 - GasUnbond int64 + MaxValidators uint16 // maximum number of validators + BondDenom string // bondable coin denomination } ``` ### Validator -The `Validator` holds the current state and some historical -actions of validators. - -``` go -type ValidatorStatus byte - -const ( - Bonded ValidatorStatus = 0x01 - Unbonded ValidatorStatus = 0x02 - Revoked ValidatorStatus = 0x03 -) +The `Validator` holds the current state and some historical actions of the +validator. +```golang type Validator struct { - Status ValidatorStatus - ConsensusPubKey crypto.PubKey - GovernancePubKey crypto.PubKey - Owner crypto.Address - GlobalStakeShares rational.Rat - IssuedDelegatorShares rational.Rat - RedelegatingShares rational.Rat - VotingPower rational.Rat - Commission rational.Rat - CommissionMax rational.Rat - CommissionChangeRate rational.Rat - CommissionChangeToday rational.Rat - ProposerRewardPool coin.Coins - Adjustment rational.Rat - Description Description + Owner sdk.Address // sender of BondTx - UnbondTx returns here + ConsensusPubKey crypto.PubKey // Tendermint consensus pubkey of validator + Revoked bool // has the validator been revoked? + + PoolShares PoolShares // total shares for tokens held in the pool + DelegatorShares sdk.Rat // total shares issued to a validator's delegators + + Description Description // description terms for the validator + BondHeight int64 // earliest height as a bonded validator + BondIntraTxCounter int16 // block-local tx index of validator change + ProposerRewardPool sdk.Coins // reward pool collected from being the proposer + + Commission sdk.Rat // the commission rate of fees charged to any delegators + CommissionMax sdk.Rat // maximum commission rate which this validator can ever charge + CommissionChangeRate sdk.Rat // maximum daily increase of the validator commission + CommissionChangeToday sdk.Rat // commission rate change today, reset each day (UTC time) + + PrevPoolShares PoolShares // total shares of a global hold pools } type Description struct { - Name string - DateBonded string - Identity string - Website string - Details string + Moniker string // name + Identity string // optional identity signature (ex. UPort or Keybase) + Website string // optional website link + Details string // optional details } ``` -Validator parameters are described: -* Status: it can be Bonded (active validator), Unbonding (validator) - or Revoked -* ConsensusPubKey: validator public key that is used strictly for participating in - consensus -* GovernancePubKey: public key used by the validator for governance voting -* Owner: Address that is allowed to unbond coins. -* GlobalStakeShares: Represents shares of `GlobalState.BondedPool` if - `Validator.Status` is `Bonded`; or shares of `GlobalState.Unbondingt Pool` - otherwise -* IssuedDelegatorShares: Sum of all shares a validator issued to delegators - (which includes the validator's self-bond); a delegator share represents - their stake in the Validator's `GlobalStakeShares` * RedelegatingShares: The portion of `IssuedDelegatorShares` which are currently re-delegating to a new validator -* VotingPower: Proportional to the amount of bonded tokens which the validator - has if `Validator.Status` is `Bonded`; otherwise it is equal to `0` -* Commission: The commission rate of fees charged to any delegators -* CommissionMax: The maximum commission rate this validator can charge each - day from the date `GlobalState.DateLastCommissionReset` -* CommissionChangeRate: The maximum daily increase of the validator commission -* CommissionChangeToday: Counter for the amount of change to commission rate - which has occurred today, reset on the first block of each day (UTC time) -* ProposerRewardPool: reward pool for extra fees collected when this validator - is the proposer of a block -* Adjustment factor used to passively calculate each validators entitled fees - from `GlobalState.FeePool` -* Description - * Name: moniker - * DateBonded: date determined which the validator was bonded - * Identity: optional field to provide a signature which verifies the - validators identity (ex. UPort or Keybase) - * Website: optional website link - * Details: optional details -### DelegatorBond +### Delegation Atom holders may delegate coins to validators; under this circumstance their -funds are held in a `DelegatorBond` data structure. It is owned by one +funds are held in a `Delegation` data structure. It is owned by one delegator, and is associated with the shares for one validator. The sender of the transaction is the owner of the bond. -``` go -type DelegatorBond struct { - Validator crypto.PubKey - Shares rational.Rat - AdjustmentFeePool coin.Coins - AdjustmentRewardPool coin.Coins -} -``` - -Description: -* Validator: the public key of the validator: bonding too -* Shares: the number of delegator shares received from the validator -* AdjustmentFeePool: Adjustment factor used to passively calculate each bonds - entitled fees from `GlobalState.FeePool` -* AdjustmentRewardPool: Adjustment factor used to passively calculate each - bonds entitled fees from `Validator.ProposerRewardPool` - - -### QueueElem - -The Unbonding and re-delegation process is implemented using the ordered queue -data structure. All queue elements share a common structure: - ```golang -type QueueElem struct { - Validator crypto.PubKey - InitTime int64 // when the element was added to the queue +type Delegation struct { + DelegatorAddr sdk.Address // delegation owner address + ValidatorAddr sdk.Address // validator owner address + Shares sdk.Rat // delegation shares recieved + Height int64 // last height bond updated } ``` -The queue is ordered so the next element to unbond/re-delegate is at the head. -Every tick the head of the queue is checked and if the unbonding period has -passed since `InitTime`, the final settlement of the unbonding is started or -re-delegation is executed, and the element is popped from the queue. Each -`QueueElem` is persisted in the store until it is popped from the queue. +### UnbondingDelegation -### QueueElemUnbondDelegation - -QueueElemUnbondDelegation structure is used in the unbonding queue. +A UnbondingDelegation object is created every time an unbonding is initiated. +It must be completed with a second transaction provided by the delegation owner +after the unbonding period has passed. ```golang -type QueueElemUnbondDelegation struct { - QueueElem - Payout Address // account to pay out to - Tokens coin.Coins // the value in Atoms of the amount of delegator shares which are unbonding - StartSlashRatio rational.Rat // validator slash ratio +type UnbondingDelegation struct { + DelegationKey []byte // key of the delegation + InitTime int64 // unix time at unbonding initation + InitHeight int64 // block height at unbonding initation + ExpectedTokens sdk.Coins // the value in Atoms of the amount of shares which are unbonding + StartSlashRatio sdk.Rat // validator slash ratio at unbonding initiation } ``` -### QueueElemReDelegate +### Redelegation -QueueElemReDelegate structure is used in the re-delegation queue. +A redelegation object is created every time a redelegation occurs. It must be +completed with a second transaction provided by the delegation owner after the +unbonding period has passed. The destination delegation of a redelegation may +not itself undergo a new redelegation until the original redelegation has been +completed. + + - index: delegation address + - index 2: source validator owner address + - index 3: destination validator owner address ```golang -type QueueElemReDelegate struct { - QueueElem - Payout Address // account to pay out to - Shares rational.Rat // amount of shares which are unbonding - NewValidator crypto.PubKey // validator to bond to after unbond +type Redelegation struct { + SourceDelegation []byte // source delegation key + DestinationDelegation []byte // destination delegation key + InitTime int64 // unix time at redelegation + InitHeight int64 // block height at redelegation + Shares sdk.Rat // amount of shares redelegating } ``` - diff --git a/x/stake/delegation.go b/x/stake/delegation.go index dedac03e58..ae08e0867b 100644 --- a/x/stake/delegation.go +++ b/x/stake/delegation.go @@ -10,7 +10,6 @@ import ( // Delegation represents the bond with tokens held by an account. It is // owned by one delegator, and is associated with the voting power of one // pubKey. -// TODO better way of managing space type Delegation struct { DelegatorAddr sdk.Address `json:"delegator_addr"` ValidatorAddr sdk.Address `json:"validator_addr"` diff --git a/x/stake/shares.go b/x/stake/shares.go index d5fe93844d..48781e2c63 100644 --- a/x/stake/shares.go +++ b/x/stake/shares.go @@ -4,9 +4,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) -// kind of shares -type PoolShareKind byte - // pool shares held by a validator type PoolShares struct { Status sdk.BondStatus `json:"status"` diff --git a/x/stake/validator.go b/x/stake/validator.go index a0b484d712..97e1a827ea 100644 --- a/x/stake/validator.go +++ b/x/stake/validator.go @@ -82,10 +82,10 @@ func (v Validator) equal(c2 Validator) bool { // Description - description fields for a validator type Description struct { - Moniker string `json:"moniker"` - Identity string `json:"identity"` - Website string `json:"website"` - Details string `json:"details"` + Moniker string `json:"moniker"` // name + Identity string `json:"identity"` // optional identity signature (ex. UPort or Keybase) + Website string `json:"website"` // optional website link + Details string `json:"details"` // optional details } func NewDescription(moniker, identity, website, details string) Description { From b8cf5f347ea55820b42c4a48d98e071ab2bbc38c Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Fri, 25 May 2018 18:52:34 -0400 Subject: [PATCH 163/548] transaction stake updates --- docs/spec/slashing/valset-changes.md | 88 ++++++++ docs/spec/staking/state.md | 41 ++-- docs/spec/staking/transactions.md | 323 ++++++++++----------------- docs/spec/staking/valset-changes.md | 99 +------- 4 files changed, 232 insertions(+), 319 deletions(-) create mode 100644 docs/spec/slashing/valset-changes.md diff --git a/docs/spec/slashing/valset-changes.md b/docs/spec/slashing/valset-changes.md new file mode 100644 index 0000000000..c403e5d4c0 --- /dev/null +++ b/docs/spec/slashing/valset-changes.md @@ -0,0 +1,88 @@ +# Validator Set Changes + +## Slashing + +Messges which may compromise the safety of the underlying consensus protocol ("equivocations") +result in some amount of the offending validator's shares being removed ("slashed"). + +Currently, such messages include only the following: + +- prevotes by the same validator for more than one BlockID at the same + Height and Round +- precommits by the same validator for more than one BlockID at the same + Height and Round + +We call any such pair of conflicting votes `Evidence`. Full nodes in the network prioritize the +detection and gossipping of `Evidence` so that it may be rapidly included in blocks and the offending +validators punished. + +For some `evidence` to be valid, it must satisfy: + +`evidence.Timestamp >= block.Timestamp - MAX_EVIDENCE_AGE` + +where `evidence.Timestamp` is the timestamp in the block at height +`evidence.Height` and `block.Timestamp` is the current block timestamp. + +If valid evidence is included in a block, the offending validator loses +a constant `SLASH_PROPORTION` of their current stake at the beginning of the block: + +``` +oldShares = validator.shares +validator.shares = oldShares * (1 - SLASH_PROPORTION) +``` + +This ensures that offending validators are punished the same amount whether they +act as a single validator with X stake or as N validators with collectively X +stake. + + +## Automatic Unbonding + +Every block includes a set of precommits by the validators for the previous block, +known as the LastCommit. A LastCommit is valid so long as it contains precommits from +2/3 of voting power. + +Proposers are incentivized to include precommits from all +validators in the LastCommit by receiving additional fees +proportional to the difference between the voting power included in the +LastCommit and +2/3 (see [TODO](https://github.com/cosmos/cosmos-sdk/issues/967)). + +Validators are penalized for failing to be included in the LastCommit for some +number of blocks by being automatically unbonded. + +The following information is stored with each validator, and is only non-zero if the validator becomes an active validator: + +```go +type ValidatorSigningInfo struct { + StartHeight int64 + SignedBlocksBitArray BitArray +} +``` + +Where: +* `StartHeight` is set to the height that the validator became an active validator (with non-zero voting power). +* `SignedBlocksBitArray` is a bit-array of size `SIGNED_BLOCKS_WINDOW` that records, for each of the last `SIGNED_BLOCKS_WINDOW` blocks, +whether or not this validator was included in the LastCommit. It uses a `0` if the validator was included, and a `1` if it was not. +Note it is initialized with all 0s. + +At the beginning of each block, we update the signing info for each validator and check if they should be automatically unbonded: + +``` +h = block.Height +index = h % SIGNED_BLOCKS_WINDOW + +for val in block.Validators: + signInfo = val.SignInfo + if val in block.LastCommit: + signInfo.SignedBlocksBitArray.Set(index, 0) + else + signInfo.SignedBlocksBitArray.Set(index, 1) + + // validator must be active for at least SIGNED_BLOCKS_WINDOW + // before they can be automatically unbonded for failing to be + // included in 50% of the recent LastCommits + minHeight = signInfo.StartHeight + SIGNED_BLOCKS_WINDOW + minSigned = SIGNED_BLOCKS_WINDOW / 2 + blocksSigned = signInfo.SignedBlocksBitArray.Sum() + if h > minHeight AND blocksSigned < minSigned: + unbond the validator +``` diff --git a/docs/spec/staking/state.md b/docs/spec/staking/state.md index c5601d0445..fa235479f6 100644 --- a/docs/spec/staking/state.md +++ b/docs/spec/staking/state.md @@ -1,16 +1,7 @@ - ## State -The staking module persists the following information to the store: -* `Params`, a struct describing the global pools, inflation, and fees -* `Pool`, a struct describing the global pools, inflation, and fees -* `ValidatorValidators: => `, a map of all validators (including current validators) in the store, -indexed by their public key and shares in the global pool. -* `DelegatorBonds: < delegator-address | validator-pubkey > => `. a map of all delegations by a delegator to a validator, -indexed by delegator address and validator pubkey. - public key - ### Pool + - index: n/a single-record The pool is a space for all dynamic global state of the Cosmos Hub. It tracks information about the total amounts of Atoms in all states, representative @@ -39,6 +30,7 @@ type PoolShares struct { ``` ### Params + - index: n/a single-record Params is global data structure that stores system parameters and defines overall functioning of the stake module. @@ -56,6 +48,11 @@ type Params struct { ``` ### Validator + - index 1: validator owner address + - index 2: validator Tendermint PubKey + - index 3: bonded validators only + - index 4: voting power + - index 5: Tendermint updates The `Validator` holds the current state and some historical actions of the validator. @@ -90,10 +87,8 @@ type Description struct { } ``` -* RedelegatingShares: The portion of `IssuedDelegatorShares` which are - currently re-delegating to a new validator - ### Delegation + - index: delegation address Atom holders may delegate coins to validators; under this circumstance their funds are held in a `Delegation` data structure. It is owned by one @@ -110,10 +105,12 @@ type Delegation struct { ``` ### UnbondingDelegation + - index: delegation address A UnbondingDelegation object is created every time an unbonding is initiated. -It must be completed with a second transaction provided by the delegation owner +The unbond must be completed with a second transaction provided by the delegation owner after the unbonding period has passed. + ```golang type UnbondingDelegation struct { @@ -126,17 +123,17 @@ type UnbondingDelegation struct { ``` ### Redelegation - -A redelegation object is created every time a redelegation occurs. It must be -completed with a second transaction provided by the delegation owner after the -unbonding period has passed. The destination delegation of a redelegation may -not itself undergo a new redelegation until the original redelegation has been -completed. - - - index: delegation address + - index 1: delegation address - index 2: source validator owner address - index 3: destination validator owner address +A redelegation object is created every time a redelegation occurs. The +redelegation must be completed with a second transaction provided by the +delegation owner after the unbonding period has passed. The destination +delegation of a redelegation may not itself undergo a new redelegation until +the original redelegation has been completed. + + ```golang type Redelegation struct { SourceDelegation []byte // source delegation key diff --git a/docs/spec/staking/transactions.md b/docs/spec/staking/transactions.md index c80ddc7a9b..685883dd11 100644 --- a/docs/spec/staking/transactions.md +++ b/docs/spec/staking/transactions.md @@ -1,67 +1,58 @@ ### Transaction Overview +In this section we describe the processing of the transactions and the +corresponding updates to the state. + Available Transactions: -* TxDeclareCandidacy -* TxEditCandidacy -* TxDelegate -* TxUnbond -* TxRedelegate -* TxProveLive + - TxCreateValidator + - TxEditValidator + - TxDelegation + - TxRedelegation + - TxUnbond -## Transaction processing - -In this section we describe the processing of the transactions and the -corresponding updates to the global state. In the following text we will use -`gs` to refer to the `GlobalState` data structure, `unbondDelegationQueue` is a -reference to the queue of unbond delegations, `reDelegationQueue` is the -reference for the queue of redelegations. We use `tx` to denote a -reference to a transaction that is being processed, and `sender` to denote the -address of the sender of the transaction. We use function -`loadValidator(store, PubKey)` to obtain a Validator structure from the store, -and `saveValidator(store, validator)` to save it. Similarly, we use -`loadDelegatorBond(store, sender, PubKey)` to load a delegator bond with the -key (sender and PubKey) from the store, and -`saveDelegatorBond(store, sender, bond)` to save it. -`removeDelegatorBond(store, sender, bond)` is used to remove the bond from the -store. +Other notes: + - `tx` denotes a reference to the transaction being processed + - `sender` denotes the address of the sender of the transaction + - `getXxx`, `setXxx`, and `removeXxx` functions are used to retrieve and + modify objects from the store + - `sdk.Rat` refers to a rational numeric type specified by the sdk. -### TxDeclareCandidacy +### TxCreateValidator -A validator candidacy is declared using the `TxDeclareCandidacy` transaction. +A validator is created using the `TxCreateValidator` transaction. ```golang -type TxDeclareCandidacy struct { +type TxCreateValidator struct { + OwnerAddr sdk.Address ConsensusPubKey crypto.PubKey - Amount coin.Coin GovernancePubKey crypto.PubKey - Commission rational.Rat - CommissionMax int64 - CommissionMaxChange int64 + SelfDelegation coin.Coin + Description Description + Commission sdk.Rat + CommissionMax sdk.Rat + CommissionMaxChange sdk.Rat } + -declareCandidacy(tx TxDeclareCandidacy): - validator = loadValidator(store, tx.PubKey) - if validator != nil return // validator with that public key already exists +createValidator(tx TxCreateValidator): + validator = getValidator(tx.OwnerAddr) + if validator != nil return // only one validator per address - validator = NewValidator(tx.PubKey) - validator.Status = Unbonded - validator.Owner = sender - init validator VotingPower, GlobalStakeShares, IssuedDelegatorShares, RedelegatingShares and Adjustment to rational.Zero - init commision related fields based on the values from tx - validator.ProposerRewardPool = Coin(0) - validator.Description = tx.Description + validator = NewValidator(OwnerAddr, ConsensusPubKey, GovernancePubKey, Description) + init validator poolShares, delegatorShares set to 0 //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + init validator commision fields from tx + validator.PoolShares = 0 - saveValidator(store, validator) + setValidator(validator) - txDelegate = TxDelegate(tx.PubKey, tx.Amount) - return delegateWithValidator(txDelegate, validator) - -// see delegateWithValidator function in [TxDelegate](TxDelegate) + txDelegate = TxDelegate(tx.OwnerAddr, tx.OwnerAddr, tx.SelfDelegation) + delegate(txDelegate, validator) // see delegate function in [TxDelegate](TxDelegate) + return ``` -### TxEditCandidacy +### TxEditValidator If either the `Description` (excluding `DateBonded` which is constant), `Commission`, or the `GovernancePubKey` need to be updated, the @@ -70,87 +61,51 @@ If either the `Description` (excluding `DateBonded` which is constant), ```golang type TxEditCandidacy struct { GovernancePubKey crypto.PubKey - Commission int64 + Commission sdk.Rat Description Description } editCandidacy(tx TxEditCandidacy): - validator = loadValidator(store, tx.PubKey) - if validator == nil or validator.Status == Revoked return + validator = getValidator(tx.ValidatorAddr) + if tx.Commission > CommissionMax || tx.Commission < 0 return halt tx + if rateChange(tx.Commission) > CommissionMaxChange return halt tx + validator.Commission = tx.Commission + if tx.GovernancePubKey != nil validator.GovernancePubKey = tx.GovernancePubKey - if tx.Commission >= 0 validator.Commission = tx.Commission if tx.Description != nil validator.Description = tx.Description - saveValidator(store, validator) + setValidator(store, validator) return ``` -### TxDelegate +### TxDelegation -Delegator bonds are created using the `TxDelegate` transaction. Within this -transaction the delegator provides an amount of coins, and in return receives -some amount of validator's delegator shares that are assigned to -`DelegatorBond.Shares`. +Within this transaction the delegator provides coins, and in return receives +some amount of their validator's delegator-shares that are assigned to +`Delegation.Shares`. ```golang type TxDelegate struct { - PubKey crypto.PubKey - Amount coin.Coin + DelegatorAddr sdk.Address + ValidatorAddr sdk.Address + Amount sdk.Coin } delegate(tx TxDelegate): - validator = loadValidator(store, tx.PubKey) - if validator == nil return - return delegateWithValidator(tx, validator) - -delegateWithValidator(tx TxDelegate, validator Validator): + pool = getPool() if validator.Status == Revoked return - if validator.Status == Bonded - poolAccount = params.HoldBonded - else - poolAccount = params.HoldUnbonded + delegation = getDelegatorBond(DelegatorAddr, ValidatorAddr) + if delegation == nil then delegation = NewDelegation(DelegatorAddr, ValidatorAddr) - err = transfer(sender, poolAccount, tx.Amount) - if err != nil return - - bond = loadDelegatorBond(store, sender, tx.PubKey) - if bond == nil then bond = DelegatorBond(tx.PubKey, rational.Zero, Coin(0), Coin(0)) - - issuedDelegatorShares = addTokens(tx.Amount, validator) - bond.Shares += issuedDelegatorShares - - saveValidator(store, validator) - saveDelegatorBond(store, sender, bond) - saveGlobalState(store, gs) - return - -addTokens(amount coin.Coin, validator Validator): - if validator.Status == Bonded - gs.BondedPool += amount - issuedShares = amount / exchangeRate(gs.BondedShares, gs.BondedPool) - gs.BondedShares += issuedShares - else - gs.UnbondedPool += amount - issuedShares = amount / exchangeRate(gs.UnbondedShares, gs.UnbondedPool) - gs.UnbondedShares += issuedShares - - validator.GlobalStakeShares += issuedShares + validator, pool, issuedDelegatorShares = validator.addTokensFromDel(tx.Amount, pool) + delegation.Shares += issuedDelegatorShares - if validator.IssuedDelegatorShares.IsZero() - exRate = rational.One - else - exRate = validator.GlobalStakeShares / validator.IssuedDelegatorShares - - issuedDelegatorShares = issuedShares / exRate - validator.IssuedDelegatorShares += issuedDelegatorShares - return issuedDelegatorShares - -exchangeRate(shares rational.Rat, tokenAmount int64): - if shares.IsZero() then return rational.One - return tokenAmount / shares - + setDelegation(delegation) + updateValidator(validator) + setPool(pool) + return ``` ### TxUnbond @@ -159,125 +114,89 @@ Delegator unbonding is defined with the following transaction: ```golang type TxUnbond struct { - PubKey crypto.PubKey - Shares rational.Rat + DelegatorAddr sdk.Address + ValidatorAddr sdk.Address + Shares string } unbond(tx TxUnbond): - bond = loadDelegatorBond(store, sender, tx.PubKey) - if bond == nil return - if bond.Shares < tx.Shares return - - bond.Shares -= tx.Shares - - validator = loadValidator(store, tx.PubKey) - - revokeCandidacy = false - if bond.Shares.IsZero() - if sender == validator.Owner and validator.Status != Revoked then revokeCandidacy = true then removeDelegatorBond(store, sender, bond) - else - saveDelegatorBond(store, sender, bond) - - if validator.Status == Bonded - poolAccount = params.HoldBonded - else - poolAccount = params.HoldUnbonded - - returnedCoins = removeShares(validator, shares) - - unbondDelegationElem = QueueElemUnbondDelegation(tx.PubKey, currentHeight(), sender, returnedCoins, startSlashRatio) - unbondDelegationQueue.add(unbondDelegationElem) - - transfer(poolAccount, unbondingPoolAddress, returnCoins) + delegation, found = getDelegatorBond(store, sender, tx.PubKey) + if !found == nil return - if revokeCandidacy - if validator.Status == Bonded then bondedToUnbondedPool(validator) - validator.Status = Revoked - - if validator.IssuedDelegatorShares.IsZero() - removeValidator(store, tx.PubKey) + if msg.Shares == "MAX" { + if !bond.Shares.GT(sdk.ZeroRat()) { + return ErrNotEnoughBondShares(k.codespace, msg.Shares).Result() else - saveValidator(store, validator) + var err sdk.Error + delShares, err = sdk.NewRatFromDecimal(msg.Shares) + if err != nil + return err + if bond.Shares.LT(delShares) + return ErrNotEnoughBondShares(k.codespace, msg.Shares).Result() - saveGlobalState(store, gs) - return + validator, found := k.GetValidator(ctx, msg.ValidatorAddr) + if !found { + return err -removeShares(validator Validator, shares rational.Rat): - globalPoolSharesToRemove = delegatorShareExRate(validator) * shares + if msg.Shares == "MAX" + delShares = bond.Shares - if validator.Status == Bonded - gs.BondedShares -= globalPoolSharesToRemove - removedTokens = exchangeRate(gs.BondedShares, gs.BondedPool) * globalPoolSharesToRemove - gs.BondedPool -= removedTokens - else - gs.UnbondedShares -= globalPoolSharesToRemove - removedTokens = exchangeRate(gs.UnbondedShares, gs.UnbondedPool) * globalPoolSharesToRemove - gs.UnbondedPool -= removedTokens - - validator.GlobalStakeShares -= removedTokens - validator.IssuedDelegatorShares -= shares - return returnedCoins - -delegatorShareExRate(validator Validator): - if validator.IssuedDelegatorShares.IsZero() then return rational.One - return validator.GlobalStakeShares / validator.IssuedDelegatorShares - -bondedToUnbondedPool(validator Validator): - removedTokens = exchangeRate(gs.BondedShares, gs.BondedPool) * validator.GlobalStakeShares - gs.BondedShares -= validator.GlobalStakeShares - gs.BondedPool -= removedTokens - - gs.UnbondedPool += removedTokens - issuedShares = removedTokens / exchangeRate(gs.UnbondedShares, gs.UnbondedPool) - gs.UnbondedShares += issuedShares + bond.Shares -= delShares - validator.GlobalStakeShares = issuedShares - validator.Status = Unbonded + unbondingDelegation = NewUnbondingDelegation(sender, delShares, currentHeight/Time, startSlashRatio) + setUnbondingDelegation(unbondingDelegation) - return transfer(address of the bonded pool, address of the unbonded pool, removedTokens) + revokeCandidacy := false + if bond.Shares.IsZero() { + + if bond.DelegatorAddr == validator.Owner && validator.Revoked == false + revokeCandidacy = true + + k.removeDelegation(ctx, bond) + else + bond.Height = currentBlockHeight + setDelegation(bond) + + pool := k.GetPool(ctx) + validator, pool, returnAmount := validator.removeDelShares(pool, delShares) + k.setPool(ctx, pool) + AddCoins(ctx, bond.DelegatorAddr, returnAmount) + + if revokeCandidacy + validator.Revoked = true + + validator = updateValidator(ctx, validator) + + if validator.DelegatorShares == 0 { + removeValidator(ctx, validator.Owner) + + return ``` -### TxRedelegate +### TxRedelegation -The re-delegation command allows delegators to switch validators while still -receiving equal reward to as if they had never unbonded. +The redelegation command allows delegators to instantly switch validators. ```golang type TxRedelegate struct { - PubKeyFrom crypto.PubKey - PubKeyTo crypto.PubKey - Shares rational.Rat + DelegatorAddr Address + ValidatorFrom Validator + ValidatorTo Validator + Shares sdk.Rat } redelegate(tx TxRedelegate): - bond = loadDelegatorBond(store, sender, tx.PubKey) - if bond == nil then return + pool = getPool() + delegation = getDelegatorBond(tx.DelegatorAddr, tx.ValidatorFrom.Owner) + if delegation == nil then return - if bond.Shares < tx.Shares return - validator = loadValidator(store, tx.PubKeyFrom) - if validator == nil return + if delegation.Shares < tx.Shares return + delegation.shares -= Tx.Shares + validator, pool, createdCoins = validator.RemoveShares(pool, tx.Shares) + setPool(pool) - validator.RedelegatingShares += tx.Shares - reDelegationElem = QueueElemReDelegate(tx.PubKeyFrom, currentHeight(), sender, tx.Shares, tx.PubKeyTo) - redelegationQueue.add(reDelegationElem) + redelegation = newRedelegation(validatorFrom, validatorTo, Shares, createdCoins) + setRedelegation(redelegation) return ``` -### TxProveLive - -If a validator was automatically unbonded due to liveness issues and wishes to -assert it is still online, it can send `TxProveLive`: - -```golang -type TxProveLive struct { - PubKey crypto.PubKey -} -``` - -All delegators in the temporary unbonding pool which have not -transacted to move will be bonded back to the now-live validator and begin to -once again collect provisions and rewards. - -``` -TODO: pseudo-code -``` diff --git a/docs/spec/staking/valset-changes.md b/docs/spec/staking/valset-changes.md index 0547b171f5..92efa293b7 100644 --- a/docs/spec/staking/valset-changes.md +++ b/docs/spec/staking/valset-changes.md @@ -1,13 +1,9 @@ # Validator Set Changes -The validator set may be updated by state transitions that run at the beginning and -end of every block. This can happen one of three ways: - -- voting power of a validator changes due to bonding and unbonding -- voting power of validator is "slashed" due to conflicting signed messages -- validator is automatically unbonded due to inactivity - -## Voting Power Changes +The Tendermint validator set may be updated by state transitions that run at +the beginning and end of every block. The Tendermint validator set may be +changed by validators either being revoked due to inactivity/unexpected +behaviour (covered in slashing) or changed in validator power. At the end of every block, we run the following: @@ -101,90 +97,3 @@ unbondedToBondedPool(validator Validator): return transfer(address of the unbonded pool, address of the bonded pool, removedTokens) ``` - -## Slashing - -Messges which may compromise the safety of the underlying consensus protocol ("equivocations") -result in some amount of the offending validator's shares being removed ("slashed"). - -Currently, such messages include only the following: - -- prevotes by the same validator for more than one BlockID at the same - Height and Round -- precommits by the same validator for more than one BlockID at the same - Height and Round - -We call any such pair of conflicting votes `Evidence`. Full nodes in the network prioritize the -detection and gossipping of `Evidence` so that it may be rapidly included in blocks and the offending -validators punished. - -For some `evidence` to be valid, it must satisfy: - -`evidence.Timestamp >= block.Timestamp - MAX_EVIDENCE_AGE` - -where `evidence.Timestamp` is the timestamp in the block at height -`evidence.Height` and `block.Timestamp` is the current block timestamp. - -If valid evidence is included in a block, the offending validator loses -a constant `SLASH_PROPORTION` of their current stake at the beginning of the block: - -``` -oldShares = validator.shares -validator.shares = oldShares * (1 - SLASH_PROPORTION) -``` - -This ensures that offending validators are punished the same amount whether they -act as a single validator with X stake or as N validators with collectively X -stake. - - -## Automatic Unbonding - -Every block includes a set of precommits by the validators for the previous block, -known as the LastCommit. A LastCommit is valid so long as it contains precommits from +2/3 of voting power. - -Proposers are incentivized to include precommits from all -validators in the LastCommit by receiving additional fees -proportional to the difference between the voting power included in the -LastCommit and +2/3 (see [TODO](https://github.com/cosmos/cosmos-sdk/issues/967)). - -Validators are penalized for failing to be included in the LastCommit for some -number of blocks by being automatically unbonded. - -The following information is stored with each validator, and is only non-zero if the validator becomes an active validator: - -```go -type ValidatorSigningInfo struct { - StartHeight int64 - SignedBlocksBitArray BitArray -} -``` - -Where: -* `StartHeight` is set to the height that the validator became an active validator (with non-zero voting power). -* `SignedBlocksBitArray` is a bit-array of size `SIGNED_BLOCKS_WINDOW` that records, for each of the last `SIGNED_BLOCKS_WINDOW` blocks, -whether or not this validator was included in the LastCommit. It uses a `0` if the validator was included, and a `1` if it was not. -Note it is initialized with all 0s. - -At the beginning of each block, we update the signing info for each validator and check if they should be automatically unbonded: - -``` -h = block.Height -index = h % SIGNED_BLOCKS_WINDOW - -for val in block.Validators: - signInfo = val.SignInfo - if val in block.LastCommit: - signInfo.SignedBlocksBitArray.Set(index, 0) - else - signInfo.SignedBlocksBitArray.Set(index, 1) - - // validator must be active for at least SIGNED_BLOCKS_WINDOW - // before they can be automatically unbonded for failing to be - // included in 50% of the recent LastCommits - minHeight = signInfo.StartHeight + SIGNED_BLOCKS_WINDOW - minSigned = SIGNED_BLOCKS_WINDOW / 2 - blocksSigned = signInfo.SignedBlocksBitArray.Sum() - if h > minHeight AND blocksSigned < minSigned: - unbond the validator -``` From e39ba70c08d004ca3c2e68159a294a20d7f2bb6a Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Tue, 29 May 2018 14:50:35 -0400 Subject: [PATCH 164/548] complete staking spec update --- docs/spec/staking/end_block.md | 61 ++++++++++++++++++ docs/spec/staking/state.md | 4 +- docs/spec/staking/transactions.md | 97 +++++++++++++++++++++++++++- docs/spec/staking/valset-changes.md | 99 ----------------------------- x/stake/keeper.go | 14 ++-- 5 files changed, 164 insertions(+), 111 deletions(-) create mode 100644 docs/spec/staking/end_block.md delete mode 100644 docs/spec/staking/valset-changes.md diff --git a/docs/spec/staking/end_block.md b/docs/spec/staking/end_block.md new file mode 100644 index 0000000000..e7c4e1e822 --- /dev/null +++ b/docs/spec/staking/end_block.md @@ -0,0 +1,61 @@ +# End-Block + +Two staking activities are intended to be processed in the application endblock. + - inform tendermint of validator set changes + - process and set atom inflation + +# Validator Set Changes + +The Tendermint validator set may be updated by state transitions that run at +the end of every block. The Tendermint validator set may be changed by +validators either being revoked due to inactivity/unexpected behaviour (covered +in slashing) or changed in validator power. Determining which validator set +changes must be made occures during staking transactions (and slashing +transactions) - during end-block the already accounted changes are applied and +the changes cleared + +```golang +EndBlock() ValidatorSetChanges + vsc = GetTendermintUpdates() + ClearTendermintUpdates() + return vsc +``` + +# Inflation + +The atom inflation rate is changed once per hour based on the current and +historic bond ratio + +```golang +processProvisions(): + hrsPerYr = 8766 // as defined by a julian year of 365.25 days + + time = BFTTime() + if time > pool.InflationLastTime + ProvisionTimeout + pool.InflationLastTime = time + pool.Inflation = nextInflation(hrsPerYr).Round(1000000000) + + provisions = pool.Inflation * (pool.TotalSupply / hrsPerYr) + + pool.LooseUnbondedTokens += provisions + feePool += LooseUnbondedTokens + + setPool(pool) + +nextInflation(hrsPerYr rational.Rat): + if pool.TotalSupply > 0 + bondedRatio = pool.BondedPool / pool.TotalSupply + else + bondedRation = 0 + + inflationRateChangePerYear = (1 - bondedRatio / params.GoalBonded) * params.InflationRateChange + inflationRateChange = inflationRateChangePerYear / hrsPerYr + + inflation = pool.Inflation + inflationRateChange + if inflation > params.InflationMax then inflation = params.InflationMax + + if inflation < params.InflationMin then inflation = params.InflationMin + + return inflation +``` + diff --git a/docs/spec/staking/state.md b/docs/spec/staking/state.md index fa235479f6..72cda1bb45 100644 --- a/docs/spec/staking/state.md +++ b/docs/spec/staking/state.md @@ -52,7 +52,9 @@ type Params struct { - index 2: validator Tendermint PubKey - index 3: bonded validators only - index 4: voting power - - index 5: Tendermint updates + +Related Store which holds Validator.ABCIValidator() + - index: validator owner address The `Validator` holds the current state and some historical actions of the validator. diff --git a/docs/spec/staking/transactions.md b/docs/spec/staking/transactions.md index 685883dd11..b590773145 100644 --- a/docs/spec/staking/transactions.md +++ b/docs/spec/staking/transactions.md @@ -2,15 +2,16 @@ ### Transaction Overview In this section we describe the processing of the transactions and the -corresponding updates to the state. - -Available Transactions: +corresponding updates to the state. Transactions: - TxCreateValidator - TxEditValidator - TxDelegation - TxRedelegation - TxUnbond +Other important state changes: + - Update Validators + Other notes: - `tx` denotes a reference to the transaction being processed - `sender` denotes the address of the sender of the transaction @@ -200,3 +201,93 @@ redelegate(tx TxRedelegate): return ``` +### Update Validators + +Within many transactions the validator set must be updated based on changes in +power to a single validator. This process also updates the Tendermint-Updates +store for use in end-block when validators are either added or kicked from the +Tendermint. + +```golang +updateBondedValidators(newValidator Validator) (updatedVal Validator) + + kickCliffValidator := false + oldCliffValidatorAddr := getCliffValidator(ctx) + + // add the actual validator power sorted store + maxValidators := GetParams(ctx).MaxValidators + iterator := ReverseSubspaceIterator(ValidatorsByPowerKey) // largest to smallest + bondedValidatorsCount := 0 + var validator Validator + for { + if !iterator.Valid() || bondedValidatorsCount > int(maxValidators-1) { + + if bondedValidatorsCount == int(maxValidators) { // is cliff validator + setCliffValidator(ctx, validator, GetPool(ctx)) + iterator.Close() + break + + // either retrieve the original validator from the store, + // or under the situation that this is the "new validator" just + // use the validator provided because it has not yet been updated + // in the main validator store + + ownerAddr := iterator.Value() + if bytes.Equal(ownerAddr, newValidator.Owner) { + validator = newValidator + else + validator = getValidator(ownerAddr) + + // if not previously a validator (and unrevoked), + // kick the cliff validator / bond this new validator + if validator.Status() != sdk.Bonded && !validator.Revoked { + kickCliffValidator = true + + validator = bondValidator(ctx, store, validator) + if bytes.Equal(ownerAddr, newValidator.Owner) { + updatedVal = validator + + bondedValidatorsCount++ + iterator.Next() + + // perform the actual kicks + if oldCliffValidatorAddr != nil && kickCliffValidator { + validator := getValidator(store, oldCliffValidatorAddr) + unbondValidator(ctx, store, validator) + return + +// perform all the store operations for when a validator status becomes unbonded +unbondValidator(ctx sdk.Context, store sdk.KVStore, validator Validator) + pool := GetPool(ctx) + + // set the status + validator, pool = validator.UpdateStatus(pool, sdk.Unbonded) + setPool(ctx, pool) + + // save the now unbonded validator record + setValidator(validator) + + // add to accumulated changes for tendermint + setTendermintUpdates(validator.abciValidatorZero) + + // also remove from the bonded validators index + removeValidatorsBonded(validator) +} + +// perform all the store operations for when a validator status becomes bonded +bondValidator(ctx sdk.Context, store sdk.KVStore, validator Validator) Validator + pool := GetPool(ctx) + + // set the status + validator, pool = validator.UpdateStatus(pool, sdk.Bonded) + setPool(ctx, pool) + + // save the now bonded validator record to the three referenced stores + setValidator(validator) + setValidatorsBonded(validator) + + // add to accumulated changes for tendermint + setTendermintUpdates(validator.abciValidator) + + return validator +``` diff --git a/docs/spec/staking/valset-changes.md b/docs/spec/staking/valset-changes.md deleted file mode 100644 index 92efa293b7..0000000000 --- a/docs/spec/staking/valset-changes.md +++ /dev/null @@ -1,99 +0,0 @@ -# Validator Set Changes - -The Tendermint validator set may be updated by state transitions that run at -the beginning and end of every block. The Tendermint validator set may be -changed by validators either being revoked due to inactivity/unexpected -behaviour (covered in slashing) or changed in validator power. - -At the end of every block, we run the following: - -(TODO remove inflation from here) - -```golang -tick(ctx Context): - hrsPerYr = 8766 // as defined by a julian year of 365.25 days - - time = ctx.Time() - if time > gs.InflationLastTime + ProvisionTimeout - gs.InflationLastTime = time - gs.Inflation = nextInflation(hrsPerYr).Round(1000000000) - - provisions = gs.Inflation * (gs.TotalSupply / hrsPerYr) - - gs.BondedPool += provisions - gs.TotalSupply += provisions - - saveGlobalState(store, gs) - - if time > unbondDelegationQueue.head().InitTime + UnbondingPeriod - for each element elem in the unbondDelegationQueue where time > elem.InitTime + UnbondingPeriod do - transfer(unbondingQueueAddress, elem.Payout, elem.Tokens) - unbondDelegationQueue.remove(elem) - - if time > reDelegationQueue.head().InitTime + UnbondingPeriod - for each element elem in the unbondDelegationQueue where time > elem.InitTime + UnbondingPeriod do - validator = getValidator(store, elem.PubKey) - returnedCoins = removeShares(validator, elem.Shares) - validator.RedelegatingShares -= elem.Shares - delegateWithValidator(TxDelegate(elem.NewValidator, returnedCoins), validator) - reDelegationQueue.remove(elem) - - return UpdateValidatorSet() - -nextInflation(hrsPerYr rational.Rat): - if gs.TotalSupply > 0 - bondedRatio = gs.BondedPool / gs.TotalSupply - else - bondedRation = 0 - - inflationRateChangePerYear = (1 - bondedRatio / params.GoalBonded) * params.InflationRateChange - inflationRateChange = inflationRateChangePerYear / hrsPerYr - - inflation = gs.Inflation + inflationRateChange - if inflation > params.InflationMax then inflation = params.InflationMax - - if inflation < params.InflationMin then inflation = params.InflationMin - - return inflation - -UpdateValidatorSet(): - validators = loadValidators(store) - - v1 = validators.Validators() - v2 = updateVotingPower(validators).Validators() - - change = v1.validatorsUpdated(v2) // determine all updated validators between two validator sets - return change - -updateVotingPower(validators Validators): - foreach validator in validators do - validator.VotingPower = (validator.IssuedDelegatorShares - validator.RedelegatingShares) * delegatorShareExRate(validator) - - validators.Sort() - - foreach validator in validators do - if validator is not in the first params.MaxVals - validator.VotingPower = rational.Zero - if validator.Status == Bonded then bondedToUnbondedPool(validator Validator) - - else if validator.Status == UnBonded then unbondedToBondedPool(validator) - - saveValidator(store, c) - - return validators - -unbondedToBondedPool(validator Validator): - removedTokens = exchangeRate(gs.UnbondedShares, gs.UnbondedPool) * validator.GlobalStakeShares - gs.UnbondedShares -= validator.GlobalStakeShares - gs.UnbondedPool -= removedTokens - - gs.BondedPool += removedTokens - issuedShares = removedTokens / exchangeRate(gs.BondedShares, gs.BondedPool) - gs.BondedShares += issuedShares - - validator.GlobalStakeShares = issuedShares - validator.Status = Bonded - - return transfer(address of the unbonded pool, address of the bonded pool, removedTokens) -``` - diff --git a/x/stake/keeper.go b/x/stake/keeper.go index 9f554c764f..dfa2709d1e 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -282,16 +282,14 @@ func (k Keeper) updateValidator(ctx sdk.Context, validator Validator) Validator return validator } -// XXX TODO build in consideration for revoked -// // Update the validator group and kick out any old validators. In addition this // function adds (or doesn't add) a validator which has updated its bonded // tokens to the validator group. -> this validator is specified through the // updatedValidatorAddr term. // // The correct subset is retrieved by iterating through an index of the -// validators sorted by power, stored using the ValidatorsByPowerKey. Simultaniously -// the current validator records are updated in store with the +// validators sorted by power, stored using the ValidatorsByPowerKey. +// Simultaneously the current validator records are updated in store with the // ValidatorsBondedKey. This store is used to determine if a validator is a // validator without needing to iterate over the subspace as we do in // GetValidators. @@ -319,10 +317,10 @@ func (k Keeper) updateBondedValidators(ctx sdk.Context, store sdk.KVStore, break } - // either retrieve the original validator from the store, - // or under the situation that this is the "new validator" just - // use the validator provided because it has not yet been updated - // in the main validator store + // either retrieve the original validator from the store, or under the + // situation that this is the "new validator" just use the validator + // provided because it has not yet been updated in the main validator + // store ownerAddr := iterator.Value() if bytes.Equal(ownerAddr, newValidator.Owner) { validator = newValidator From 25ae0269586e20b15c3789b666bd8656c1ea22f0 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Tue, 29 May 2018 16:03:13 -0400 Subject: [PATCH 165/548] spec complete unbonding, redelegation txs --- docs/spec/staking/state.md | 93 +++++++++++++++--------------- docs/spec/staking/transactions.md | 96 +++++++++++++++++++++++-------- x/stake/delegation.go | 1 - 3 files changed, 120 insertions(+), 70 deletions(-) diff --git a/docs/spec/staking/state.md b/docs/spec/staking/state.md index 72cda1bb45..82a22dc652 100644 --- a/docs/spec/staking/state.md +++ b/docs/spec/staking/state.md @@ -10,22 +10,22 @@ information, etc. ```golang type Pool struct { - LooseUnbondedTokens int64 // tokens not associated with any validator - UnbondedTokens int64 // reserve of unbonded tokens held with validators - UnbondingTokens int64 // tokens moving from bonded to unbonded pool - BondedTokens int64 // reserve of bonded tokens - UnbondedShares sdk.Rat // sum of all shares distributed for the Unbonded Pool - UnbondingShares sdk.Rat // shares moving from Bonded to Unbonded Pool - BondedShares sdk.Rat // sum of all shares distributed for the Bonded Pool - InflationLastTime int64 // block which the last inflation was processed // TODO make time - Inflation sdk.Rat // current annual inflation rate + LooseUnbondedTokens int64 // tokens not associated with any validator + UnbondedTokens int64 // reserve of unbonded tokens held with validators + UnbondingTokens int64 // tokens moving from bonded to unbonded pool + BondedTokens int64 // reserve of bonded tokens + UnbondedShares sdk.Rat // sum of all shares distributed for the Unbonded Pool + UnbondingShares sdk.Rat // shares moving from Bonded to Unbonded Pool + BondedShares sdk.Rat // sum of all shares distributed for the Bonded Pool + InflationLastTime int64 // block which the last inflation was processed // TODO make time + Inflation sdk.Rat // current annual inflation rate DateLastCommissionReset int64 // unix timestamp for last commission accounting reset (daily) } type PoolShares struct { - Status sdk.BondStatus // either: unbonded, unbonding, or bonded - Amount sdk.Rat // total shares of type ShareKind + Status sdk.BondStatus // either: unbonded, unbonding, or bonded + Amount sdk.Rat // total shares of type ShareKind } ``` @@ -37,13 +37,13 @@ overall functioning of the stake module. ```golang type Params struct { - InflationRateChange sdk.Rat // maximum annual change in inflation rate - InflationMax sdk.Rat // maximum inflation rate - InflationMin sdk.Rat // minimum inflation rate - GoalBonded sdk.Rat // Goal of percent bonded atoms + InflationRateChange sdk.Rat // maximum annual change in inflation rate + InflationMax sdk.Rat // maximum inflation rate + InflationMin sdk.Rat // minimum inflation rate + GoalBonded sdk.Rat // Goal of percent bonded atoms - MaxValidators uint16 // maximum number of validators - BondDenom string // bondable coin denomination + MaxValidators uint16 // maximum number of validators + BondDenom string // bondable coin denomination } ``` @@ -65,27 +65,28 @@ type Validator struct { ConsensusPubKey crypto.PubKey // Tendermint consensus pubkey of validator Revoked bool // has the validator been revoked? - PoolShares PoolShares // total shares for tokens held in the pool - DelegatorShares sdk.Rat // total shares issued to a validator's delegators + PoolShares PoolShares // total shares for tokens held in the pool + DelegatorShares sdk.Rat // total shares issued to a validator's delegators + SlashRatio sdk.Rat // increases each time the validator is slashed - Description Description // description terms for the validator - BondHeight int64 // earliest height as a bonded validator - BondIntraTxCounter int16 // block-local tx index of validator change - ProposerRewardPool sdk.Coins // reward pool collected from being the proposer + Description Description // description terms for the validator + BondHeight int64 // earliest height as a bonded validator + BondIntraTxCounter int16 // block-local tx index of validator change + ProposerRewardPool sdk.Coins // reward pool collected from being the proposer Commission sdk.Rat // the commission rate of fees charged to any delegators CommissionMax sdk.Rat // maximum commission rate which this validator can ever charge CommissionChangeRate sdk.Rat // maximum daily increase of the validator commission CommissionChangeToday sdk.Rat // commission rate change today, reset each day (UTC time) - PrevPoolShares PoolShares // total shares of a global hold pools + PrevPoolShares PoolShares // total shares of a global hold pools } type Description struct { - Moniker string // name - Identity string // optional identity signature (ex. UPort or Keybase) - Website string // optional website link - Details string // optional details + Moniker string // name + Identity string // optional identity signature (ex. UPort or Keybase) + Website string // optional website link + Details string // optional details } ``` @@ -99,10 +100,10 @@ the transaction is the owner of the bond. ```golang type Delegation struct { - DelegatorAddr sdk.Address // delegation owner address - ValidatorAddr sdk.Address // validator owner address - Shares sdk.Rat // delegation shares recieved - Height int64 // last height bond updated + DelegatorAddr sdk.Address // delegation owner address + ValidatorAddr sdk.Address // validator owner address + Shares sdk.Rat // delegation shares recieved + Height int64 // last height bond updated } ``` @@ -110,17 +111,16 @@ type Delegation struct { - index: delegation address A UnbondingDelegation object is created every time an unbonding is initiated. -The unbond must be completed with a second transaction provided by the delegation owner -after the unbonding period has passed. - +The unbond must be completed with a second transaction provided by the +delegation owner after the unbonding period has passed. ```golang type UnbondingDelegation struct { - DelegationKey []byte // key of the delegation - InitTime int64 // unix time at unbonding initation - InitHeight int64 // block height at unbonding initation - ExpectedTokens sdk.Coins // the value in Atoms of the amount of shares which are unbonding - StartSlashRatio sdk.Rat // validator slash ratio at unbonding initiation + DelegationKey sdk.Address // key of the delegation + ExpectedTokens sdk.Coins // the value in Atoms of the amount of shares which are unbonding + StartSlashRatio sdk.Rat // validator slash ratio at unbonding initiation + CompleteTime int64 // unix time to complete redelegation + CompleteHeight int64 // block height to complete redelegation } ``` @@ -135,13 +135,14 @@ delegation owner after the unbonding period has passed. The destination delegation of a redelegation may not itself undergo a new redelegation until the original redelegation has been completed. - ```golang type Redelegation struct { - SourceDelegation []byte // source delegation key - DestinationDelegation []byte // destination delegation key - InitTime int64 // unix time at redelegation - InitHeight int64 // block height at redelegation - Shares sdk.Rat // amount of shares redelegating + SourceDelegation sdk.Address // source delegation key + DestinationDelegation sdk.Address // destination delegation key + SourceShares sdk.Rat // amount of source shares redelegating + DestinationShares sdk.Rat // amount of destination shares created at redelegation + SourceStartSlashRatio sdk.Rat // source validator slash ratio at unbonding initiation + CompleteTime int64 // unix time to complete redelegation + CompleteHeight int64 // block height to complete redelegation } ``` diff --git a/docs/spec/staking/transactions.md b/docs/spec/staking/transactions.md index b590773145..8013829ec1 100644 --- a/docs/spec/staking/transactions.md +++ b/docs/spec/staking/transactions.md @@ -6,8 +6,10 @@ corresponding updates to the state. Transactions: - TxCreateValidator - TxEditValidator - TxDelegation - - TxRedelegation - - TxUnbond + - TxStartUnbonding + - TxCompleteUnbonding + - TxRedelegate + - TxCompleteRedelegation Other important state changes: - Update Validators @@ -109,43 +111,41 @@ delegate(tx TxDelegate): return ``` -### TxUnbond +### TxStartUnbonding Delegator unbonding is defined with the following transaction: ```golang -type TxUnbond struct { +type TxStartUnbonding struct { DelegatorAddr sdk.Address ValidatorAddr sdk.Address Shares string } -unbond(tx TxUnbond): +startUnbonding(tx TxStartUnbonding): delegation, found = getDelegatorBond(store, sender, tx.PubKey) if !found == nil return - if msg.Shares == "MAX" { + if tx.Shares == "MAX" { if !bond.Shares.GT(sdk.ZeroRat()) { - return ErrNotEnoughBondShares(k.codespace, msg.Shares).Result() + return ErrNotEnoughBondShares else var err sdk.Error - delShares, err = sdk.NewRatFromDecimal(msg.Shares) + delShares, err = sdk.NewRatFromDecimal(tx.Shares) if err != nil return err if bond.Shares.LT(delShares) - return ErrNotEnoughBondShares(k.codespace, msg.Shares).Result() + return ErrNotEnoughBondShares - validator, found := k.GetValidator(ctx, msg.ValidatorAddr) + validator, found := GetValidator(tx.ValidatorAddr) if !found { return err - if msg.Shares == "MAX" + if tx.Shares == "MAX" delShares = bond.Shares bond.Shares -= delShares - unbondingDelegation = NewUnbondingDelegation(sender, delShares, currentHeight/Time, startSlashRatio) - setUnbondingDelegation(unbondingDelegation) revokeCandidacy := false if bond.Shares.IsZero() { @@ -153,30 +153,55 @@ unbond(tx TxUnbond): if bond.DelegatorAddr == validator.Owner && validator.Revoked == false revokeCandidacy = true - k.removeDelegation(ctx, bond) + removeDelegation( bond) else bond.Height = currentBlockHeight setDelegation(bond) - pool := k.GetPool(ctx) + pool := GetPool() validator, pool, returnAmount := validator.removeDelShares(pool, delShares) - k.setPool(ctx, pool) - AddCoins(ctx, bond.DelegatorAddr, returnAmount) + setPool( pool) + + unbondingDelegation = NewUnbondingDelegation(sender, returnAmount, currentHeight/Time, startSlashRatio) + setUnbondingDelegation(unbondingDelegation) if revokeCandidacy validator.Revoked = true - validator = updateValidator(ctx, validator) + validator = updateValidator(validator) if validator.DelegatorShares == 0 { - removeValidator(ctx, validator.Owner) + removeValidator(validator.Owner) return ``` +### TxCompleteUnbonding + +Complete the unbonding and transfer the coins to the delegate. Perform any +slashing that occured during the unbonding period. + +```golang +type TxUnbondingComplete struct { + DelegatorAddr sdk.Address + ValidatorAddr sdk.Address +} + +redelegationComplete(tx TxRedelegate): + unbonding = getUnbondingDelegation(tx.DelegatorAddr, tx.Validator) + if unbonding.CompleteTime >= CurrentBlockTime && unbonding.CompleteHeight >= CurrentBlockHeight + validator = GetValidator(tx.ValidatorAddr) + returnTokens = ExpectedTokens * tx.startSlashRatio/validator.SlashRatio + AddCoins(unbonding.DelegatorAddr, returnTokens) + removeUnbondingDelegation(unbonding) + return +``` + ### TxRedelegation -The redelegation command allows delegators to instantly switch validators. +The redelegation command allows delegators to instantly switch validators. Once +the unbonding period has passed, the redelegation must be completed with +txRedelegationComplete. ```golang type TxRedelegate struct { @@ -184,23 +209,48 @@ type TxRedelegate struct { ValidatorFrom Validator ValidatorTo Validator Shares sdk.Rat + CompletedTime int64 } redelegate(tx TxRedelegate): + pool = getPool() delegation = getDelegatorBond(tx.DelegatorAddr, tx.ValidatorFrom.Owner) - if delegation == nil then return + if delegation == nil + return - if delegation.Shares < tx.Shares return + if delegation.Shares < tx.Shares + return delegation.shares -= Tx.Shares validator, pool, createdCoins = validator.RemoveShares(pool, tx.Shares) setPool(pool) - redelegation = newRedelegation(validatorFrom, validatorTo, Shares, createdCoins) + redelegation = newRedelegation(tx.DelegatorAddr, tx.validatorFrom, + tx.validatorTo, tx.Shares, createdCoins, tx.CompletedTime) setRedelegation(redelegation) return ``` +### TxCompleteRedelegation + +Note that unlike TxCompleteUnbonding slashing of redelegating shares does not +take place during completion. Slashing on redelegated shares takes place +actively as a slashing occurs. + +```golang +type TxRedelegationComplete struct { + DelegatorAddr Address + ValidatorFrom Validator + ValidatorTo Validator +} + +redelegationComplete(tx TxRedelegate): + redelegation = getRedelegation(tx.DelegatorAddr, tx.validatorFrom, tx.validatorTo) + if redelegation.CompleteTime >= CurrentBlockTime && redelegation.CompleteHeight >= CurrentBlockHeight + removeRedelegation(redelegation) + return +``` + ### Update Validators Within many transactions the validator set must be updated based on changes in diff --git a/x/stake/delegation.go b/x/stake/delegation.go index ae08e0867b..8b047acced 100644 --- a/x/stake/delegation.go +++ b/x/stake/delegation.go @@ -49,5 +49,4 @@ func (b Delegation) HumanReadableString() (string, error) { resp += fmt.Sprintf("Height: %d", b.Height) return resp, nil - } From d587a6f6c3607aed5ce5637f22ce166a3229c8dc Mon Sep 17 00:00:00 2001 From: Zach Ramsay Date: Wed, 30 May 2018 13:30:19 -0400 Subject: [PATCH 166/548] docs: some files need to be in root & path fixes --- docs/{guides => }/Makefile | 0 docs/{guides => }/conf.py | 0 docs/{guides => }/index.rst | 6 +++--- docs/{guides => }/make.bat | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename docs/{guides => }/Makefile (100%) rename docs/{guides => }/conf.py (100%) rename docs/{guides => }/index.rst (92%) rename docs/{guides => }/make.bat (100%) diff --git a/docs/guides/Makefile b/docs/Makefile similarity index 100% rename from docs/guides/Makefile rename to docs/Makefile diff --git a/docs/guides/conf.py b/docs/conf.py similarity index 100% rename from docs/guides/conf.py rename to docs/conf.py diff --git a/docs/guides/index.rst b/docs/index.rst similarity index 92% rename from docs/guides/index.rst rename to docs/index.rst index 66e3f7cb8c..77b0307435 100644 --- a/docs/guides/index.rst +++ b/docs/index.rst @@ -17,8 +17,8 @@ SDK .. toctree:: :maxdepth: 1 - sdk/install.rst - sdk/key-management.rst + guides/sdk/install.rst + guides/sdk/key-management.rst .. sdk/overview.rst # needs to be updated .. old/glossary.rst # not completely up to date but has good content @@ -47,7 +47,7 @@ Staking .. toctree:: :maxdepth: 1 - staking/testnet.rst + guides/staking/testnet.rst .. staking/intro.rst .. staking/key-management.rst .. staking/local-testnet.rst diff --git a/docs/guides/make.bat b/docs/make.bat similarity index 100% rename from docs/guides/make.bat rename to docs/make.bat From 605dfbbe5454ce9b4dbdca31ffbf104964ba0993 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Wed, 30 May 2018 12:04:14 -0700 Subject: [PATCH 167/548] changelog, update spec README --- CHANGELOG.md | 6 ++++-- docs/spec/README.md | 6 ++++-- docs/spec/staking/end_block.md | 6 +++--- docs/spec/staking/transactions.md | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22969a4037..dd953b6ab3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,9 +41,11 @@ BUG FIXES * query sequence via account store * fixed duplicate pub_key in stake.Validator -## 0.18.0 +FEATURES +* [docs] Reorganize documentation +* [docs] Update staking spec, create WIP spec for slashing, and fees -_TBD_ +## 0.18.0 BREAKING CHANGES diff --git a/docs/spec/README.md b/docs/spec/README.md index e7507bf95e..7f773e6aa3 100644 --- a/docs/spec/README.md +++ b/docs/spec/README.md @@ -7,11 +7,13 @@ NOTE: the specifications are not yet complete and very much a work in progress. - [Basecoin](basecoin) - Cosmos SDK related specifications and transactions for sending tokens. -- [Staking](staking) - Proof of Stake related specifications including bonding - and delegation transactions, inflation, fees, etc. - [Governance](governance) - Governance related specifications including proposals and voting. - [IBC](ibc) - Specification of the Cosmos inter-blockchain communication (IBC) protocol. +- [Staking](staking) - Proof of Stake related specifications including bonding + and delegation transactions, inflation, etc. +- [Slashing](slashing) - Specifications of validator punishment mechanisms +- [Provisioning](provisioning) - Fee distribution, and atom provision distribution specification - [Other](other) - Other components of the Cosmos Hub, including the reserve pool, All in Bits vesting, etc. diff --git a/docs/spec/staking/end_block.md b/docs/spec/staking/end_block.md index e7c4e1e822..28e3891d10 100644 --- a/docs/spec/staking/end_block.md +++ b/docs/spec/staking/end_block.md @@ -1,7 +1,7 @@ # End-Block -Two staking activities are intended to be processed in the application endblock. - - inform tendermint of validator set changes +Two staking activities are intended to be processed in the application end-block. + - inform Tendermint of validator set changes - process and set atom inflation # Validator Set Changes @@ -10,7 +10,7 @@ The Tendermint validator set may be updated by state transitions that run at the end of every block. The Tendermint validator set may be changed by validators either being revoked due to inactivity/unexpected behaviour (covered in slashing) or changed in validator power. Determining which validator set -changes must be made occures during staking transactions (and slashing +changes must be made occurs during staking transactions (and slashing transactions) - during end-block the already accounted changes are applied and the changes cleared diff --git a/docs/spec/staking/transactions.md b/docs/spec/staking/transactions.md index 8013829ec1..11edbb98bc 100644 --- a/docs/spec/staking/transactions.md +++ b/docs/spec/staking/transactions.md @@ -19,7 +19,7 @@ Other notes: - `sender` denotes the address of the sender of the transaction - `getXxx`, `setXxx`, and `removeXxx` functions are used to retrieve and modify objects from the store - - `sdk.Rat` refers to a rational numeric type specified by the sdk. + - `sdk.Rat` refers to a rational numeric type specified by the SDK. ### TxCreateValidator From e78a232e8508bbbb7bd0856557d0fe85dbed44b5 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 31 May 2018 00:54:46 +0200 Subject: [PATCH 168/548] Move over slashing spec changes from #1011 --- docs/spec/slashing/valset-changes.md | 54 +++++++++++++++++----------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/docs/spec/slashing/valset-changes.md b/docs/spec/slashing/valset-changes.md index c403e5d4c0..8aad213b80 100644 --- a/docs/spec/slashing/valset-changes.md +++ b/docs/spec/slashing/valset-changes.md @@ -49,40 +49,52 @@ LastCommit and +2/3 (see [TODO](https://github.com/cosmos/cosmos-sdk/issues/967) Validators are penalized for failing to be included in the LastCommit for some number of blocks by being automatically unbonded. -The following information is stored with each validator, and is only non-zero if the validator becomes an active validator: +The following information is stored with each validator candidate, and is only non-zero if the candidate becomes an active validator: ```go type ValidatorSigningInfo struct { - StartHeight int64 - SignedBlocksBitArray BitArray + StartHeight int64 + IndexOffset int64 + JailedUntil int64 + SignedBlocksCounter int64 + SignedBlocksBitArray BitArray } ``` Where: -* `StartHeight` is set to the height that the validator became an active validator (with non-zero voting power). +* `StartHeight` is set to the height that the candidate became an active validator (with non-zero voting power). +* `IndexOffset` is incremented each time the candidate was a bonded validator in a block (and may have signed a precommit or not). +* `JailedUntil` is set whenever the candidate is revoked due to downtime +* `SignedBlocksCounter` is a counter kept to avoid unnecessary array reads. `SignedBlocksBitArray.Sum() == SignedBlocksCounter` always. * `SignedBlocksBitArray` is a bit-array of size `SIGNED_BLOCKS_WINDOW` that records, for each of the last `SIGNED_BLOCKS_WINDOW` blocks, -whether or not this validator was included in the LastCommit. It uses a `0` if the validator was included, and a `1` if it was not. -Note it is initialized with all 0s. +whether or not this validator was included in the LastCommit. It uses a `1` if the validator was included, and a `0` if it was not. Note it is initialized with all 0s. At the beginning of each block, we update the signing info for each validator and check if they should be automatically unbonded: ``` -h = block.Height -index = h % SIGNED_BLOCKS_WINDOW +height := block.Height for val in block.Validators: - signInfo = val.SignInfo - if val in block.LastCommit: - signInfo.SignedBlocksBitArray.Set(index, 0) - else - signInfo.SignedBlocksBitArray.Set(index, 1) + signInfo = val.SignInfo + index := signInfo.IndexOffset % SIGNED_BLOCKS_WINDOW + signInfo.IndexOffset++ + previous = signInfo.SignedBlocksBitArray.Get(index) - // validator must be active for at least SIGNED_BLOCKS_WINDOW - // before they can be automatically unbonded for failing to be - // included in 50% of the recent LastCommits - minHeight = signInfo.StartHeight + SIGNED_BLOCKS_WINDOW - minSigned = SIGNED_BLOCKS_WINDOW / 2 - blocksSigned = signInfo.SignedBlocksBitArray.Sum() - if h > minHeight AND blocksSigned < minSigned: - unbond the validator + // update counter if array has changed + if previous and val in block.AbsentValidators: + signInfo.SignedBlocksBitArray.Set(index, 0) + signInfo.SignedBlocksCounter-- + else if !previous and val not in block.AbsentValidators: + signInfo.SignedBlocksBitArray.Set(index, 1) + signInfo.SignedBlocksCounter++ + // else previous == val not in block.AbsentValidators, no change + + // validator must be active for at least SIGNED_BLOCKS_WINDOW + // before they can be automatically unbonded for failing to be + // included in 50% of the recent LastCommits + minHeight = signInfo.StartHeight + SIGNED_BLOCKS_WINDOW + minSigned = SIGNED_BLOCKS_WINDOW / 2 + if height > minHeight AND signInfo.SignedBlocksCounter < minSigned: + signInfo.JailedUntil = block.Time + DOWNTIME_UNBOND_DURATION + slash & unbond the validator ``` From d87dfce8e4db5c46fa349951f9de5be15c1b428e Mon Sep 17 00:00:00 2001 From: Zach Ramsay Date: Thu, 31 May 2018 09:16:12 -0400 Subject: [PATCH 169/548] docs: rst => md --- docs/conf.py | 14 +++-- docs/guides/sdk/install.md | 42 +++++++++++++ docs/guides/sdk/install.rst | 48 --------------- docs/guides/sdk/key-management.md | 17 ++++++ docs/guides/sdk/key-management.rst | 18 ------ docs/guides/staking/testnet.md | 94 ++++++++++++++++++++++++++++++ docs/index.rst | 7 ++- 7 files changed, 167 insertions(+), 73 deletions(-) create mode 100644 docs/guides/sdk/install.md delete mode 100644 docs/guides/sdk/install.rst create mode 100644 docs/guides/sdk/key-management.md delete mode 100644 docs/guides/sdk/key-management.rst create mode 100644 docs/guides/staking/testnet.md diff --git a/docs/conf.py b/docs/conf.py index 73a0220fd5..3f7cb19b57 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -38,9 +38,15 @@ templates_path = ['_templates'] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' + +from recommonmark.parser import CommonMarkParser + +source_parsers = { + '.md': CommonMarkParser, +} + +source_suffix = ['.rst', '.md'] +#source_suffix = '.rst' # The master toctree document. master_doc = 'index' @@ -69,7 +75,7 @@ language = None # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', 'old'] +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', '_attic', 'spec'] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' diff --git a/docs/guides/sdk/install.md b/docs/guides/sdk/install.md new file mode 100644 index 0000000000..f34d0bd72b --- /dev/null +++ b/docs/guides/sdk/install.md @@ -0,0 +1,42 @@ +# Install + +Cosmos SDK can be installed to +`$GOPATH/src/github.com/cosmos/cosmos-sdk` like a normal Go program: + +``` +go get github.com/cosmos/cosmos-sdk +``` + +If the dependencies have been updated with breaking changes, or if +another branch is required, `dep` is used for dependency management. +Thus, assuming you've already run `go get` or otherwise cloned the repo, +the correct way to install is: + +``` +cd $GOPATH/src/github.com/cosmos/cosmos-sdk +make get_vendor_deps +make install +make install_examples +``` + +This will install `gaiad` and `gaiacli` and four example binaries: +`basecoind`, `basecli`, `democoind`, and `democli`. + +Verify that everything is OK by running: + +``` +gaiad version +``` + +you should see: + +``` +0.17.3-a5a78eb +``` + +then with: + +``` +gaiacli version +``` +you should see the same version (or a later one for both). diff --git a/docs/guides/sdk/install.rst b/docs/guides/sdk/install.rst deleted file mode 100644 index 03b219cb5b..0000000000 --- a/docs/guides/sdk/install.rst +++ /dev/null @@ -1,48 +0,0 @@ -Install -======= - -Cosmos SDK can be installed to -``$GOPATH/src/github.com/cosmos/cosmos-sdk`` like a normal Go program: - -:: - - go get github.com/cosmos/cosmos-sdk - -If the dependencies have been updated with breaking changes, or if -another branch is required, ``dep`` is used for dependency management. -Thus, assuming you've already run ``go get`` or otherwise cloned the -repo, the correct way to install is: - -:: - - cd $GOPATH/src/github.com/cosmos/cosmos-sdk - make get_vendor_deps - make install - make install_examples - -This will install ``gaiad`` and ``gaiacli`` and four example binaries: -``basecoind``, ``basecli``, ``democoind``, and ``democli``. - -Verify that everything is OK by running: - -:: - - gaiad version - -you should see: - -:: - - 0.15.0-rc1-9d90c6b - -then with: - -:: - - gaiacli version - -you should see: - -:: - - 0.15.0-rc1-9d90c6b diff --git a/docs/guides/sdk/key-management.md b/docs/guides/sdk/key-management.md new file mode 100644 index 0000000000..a4c0f55012 --- /dev/null +++ b/docs/guides/sdk/key-management.md @@ -0,0 +1,17 @@ +# Key Management + +Here we cover many aspects of handling keys within the Cosmos SDK +framework. + +## Pseudo Code + +Generating an address for an ed25519 public key (in pseudo code): + +``` +const TypeDistinguisher = HexToBytes("1624de6220") + +// prepend the TypeDistinguisher as Bytes +SerializedBytes = TypeDistinguisher ++ PubKey.asBytes() + +Address = ripemd160(SerializedBytes) +``` diff --git a/docs/guides/sdk/key-management.rst b/docs/guides/sdk/key-management.rst deleted file mode 100644 index d2b6577290..0000000000 --- a/docs/guides/sdk/key-management.rst +++ /dev/null @@ -1,18 +0,0 @@ -Key Management -============== - -Here we cover many aspects of handling keys within the Cosmos SDK framework. - -Pseudo Code ------------ - -Generating an address for an ed25519 public key (in pseudo code): - -:: - - const TypeDistinguisher = HexToBytes("1624de6220") - - // prepend the TypeDistinguisher as Bytes - SerializedBytes = TypeDistinguisher ++ PubKey.asBytes() - - Address = ripemd160(SerializedBytes) diff --git a/docs/guides/staking/testnet.md b/docs/guides/staking/testnet.md new file mode 100644 index 0000000000..b2bbd8f1a3 --- /dev/null +++ b/docs/guides/staking/testnet.md @@ -0,0 +1,94 @@ +# Testnet Setup + +**Note:** This document is incomplete and may not be up-to-date with the +state of the code. + +See the [installation guide](../sdk/install.html) for details on +installation. + +Here is a quick example to get you off your feet: + +First, generate a couple of genesis transactions to be incorporated into +the genesis file, this will create two keys with the password +`1234567890`: + +``` +gaiad init gen-tx --name=foo --home=$HOME/.gaiad1 +gaiad init gen-tx --name=bar --home=$HOME/.gaiad2 +gaiacli keys list +``` + +**Note:** If you've already run these tests you may need to overwrite +keys using the `--owk` flag When you list the keys you should see two +addresses, we'll need these later so take note. Now let's actually +create the genesis files for both nodes: + +``` +cp -a ~/.gaiad2/config/gentx/. ~/.gaiad1/config/gentx/ +cp -a ~/.gaiad1/config/gentx/. ~/.gaiad2/config/gentx/ +gaiad init --gen-txs --home=$HOME/.gaiad1 --chain-id=test-chain +gaiad init --gen-txs --home=$HOME/.gaiad2 --chain-id=test-chain +``` + +**Note:** If you've already run these tests you may need to overwrite +genesis using the `-o` flag. What we just did is copy the genesis +transactions between each of the nodes so there is a common genesis +transaction set; then we created both genesis files independently from +each home directory. Importantly both nodes have independently created +their `genesis.json` and `config.toml` files, which should be identical +between nodes. + +Great, now that we've initialized the chains, we can start both nodes in +the background: + +``` +gaiad start --home=$HOME/.gaiad1 &> gaia1.log & +NODE1_PID=$! +gaia start --home=$HOME/.gaiad2 &> gaia2.log & +NODE2_PID=$! +``` + +Note that we save the PID so we can later kill the processes. You can +peak at your logs with `tail gaia1.log`, or follow them for a bit with +`tail -f gaia1.log`. + +Nice. We can also lookup the validator set: + +``` +gaiacli validatorset +``` + +Then, we try to transfer some `steak` to another account: + +``` +gaiacli account +gaiacli account +gaiacli send --amount=10steak --to= --name=foo --chain-id=test-chain +``` + +**Note:** We need to be careful with the `chain-id` and `sequence` + +Check the balance & sequence with: + +``` +gaiacli account +``` + +To confirm for certain the new validator is active, check tendermint: + +``` +curl localhost:46657/validators +``` + +Finally, to relinquish all your power, unbond some coins. You should see +your VotingPower reduce and your account balance increase. + +``` +gaiacli unbond --chain-id= --name=test +``` + +That's it! + +**Note:** TODO demonstrate edit-candidacy **Note:** TODO demonstrate +delegation **Note:** TODO demonstrate unbond of delegation **Note:** +TODO demonstrate unbond candidate diff --git a/docs/index.rst b/docs/index.rst index 77b0307435..3a2237a3c0 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -17,8 +17,9 @@ SDK .. toctree:: :maxdepth: 1 - guides/sdk/install.rst - guides/sdk/key-management.rst + guides/sdk/install.md + guides/sdk/key-management.md + .. sdk/overview.rst # needs to be updated .. old/glossary.rst # not completely up to date but has good content @@ -47,7 +48,7 @@ Staking .. toctree:: :maxdepth: 1 - guides/staking/testnet.rst + guides/staking/testnet.md .. staking/intro.rst .. staking/key-management.rst .. staking/local-testnet.rst From 1031e45a823b19214c0f8ea4c9118dfa77b61df9 Mon Sep 17 00:00:00 2001 From: Zach Ramsay Date: Thu, 31 May 2018 11:03:02 -0400 Subject: [PATCH 170/548] docs/install: add easy script --- scripts/install.sh | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 scripts/install.sh diff --git a/scripts/install.sh b/scripts/install.sh new file mode 100644 index 0000000000..e8a6a75e3c --- /dev/null +++ b/scripts/install.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +# XXX: this script is intended to be run from +# a fresh Digital Ocean droplet with Ubuntu + +# upon its completion, you must either reset +# your terminal or run `source ~/.profile` + +# change this to a specific release or branch +BRANCH=master + +sudo apt-get update -y +sudo apt-get upgrade -y +sudo apt-get install -y make + +# get and unpack golang +curl -O https://storage.googleapis.com/golang/go1.10.linux-amd64.tar.gz +tar -xvf go1.10.linux-amd64.tar.gz + +# move go binary and add to path +mv go /usr/local +echo "export PATH=\$PATH:/usr/local/go/bin" >> ~/.profile + +# create the goApps directory, set GOPATH, and put it on PATH +mkdir goApps +echo "export GOPATH=/root/goApps" >> ~/.profile +echo "export PATH=\$PATH:\$GOPATH/bin" >> ~/.profile + +source ~/.profile + +# get the code and move into repo +REPO=github.com/cosmos/cosmos-sdk +go get $REPO +cd $GOPATH/src/$REPO + +# build & install master +git checkout $BRANCH +make get_tools +make get_vendor_deps +make install +make install_examples From cd4499c15f7871f6b3554afd461275dda2a80a81 Mon Sep 17 00:00:00 2001 From: Zach Ramsay Date: Thu, 31 May 2018 11:12:03 -0400 Subject: [PATCH 171/548] docs: link to quick install script --- docs/guides/sdk/install.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/guides/sdk/install.md b/docs/guides/sdk/install.md index f34d0bd72b..cf3e831610 100644 --- a/docs/guides/sdk/install.md +++ b/docs/guides/sdk/install.md @@ -1,5 +1,8 @@ # Install +The fastest and easiest way to install the Cosmos SDK binaries +is to run [this script](https://github.com/cosmos/cosmos-sdk/blob/develop/scripts/install.sh) on a fresh Ubuntu instance. Read the comments / instructions carefully (i.e., reset your terminal after running the script). + Cosmos SDK can be installed to `$GOPATH/src/github.com/cosmos/cosmos-sdk` like a normal Go program: @@ -14,6 +17,7 @@ the correct way to install is: ``` cd $GOPATH/src/github.com/cosmos/cosmos-sdk +make get_tools make get_vendor_deps make install make install_examples @@ -40,3 +44,16 @@ then with: gaiacli version ``` you should see the same version (or a later one for both). + +## Update + +Get latest code (you can also `git fetch` only the version desired), +ensure the dependencies are up to date, then recompile. + +``` +cd $GOPATH/src/github.com/cosmos/cosmos-sdk +git fetch -a origin +git checkout VERSION +make get_vendor_deps +make install +``` From 40df73adc2eab233149f68a5241a8a879139bbd7 Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Mon, 4 Jun 2018 13:35:00 -0700 Subject: [PATCH 172/548] docs: Add BSD install script --- docs/guides/sdk/install.md | 2 +- scripts/install_sdk_bsd.sh | 46 +++++++++++++++++++ scripts/{install.sh => install_sdk_ubuntu.sh} | 0 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 scripts/install_sdk_bsd.sh rename scripts/{install.sh => install_sdk_ubuntu.sh} (100%) diff --git a/docs/guides/sdk/install.md b/docs/guides/sdk/install.md index cf3e831610..37faec8293 100644 --- a/docs/guides/sdk/install.md +++ b/docs/guides/sdk/install.md @@ -1,7 +1,7 @@ # Install The fastest and easiest way to install the Cosmos SDK binaries -is to run [this script](https://github.com/cosmos/cosmos-sdk/blob/develop/scripts/install.sh) on a fresh Ubuntu instance. Read the comments / instructions carefully (i.e., reset your terminal after running the script). +is to run [this script](https://github.com/cosmos/cosmos-sdk/blob/develop/scripts/install_sdk_ubuntu.sh) on a fresh Ubuntu instance. Similarly, you can run [this script](https://github.com/cosmos/cosmos-sdk/blob/develop/scripts/install_sdk_bsd.sh) on a fresh FreeBSD instance. Read the comments / instructions carefully (i.e., reset your terminal after running the script). Cosmos SDK can be installed to `$GOPATH/src/github.com/cosmos/cosmos-sdk` like a normal Go program: diff --git a/scripts/install_sdk_bsd.sh b/scripts/install_sdk_bsd.sh new file mode 100644 index 0000000000..e0795ca907 --- /dev/null +++ b/scripts/install_sdk_bsd.sh @@ -0,0 +1,46 @@ +#!/usr/bin/tcsh + +# Just run tcsh install_sdk_bsd.sh +# XXX: this script is intended to be run from +# a fresh Digital Ocean droplet with FreeBSD + +# upon its completion, you must either reset +# your terminal or run `source ~/.tcshrc` + +# change this to a specific release or branch +set BRANCH=master + +sudo pkg updatels + +sudo pkg upgrade -y +sudo pkg install -y gmake +sudo pkg install -y git + +# get and unpack golang +curl -O https://storage.googleapis.com/golang/go1.10.freebsd-amd64.tar.gz +tar -xvf go1.10.freebsd-amd64.tar.gz + +# move go binary and add to path +mv go /usr/local +set path=($path /usr/local/go/bin) + + +# create the go directory, set GOPATH, and put it on PATH +mkdir go +echo "setenv GOPATH /root/go" >> ~/.tcshrc +setenv GOPATH /root/go +echo "set path=($path $GOPATH/bin)" >> ~/.tcshrc + +source ~/.tcshrc + +# get the code and move into repo +set REPO=github.com/cosmos/cosmos-sdk +go get $REPO +cd $GOPATH/src/$REPO + +# build & install master +git checkout $BRANCH +gmake get_tools +gmake get_vendor_deps +gmake install +gmake install_examples diff --git a/scripts/install.sh b/scripts/install_sdk_ubuntu.sh similarity index 100% rename from scripts/install.sh rename to scripts/install_sdk_ubuntu.sh From 508af391fe4252f99600a7ba8e9aa92d468f162a Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Mon, 4 Jun 2018 16:52:19 -0700 Subject: [PATCH 173/548] docs: Add disclaimer for install scripts --- docs/guides/sdk/install.md | 2 +- scripts/install_sdk_bsd.sh | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/guides/sdk/install.md b/docs/guides/sdk/install.md index 37faec8293..bafdfc4bde 100644 --- a/docs/guides/sdk/install.md +++ b/docs/guides/sdk/install.md @@ -1,7 +1,7 @@ # Install The fastest and easiest way to install the Cosmos SDK binaries -is to run [this script](https://github.com/cosmos/cosmos-sdk/blob/develop/scripts/install_sdk_ubuntu.sh) on a fresh Ubuntu instance. Similarly, you can run [this script](https://github.com/cosmos/cosmos-sdk/blob/develop/scripts/install_sdk_bsd.sh) on a fresh FreeBSD instance. Read the comments / instructions carefully (i.e., reset your terminal after running the script). +is to run [this script](https://github.com/cosmos/cosmos-sdk/blob/develop/scripts/install_sdk_ubuntu.sh) on a fresh Ubuntu instance. Similarly, you can run [this script](https://github.com/cosmos/cosmos-sdk/blob/develop/scripts/install_sdk_bsd.sh) on a fresh FreeBSD instance. Read the scripts before running them to ensure no untrusted connection is being made, for example we're making curl requests to download golang. Also read the comments / instructions carefully (i.e., reset your terminal after running the script). Cosmos SDK can be installed to `$GOPATH/src/github.com/cosmos/cosmos-sdk` like a normal Go program: diff --git a/scripts/install_sdk_bsd.sh b/scripts/install_sdk_bsd.sh index e0795ca907..2ee812e541 100644 --- a/scripts/install_sdk_bsd.sh +++ b/scripts/install_sdk_bsd.sh @@ -7,6 +7,11 @@ # upon its completion, you must either reset # your terminal or run `source ~/.tcshrc` +# This assumes your installing it through tcsh as root. +# Change the relevant lines from tcsh to csh if your +# installing as a different user, along with changing the +# gopath. + # change this to a specific release or branch set BRANCH=master From 23fe4fab456910953114a25814eb18b33047da41 Mon Sep 17 00:00:00 2001 From: Dev Ojha Date: Mon, 4 Jun 2018 22:57:09 -0700 Subject: [PATCH 174/548] Fix typo --- scripts/install_sdk_bsd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install_sdk_bsd.sh b/scripts/install_sdk_bsd.sh index 2ee812e541..5bff970e64 100644 --- a/scripts/install_sdk_bsd.sh +++ b/scripts/install_sdk_bsd.sh @@ -15,7 +15,7 @@ # change this to a specific release or branch set BRANCH=master -sudo pkg updatels +sudo pkg update sudo pkg upgrade -y sudo pkg install -y gmake From 02559e725a49e70434e424f29e674f3e4d9149ce Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Tue, 5 Jun 2018 09:11:03 -0700 Subject: [PATCH 175/548] cwgoes spec comments --- docs/guides/staking/overview.md | 28 ++++++++++-------- .../fee_distribution_model.xlsx | Bin .../overview.md | 17 +++++------ docs/spec/{slashing => WIP_slashing}/state.md | 0 .../transactions.md | 0 .../valset-changes.md | 0 6 files changed, 23 insertions(+), 22 deletions(-) rename docs/spec/{provisioning => WIP_provisioning}/fee_distribution_model.xlsx (100%) rename docs/spec/{provisioning => WIP_provisioning}/overview.md (95%) rename docs/spec/{slashing => WIP_slashing}/state.md (100%) rename docs/spec/{slashing => WIP_slashing}/transactions.md (100%) rename docs/spec/{slashing => WIP_slashing}/valset-changes.md (100%) diff --git a/docs/guides/staking/overview.md b/docs/guides/staking/overview.md index 9867dc95e3..570a0bfc59 100644 --- a/docs/guides/staking/overview.md +++ b/docs/guides/staking/overview.md @@ -6,25 +6,27 @@ The Cosmos Hub is a Tendermint-based Delegated Proof of Stake (DPos) blockchain system that serves as a backbone of the Cosmos ecosystem. It is operated and -secured by an open and globally decentralized set of validators. Tendermint -consensus is a Byzantine fault-tolerant distributed protocol that involves all -validators in the process of exchanging protocol messages in the production of -each block. To avoid Nothing-at-Stake problem, a validator in Tendermint needs -to lock up coins in a bond deposit. Tendermint protocol messages are signed by -the validator's private key, and this is a basis for Tendermint strict -accountability that allows punishing misbehaving validators by slashing -(burning) their bonded Atoms. On the other hand, validators are rewarded for -their service of securing blockchain network by the inflationary provisions and -transactions fees. This incentives correct behavior of the validators and -provides the economic security of the network. +secured by an open and globally decentralized set of validators. Tendermint is +a Byzantine fault-tolerant distributed protocol for consensus among distrusting +parties, in this case the group of validators which produce the blocks for +cosmos. To avoid the nothing-at-stake problem, a validator in Tendermint needs +to lock up coins in a bond deposit. Each bond's atoms are illiquid, they cannot +be transferred however they can be unbonded to become liquid, this process +takes the unbonding-period which will be 3 weeks by default at Cosmos-Hub +launch. Tendermint protocol messages are signed by the validator's private key, +and this is a basis for Tendermint strict accountability that allows punishing +misbehaving validators by slashing (burning) their bonded Atoms. On the other +hand, validators are rewarded for their service of securing blockchain network +by the inflationary provisions and transactions fees. This incentivizes correct +behavior of the validators and provides the economic security of the network. -The native token of the Cosmos Hub is called Atom; becoming a validator of the +The native token of the Cosmos Hub is called the Atom; becoming a validator of the Cosmos Hub requires holding Atoms. However, not all Atom holders are validators of the Cosmos Hub. More precisely, there is a selection process that determines the validator set as a subset of all validators (Atom holders that wants to become a validator). The other option for Atom holder is to delegate their atoms to validators, i.e., being a delegator. A delegator is an Atom -holder that has bonded its Atoms by delegating it to a validator. By bonding +holder that has put its Atoms at stake by delegating it to a validator. By bonding Atoms to secure the network (and taking a risk of being slashed in case of misbehaviour), a user is rewarded with inflationary provisions and transaction fees proportional to the amount of its bonded Atoms. The Cosmos Hub is diff --git a/docs/spec/provisioning/fee_distribution_model.xlsx b/docs/spec/WIP_provisioning/fee_distribution_model.xlsx similarity index 100% rename from docs/spec/provisioning/fee_distribution_model.xlsx rename to docs/spec/WIP_provisioning/fee_distribution_model.xlsx diff --git a/docs/spec/provisioning/overview.md b/docs/spec/WIP_provisioning/overview.md similarity index 95% rename from docs/spec/provisioning/overview.md rename to docs/spec/WIP_provisioning/overview.md index a8ffac398c..046223a4b0 100644 --- a/docs/spec/provisioning/overview.md +++ b/docs/spec/WIP_provisioning/overview.md @@ -13,15 +13,14 @@ withdraw all fees they are entitled too before they can bond or unbond Atoms. Because fees are optimized to note -Commission on Atom Provisions and having atoms autobonded are mutually exclusive (we can’t have both). The reason -for this is that - -if there are atoms commissions and autobonding, the portion of -atoms the fee distribution calculation would become very large as the atom -portion for each delegator would change each block making a withdrawal of fees -for a delegator require a calculation for every single block since the last -withdrawal. Conclusion we can only have atom commission and unbonded atoms -provisions, or bonded atom provisions and no atom commission +Commission on Atom Provisions and having atoms autobonded are mutually +exclusive (we can’t have both). The reason for this is that if there are atoms +commissions and autobonding, the portion of atoms the fee distribution +calculation would become very large as the atom portion for each delegator +would change each block making a withdrawal of fees for a delegator require a +calculation for every single block since the last withdrawal. Conclusion we can +only have atom commission and unbonded atoms provisions, or bonded atom +provisions and no atom commission ## Fee Calculations diff --git a/docs/spec/slashing/state.md b/docs/spec/WIP_slashing/state.md similarity index 100% rename from docs/spec/slashing/state.md rename to docs/spec/WIP_slashing/state.md diff --git a/docs/spec/slashing/transactions.md b/docs/spec/WIP_slashing/transactions.md similarity index 100% rename from docs/spec/slashing/transactions.md rename to docs/spec/WIP_slashing/transactions.md diff --git a/docs/spec/slashing/valset-changes.md b/docs/spec/WIP_slashing/valset-changes.md similarity index 100% rename from docs/spec/slashing/valset-changes.md rename to docs/spec/WIP_slashing/valset-changes.md From f3f2729b117677977ce6740813d0d737e238d848 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 5 Jun 2018 18:04:16 -0700 Subject: [PATCH 176/548] update for tm v0.19.9 --- CHANGELOG.md | 7 +++++++ Gopkg.lock | 18 +++++++++--------- Gopkg.toml | 4 ++-- client/lcd/lcd_test.go | 2 +- server/init.go | 2 +- server/start.go | 2 +- server/tm_cmds.go | 2 +- version/version.go | 4 ++-- 8 files changed, 24 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 271be8fb9f..c017ca91ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## 0.17.5 + +*June 5, 2018* + +Update to Tendermint v0.19.9 (Fix evidence reactor, mempool deadlock, WAL panic, +memory leak) + ## 0.17.4 *May 31, 2018* diff --git a/Gopkg.lock b/Gopkg.lock index 3873b91550..a084270421 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -164,8 +164,8 @@ [[projects]] name = "github.com/pelletier/go-toml" packages = ["."] - revision = "acdc4509485b587f5e675510c4f2c63e90ff68a8" - version = "v1.1.0" + revision = "c01d1270ff3e442a8a57cddc1c92dc1138598194" + version = "v1.2.0" [[projects]] name = "github.com/pkg/errors" @@ -327,6 +327,7 @@ "p2p/conn", "p2p/pex", "p2p/upnp", + "privval", "proxy", "rpc/client", "rpc/core", @@ -341,11 +342,10 @@ "state/txindex/kv", "state/txindex/null", "types", - "types/priv_validator", "version" ] - revision = "a017f2fdd41496a81e04a2216630a405189da6e2" - version = "v0.19.7-rc0" + revision = "775fef31c2b8fb7ea36f0d57bae3bfa74d353100" + version = "v0.19.9-rc0" [[projects]] name = "github.com/tendermint/tmlibs" @@ -360,8 +360,8 @@ "log", "merkle" ] - revision = "d970af87248a4e162590300dbb74e102183a417d" - version = "v0.8.3" + revision = "692f1d86a6e2c0efa698fd1e4541b68c74ffaf38" + version = "v0.8.4" [[projects]] branch = "master" @@ -377,7 +377,7 @@ "ripemd160", "salsa20/salsa" ] - revision = "ab813273cd59e1333f7ae7bff5d027d4aadf528c" + revision = "78e79280f680f7dd6b8e48c751887111ebdbcbd8" [[projects]] branch = "master" @@ -458,6 +458,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "a3a75136fb6921c4c4d413e4c8366f203b77367762763c97b8669ea854fbd62d" + inputs-digest = "71d11bd2a8f3f46ba3fd16759b501ad5b6b48037717d82020ebb25e021b67117" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index b8838920a5..c25623bba8 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -74,11 +74,11 @@ [[constraint]] name = "github.com/tendermint/tendermint" - version = "0.19.7-rc0" + version = "0.19.9-rc0" [[override]] name = "github.com/tendermint/tmlibs" - version = "~0.8.3-rc0" + version = "~0.8.4" # this got updated and broke, so locked to an old working commit ... [[override]] diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 66a8a4085f..73f5ad2c55 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -24,7 +24,7 @@ import ( ctypes "github.com/tendermint/tendermint/rpc/core/types" tmrpc "github.com/tendermint/tendermint/rpc/lib/server" tmtypes "github.com/tendermint/tendermint/types" - pvm "github.com/tendermint/tendermint/types/priv_validator" + pvm "github.com/tendermint/tendermint/privval" "github.com/tendermint/tmlibs/cli" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" diff --git a/server/init.go b/server/init.go index 68a1709bc8..512751bed0 100644 --- a/server/init.go +++ b/server/init.go @@ -20,7 +20,7 @@ import ( cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/p2p" tmtypes "github.com/tendermint/tendermint/types" - pvm "github.com/tendermint/tendermint/types/priv_validator" + pvm "github.com/tendermint/tendermint/privval" tmcli "github.com/tendermint/tmlibs/cli" cmn "github.com/tendermint/tmlibs/common" dbm "github.com/tendermint/tmlibs/db" diff --git a/server/start.go b/server/start.go index 23e38749be..9bf2d30cdb 100644 --- a/server/start.go +++ b/server/start.go @@ -10,7 +10,7 @@ import ( tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" "github.com/tendermint/tendermint/node" "github.com/tendermint/tendermint/proxy" - pvm "github.com/tendermint/tendermint/types/priv_validator" + pvm "github.com/tendermint/tendermint/privval" cmn "github.com/tendermint/tmlibs/common" ) diff --git a/server/tm_cmds.go b/server/tm_cmds.go index d581ca5f76..4d8edacabb 100644 --- a/server/tm_cmds.go +++ b/server/tm_cmds.go @@ -11,7 +11,7 @@ import ( tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" "github.com/tendermint/tendermint/p2p" - pvm "github.com/tendermint/tendermint/types/priv_validator" + pvm "github.com/tendermint/tendermint/privval" ) // ShowNodeIDCmd - ported from Tendermint, dump node ID to stdout diff --git a/version/version.go b/version/version.go index 0871aee005..be9f7858b0 100644 --- a/version/version.go +++ b/version/version.go @@ -7,9 +7,9 @@ package version const Maj = "0" const Min = "17" -const Fix = "4" +const Fix = "5" -const Version = "0.17.4" +const Version = "0.17.5" // GitCommit set by build flags var GitCommit = "" From 89d6264587f7e8216ed75d5a08b91b3e0cc49b8f Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Tue, 5 Jun 2018 23:02:31 -0400 Subject: [PATCH 177/548] simplified TestProcessProvisions into 4 repeatable funcs. fixed a small bug in it --- x/stake/tick_test.go | 165 +++++++++++++++++++++++++------------------ 1 file changed, 98 insertions(+), 67 deletions(-) diff --git a/x/stake/tick_test.go b/x/stake/tick_test.go index 6be3cd59fb..1264814a7b 100644 --- a/x/stake/tick_test.go +++ b/x/stake/tick_test.go @@ -61,80 +61,111 @@ func TestGetInflation(t *testing.T) { func TestProcessProvisions(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 0) - params := defaultParams() - params.MaxValidators = 2 - keeper.setParams(ctx, params) pool := keeper.GetPool(ctx) - var tokenSupply int64 = 550000000 - var bondedShares int64 = 150000000 - var unbondedShares int64 = 400000000 + var ( + initialTotalTokens int64 = 550000000 + initialBondedTokens int64 = 250000000 + initialUnbondedTokens int64 = 300000000 + cumulativeExpProvs int64 + initialBondedShares = sdk.NewRat(250000000, 1) + initialUnbondedShares = sdk.NewRat(300000000, 1) + tokensForValidators = []int64{150000000, 100000000, 100000000, 100000000, 100000000} + bondedValidators uint16 = 2 + ) // create some validators some bonded, some unbonded - var validators [5]Validator - validators[0] = NewValidator(addrs[0], pks[0], Description{}) - validators[0], pool, _ = validators[0].addTokensFromDel(pool, 150000000) - keeper.setPool(ctx, pool) - validators[0] = keeper.updateValidator(ctx, validators[0]) - pool = keeper.GetPool(ctx) - require.Equal(t, bondedShares, pool.BondedTokens, "%v", pool) + _, keeper, pool = setupTestValidators(pool, keeper, ctx, tokensForValidators, bondedValidators) + checkValidatorSetup(t, pool, initialTotalTokens, initialBondedTokens, initialUnbondedTokens) - validators[1] = NewValidator(addrs[1], pks[1], Description{}) - validators[1], pool, _ = validators[1].addTokensFromDel(pool, 100000000) - keeper.setPool(ctx, pool) - validators[1] = keeper.updateValidator(ctx, validators[1]) - validators[2] = NewValidator(addrs[2], pks[2], Description{}) - validators[2], pool, _ = validators[2].addTokensFromDel(pool, 100000000) - keeper.setPool(ctx, pool) - validators[2] = keeper.updateValidator(ctx, validators[2]) - validators[3] = NewValidator(addrs[3], pks[3], Description{}) - validators[3], pool, _ = validators[3].addTokensFromDel(pool, 100000000) - keeper.setPool(ctx, pool) - validators[3] = keeper.updateValidator(ctx, validators[3]) - validators[4] = NewValidator(addrs[4], pks[4], Description{}) - validators[4], pool, _ = validators[4].addTokensFromDel(pool, 100000000) - keeper.setPool(ctx, pool) - validators[4] = keeper.updateValidator(ctx, validators[4]) - - assert.Equal(t, tokenSupply, pool.TokenSupply()) - assert.Equal(t, bondedShares, pool.BondedTokens) - assert.Equal(t, unbondedShares, pool.UnbondedTokens) - - // initial bonded ratio ~ 27% - assert.True(t, pool.bondedRatio().Equal(sdk.NewRat(bondedShares, tokenSupply)), "%v", pool.bondedRatio()) - - // test the value of validator shares - assert.True(t, pool.bondedShareExRate().Equal(sdk.OneRat()), "%v", pool.bondedShareExRate()) - - initialSupply := pool.TokenSupply() - initialUnbonded := pool.TokenSupply() - pool.BondedTokens - - // process the provisions a year + // process the provisions for a year for hr := 0; hr < 8766; hr++ { pool := keeper.GetPool(ctx) - expInflation := keeper.nextInflation(ctx) - expProvisions := (expInflation.Mul(sdk.NewRat(pool.TokenSupply())).Quo(hrsPerYrRat)).Evaluate() - startBondedTokens := pool.BondedTokens - startTotalSupply := pool.TokenSupply() - pool = keeper.processProvisions(ctx) - keeper.setPool(ctx, pool) - //fmt.Printf("hr %v, startBondedTokens %v, expProvisions %v, pool.BondedTokens %v\n", hr, startBondedTokens, expProvisions, pool.BondedTokens) - require.Equal(t, startBondedTokens+expProvisions, pool.BondedTokens, "hr %v", hr) - require.Equal(t, startTotalSupply+expProvisions, pool.TokenSupply()) + _, expProvisions, _ := checkAndProcessProvisions(t, keeper, pool, ctx, hr) + cumulativeExpProvs = cumulativeExpProvs + expProvisions } + + //get the pool and do the final value checks from checkFinalPoolValues pool = keeper.GetPool(ctx) - assert.NotEqual(t, initialSupply, pool.TokenSupply()) - assert.Equal(t, initialUnbonded, pool.UnbondedTokens) - //panic(fmt.Sprintf("debug total %v, bonded %v, diff %v\n", p.TotalSupply, p.BondedTokens, pool.TokenSupply()-pool.BondedTokens)) - - // initial bonded ratio ~ from 27% to 40% increase for bonded holders ownership of total supply - assert.True(t, pool.bondedRatio().Equal(sdk.NewRat(211813022, 611813022)), "%v", pool.bondedRatio()) - - // global supply - assert.Equal(t, int64(611813022), pool.TokenSupply()) - assert.Equal(t, int64(211813022), pool.BondedTokens) - assert.Equal(t, unbondedShares, pool.UnbondedTokens) - - // test the value of validator shares - assert.True(t, pool.bondedShareExRate().Mul(sdk.NewRat(bondedShares)).Equal(sdk.NewRat(211813022)), "%v", pool.bondedShareExRate()) + checkFinalPoolValues(t, pool, initialTotalTokens, + initialUnbondedTokens, cumulativeExpProvs, + 0, 0, initialBondedShares, initialUnbondedShares) +} + +////////////////////////////////HELPER FUNCTIONS BELOW///////////////////////////////////// + +// Final check on the global pool values for what the total tokens accumulated from each hour of provisions and other functions +// bondedAdjustment and unbondedAdjustment are the accumulated changes for the operations of the test (i.e. if three unbonds happened, their total value would be passed as unbondedAdjustment) +func checkFinalPoolValues(t *testing.T, pool Pool, initialTotalTokens, initialUnbondedTokens, + cumulativeExpProvs, bondedAdjustment, unbondedAdjustment int64, bondedShares, unbondedShares sdk.Rat) { + + initialBonded := initialTotalTokens - initialUnbondedTokens + calculatedTotalTokens := initialTotalTokens + cumulativeExpProvs + calculatedBondedTokens := initialBonded + cumulativeExpProvs + bondedAdjustment + calculatedUnbondedTokens := initialUnbondedTokens + unbondedAdjustment + + // test that the bonded ratio the pool has is equal to what we calculated for tokens + assert.True(t, pool.bondedRatio().Equal(sdk.NewRat(calculatedBondedTokens, calculatedTotalTokens)), "%v", pool.bondedRatio()) + + // test global supply + assert.Equal(t, calculatedTotalTokens, pool.TokenSupply()) + assert.Equal(t, calculatedBondedTokens, pool.BondedTokens) + assert.Equal(t, calculatedUnbondedTokens, pool.UnbondedTokens) + + // test the value of candidate shares + assert.True(t, pool.bondedShareExRate().Mul(bondedShares).Equal(sdk.NewRat(calculatedBondedTokens)), "%v", pool.bondedShareExRate()) + assert.True(t, pool.unbondedShareExRate().Mul(unbondedShares).Equal(sdk.NewRat(calculatedUnbondedTokens)), "%v", pool.unbondedShareExRate()) +} + +// Checks provisions are added to the pool correctly every hour +// Returns expected Provisions, expected Inflation, and pool, to help with cumulative calculations back in main Tests +func checkAndProcessProvisions(t *testing.T, keeper Keeper, pool Pool, ctx sdk.Context, hr int) (sdk.Rat, int64, Pool) { + + //If we are not doing a random operation, just check that normal provisions are working for each hour + expInflation := keeper.nextInflation(ctx) + expProvisions := (expInflation.Mul(sdk.NewRat(pool.TokenSupply())).Quo(hrsPerYrRat)).Evaluate() + startBondedPool := pool.BondedTokens + startTotalSupply := pool.TokenSupply() + pool = keeper.processProvisions(ctx) + keeper.setPool(ctx, pool) + + //check provisions were added to pool + require.Equal(t, startBondedPool+expProvisions, pool.BondedTokens, "hr %v", hr) + require.Equal(t, startTotalSupply+expProvisions, pool.TokenSupply()) + + return expInflation, expProvisions, pool +} + +// Deterministic setup of validators, which updates the pool and choose maxValidators to be bonded +// Allows you to decide how many validators to setup, and which ones you want bonded +// You choose bonded validators by setting params.MaxValidators. If you choose 2, the first 2 Validators in the arrray will be bonded, the rest unbonded +func setupTestValidators(pool Pool, keeper Keeper, ctx sdk.Context, validatorTokens []int64, maxValidators uint16) ([]Validator, Keeper, Pool) { + params := defaultParams() + params.MaxValidators = maxValidators //set to limit the amount of validators we want bonded + keeper.setParams(ctx, params) + numValidators := len(validatorTokens) + validators := make([]Validator, numValidators) + + for i := 0; i < numValidators; i++ { + validators[i] = NewValidator(addrs[i], pks[i], Description{}) + validators[i], pool, _ = validators[i].addTokensFromDel(pool, validatorTokens[i]) + keeper.setPool(ctx, pool) + validators[i] = keeper.updateValidator(ctx, validators[i]) + pool = keeper.GetPool(ctx) + } + + return validators, keeper, pool +} + +// Checks that the deterministic candidate setup you wanted matches the values in the pool +func checkValidatorSetup(t *testing.T, pool Pool, initialTotalTokens, initialBondedTokens, initialUnbondedTokens int64) { + + assert.Equal(t, initialTotalTokens, pool.TokenSupply()) + assert.Equal(t, initialBondedTokens, pool.BondedTokens) + assert.Equal(t, initialUnbondedTokens, pool.UnbondedTokens) + + // test initial bonded ratio + assert.True(t, pool.bondedRatio().Equal(sdk.NewRat(initialBondedTokens, initialTotalTokens)), "%v", pool.bondedRatio()) + // test the value of candidate shares + assert.True(t, pool.bondedShareExRate().Equal(sdk.OneRat()), "%v", pool.bondedShareExRate()) } From 8d470e5410a04c374c38adbeee537316212d30d1 Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Tue, 5 Jun 2018 23:12:28 -0400 Subject: [PATCH 178/548] TestHourlyInflationRateOfChange() added, checks 11.4 years of inflation --- x/stake/tick_test.go | 77 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/x/stake/tick_test.go b/x/stake/tick_test.go index 1264814a7b..6bed352f51 100644 --- a/x/stake/tick_test.go +++ b/x/stake/tick_test.go @@ -1,6 +1,7 @@ package stake import ( + "strconv" "testing" sdk "github.com/cosmos/cosmos-sdk/types" @@ -92,6 +93,47 @@ func TestProcessProvisions(t *testing.T) { 0, 0, initialBondedShares, initialUnbondedShares) } +// Tests that the hourly rate of change will be positive, negative, or zero, depending on bonded ratio and inflation rate +// Cycles through the whole gambit of starting at 7% inflation, up to 20%, back down to 7% (it takes ~11.4 years) +func TestHourlyInflationRateOfChange(t *testing.T) { + ctx, _, keeper := createTestInput(t, false, 0) + // params := defaultParams() + // keeper.setParams(ctx, params) + pool := keeper.GetPool(ctx) + + // test setUpCandidates returned the token values by passing these vars into checkCandidateSetup() + var ( + initialTotalTokens int64 = 550000000 + initialBondedTokens int64 = 150000000 + initialUnbondedTokens int64 = 400000000 + cumulativeExpProvs int64 + bondedShares = sdk.NewRat(150000000, 1) + unbondedShares = sdk.NewRat(400000000, 1) + tokensForValidators = []int64{150000000, 100000000, 100000000, 100000000, 100000000} + bondedValidators uint16 = 1 + ) + + // create some candidates some bonded, some unbonded + _, keeper, pool = setupTestValidators(pool, keeper, ctx, tokensForValidators, bondedValidators) + checkValidatorSetup(t, pool, initialTotalTokens, initialBondedTokens, initialUnbondedTokens) + + // ~11.4 years to go from 7%, up to 20%, back down to 7% + for hr := 0; hr < 100000; hr++ { + pool := keeper.GetPool(ctx) + previousInflation := pool.Inflation + updatedInflation, expProvisions, pool := checkAndProcessProvisions(t, keeper, pool, ctx, hr) + cumulativeExpProvs = cumulativeExpProvs + expProvisions + msg := strconv.Itoa(hr) + checkInflation(t, pool, previousInflation, updatedInflation, msg) + } + + // Final check that the pool equals initial values + cumulative provisions and adjustments we recorded + pool = keeper.GetPool(ctx) + checkFinalPoolValues(t, pool, initialTotalTokens, + initialUnbondedTokens, cumulativeExpProvs, + 0, 0, bondedShares, unbondedShares) +} + ////////////////////////////////HELPER FUNCTIONS BELOW///////////////////////////////////// // Final check on the global pool values for what the total tokens accumulated from each hour of provisions and other functions @@ -169,3 +211,38 @@ func checkValidatorSetup(t *testing.T, pool Pool, initialTotalTokens, initialBon // test the value of candidate shares assert.True(t, pool.bondedShareExRate().Equal(sdk.OneRat()), "%v", pool.bondedShareExRate()) } + +// Checks that The inflation will correctly increase or decrease after an update to the pool +func checkInflation(t *testing.T, pool Pool, previousInflation, updatedInflation sdk.Rat, msg string) { + + inflationChange := updatedInflation.Sub(previousInflation) + + switch { + //BELOW 67% - Rate of change positive and increasing, while we are between 7% <= and < 20% inflation + case pool.bondedRatio().LT(sdk.NewRat(67, 100)) && updatedInflation.LT(sdk.NewRat(20, 100)): + assert.Equal(t, true, inflationChange.GT(sdk.ZeroRat()), msg) + + //BELOW 67% - Rate of change should be 0 while inflation continually stays at 20% until we reach 67% bonded ratio + case pool.bondedRatio().LT(sdk.NewRat(67, 100)) && updatedInflation.Equal(sdk.NewRat(20, 100)): + if previousInflation.Equal(sdk.NewRat(20, 100)) { + assert.Equal(t, true, inflationChange.IsZero(), msg) + //This else statement covers the one off case where we first hit 20%, but we still needed a positive ROC to get to 67% bonded ratio (i.e. we went from 19.99999% to 20%) + } else { + assert.Equal(t, true, inflationChange.GT(sdk.ZeroRat()), msg) + } + + //ABOVE 67% - Rate of change should be negative while the bond is above 67, and should stay negative until we reach inflation of 7% + case pool.bondedRatio().GT(sdk.NewRat(67, 100)) && updatedInflation.LT(sdk.NewRat(20, 100)) && updatedInflation.GT(sdk.NewRat(7, 100)): + assert.Equal(t, true, inflationChange.LT(sdk.ZeroRat()), msg) + + //ABOVE 67% - Rate of change should be 0 while inflation continually stays at 7%. + case pool.bondedRatio().GT(sdk.NewRat(67, 100)) && updatedInflation.Equal(sdk.NewRat(7, 100)): + if previousInflation.Equal(sdk.NewRat(7, 100)) { + assert.Equal(t, true, inflationChange.IsZero(), msg) + //This else statement covers the one off case where we first hit 7%, but we still needed a negative ROC to continue to get down to 67%. (i.e. we went from 7.00001% to 7%) + } else { + assert.Equal(t, true, inflationChange.LT(sdk.ZeroRat()), msg) + } + } + +} From af15f89531600b89f807399420b5ede83833efe5 Mon Sep 17 00:00:00 2001 From: Adrian Brink Date: Tue, 5 Jun 2018 21:34:19 -0700 Subject: [PATCH 179/548] Update changelog for 0.18.0 (#1149) --- CHANGELOG.md | 72 +++++++++++++++++++++------------------------------- 1 file changed, 29 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22969a4037..cf2ac21b03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,49 +1,8 @@ # Changelog -## Pending - -BREAKING CHANGES -* [cli] rearranged commands under subcommands -* [stake] remove Tick and add EndBlocker - -FEATURES - -IMPROVEMENTS -* bank module uses go-wire codec instead of 'encoding/json' -* auth module uses go-wire codec instead of 'encoding/json' -* revised use of endblock and beginblock - -FIXES -* [cli] fixed cli-bash tests -* [ci] added cli-bash tests -* [basecoin] updated basecoin for stake and slashing -* [docs] fixed references to old cli commands - -## 0.18.1 - -BREAKING CHANGES - -* [x/auth] move stuff specific to auth anteHandler to the auth module rather than the types folder. This includes: - * StdTx (and its related stuff i.e. StdSignDoc, etc) - * StdFee - * StdSignature - * Account interface - * Related to this organization, I also: -* [x/auth] got rid of AccountMapper interface (in favor of the struct already in auth module) -* [x/auth] removed the FeeHandler function from the AnteHandler, Replaced with FeeKeeper -* [x/auth] Removed GetSignatures() from Tx interface (as different Tx styles might use something different than StdSignature) -* [store] Removed SubspaceIterator and ReverseSubspaceIterator from KVStore interface and replaced them with helper functions in /types -* Switch to bech32cosmos on all human readable inputs and outputs - -BUG FIXES - -* auto-sequencing transactions correctly -* query sequence via account store -* fixed duplicate pub_key in stake.Validator - ## 0.18.0 -_TBD_ +_2018-06-05_ BREAKING CHANGES @@ -62,6 +21,20 @@ BREAKING CHANGES * Introduction of Unbonding fields, lowlevel logic throughout (not fully implemented with queue) * Introduction of PoolShares type within validators, replaces three rational fields (BondedShares, UnbondingShares, UnbondedShares +* [x/auth] move stuff specific to auth anteHandler to the auth module rather than the types folder. This includes: + * StdTx (and its related stuff i.e. StdSignDoc, etc) + * StdFee + * StdSignature + * Account interface + * Related to this organization, I also: +* [x/auth] got rid of AccountMapper interface (in favor of the struct already in auth module) +* [x/auth] removed the FeeHandler function from the AnteHandler, Replaced with FeeKeeper +* [x/auth] Removed GetSignatures() from Tx interface (as different Tx styles might use something different than StdSignature) +* [store] Removed SubspaceIterator and ReverseSubspaceIterator from KVStore interface and replaced them with helper functions in /types +* [cli] rearranged commands under subcommands +* [stake] remove Tick and add EndBlocker +* Switch to bech32cosmos on all human readable inputs and outputs + FEATURES @@ -78,12 +51,22 @@ FEATURES * [stake] Added REST API * [Makefile] Added terraform/ansible playbooks to easily create remote testnets on Digital Ocean + BUG FIXES -* Auto-sequencing now works correctly * [stake] staking delegator shares exchange rate now relative to equivalent-bonded-tokens the validator has instead of bonded tokens ^ this is important for unbonded validators in the power store! +* [cli] fixed cli-bash tests +* [ci] added cli-bash tests +* [basecoin] updated basecoin for stake and slashing +* [docs] fixed references to old cli commands * [docs] Downgraded Swagger to v2 for downstream compatibility +* auto-sequencing transactions correctly +* query sequence via account store +* fixed duplicate pub_key in stake.Validator +* Auto-sequencing now works correctly + + ## 0.17.2 @@ -123,6 +106,7 @@ BUG FIXES * Auto-sequencing now works correctly + ## 0.16.0 (May 14th, 2018) BREAKING CHANGES @@ -157,12 +141,14 @@ BUG FIXES * Gaia now uses stake, ported from github.com/cosmos/gaia + ## 0.15.1 (April 29, 2018) IMPROVEMENTS: * Update Tendermint to v0.19.1 (includes many rpc fixes) + ## 0.15.0 (April 29, 2018) NOTE: v0.15.0 is a large breaking change that updates the encoding scheme to use From 5f409ce83247cce37ef34adeff2503f11a1903ee Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 6 Jun 2018 06:53:04 +0200 Subject: [PATCH 180/548] Merge PR #1086: Bech32Cosmos output/input for the LCD * refactored bech32ization * updated keys endpoints for bech32 * bech32 for sending and querying * trying to change output of validator addresses * fixed validator output * linted * fixed merge conflict * added bech32 to staking endpoints * removed some logging statements * added GetAccPubKeyBech32Cosmos * fixed cli tests * updated swagger * merged standard bech32 change * renamed bech32cosmos to bech32 * bech32ify json output for key add * readded changelog * fixed changelog merge issue * Update CHANGELOG.md --- CHANGELOG.md | 4 ++ client/keys/add.go | 11 ++--- client/keys/list.go | 9 ++-- client/keys/show.go | 8 +++- client/keys/utils.go | 64 +++++++++++++++++------------ client/lcd/lcd_test.go | 69 +++++++++++++++++-------------- client/rpc/validators.go | 50 ++++++++++++++++++++++- cmd/gaia/cli_test/cli_test.go | 8 +++- docs/sdk/lcd-rest-api.yaml | 77 ++++++++++++++++++----------------- types/account.go | 17 +++++++- x/auth/client/rest/query.go | 8 ++-- x/bank/client/rest/sendtx.go | 11 ++++- x/ibc/client/rest/transfer.go | 11 ++++- x/stake/client/rest/query.go | 75 ++++++++++++++++++++++++++++++---- x/stake/client/rest/tx.go | 64 ++++++++++++++++++++++++----- 15 files changed, 348 insertions(+), 138 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf2ac21b03..731f3c14a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +BREAKING CHANGES + +* [lcd] Switch to bech32 for addresses on all human readable inputs and outputs + ## 0.18.0 _2018-06-05_ diff --git a/client/keys/add.go b/client/keys/add.go index da368a3a63..7ad9474cef 100644 --- a/client/keys/add.go +++ b/client/keys/add.go @@ -102,12 +102,6 @@ func runAddCmd(cmd *cobra.Command, args []string) error { return nil } -// addOutput lets us json format the data -type addOutput struct { - Key keys.Info `json:"key"` - Seed string `json:"seed"` -} - func printCreate(info keys.Info, seed string) { output := viper.Get(cli.OutputFlag) switch output { @@ -121,7 +115,10 @@ func printCreate(info keys.Info, seed string) { fmt.Println(seed) } case "json": - out := addOutput{Key: info} + out, err := Bech32KeyOutput(info) + if err != nil { + panic(err) + } if !viper.GetBool(flagNoBackup) { out.Seed = seed } diff --git a/client/keys/list.go b/client/keys/list.go index 9af511e5cd..22f163f1d8 100644 --- a/client/keys/list.go +++ b/client/keys/list.go @@ -4,7 +4,6 @@ import ( "encoding/json" "net/http" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/spf13/cobra" ) @@ -54,9 +53,11 @@ func QueryKeysRequestHandler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("[]")) return } - keysOutput := make([]KeyOutput, len(infos)) - for i, info := range infos { - keysOutput[i] = KeyOutput{Name: info.Name, Address: sdk.Address(info.PubKey.Address().Bytes())} + keysOutput, err := Bech32KeysOutput(infos) + if err != nil { + w.WriteHeader(500) + w.Write([]byte(err.Error())) + return } output, err := json.MarshalIndent(keysOutput, "", " ") if err != nil { diff --git a/client/keys/show.go b/client/keys/show.go index c7be9cc9db..9051aba160 100644 --- a/client/keys/show.go +++ b/client/keys/show.go @@ -4,7 +4,6 @@ import ( "encoding/json" "net/http" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/gorilla/mux" keys "github.com/tendermint/go-crypto/keys" @@ -51,7 +50,12 @@ func GetKeyRequestHandler(w http.ResponseWriter, r *http.Request) { return } - keyOutput := KeyOutput{Name: info.Name, Address: sdk.Address(info.PubKey.Address())} + keyOutput, err := Bech32KeyOutput(info) + if err != nil { + w.WriteHeader(500) + w.Write([]byte(err.Error())) + return + } output, err := json.MarshalIndent(keyOutput, "", " ") if err != nil { w.WriteHeader(500) diff --git a/client/keys/utils.go b/client/keys/utils.go index 1c1fd0979a..d810dfa1f4 100644 --- a/client/keys/utils.go +++ b/client/keys/utils.go @@ -6,7 +6,6 @@ import ( "github.com/spf13/viper" - crypto "github.com/tendermint/go-crypto" keys "github.com/tendermint/go-crypto/keys" "github.com/tendermint/tmlibs/cli" dbm "github.com/tendermint/tmlibs/db" @@ -47,29 +46,47 @@ func SetKeyBase(kb keys.Keybase) { // used for outputting keys.Info over REST type KeyOutput struct { - Name string `json:"name"` - Address sdk.Address `json:"address"` - PubKey crypto.PubKey `json:"pub_key"` + Name string `json:"name"` + Address string `json:"address"` + PubKey string `json:"pub_key"` + Seed string `json:"seed,omitempty"` } -func NewKeyOutput(info keys.Info) KeyOutput { - return KeyOutput{ - Name: info.Name, - Address: sdk.Address(info.PubKey.Address().Bytes()), - PubKey: info.PubKey, - } -} - -func NewKeyOutputs(infos []keys.Info) []KeyOutput { +// create a list of KeyOutput in bech32 format +func Bech32KeysOutput(infos []keys.Info) ([]KeyOutput, error) { kos := make([]KeyOutput, len(infos)) for i, info := range infos { - kos[i] = NewKeyOutput(info) + ko, err := Bech32KeyOutput(info) + if err != nil { + return nil, err + } + kos[i] = ko } - return kos + return kos, nil +} + +// create a KeyOutput in bech32 format +func Bech32KeyOutput(info keys.Info) (KeyOutput, error) { + bechAccount, err := sdk.Bech32ifyAcc(sdk.Address(info.PubKey.Address().Bytes())) + if err != nil { + return KeyOutput{}, err + } + bechPubKey, err := sdk.Bech32ifyAccPub(info.PubKey) + if err != nil { + return KeyOutput{}, err + } + return KeyOutput{ + Name: info.Name, + Address: bechAccount, + PubKey: bechPubKey, + }, nil } func printInfo(info keys.Info) { - ko := NewKeyOutput(info) + ko, err := Bech32KeyOutput(info) + if err != nil { + panic(err) + } switch viper.Get(cli.OutputFlag) { case "text": fmt.Printf("NAME:\tADDRESS:\t\t\t\t\t\tPUBKEY:\n") @@ -84,7 +101,10 @@ func printInfo(info keys.Info) { } func printInfos(infos []keys.Info) { - kos := NewKeyOutputs(infos) + kos, err := Bech32KeysOutput(infos) + if err != nil { + panic(err) + } switch viper.Get(cli.OutputFlag) { case "text": fmt.Printf("NAME:\tADDRESS:\t\t\t\t\t\tPUBKEY:\n") @@ -101,13 +121,5 @@ func printInfos(infos []keys.Info) { } func printKeyOutput(ko KeyOutput) { - bechAccount, err := sdk.Bech32ifyAcc(ko.Address) - if err != nil { - panic(err) - } - bechPubKey, err := sdk.Bech32ifyAccPub(ko.PubKey) - if err != nil { - panic(err) - } - fmt.Printf("%s\t%s\t%s\n", ko.Name, bechAccount, bechPubKey) + fmt.Printf("%s\t%s\t%s\n", ko.Name, ko.Address, ko.PubKey) } diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 7a9cdbc254..47df51e7e3 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -33,6 +33,7 @@ import ( client "github.com/cosmos/cosmos-sdk/client" keys "github.com/cosmos/cosmos-sdk/client/keys" + rpc "github.com/cosmos/cosmos-sdk/client/rpc" gapp "github.com/cosmos/cosmos-sdk/cmd/gaia/app" "github.com/cosmos/cosmos-sdk/server" tests "github.com/cosmos/cosmos-sdk/tests" @@ -40,14 +41,17 @@ import ( "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/stake" + stakerest "github.com/cosmos/cosmos-sdk/x/stake/client/rest" ) var ( coinDenom = "steak" coinAmount = int64(10000000) - validatorAddr1 = "" - validatorAddr2 = "" + validatorAddr1Hx = "" + validatorAddr2Hx = "" + validatorAddr1 = "" + validatorAddr2 = "" // XXX bad globals name = "test" @@ -99,13 +103,13 @@ func TestKeys(t *testing.T) { err = cdc.UnmarshalJSON([]byte(body), &m) require.Nil(t, err) - sendAddrAcc, _ := sdk.GetAccAddressHex(sendAddr) addrAcc, _ := sdk.GetAccAddressHex(addr) + addrBech32, _ := sdk.Bech32ifyAcc(addrAcc) - assert.Equal(t, m[0].Name, name, "Did not serve keys name correctly") - assert.Equal(t, m[0].Address, sendAddrAcc, "Did not serve keys Address correctly") - assert.Equal(t, m[1].Name, newName, "Did not serve keys name correctly") - assert.Equal(t, m[1].Address, addrAcc, "Did not serve keys Address correctly") + assert.Equal(t, name, m[0].Name, "Did not serve keys name correctly") + assert.Equal(t, sendAddr, m[0].Address, "Did not serve keys Address correctly") + assert.Equal(t, newName, m[1].Name, "Did not serve keys name correctly") + assert.Equal(t, addrBech32, m[1].Address, "Did not serve keys Address correctly") // select key keyEndpoint := fmt.Sprintf("/keys/%s", newName) @@ -116,7 +120,7 @@ func TestKeys(t *testing.T) { require.Nil(t, err) assert.Equal(t, newName, m2.Name, "Did not serve keys name correctly") - assert.Equal(t, addrAcc, m2.Address, "Did not serve keys Address correctly") + assert.Equal(t, addrBech32, m2.Address, "Did not serve keys Address correctly") // update key jsonStr = []byte(fmt.Sprintf(`{"old_password":"%s", "new_password":"12345678901"}`, newPassword)) @@ -198,7 +202,7 @@ func TestBlock(t *testing.T) { func TestValidators(t *testing.T) { - var resultVals ctypes.ResultValidators + var resultVals rpc.ResultValidatorsOutput res, body := request(t, port, "GET", "/validatorsets/latest", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) @@ -206,7 +210,10 @@ func TestValidators(t *testing.T) { err := cdc.UnmarshalJSON([]byte(body), &resultVals) require.Nil(t, err, "Couldn't parse validatorset") - assert.NotEqual(t, ctypes.ResultValidators{}, resultVals) + assert.NotEqual(t, rpc.ResultValidatorsOutput{}, resultVals) + + assert.Contains(t, resultVals.Validators[0].Address, "cosmosvaladdr") + assert.Contains(t, resultVals.Validators[0].PubKey, "cosmosvalpub") // -- @@ -216,7 +223,7 @@ func TestValidators(t *testing.T) { err = cdc.UnmarshalJSON([]byte(body), &resultVals) require.Nil(t, err, "Couldn't parse validatorset") - assert.NotEqual(t, ctypes.ResultValidators{}, resultVals) + assert.NotEqual(t, rpc.ResultValidatorsOutput{}, resultVals) // -- @@ -225,10 +232,11 @@ func TestValidators(t *testing.T) { } func TestCoinSend(t *testing.T) { + bz, _ := hex.DecodeString("8FA6AB57AD6870F6B5B2E57735F38F2F30E73CB6") + someFakeAddr, _ := sdk.Bech32ifyAcc(bz) // query empty - //res, body := request(t, port, "GET", "/accounts/8FA6AB57AD6870F6B5B2E57735F38F2F30E73CB6", nil) - res, body := request(t, port, "GET", "/accounts/8FA6AB57AD6870F6B5B2E57735F38F2F30E73CB6", nil) + res, body := request(t, port, "GET", "/accounts/"+someFakeAddr, nil) require.Equal(t, http.StatusNoContent, res.StatusCode, body) acc := getAccount(t, sendAddr) @@ -323,15 +331,14 @@ func TestValidatorsQuery(t *testing.T) { // make sure all the validators were found (order unknown because sorted by owner addr) foundVal1, foundVal2 := false, false - res1, res2 := hex.EncodeToString(validators[0].Owner), hex.EncodeToString(validators[1].Owner) - if res1 == validatorAddr1 || res2 == validatorAddr1 { + if validators[0].Owner == validatorAddr1 || validators[1].Owner == validatorAddr1 { foundVal1 = true } - if res1 == validatorAddr2 || res2 == validatorAddr2 { + if validators[0].Owner == validatorAddr2 || validators[1].Owner == validatorAddr2 { foundVal2 = true } - assert.True(t, foundVal1, "validatorAddr1 %v, res1 %v, res2 %v", validatorAddr1, res1, res2) - assert.True(t, foundVal2, "validatorAddr2 %v, res1 %v, res2 %v", validatorAddr2, res1, res2) + assert.True(t, foundVal1, "validatorAddr1 %v, owner1 %v, owner2 %v", validatorAddr1, validators[0].Owner, validators[1].Owner) + assert.True(t, foundVal2, "validatorAddr2 %v, owner1 %v, owner2 %v", validatorAddr2, validators[0].Owner, validators[1].Owner) } func TestBond(t *testing.T) { @@ -418,8 +425,10 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { pk1 := genDoc.Validators[0].PubKey pk2 := genDoc.Validators[1].PubKey - validatorAddr1 = hex.EncodeToString(pk1.Address()) - validatorAddr2 = hex.EncodeToString(pk2.Address()) + validatorAddr1Hx = hex.EncodeToString(pk1.Address()) + validatorAddr2Hx = hex.EncodeToString(pk2.Address()) + validatorAddr1, _ = sdk.Bech32ifyVal(pk1.Address()) + validatorAddr2, _ = sdk.Bech32ifyVal(pk2.Address()) // NOTE it's bad practice to reuse pk address for the owner address but doing in the // test for simplicity @@ -444,7 +453,8 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { if err != nil { return nil, nil, err } - sendAddr = info.PubKey.Address().String() // XXX global + sendAddrHex, _ := sdk.GetAccAddressHex(info.PubKey.Address().String()) + sendAddr, _ = sdk.Bech32ifyAcc(sendAddrHex) // XXX global accAuth := auth.NewBaseAccountWithAddress(info.PubKey.Address()) accAuth.Coins = sdk.Coins{{"steak", 100}} acc := gapp.NewGenesisAccount(&accAuth) @@ -548,7 +558,7 @@ func doSend(t *testing.T, port, seed string) (receiveAddr string, resultTx ctype kb := client.MockKeyBase() receiveInfo, _, err := kb.Create("receive_address", "1234567890", cryptoKeys.CryptoAlgo("ed25519")) require.Nil(t, err) - receiveAddr = receiveInfo.PubKey.Address().String() + receiveAddr, _ = sdk.Bech32ifyAcc(receiveInfo.PubKey.Address()) acc := getAccount(t, sendAddr) sequence := acc.GetSequence() @@ -565,12 +575,11 @@ func doSend(t *testing.T, port, seed string) (receiveAddr string, resultTx ctype } func doIBCTransfer(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxCommit) { - // create receive address kb := client.MockKeyBase() receiveInfo, _, err := kb.Create("receive_address", "1234567890", cryptoKeys.CryptoAlgo("ed25519")) require.Nil(t, err) - receiveAddr := receiveInfo.PubKey.Address().String() + receiveAddr, _ := sdk.Bech32ifyAcc(receiveInfo.PubKey.Address()) // get the account to get the sequence acc := getAccount(t, sendAddr) @@ -609,13 +618,13 @@ func doBond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxC "sequence": %d, "delegate": [ { - "delegator_addr": "%x", + "delegator_addr": "%s", "validator_addr": "%s", "bond": { "denom": "%s", "amount": 10 } } ], "unbond": [] - }`, name, password, sequence, acc.GetAddress(), validatorAddr1, coinDenom)) + }`, name, password, sequence, sendAddr, validatorAddr1, coinDenom)) res, body := request(t, port, "POST", "/stake/delegations", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) @@ -639,12 +648,12 @@ func doUnbond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastT "bond": [], "unbond": [ { - "delegator_addr": "%x", + "delegator_addr": "%s", "validator_addr": "%s", "shares": "1" } ] - }`, name, password, sequence, acc.GetAddress(), validatorAddr1)) + }`, name, password, sequence, sendAddr, validatorAddr1)) res, body := request(t, port, "POST", "/stake/delegations", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) @@ -655,11 +664,11 @@ func doUnbond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastT return results[0] } -func getValidators(t *testing.T) []stake.Validator { +func getValidators(t *testing.T) []stakerest.StakeValidatorOutput { // get the account to get the sequence res, body := request(t, port, "GET", "/stake/validators", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - var validators stake.Validators + var validators []stakerest.StakeValidatorOutput err := cdc.UnmarshalJSON([]byte(body), &validators) require.Nil(t, err) return validators diff --git a/client/rpc/validators.go b/client/rpc/validators.go index d1aa6c9c18..f8835d7377 100644 --- a/client/rpc/validators.go +++ b/client/rpc/validators.go @@ -10,6 +10,8 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/context" + sdk "github.com/cosmos/cosmos-sdk/types" + tmtypes "github.com/tendermint/tendermint/types" ) // TODO these next two functions feel kinda hacky based on their placement @@ -28,6 +30,38 @@ func ValidatorCommand() *cobra.Command { return cmd } +// Validator output in bech32 format +type ValidatorOutput struct { + Address string `json:"address"` // in bech32 + PubKey string `json:"pub_key"` // in bech32 + Accum int64 `json:"accum"` + VotingPower int64 `json:"voting_power"` +} + +// Validators at a certain height output in bech32 format +type ResultValidatorsOutput struct { + BlockHeight int64 `json:"block_height"` + Validators []ValidatorOutput `json:"validators"` +} + +func bech32ValidatorOutput(validator *tmtypes.Validator) (ValidatorOutput, error) { + bechAddress, err := sdk.Bech32ifyVal(validator.Address) + if err != nil { + return ValidatorOutput{}, err + } + bechValPubkey, err := sdk.Bech32ifyValPub(validator.PubKey) + if err != nil { + return ValidatorOutput{}, err + } + + return ValidatorOutput{ + Address: bechAddress, + PubKey: bechValPubkey, + Accum: validator.Accum, + VotingPower: validator.VotingPower, + }, nil +} + func getValidators(ctx context.CoreContext, height *int64) ([]byte, error) { // get the node node, err := ctx.GetNode() @@ -35,12 +69,23 @@ func getValidators(ctx context.CoreContext, height *int64) ([]byte, error) { return nil, err } - res, err := node.Validators(height) + validatorsRes, err := node.Validators(height) if err != nil { return nil, err } - output, err := cdc.MarshalJSON(res) + outputValidatorsRes := ResultValidatorsOutput{ + BlockHeight: validatorsRes.BlockHeight, + Validators: make([]ValidatorOutput, len(validatorsRes.Validators)), + } + for i := 0; i < len(validatorsRes.Validators); i++ { + outputValidatorsRes.Validators[i], err = bech32ValidatorOutput(validatorsRes.Validators[i]) + if err != nil { + return nil, err + } + } + + output, err := cdc.MarshalJSON(outputValidatorsRes) if err != nil { return nil, err } @@ -96,6 +141,7 @@ func ValidatorSetRequestHandlerFn(ctx context.CoreContext) http.HandlerFunc { w.Write([]byte(err.Error())) return } + w.Write(output) } } diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index ae46a623cd..1868452a64 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -170,7 +170,13 @@ func executeGetAddrPK(t *testing.T, cmdStr string) (sdk.Address, crypto.PubKey) var ko keys.KeyOutput keys.UnmarshalJSON([]byte(out), &ko) - return ko.Address, ko.PubKey + address, err := sdk.GetAccAddressBech32(ko.Address) + require.NoError(t, err) + + pk, err := sdk.GetAccPubKeyBech32(ko.PubKey) + require.NoError(t, err) + + return address, pk } func executeGetAccount(t *testing.T, cmdStr string) auth.BaseAccount { diff --git a/docs/sdk/lcd-rest-api.yaml b/docs/sdk/lcd-rest-api.yaml index 408b2a792b..3008d7f73c 100644 --- a/docs/sdk/lcd-rest-api.yaml +++ b/docs/sdk/lcd-rest-api.yaml @@ -102,7 +102,7 @@ paths: - application/json responses: 200: - description: 12 word Seed + description: 16 word Seed schema: type: string /keys/{name}: @@ -204,7 +204,7 @@ paths: parameters: - in: path name: address - description: Account address + description: Account address in bech32 format required: true type: string get: @@ -222,7 +222,7 @@ paths: parameters: - in: path name: address - description: Account address + description: Account address in bech32 format required: true type: string post: @@ -255,18 +255,6 @@ paths: description: Tx was send and will probably be added to the next block 400: description: The Tx was malformated - /accounts/{address}/nonce: - parameters: - - in: path - name: address - description: Account address - required: true - type: string - get: - summary: Get the nonce for a certain account - responses: - 200: - description: Plaintext nonce i.e. "4" defaults to "0" /blocks/latest: get: summary: Get the latest block @@ -304,9 +292,14 @@ paths: 200: description: The validator set at the latest block height schema: - type: array - items: - $ref: "#/definitions/Delegate" + type: object + properties: + block_height: + type: number + validators: + type: array + items: + $ref: "#/definitions/Validator" /validatorsets/{height}: parameters: - in: path @@ -322,9 +315,14 @@ paths: 200: description: The validator set at a specific block height schema: - type: array - items: - $ref: "#/definitions/Delegate" + type: object + properties: + block_height: + type: number + validators: + type: array + items: + $ref: "#/definitions/Validator" 404: description: Block at height not available # /txs: @@ -549,7 +547,20 @@ paths: definitions: Address: type: string - example: DF096FDE8D380FA5B2AD20DB2962C82DDEA1ED9B + description: bech32 encoded addres + example: cosmosaccaddr:zgnkwr7eyyv643dllwfpdwensmgdtz89yu73zq + ValidatorAddress: + type: string + description: bech32 encoded addres + example: cosmosvaladdr:zgnkwr7eyyv643dllwfpdwensmgdtz89yu73zq + PubKey: + type: string + description: bech32 encoded public key + example: cosmosaccpub:zgnkwr7eyyv643dllwfpdwensmgdtz89yu73zq + ValidatorPubKey: + type: string + description: bech32 encoded public key + example: cosmosvalpub:zgnkwr7eyyv643dllwfpdwensmgdtz89yu73zq Coins: type: object properties: @@ -652,16 +663,6 @@ definitions: example: 81B11E717789600CC192B26F452A983DF13B985EE75ABD9DD9E68D7BA007A958 Pubkey: $ref: "#/definitions/PubKey" - PubKey: - type: object - properties: - type: - type: string - enum: - - ed25519 - data: - type: string - example: 81B11E717789600CC192B26F452A983DF13B985EE75ABD9DD9E68D7BA007A958 Account: type: object properties: @@ -753,17 +754,19 @@ definitions: type: array items: type: object - Delegate: + Validator: type: object properties: + address: + $ref: '#/definitions/ValidatorAddress' pub_key: - $ref: "#/definitions/PubKey" + $ref: "#/definitions/ValidatorPubKey" power: type: number example: 1000 - name: - type: string - example: "159.89.3.34" + accum: + type: number + example: 1000 # Added by API Auto Mocking Plugin host: virtserver.swaggerhub.com basePath: /faboweb1/Cosmos-LCD-2/1.0.0 diff --git a/types/account.go b/types/account.go index ad0c58231f..00d180a1c7 100644 --- a/types/account.go +++ b/types/account.go @@ -32,7 +32,7 @@ func Bech32ifyAccPub(pub crypto.PubKey) (string, error) { } // Bech32ifyVal returns the bech32 encoded string for a validator address -func bech32ifyVal(addr Address) (string, error) { +func Bech32ifyVal(addr Address) (string, error) { return bech32.ConvertAndEncode(Bech32PrefixValAddr, addr.Bytes()) } @@ -62,6 +62,21 @@ func GetAccAddressBech32(address string) (addr Address, err error) { return Address(bz), nil } +// create a Pubkey from a string +func GetAccPubKeyBech32(address string) (pk crypto.PubKey, err error) { + bz, err := getFromBech32(address, Bech32PrefixAccPub) + if err != nil { + return nil, err + } + + pk, err = crypto.PubKeyFromBytes(bz) + if err != nil { + return nil, err + } + + return pk, nil +} + // create an Address from a hex string func GetValAddressHex(address string) (addr Address, err error) { if len(address) == 0 { diff --git a/x/auth/client/rest/query.go b/x/auth/client/rest/query.go index a60ce5cdb2..bcae59c203 100644 --- a/x/auth/client/rest/query.go +++ b/x/auth/client/rest/query.go @@ -1,7 +1,6 @@ package rest import ( - "encoding/hex" "fmt" "net/http" @@ -26,17 +25,16 @@ func RegisterRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec, sto func QueryAccountRequestHandlerFn(storeName string, cdc *wire.Codec, decoder auth.AccountDecoder, ctx context.CoreContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) - addr := vars["address"] + bech32addr := vars["address"] - bz, err := hex.DecodeString(addr) + addr, err := sdk.GetAccAddressBech32(bech32addr) if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) return } - key := sdk.Address(bz) - res, err := ctx.Query(key, storeName) + res, err := ctx.Query(addr, storeName) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(fmt.Sprintf("Could't query account. Error: %s", err.Error()))) diff --git a/x/bank/client/rest/sendtx.go b/x/bank/client/rest/sendtx.go index defed3f144..83ab3b843f 100644 --- a/x/bank/client/rest/sendtx.go +++ b/x/bank/client/rest/sendtx.go @@ -41,7 +41,14 @@ func SendRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx context.CoreCont return func(w http.ResponseWriter, r *http.Request) { // collect data vars := mux.Vars(r) - address := vars["address"] + bech32addr := vars["address"] + + address, err := sdk.GetAccAddressBech32(bech32addr) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(err.Error())) + return + } var m sendBody body, err := ioutil.ReadAll(r.Body) @@ -64,7 +71,7 @@ func SendRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx context.CoreCont return } - to, err := sdk.GetAccAddressHex(address) + to, err := sdk.GetAccAddressHex(address.String()) if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) diff --git a/x/ibc/client/rest/transfer.go b/x/ibc/client/rest/transfer.go index 48a29ee801..d897c6e4f6 100644 --- a/x/ibc/client/rest/transfer.go +++ b/x/ibc/client/rest/transfer.go @@ -35,7 +35,14 @@ func TransferRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx context.Core // collect data vars := mux.Vars(r) destChainID := vars["destchain"] - address := vars["address"] + bech32addr := vars["address"] + + address, err := sdk.GetAccAddressBech32(bech32addr) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(err.Error())) + return + } var m transferBody body, err := ioutil.ReadAll(r.Body) @@ -58,7 +65,7 @@ func TransferRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx context.Core return } - bz, err := hex.DecodeString(address) + bz, err := hex.DecodeString(address.String()) if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index 3e439c2b44..0da3260cb8 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -1,7 +1,6 @@ package rest import ( - "encoding/hex" "fmt" "net/http" @@ -30,24 +29,22 @@ func bondingStatusHandlerFn(ctx context.CoreContext, storeName string, cdc *wire // read parameters vars := mux.Vars(r) - delegator := vars["delegator"] - validator := vars["validator"] + bech32delegator := vars["delegator"] + bech32validator := vars["validator"] - bz, err := hex.DecodeString(delegator) + delegatorAddr, err := sdk.GetAccAddressBech32(bech32delegator) if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) return } - delegatorAddr := sdk.Address(bz) - bz, err = hex.DecodeString(validator) + validatorAddr, err := sdk.GetValAddressBech32(bech32validator) if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) return } - validatorAddr := sdk.Address(bz) key := stake.GetDelegationKey(delegatorAddr, validatorAddr, cdc) @@ -83,6 +80,62 @@ func bondingStatusHandlerFn(ctx context.CoreContext, storeName string, cdc *wire } } +// TODO inherit from Validator +type StakeValidatorOutput struct { + Owner string `json:"owner"` // in bech32 + PubKey string `json:"pub_key"` // in bech32 + Revoked bool `json:"revoked"` // has the validator been revoked from bonded status? + + PoolShares stake.PoolShares `json:"pool_shares"` // total shares for tokens held in the pool + DelegatorShares sdk.Rat `json:"delegator_shares"` // total shares issued to a validator's delegators + + Description stake.Description `json:"description"` // description terms for the validator + BondHeight int64 `json:"bond_height"` // earliest height as a bonded validator + BondIntraTxCounter int16 `json:"bond_intra_tx_counter"` // block-local tx index of validator change + ProposerRewardPool sdk.Coins `json:"proposer_reward_pool"` // XXX reward pool collected from being the proposer + + Commission sdk.Rat `json:"commission"` // XXX the commission rate of fees charged to any delegators + CommissionMax sdk.Rat `json:"commission_max"` // XXX maximum commission rate which this validator can ever charge + CommissionChangeRate sdk.Rat `json:"commission_change_rate"` // XXX maximum daily increase of the validator commission + CommissionChangeToday sdk.Rat `json:"commission_change_today"` // XXX commission rate change today, reset each day (UTC time) + + // fee related + PrevBondedShares sdk.Rat `json:"prev_bonded_shares"` // total shares of a global hold pools +} + +func bech32StakeValidatorOutput(validator stake.Validator) (StakeValidatorOutput, error) { + bechOwner, err := sdk.Bech32ifyVal(validator.Owner) + if err != nil { + return StakeValidatorOutput{}, err + } + bechValPubkey, err := sdk.Bech32ifyValPub(validator.PubKey) + if err != nil { + return StakeValidatorOutput{}, err + } + + return StakeValidatorOutput{ + Owner: bechOwner, + PubKey: bechValPubkey, + Revoked: validator.Revoked, + + PoolShares: validator.PoolShares, + DelegatorShares: validator.DelegatorShares, + + Description: validator.Description, + BondHeight: validator.BondHeight, + BondIntraTxCounter: validator.BondIntraTxCounter, + ProposerRewardPool: validator.ProposerRewardPool, + + Commission: validator.Commission, + CommissionMax: validator.CommissionMax, + CommissionChangeRate: validator.CommissionChangeRate, + CommissionChangeToday: validator.CommissionChangeToday, + + PrevBondedShares: validator.PrevBondedShares, + }, nil +} + +// TODO bech32 // http request handler to query list of validators func validatorsHandlerFn(ctx context.CoreContext, storeName string, cdc *wire.Codec) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { @@ -100,16 +153,20 @@ func validatorsHandlerFn(ctx context.CoreContext, storeName string, cdc *wire.Co } // parse out the validators - validators := make([]stake.Validator, len(kvs)) + validators := make([]StakeValidatorOutput, len(kvs)) for i, kv := range kvs { var validator stake.Validator + var bech32Validator StakeValidatorOutput err = cdc.UnmarshalBinary(kv.Value, &validator) + if err == nil { + bech32Validator, err = bech32StakeValidatorOutput(validator) + } if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(fmt.Sprintf("Couldn't decode validator. Error: %s", err.Error()))) return } - validators[i] = validator + validators[i] = bech32Validator } output, err := cdc.MarshalJSON(validators) diff --git a/x/stake/client/rest/tx.go b/x/stake/client/rest/tx.go index eaf206bf6b..33fe73c699 100644 --- a/x/stake/client/rest/tx.go +++ b/x/stake/client/rest/tx.go @@ -3,6 +3,7 @@ package rest import ( "bytes" "encoding/json" + "fmt" "io/ioutil" "net/http" @@ -23,13 +24,24 @@ func registerTxRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec, k ).Methods("POST") } +type msgDelegateInput struct { + DelegatorAddr string `json:"delegator_addr"` // in bech32 + ValidatorAddr string `json:"validator_addr"` // in bech32 + Bond sdk.Coin `json:"bond"` +} +type msgUnbondInput struct { + DelegatorAddr string `json:"delegator_addr"` // in bech32 + ValidatorAddr string `json:"validator_addr"` // in bech32 + Shares string `json:"shares"` +} + type editDelegationsBody struct { - LocalAccountName string `json:"name"` - Password string `json:"password"` - ChainID string `json:"chain_id"` - Sequence int64 `json:"sequence"` - Delegate []stake.MsgDelegate `json:"delegate"` - Unbond []stake.MsgUnbond `json:"unbond"` + LocalAccountName string `json:"name"` + Password string `json:"password"` + ChainID string `json:"chain_id"` + Sequence int64 `json:"sequence"` + Delegate []msgDelegateInput `json:"delegate"` + Unbond []msgUnbondInput `json:"unbond"` } func editDelegationsRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx context.CoreContext) http.HandlerFunc { @@ -59,21 +71,53 @@ func editDelegationsRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx conte messages := make([]sdk.Msg, len(m.Delegate)+len(m.Unbond)) i := 0 for _, msg := range m.Delegate { - if !bytes.Equal(info.Address(), msg.DelegatorAddr) { + delegatorAddr, err := sdk.GetAccAddressBech32(msg.DelegatorAddr) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf("Couldn't decode delegator. Error: %s", err.Error()))) + return + } + validatorAddr, err := sdk.GetValAddressBech32(msg.ValidatorAddr) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf("Couldn't decode validator. Error: %s", err.Error()))) + return + } + if !bytes.Equal(info.Address(), delegatorAddr) { w.WriteHeader(http.StatusUnauthorized) w.Write([]byte("Must use own delegator address")) return } - messages[i] = msg + messages[i] = stake.MsgDelegate{ + DelegatorAddr: delegatorAddr, + ValidatorAddr: validatorAddr, + Bond: msg.Bond, + } i++ } for _, msg := range m.Unbond { - if !bytes.Equal(info.Address(), msg.DelegatorAddr) { + delegatorAddr, err := sdk.GetAccAddressBech32(msg.DelegatorAddr) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf("Couldn't decode delegator. Error: %s", err.Error()))) + return + } + validatorAddr, err := sdk.GetValAddressBech32(msg.ValidatorAddr) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf("Couldn't decode validator. Error: %s", err.Error()))) + return + } + if !bytes.Equal(info.Address(), delegatorAddr) { w.WriteHeader(http.StatusUnauthorized) w.Write([]byte("Must use own delegator address")) return } - messages[i] = msg + messages[i] = stake.MsgUnbond{ + DelegatorAddr: delegatorAddr, + ValidatorAddr: validatorAddr, + Shares: msg.Shares, + } i++ } From 7cb404d578df12d3d2af921c16e9c9453f0c3131 Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Wed, 6 Jun 2018 09:55:34 -0400 Subject: [PATCH 181/548] created a test to check large unbonds lower bonded ratio --- x/stake/tick_test.go | 67 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 7 deletions(-) diff --git a/x/stake/tick_test.go b/x/stake/tick_test.go index 6bed352f51..fb3177f0af 100644 --- a/x/stake/tick_test.go +++ b/x/stake/tick_test.go @@ -1,6 +1,7 @@ package stake import ( + "math/rand" "strconv" "testing" @@ -9,6 +10,9 @@ import ( "github.com/stretchr/testify/require" ) +//change the int in NewSource to generate random input for tests that use r for randomization +var r = rand.New(rand.NewSource(505)) + func TestGetInflation(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 0) pool := keeper.GetPool(ctx) @@ -97,11 +101,8 @@ func TestProcessProvisions(t *testing.T) { // Cycles through the whole gambit of starting at 7% inflation, up to 20%, back down to 7% (it takes ~11.4 years) func TestHourlyInflationRateOfChange(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 0) - // params := defaultParams() - // keeper.setParams(ctx, params) pool := keeper.GetPool(ctx) - // test setUpCandidates returned the token values by passing these vars into checkCandidateSetup() var ( initialTotalTokens int64 = 550000000 initialBondedTokens int64 = 150000000 @@ -113,7 +114,7 @@ func TestHourlyInflationRateOfChange(t *testing.T) { bondedValidators uint16 = 1 ) - // create some candidates some bonded, some unbonded + // create some validators some bonded, some unbonded _, keeper, pool = setupTestValidators(pool, keeper, ctx, tokensForValidators, bondedValidators) checkValidatorSetup(t, pool, initialTotalTokens, initialBondedTokens, initialUnbondedTokens) @@ -134,6 +135,58 @@ func TestHourlyInflationRateOfChange(t *testing.T) { 0, 0, bondedShares, unbondedShares) } +//Test that a large unbonding will significantly lower the bonded ratio +func TestLargeUnbond(t *testing.T) { + ctx, _, keeper := createTestInput(t, false, 0) + // params := defaultParams() + // keeper.setParams(ctx, params) + pool := keeper.GetPool(ctx) + + var ( + initialTotalTokens int64 = 1200000000 + initialBondedTokens int64 = 900000000 + initialUnbondedTokens int64 = 300000000 + val0UnbondedTokens int64 + bondedShares = sdk.NewRat(900000000, 1) + unbondedShares = sdk.NewRat(300000000, 1) + bondSharesVal0 = sdk.NewRat(300000000, 1) + tokensForValidators = []int64{300000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000} + bondedValidators uint16 = 7 + ) + + _, keeper, pool = setupTestValidators(pool, keeper, ctx, tokensForValidators, bondedValidators) + checkValidatorSetup(t, pool, initialTotalTokens, initialBondedTokens, initialUnbondedTokens) + + pool = keeper.GetPool(ctx) + validator, found := keeper.GetValidator(ctx, addrs[0]) + assert.True(t, found) + + // initialBondedRatio that we can use to compare to the new values after the unbond + initialBondedRatio := pool.bondedRatio() + // validator[0] will be unbonded, bringing us from 75% to ~50% + // This func will unbond 300,000,000 tokens that were previously bonded + pool, validator, _, _ = OpBondOrUnbond(r, pool, validator) + keeper.setPool(ctx, pool) + + // process provisions after the bonding, to compare the difference in expProvisions and expInflation + _, expProvisionsAfter, pool := checkAndProcessProvisions(t, keeper, pool, ctx, 0) + + bondedShares = bondedShares.Sub(bondSharesVal0) + val0UnbondedTokens = pool.unbondedShareExRate().Mul(validator.PoolShares.Unbonded()).Evaluate() + unbondedShares = unbondedShares.Add(sdk.NewRat(val0UnbondedTokens, 1).Mul(pool.unbondedShareExRate())) + + // unbonded shares should increase + assert.True(t, unbondedShares.GT(sdk.NewRat(150000000, 1))) + // Ensure that new bonded ratio is less than old bonded ratio , because before they were increasing (i.e. 55 < 72) + assert.True(t, (pool.bondedRatio().LT(initialBondedRatio))) + + // Final check that the pool equals initial values + provisions and adjustments we recorded + pool = keeper.GetPool(ctx) + checkFinalPoolValues(t, pool, initialTotalTokens, + initialUnbondedTokens, expProvisionsAfter, + -val0UnbondedTokens, val0UnbondedTokens, bondedShares, unbondedShares) +} + ////////////////////////////////HELPER FUNCTIONS BELOW///////////////////////////////////// // Final check on the global pool values for what the total tokens accumulated from each hour of provisions and other functions @@ -154,7 +207,7 @@ func checkFinalPoolValues(t *testing.T, pool Pool, initialTotalTokens, initialUn assert.Equal(t, calculatedBondedTokens, pool.BondedTokens) assert.Equal(t, calculatedUnbondedTokens, pool.UnbondedTokens) - // test the value of candidate shares + // test the value of validator shares assert.True(t, pool.bondedShareExRate().Mul(bondedShares).Equal(sdk.NewRat(calculatedBondedTokens)), "%v", pool.bondedShareExRate()) assert.True(t, pool.unbondedShareExRate().Mul(unbondedShares).Equal(sdk.NewRat(calculatedUnbondedTokens)), "%v", pool.unbondedShareExRate()) } @@ -199,7 +252,7 @@ func setupTestValidators(pool Pool, keeper Keeper, ctx sdk.Context, validatorTok return validators, keeper, pool } -// Checks that the deterministic candidate setup you wanted matches the values in the pool +// Checks that the deterministic validator setup you wanted matches the values in the pool func checkValidatorSetup(t *testing.T, pool Pool, initialTotalTokens, initialBondedTokens, initialUnbondedTokens int64) { assert.Equal(t, initialTotalTokens, pool.TokenSupply()) @@ -208,7 +261,7 @@ func checkValidatorSetup(t *testing.T, pool Pool, initialTotalTokens, initialBon // test initial bonded ratio assert.True(t, pool.bondedRatio().Equal(sdk.NewRat(initialBondedTokens, initialTotalTokens)), "%v", pool.bondedRatio()) - // test the value of candidate shares + // test the value of validator shares assert.True(t, pool.bondedShareExRate().Equal(sdk.OneRat()), "%v", pool.bondedShareExRate()) } From 3fbee11ccc5a504c925cdb42f7c6a1edd1be6d92 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 6 Jun 2018 18:38:13 +0200 Subject: [PATCH 182/548] Merge PR #1142: Export validators to genesis * Validator export skeleton * Update export command, add tests, update CHANGELOG * Rename exportAppState to exportAppStateAndTMValidators --- CHANGELOG.md | 6 +++++ cmd/gaia/app/app.go | 10 +++++-- cmd/gaia/app/app_test.go | 36 +++++++++++++++++++++++++ cmd/gaia/cmd/gaiad/main.go | 7 ++--- examples/basecoin/app/app.go | 10 +++++-- examples/basecoin/cmd/basecoind/main.go | 7 ++--- examples/democoin/app/app.go | 9 +++++-- examples/democoin/cmd/democoind/main.go | 7 ++--- server/constructors.go | 11 ++++---- server/export.go | 3 ++- types/stake.go | 1 + x/stake/genesis.go | 19 ++++++++++++- x/stake/validator.go | 1 + 13 files changed, 105 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 731f3c14a3..6d65416915 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ BREAKING CHANGES +FEATURES + +IMPROVEMENTS +* export command now writes current validator set for Tendermint + +FIXES * [lcd] Switch to bech32 for addresses on all human readable inputs and outputs ## 0.18.0 diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index 8f8ed281ed..f06ed2be30 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -5,6 +5,7 @@ import ( "os" abci "github.com/tendermint/abci/types" + tmtypes "github.com/tendermint/tendermint/types" cmn "github.com/tendermint/tmlibs/common" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" @@ -153,7 +154,7 @@ func (app *GaiaApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci } // export the state of gaia for a genesis file -func (app *GaiaApp) ExportAppStateJSON() (appState json.RawMessage, err error) { +func (app *GaiaApp) ExportAppStateAndValidators() (appState json.RawMessage, validators []tmtypes.GenesisValidator, err error) { ctx := app.NewContext(true, abci.Header{}) // iterate to get the accounts @@ -169,5 +170,10 @@ func (app *GaiaApp) ExportAppStateJSON() (appState json.RawMessage, err error) { Accounts: accounts, StakeData: stake.WriteGenesis(ctx, app.stakeKeeper), } - return wire.MarshalJSONIndent(app.cdc, genState) + appState, err = wire.MarshalJSONIndent(app.cdc, genState) + if err != nil { + return nil, nil, err + } + validators = stake.WriteValidators(ctx, app.stakeKeeper) + return appState, validators, nil } diff --git a/cmd/gaia/app/app_test.go b/cmd/gaia/app/app_test.go index b6fffac32f..0fe1cfe5b9 100644 --- a/cmd/gaia/app/app_test.go +++ b/cmd/gaia/app/app_test.go @@ -430,6 +430,42 @@ func TestStakeMsgs(t *testing.T) { require.False(t, found) } +func TestExportValidators(t *testing.T) { + gapp := newGaiaApp() + + genCoins, err := sdk.ParseCoins("42steak") + require.Nil(t, err) + bondCoin, err := sdk.ParseCoin("10steak") + require.Nil(t, err) + + acc1 := &auth.BaseAccount{ + Address: addr1, + Coins: genCoins, + } + acc2 := &auth.BaseAccount{ + Address: addr2, + Coins: genCoins, + } + + err = setGenesis(gapp, acc1, acc2) + require.Nil(t, err) + + // Create Validator + description := stake.NewDescription("foo_moniker", "", "", "") + createValidatorMsg := stake.NewMsgCreateValidator( + addr1, priv1.PubKey(), bondCoin, description, + ) + SignCheckDeliver(t, gapp, createValidatorMsg, []int64{0}, true, priv1) + gapp.Commit() + + // Export validator set + _, validators, err := gapp.ExportAppStateAndValidators() + require.Nil(t, err) + require.Equal(t, 1, len(validators)) // 1 validator + require.Equal(t, priv1.PubKey(), validators[0].PubKey) + require.Equal(t, int64(10), validators[0].Power) +} + //____________________________________________________________________________________ func CheckBalance(t *testing.T, gapp *GaiaApp, addr sdk.Address, balExpected string) { diff --git a/cmd/gaia/cmd/gaiad/main.go b/cmd/gaia/cmd/gaiad/main.go index 30cb276ee1..5d0eb90300 100644 --- a/cmd/gaia/cmd/gaiad/main.go +++ b/cmd/gaia/cmd/gaiad/main.go @@ -6,6 +6,7 @@ import ( "github.com/spf13/cobra" abci "github.com/tendermint/abci/types" + tmtypes "github.com/tendermint/tendermint/types" "github.com/tendermint/tmlibs/cli" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" @@ -26,7 +27,7 @@ func main() { server.AddCommands(ctx, cdc, rootCmd, app.GaiaAppInit(), server.ConstructAppCreator(newApp, "gaia"), - server.ConstructAppExporter(exportAppState, "gaia")) + server.ConstructAppExporter(exportAppStateAndTMValidators, "gaia")) // prepare and add flags executor := cli.PrepareBaseCmd(rootCmd, "GA", app.DefaultNodeHome) @@ -37,7 +38,7 @@ func newApp(logger log.Logger, db dbm.DB) abci.Application { return app.NewGaiaApp(logger, db) } -func exportAppState(logger log.Logger, db dbm.DB) (json.RawMessage, error) { +func exportAppStateAndTMValidators(logger log.Logger, db dbm.DB) (json.RawMessage, []tmtypes.GenesisValidator, error) { gapp := app.NewGaiaApp(logger, db) - return gapp.ExportAppStateJSON() + return gapp.ExportAppStateAndValidators() } diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index 1718b8be23..fdb0638b69 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -4,6 +4,7 @@ import ( "encoding/json" abci "github.com/tendermint/abci/types" + tmtypes "github.com/tendermint/tendermint/types" cmn "github.com/tendermint/tmlibs/common" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" @@ -155,7 +156,7 @@ func (app *BasecoinApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) } // Custom logic for state export -func (app *BasecoinApp) ExportAppStateJSON() (appState json.RawMessage, err error) { +func (app *BasecoinApp) ExportAppStateAndValidators() (appState json.RawMessage, validators []tmtypes.GenesisValidator, err error) { ctx := app.NewContext(true, abci.Header{}) // iterate to get the accounts @@ -173,5 +174,10 @@ func (app *BasecoinApp) ExportAppStateJSON() (appState json.RawMessage, err erro genState := types.GenesisState{ Accounts: accounts, } - return wire.MarshalJSONIndent(app.cdc, genState) + appState, err = wire.MarshalJSONIndent(app.cdc, genState) + if err != nil { + return nil, nil, err + } + validators = stake.WriteValidators(ctx, app.stakeKeeper) + return appState, validators, err } diff --git a/examples/basecoin/cmd/basecoind/main.go b/examples/basecoin/cmd/basecoind/main.go index 4e6a30a086..4a6498e1be 100644 --- a/examples/basecoin/cmd/basecoind/main.go +++ b/examples/basecoin/cmd/basecoind/main.go @@ -7,6 +7,7 @@ import ( "github.com/spf13/cobra" abci "github.com/tendermint/abci/types" + tmtypes "github.com/tendermint/tendermint/types" "github.com/tendermint/tmlibs/cli" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" @@ -27,7 +28,7 @@ func main() { server.AddCommands(ctx, cdc, rootCmd, server.DefaultAppInit, server.ConstructAppCreator(newApp, "basecoin"), - server.ConstructAppExporter(exportAppState, "basecoin")) + server.ConstructAppExporter(exportAppStateAndTMValidators, "basecoin")) // prepare and add flags rootDir := os.ExpandEnv("$HOME/.basecoind") @@ -39,7 +40,7 @@ func newApp(logger log.Logger, db dbm.DB) abci.Application { return app.NewBasecoinApp(logger, db) } -func exportAppState(logger log.Logger, db dbm.DB) (json.RawMessage, error) { +func exportAppStateAndTMValidators(logger log.Logger, db dbm.DB) (json.RawMessage, []tmtypes.GenesisValidator, error) { bapp := app.NewBasecoinApp(logger, db) - return bapp.ExportAppStateJSON() + return bapp.ExportAppStateAndValidators() } diff --git a/examples/democoin/app/app.go b/examples/democoin/app/app.go index 2075a64da0..dc7c3c9d8e 100644 --- a/examples/democoin/app/app.go +++ b/examples/democoin/app/app.go @@ -4,6 +4,7 @@ import ( "encoding/json" abci "github.com/tendermint/abci/types" + tmtypes "github.com/tendermint/tendermint/types" cmn "github.com/tendermint/tmlibs/common" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" @@ -154,7 +155,7 @@ func (app *DemocoinApp) initChainerFn(coolKeeper cool.Keeper, powKeeper pow.Keep } // Custom logic for state export -func (app *DemocoinApp) ExportAppStateJSON() (appState json.RawMessage, err error) { +func (app *DemocoinApp) ExportAppStateAndValidators() (appState json.RawMessage, validators []tmtypes.GenesisValidator, err error) { ctx := app.NewContext(true, abci.Header{}) // iterate to get the accounts @@ -174,5 +175,9 @@ func (app *DemocoinApp) ExportAppStateJSON() (appState json.RawMessage, err erro POWGenesis: pow.WriteGenesis(ctx, app.powKeeper), CoolGenesis: cool.WriteGenesis(ctx, app.coolKeeper), } - return wire.MarshalJSONIndent(app.cdc, genState) + appState, err = wire.MarshalJSONIndent(app.cdc, genState) + if err != nil { + return nil, nil, err + } + return appState, validators, nil } diff --git a/examples/democoin/cmd/democoind/main.go b/examples/democoin/cmd/democoind/main.go index 3283da58ae..76d29075e9 100644 --- a/examples/democoin/cmd/democoind/main.go +++ b/examples/democoin/cmd/democoind/main.go @@ -7,6 +7,7 @@ import ( "github.com/spf13/cobra" abci "github.com/tendermint/abci/types" + tmtypes "github.com/tendermint/tendermint/types" "github.com/tendermint/tmlibs/cli" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" @@ -46,9 +47,9 @@ func newApp(logger log.Logger, db dbm.DB) abci.Application { return app.NewDemocoinApp(logger, db) } -func exportAppState(logger log.Logger, db dbm.DB) (json.RawMessage, error) { +func exportAppStateAndTMValidators(logger log.Logger, db dbm.DB) (json.RawMessage, []tmtypes.GenesisValidator, error) { dapp := app.NewDemocoinApp(logger, db) - return dapp.ExportAppStateJSON() + return dapp.ExportAppStateAndValidators() } func main() { @@ -63,7 +64,7 @@ func main() { server.AddCommands(ctx, cdc, rootCmd, CoolAppInit, server.ConstructAppCreator(newApp, "democoin"), - server.ConstructAppExporter(exportAppState, "democoin")) + server.ConstructAppExporter(exportAppStateAndTMValidators, "democoin")) // prepare and add flags rootDir := os.ExpandEnv("$HOME/.democoind") diff --git a/server/constructors.go b/server/constructors.go index 3d6950062b..c91c67a18d 100644 --- a/server/constructors.go +++ b/server/constructors.go @@ -5,6 +5,7 @@ import ( "path/filepath" abci "github.com/tendermint/abci/types" + tmtypes "github.com/tendermint/tendermint/types" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" ) @@ -13,8 +14,8 @@ import ( // and other flags (?) to start type AppCreator func(string, log.Logger) (abci.Application, error) -// AppExporter dumps all app state to JSON-serializable structure -type AppExporter func(home string, log log.Logger) (json.RawMessage, error) +// AppExporter dumps all app state to JSON-serializable structure and returns the current validator set +type AppExporter func(home string, log log.Logger) (json.RawMessage, []tmtypes.GenesisValidator, error) // ConstructAppCreator returns an application generation function func ConstructAppCreator(appFn func(log.Logger, dbm.DB) abci.Application, name string) AppCreator { @@ -30,12 +31,12 @@ func ConstructAppCreator(appFn func(log.Logger, dbm.DB) abci.Application, name s } // ConstructAppExporter returns an application export function -func ConstructAppExporter(appFn func(log.Logger, dbm.DB) (json.RawMessage, error), name string) AppExporter { - return func(rootDir string, logger log.Logger) (json.RawMessage, error) { +func ConstructAppExporter(appFn func(log.Logger, dbm.DB) (json.RawMessage, []tmtypes.GenesisValidator, error), name string) AppExporter { + return func(rootDir string, logger log.Logger) (json.RawMessage, []tmtypes.GenesisValidator, error) { dataDir := filepath.Join(rootDir, "data") db, err := dbm.NewGoLevelDB(name, dataDir) if err != nil { - return nil, err + return nil, nil, err } return appFn(logger, db) } diff --git a/server/export.go b/server/export.go index dad2df9cc9..794235f629 100644 --- a/server/export.go +++ b/server/export.go @@ -18,7 +18,7 @@ func ExportCmd(ctx *Context, cdc *wire.Codec, appExporter AppExporter) *cobra.Co Short: "Export state to JSON", RunE: func(cmd *cobra.Command, args []string) error { home := viper.GetString("home") - appState, err := appExporter(home, ctx.Logger) + appState, validators, err := appExporter(home, ctx.Logger) if err != nil { return errors.Errorf("Error exporting state: %v\n", err) } @@ -27,6 +27,7 @@ func ExportCmd(ctx *Context, cdc *wire.Codec, appExporter AppExporter) *cobra.Co return err } doc.AppStateJSON = appState + doc.Validators = validators encoded, err := wire.MarshalJSONIndent(cdc, doc) if err != nil { return err diff --git a/types/stake.go b/types/stake.go index 6a620db762..7484295cc5 100644 --- a/types/stake.go +++ b/types/stake.go @@ -32,6 +32,7 @@ func BondStatusToString(b BondStatus) string { // validator for a delegated proof of stake system type Validator interface { + GetMoniker() string // moniker of the validator GetStatus() BondStatus // status of the validator GetOwner() Address // owner address to receive/return validators coins GetPubKey() crypto.PubKey // validation pubkey diff --git a/x/stake/genesis.go b/x/stake/genesis.go index 0a7c528bf6..43ea61d8b7 100644 --- a/x/stake/genesis.go +++ b/x/stake/genesis.go @@ -1,6 +1,10 @@ package stake -import sdk "github.com/cosmos/cosmos-sdk/types" +import ( + tmtypes "github.com/tendermint/tendermint/types" + + sdk "github.com/cosmos/cosmos-sdk/types" +) // GenesisState - all staking state that must be provided at genesis type GenesisState struct { @@ -63,3 +67,16 @@ func WriteGenesis(ctx sdk.Context, k Keeper) GenesisState { bonds, } } + +// WriteValidators - output current validator set +func WriteValidators(ctx sdk.Context, k Keeper) (vals []tmtypes.GenesisValidator) { + k.IterateValidatorsBonded(ctx, func(_ int64, validator sdk.Validator) (stop bool) { + vals = append(vals, tmtypes.GenesisValidator{ + PubKey: validator.GetPubKey(), + Power: validator.GetPower().Evaluate(), + Name: validator.GetMoniker(), + }) + return false + }) + return +} diff --git a/x/stake/validator.go b/x/stake/validator.go index a0b484d712..3b135c12bf 100644 --- a/x/stake/validator.go +++ b/x/stake/validator.go @@ -251,6 +251,7 @@ func (v Validator) DelegatorShareExRate(pool Pool) sdk.Rat { var _ sdk.Validator = Validator{} // nolint - for sdk.Validator +func (v Validator) GetMoniker() string { return v.Description.Moniker } func (v Validator) GetStatus() sdk.BondStatus { return v.Status() } func (v Validator) GetOwner() sdk.Address { return v.Owner } func (v Validator) GetPubKey() crypto.PubKey { return v.PubKey } From 5aa6c96cb6316f2d914bee32f8e6ded788c798ab Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Wed, 6 Jun 2018 13:11:36 -0400 Subject: [PATCH 183/548] added Large Bond test for provisions --- x/stake/tick_test.go | 63 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/x/stake/tick_test.go b/x/stake/tick_test.go index fb3177f0af..27b3072f9e 100644 --- a/x/stake/tick_test.go +++ b/x/stake/tick_test.go @@ -138,8 +138,6 @@ func TestHourlyInflationRateOfChange(t *testing.T) { //Test that a large unbonding will significantly lower the bonded ratio func TestLargeUnbond(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 0) - // params := defaultParams() - // keeper.setParams(ctx, params) pool := keeper.GetPool(ctx) var ( @@ -176,7 +174,7 @@ func TestLargeUnbond(t *testing.T) { unbondedShares = unbondedShares.Add(sdk.NewRat(val0UnbondedTokens, 1).Mul(pool.unbondedShareExRate())) // unbonded shares should increase - assert.True(t, unbondedShares.GT(sdk.NewRat(150000000, 1))) + assert.True(t, unbondedShares.GT(sdk.NewRat(300000000, 1))) // Ensure that new bonded ratio is less than old bonded ratio , because before they were increasing (i.e. 55 < 72) assert.True(t, (pool.bondedRatio().LT(initialBondedRatio))) @@ -187,6 +185,63 @@ func TestLargeUnbond(t *testing.T) { -val0UnbondedTokens, val0UnbondedTokens, bondedShares, unbondedShares) } +//Test that a large bonding will significantly increase the bonded ratio +func TestLargeBond(t *testing.T) { + ctx, _, keeper := createTestInput(t, false, 0) + pool := keeper.GetPool(ctx) + + var ( + initialTotalTokens int64 = 1600000000 + initialBondedTokens int64 = 400000000 + initialUnbondedTokens int64 = 1200000000 + val9UnbondedTokens int64 = 400000000 + val9BondedTokens int64 + bondedShares = sdk.NewRat(400000000, 1) + unbondedShares = sdk.NewRat(1200000000, 1) + unbondedSharesVal9 = sdk.NewRat(400000000, 1) + tokensForValidators = []int64{400000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 400000000} + bondedValidators uint16 = 1 + ) + + _, keeper, pool = setupTestValidators(pool, keeper, ctx, tokensForValidators, bondedValidators) + checkValidatorSetup(t, pool, initialTotalTokens, initialBondedTokens, initialUnbondedTokens) + + pool = keeper.GetPool(ctx) + validator, found := keeper.GetValidator(ctx, addrs[9]) + assert.True(t, found) + + // initialBondedRatio that we can use to compare to the new values after the unbond + initialBondedRatio := pool.bondedRatio() + + params := defaultParams() + params.MaxValidators = bondedValidators + 1 //must do this to allow for an extra validator to bond + keeper.setParams(ctx, params) + + // validator[9] will be bonded, bringing us from 25% to ~50% + // This func will bond 400,000,000 tokens that were previously unbonded + pool, validator, _, _ = OpBondOrUnbond(r, pool, validator) + keeper.setPool(ctx, pool) + + // process provisions after the bonding, to compare the difference in expProvisions and expInflation + _, expProvisionsAfter, pool := checkAndProcessProvisions(t, keeper, pool, ctx, 0) + unbondedShares = unbondedShares.Sub(unbondedSharesVal9) + val9BondedTokens = val9UnbondedTokens + val9UnbondedTokens = 0 + bondedTokens := initialBondedTokens + val9BondedTokens + expProvisionsAfter + bondedShares = sdk.NewRat(bondedTokens, 1).Quo(pool.bondedShareExRate()) + + // unbonded shares should decrease + assert.True(t, unbondedShares.LT(sdk.NewRat(1200000000, 1))) + // Ensure that new bonded ratio is greater than old bonded ratio (i.e. 50% > 25%) + assert.True(t, (pool.bondedRatio().GT(initialBondedRatio))) + // Final check that the pool equals initial values + provisions and adjustments we recorded + pool = keeper.GetPool(ctx) + + checkFinalPoolValues(t, pool, initialTotalTokens, + initialUnbondedTokens, expProvisionsAfter, + val9BondedTokens, -val9BondedTokens, bondedShares, unbondedShares) +} + ////////////////////////////////HELPER FUNCTIONS BELOW///////////////////////////////////// // Final check on the global pool values for what the total tokens accumulated from each hour of provisions and other functions @@ -245,7 +300,7 @@ func setupTestValidators(pool Pool, keeper Keeper, ctx sdk.Context, validatorTok validators[i] = NewValidator(addrs[i], pks[i], Description{}) validators[i], pool, _ = validators[i].addTokensFromDel(pool, validatorTokens[i]) keeper.setPool(ctx, pool) - validators[i] = keeper.updateValidator(ctx, validators[i]) + validators[i] = keeper.updateValidator(ctx, validators[i]) //will kick out lower power validators. must keep in mind when setting up the test validators order pool = keeper.GetPool(ctx) } From 5352b650787fffe7f6302983305ee6201149f79c Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Wed, 6 Jun 2018 14:05:51 -0400 Subject: [PATCH 184/548] Added TestInflationWithRandomOperations --- x/stake/tick_test.go | 119 +++++++++++++++++++++++++++++++------------ 1 file changed, 86 insertions(+), 33 deletions(-) diff --git a/x/stake/tick_test.go b/x/stake/tick_test.go index 27b3072f9e..8096119f42 100644 --- a/x/stake/tick_test.go +++ b/x/stake/tick_test.go @@ -10,8 +10,8 @@ import ( "github.com/stretchr/testify/require" ) -//change the int in NewSource to generate random input for tests that use r for randomization -var r = rand.New(rand.NewSource(505)) +//changing the int in NewSource will allow you to test different, deterministic, sets of operations +var r = rand.New(rand.NewSource(6595)) func TestGetInflation(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 0) @@ -64,6 +64,7 @@ func TestGetInflation(t *testing.T) { } } +// Test that provisions are correctly added to the pool and validators each hour for 1 year func TestProcessProvisions(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 0) pool := keeper.GetPool(ctx) @@ -75,18 +76,18 @@ func TestProcessProvisions(t *testing.T) { cumulativeExpProvs int64 initialBondedShares = sdk.NewRat(250000000, 1) initialUnbondedShares = sdk.NewRat(300000000, 1) - tokensForValidators = []int64{150000000, 100000000, 100000000, 100000000, 100000000} + validatorTokens = []int64{150000000, 100000000, 100000000, 100000000, 100000000} bondedValidators uint16 = 2 ) // create some validators some bonded, some unbonded - _, keeper, pool = setupTestValidators(pool, keeper, ctx, tokensForValidators, bondedValidators) + _, keeper, pool = setupTestValidators(pool, keeper, ctx, validatorTokens, bondedValidators) checkValidatorSetup(t, pool, initialTotalTokens, initialBondedTokens, initialUnbondedTokens) // process the provisions for a year for hr := 0; hr < 8766; hr++ { pool := keeper.GetPool(ctx) - _, expProvisions, _ := checkAndProcessProvisions(t, keeper, pool, ctx, hr) + _, expProvisions, _ := updateProvisions(t, keeper, pool, ctx, hr) cumulativeExpProvs = cumulativeExpProvs + expProvisions } @@ -97,8 +98,8 @@ func TestProcessProvisions(t *testing.T) { 0, 0, initialBondedShares, initialUnbondedShares) } -// Tests that the hourly rate of change will be positive, negative, or zero, depending on bonded ratio and inflation rate -// Cycles through the whole gambit of starting at 7% inflation, up to 20%, back down to 7% (it takes ~11.4 years) +// Tests that the hourly rate of change of inflation will be positive, negative, or zero, depending on bonded ratio and inflation rate +// Cycles through the whole gambit of inflation possibilities, starting at 7% inflation, up to 20%, back down to 7% (it takes ~11.4 years) func TestHourlyInflationRateOfChange(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 0) pool := keeper.GetPool(ctx) @@ -110,19 +111,19 @@ func TestHourlyInflationRateOfChange(t *testing.T) { cumulativeExpProvs int64 bondedShares = sdk.NewRat(150000000, 1) unbondedShares = sdk.NewRat(400000000, 1) - tokensForValidators = []int64{150000000, 100000000, 100000000, 100000000, 100000000} + validatorTokens = []int64{150000000, 100000000, 100000000, 100000000, 100000000} bondedValidators uint16 = 1 ) // create some validators some bonded, some unbonded - _, keeper, pool = setupTestValidators(pool, keeper, ctx, tokensForValidators, bondedValidators) + _, keeper, pool = setupTestValidators(pool, keeper, ctx, validatorTokens, bondedValidators) checkValidatorSetup(t, pool, initialTotalTokens, initialBondedTokens, initialUnbondedTokens) // ~11.4 years to go from 7%, up to 20%, back down to 7% for hr := 0; hr < 100000; hr++ { pool := keeper.GetPool(ctx) previousInflation := pool.Inflation - updatedInflation, expProvisions, pool := checkAndProcessProvisions(t, keeper, pool, ctx, hr) + updatedInflation, expProvisions, pool := updateProvisions(t, keeper, pool, ctx, hr) cumulativeExpProvs = cumulativeExpProvs + expProvisions msg := strconv.Itoa(hr) checkInflation(t, pool, previousInflation, updatedInflation, msg) @@ -148,11 +149,11 @@ func TestLargeUnbond(t *testing.T) { bondedShares = sdk.NewRat(900000000, 1) unbondedShares = sdk.NewRat(300000000, 1) bondSharesVal0 = sdk.NewRat(300000000, 1) - tokensForValidators = []int64{300000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000} + validatorTokens = []int64{300000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000} bondedValidators uint16 = 7 ) - _, keeper, pool = setupTestValidators(pool, keeper, ctx, tokensForValidators, bondedValidators) + _, keeper, pool = setupTestValidators(pool, keeper, ctx, validatorTokens, bondedValidators) checkValidatorSetup(t, pool, initialTotalTokens, initialBondedTokens, initialUnbondedTokens) pool = keeper.GetPool(ctx) @@ -161,13 +162,13 @@ func TestLargeUnbond(t *testing.T) { // initialBondedRatio that we can use to compare to the new values after the unbond initialBondedRatio := pool.bondedRatio() - // validator[0] will be unbonded, bringing us from 75% to ~50% - // This func will unbond 300,000,000 tokens that were previously bonded + + // validator[0] will be unbonded, bringing us from 75% bonded ratio to ~50% (unbonding 300,000,000) pool, validator, _, _ = OpBondOrUnbond(r, pool, validator) keeper.setPool(ctx, pool) // process provisions after the bonding, to compare the difference in expProvisions and expInflation - _, expProvisionsAfter, pool := checkAndProcessProvisions(t, keeper, pool, ctx, 0) + _, expProvisionsAfter, pool := updateProvisions(t, keeper, pool, ctx, 0) bondedShares = bondedShares.Sub(bondSharesVal0) val0UnbondedTokens = pool.unbondedShareExRate().Mul(validator.PoolShares.Unbonded()).Evaluate() @@ -175,7 +176,7 @@ func TestLargeUnbond(t *testing.T) { // unbonded shares should increase assert.True(t, unbondedShares.GT(sdk.NewRat(300000000, 1))) - // Ensure that new bonded ratio is less than old bonded ratio , because before they were increasing (i.e. 55 < 72) + // Ensure that new bonded ratio is less than old bonded ratio , because before they were increasing (i.e. 50% < 75) assert.True(t, (pool.bondedRatio().LT(initialBondedRatio))) // Final check that the pool equals initial values + provisions and adjustments we recorded @@ -199,11 +200,11 @@ func TestLargeBond(t *testing.T) { bondedShares = sdk.NewRat(400000000, 1) unbondedShares = sdk.NewRat(1200000000, 1) unbondedSharesVal9 = sdk.NewRat(400000000, 1) - tokensForValidators = []int64{400000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 400000000} + validatorTokens = []int64{400000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 400000000} bondedValidators uint16 = 1 ) - _, keeper, pool = setupTestValidators(pool, keeper, ctx, tokensForValidators, bondedValidators) + _, keeper, pool = setupTestValidators(pool, keeper, ctx, validatorTokens, bondedValidators) checkValidatorSetup(t, pool, initialTotalTokens, initialBondedTokens, initialUnbondedTokens) pool = keeper.GetPool(ctx) @@ -217,13 +218,12 @@ func TestLargeBond(t *testing.T) { params.MaxValidators = bondedValidators + 1 //must do this to allow for an extra validator to bond keeper.setParams(ctx, params) - // validator[9] will be bonded, bringing us from 25% to ~50% - // This func will bond 400,000,000 tokens that were previously unbonded + // validator[9] will be bonded, bringing us from 25% to ~50% (bonding 400,000,000 tokens) pool, validator, _, _ = OpBondOrUnbond(r, pool, validator) keeper.setPool(ctx, pool) // process provisions after the bonding, to compare the difference in expProvisions and expInflation - _, expProvisionsAfter, pool := checkAndProcessProvisions(t, keeper, pool, ctx, 0) + _, expProvisionsAfter, pool := updateProvisions(t, keeper, pool, ctx, 0) unbondedShares = unbondedShares.Sub(unbondedSharesVal9) val9BondedTokens = val9UnbondedTokens val9UnbondedTokens = 0 @@ -242,10 +242,65 @@ func TestLargeBond(t *testing.T) { val9BondedTokens, -val9BondedTokens, bondedShares, unbondedShares) } +// Tests that inflation increases or decreases as expected when we do a random operation on 20 different validators +func TestInflationWithRandomOperations(t *testing.T) { + ctx, _, keeper := createTestInput(t, false, 0) + params := defaultParams() + keeper.setParams(ctx, params) + numValidators := 20 + + // start off by randomly setting up 20 validators + pool, validators := randomSetup(r, numValidators) + require.Equal(t, numValidators, len(validators)) + + for i := 0; i < len(validators); i++ { + keeper.setValidator(ctx, validators[i]) + } + keeper.setPool(ctx, pool) + + // Used to rotate validators so each random operation is applied to a different validator + validatorCounter := 0 + + // Loop through 20 random operations, and check the inflation after each operation + for i := 0; i < numValidators; i++ { + pool := keeper.GetPool(ctx) + + // Get inflation before randomOperation, for comparison later + previousInflation := pool.Inflation + + // Perform the random operation, and record how validators are modified + poolMod, validatorMod, tokens, msg := randomOperation(r)(r, pool, validators[validatorCounter]) + validatorsMod := make([]Validator, len(validators)) + copy(validatorsMod[:], validators[:]) + require.Equal(t, numValidators, len(validators), "i %v", validatorCounter) + require.Equal(t, numValidators, len(validatorsMod), "i %v", validatorCounter) + validatorsMod[validatorCounter] = validatorMod + + assertInvariants(t, msg, + pool, validators, + poolMod, validatorsMod, tokens) + + // set pool and validators after the random operation + pool = poolMod + keeper.setPool(ctx, pool) + validators = validatorsMod + + // Must set inflation here manually, as opposed to most other tests in this suite, where we call keeper.processProvisions(), which updates pool.Inflation + updatedInflation := keeper.nextInflation(ctx) + pool.Inflation = updatedInflation + keeper.setPool(ctx, pool) + + // Ensure inflation changes as expected when random operations are applied. + checkInflation(t, pool, previousInflation, updatedInflation, msg) + validatorCounter++ + } +} + ////////////////////////////////HELPER FUNCTIONS BELOW///////////////////////////////////// // Final check on the global pool values for what the total tokens accumulated from each hour of provisions and other functions -// bondedAdjustment and unbondedAdjustment are the accumulated changes for the operations of the test (i.e. if three unbonds happened, their total value would be passed as unbondedAdjustment) +// bondedAdjustment and unbondedAdjustment are the accumulated changes for the operations of the test +// (i.e. if three unbond operations happened, their total value would be passed as unbondedAdjustment) func checkFinalPoolValues(t *testing.T, pool Pool, initialTotalTokens, initialUnbondedTokens, cumulativeExpProvs, bondedAdjustment, unbondedAdjustment int64, bondedShares, unbondedShares sdk.Rat) { @@ -267,11 +322,9 @@ func checkFinalPoolValues(t *testing.T, pool Pool, initialTotalTokens, initialUn assert.True(t, pool.unbondedShareExRate().Mul(unbondedShares).Equal(sdk.NewRat(calculatedUnbondedTokens)), "%v", pool.unbondedShareExRate()) } -// Checks provisions are added to the pool correctly every hour +// Processes provisions are added to the pool correctly every hour // Returns expected Provisions, expected Inflation, and pool, to help with cumulative calculations back in main Tests -func checkAndProcessProvisions(t *testing.T, keeper Keeper, pool Pool, ctx sdk.Context, hr int) (sdk.Rat, int64, Pool) { - - //If we are not doing a random operation, just check that normal provisions are working for each hour +func updateProvisions(t *testing.T, keeper Keeper, pool Pool, ctx sdk.Context, hr int) (sdk.Rat, int64, Pool) { expInflation := keeper.nextInflation(ctx) expProvisions := (expInflation.Mul(sdk.NewRat(pool.TokenSupply())).Quo(hrsPerYrRat)).Evaluate() startBondedPool := pool.BondedTokens @@ -286,12 +339,12 @@ func checkAndProcessProvisions(t *testing.T, keeper Keeper, pool Pool, ctx sdk.C return expInflation, expProvisions, pool } -// Deterministic setup of validators, which updates the pool and choose maxValidators to be bonded -// Allows you to decide how many validators to setup, and which ones you want bonded -// You choose bonded validators by setting params.MaxValidators. If you choose 2, the first 2 Validators in the arrray will be bonded, the rest unbonded +// Deterministic setup of validators and pool +// Allows you to decide how many validators to setup +// Allows you to pick which validators are bonded by adjusting the MaxValidators of params func setupTestValidators(pool Pool, keeper Keeper, ctx sdk.Context, validatorTokens []int64, maxValidators uint16) ([]Validator, Keeper, Pool) { params := defaultParams() - params.MaxValidators = maxValidators //set to limit the amount of validators we want bonded + params.MaxValidators = maxValidators keeper.setParams(ctx, params) numValidators := len(validatorTokens) validators := make([]Validator, numValidators) @@ -300,7 +353,7 @@ func setupTestValidators(pool Pool, keeper Keeper, ctx sdk.Context, validatorTok validators[i] = NewValidator(addrs[i], pks[i], Description{}) validators[i], pool, _ = validators[i].addTokensFromDel(pool, validatorTokens[i]) keeper.setPool(ctx, pool) - validators[i] = keeper.updateValidator(ctx, validators[i]) //will kick out lower power validators. must keep in mind when setting up the test validators order + validators[i] = keeper.updateValidator(ctx, validators[i]) //will kick out lower power validators. Keep this in mind when setting up the test validators order pool = keeper.GetPool(ctx) } @@ -309,7 +362,6 @@ func setupTestValidators(pool Pool, keeper Keeper, ctx sdk.Context, validatorTok // Checks that the deterministic validator setup you wanted matches the values in the pool func checkValidatorSetup(t *testing.T, pool Pool, initialTotalTokens, initialBondedTokens, initialUnbondedTokens int64) { - assert.Equal(t, initialTotalTokens, pool.TokenSupply()) assert.Equal(t, initialBondedTokens, pool.BondedTokens) assert.Equal(t, initialUnbondedTokens, pool.UnbondedTokens) @@ -322,7 +374,6 @@ func checkValidatorSetup(t *testing.T, pool Pool, initialTotalTokens, initialBon // Checks that The inflation will correctly increase or decrease after an update to the pool func checkInflation(t *testing.T, pool Pool, previousInflation, updatedInflation sdk.Rat, msg string) { - inflationChange := updatedInflation.Sub(previousInflation) switch { @@ -334,6 +385,7 @@ func checkInflation(t *testing.T, pool Pool, previousInflation, updatedInflation case pool.bondedRatio().LT(sdk.NewRat(67, 100)) && updatedInflation.Equal(sdk.NewRat(20, 100)): if previousInflation.Equal(sdk.NewRat(20, 100)) { assert.Equal(t, true, inflationChange.IsZero(), msg) + //This else statement covers the one off case where we first hit 20%, but we still needed a positive ROC to get to 67% bonded ratio (i.e. we went from 19.99999% to 20%) } else { assert.Equal(t, true, inflationChange.GT(sdk.ZeroRat()), msg) @@ -347,6 +399,7 @@ func checkInflation(t *testing.T, pool Pool, previousInflation, updatedInflation case pool.bondedRatio().GT(sdk.NewRat(67, 100)) && updatedInflation.Equal(sdk.NewRat(7, 100)): if previousInflation.Equal(sdk.NewRat(7, 100)) { assert.Equal(t, true, inflationChange.IsZero(), msg) + //This else statement covers the one off case where we first hit 7%, but we still needed a negative ROC to continue to get down to 67%. (i.e. we went from 7.00001% to 7%) } else { assert.Equal(t, true, inflationChange.LT(sdk.ZeroRat()), msg) From 78703f027d77cb881a5f1eec4575f689fa06b270 Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Wed, 6 Jun 2018 15:49:22 -0400 Subject: [PATCH 185/548] fixed small breaking changes from pulling in develop --- x/stake/inflation_test.go | 6 +++--- x/stake/test_common.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/x/stake/inflation_test.go b/x/stake/inflation_test.go index 8096119f42..7fa393edc8 100644 --- a/x/stake/inflation_test.go +++ b/x/stake/inflation_test.go @@ -214,7 +214,7 @@ func TestLargeBond(t *testing.T) { // initialBondedRatio that we can use to compare to the new values after the unbond initialBondedRatio := pool.bondedRatio() - params := defaultParams() + params := DefaultParams() params.MaxValidators = bondedValidators + 1 //must do this to allow for an extra validator to bond keeper.setParams(ctx, params) @@ -245,7 +245,7 @@ func TestLargeBond(t *testing.T) { // Tests that inflation increases or decreases as expected when we do a random operation on 20 different validators func TestInflationWithRandomOperations(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 0) - params := defaultParams() + params := DefaultParams() keeper.setParams(ctx, params) numValidators := 20 @@ -343,7 +343,7 @@ func updateProvisions(t *testing.T, keeper Keeper, pool Pool, ctx sdk.Context, h // Allows you to decide how many validators to setup // Allows you to pick which validators are bonded by adjusting the MaxValidators of params func setupTestValidators(pool Pool, keeper Keeper, ctx sdk.Context, validatorTokens []int64, maxValidators uint16) ([]Validator, Keeper, Pool) { - params := defaultParams() + params := DefaultParams() params.MaxValidators = maxValidators keeper.setParams(ctx, params) numValidators := len(validatorTokens) diff --git a/x/stake/test_common.go b/x/stake/test_common.go index 50d8dc37e3..3cea0b281a 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -150,7 +150,7 @@ func createTestAddrs(numAddrs int) []sdk.Address { buffer.WriteString(numString) //adding on final two digits to make addresses unique res, _ := sdk.GetAccAddressHex(buffer.String()) - bech, _ := sdk.Bech32CosmosifyAcc(res) + bech, _ := sdk.Bech32ifyAcc(res) addresses = append(addresses, testAddr(buffer.String(), bech)) buffer.Reset() } From 04d6ce68989e3e270a4c9386361c8c27211143b8 Mon Sep 17 00:00:00 2001 From: mossid Date: Wed, 6 Jun 2018 18:25:00 -0700 Subject: [PATCH 186/548] add revoked prefix to key, add condition in getbypower --- x/stake/keeper.go | 6 ++++++ x/stake/keeper_keys.go | 13 ++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/x/stake/keeper.go b/x/stake/keeper.go index 9f554c764f..fad1f86ef1 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -167,6 +167,12 @@ func (k Keeper) GetValidatorsByPower(ctx sdk.Context) []Validator { if !found { panic(fmt.Sprintf("validator record not found for address: %v\n", address)) } + + // Reached to revoked validators, stop iterating + if validator.Revoked { + iterator.Close() + break + } if validator.Status() == sdk.Bonded { validators[i] = validator i++ diff --git a/x/stake/keeper_keys.go b/x/stake/keeper_keys.go index 632a86ec3c..20062f00e4 100644 --- a/x/stake/keeper_keys.go +++ b/x/stake/keeper_keys.go @@ -51,15 +51,22 @@ func GetValidatorsByPowerKey(validator Validator, pool Pool) []byte { powerBytes := []byte(power.ToLeftPadded(maxDigitsForAccount)) // power big-endian (more powerful validators first) // TODO ensure that the key will be a readable string.. probably should add seperators and have + revokedBytes := make([]byte, 1) + if validator.Revoked { + revokedBytes[0] = byte(0x01) + } else { + revokedBytes[0] = byte(0x00) + } // heightBytes and counterBytes represent strings like powerBytes does heightBytes := make([]byte, binary.MaxVarintLen64) binary.BigEndian.PutUint64(heightBytes, ^uint64(validator.BondHeight)) // invert height (older validators first) counterBytes := make([]byte, 2) binary.BigEndian.PutUint16(counterBytes, ^uint16(validator.BondIntraTxCounter)) // invert counter (first txns have priority) return append(ValidatorsByPowerKey, - append(powerBytes, - append(heightBytes, - append(counterBytes, validator.Owner.Bytes()...)...)...)...) // TODO don't technically need to store owner + append(revokedBytes, + append(powerBytes, + append(heightBytes, + append(counterBytes, validator.Owner.Bytes()...)...)...)...)...) // TODO don't technically need to store owner } // get the key for the accumulated update validators From 7baed6d3619d0bd912a27393420f8a3ac466a987 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 7 Jun 2018 21:36:03 +0200 Subject: [PATCH 187/548] Add MustUnBech32() functions --- types/account.go | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/types/account.go b/types/account.go index 00d180a1c7..fa471ab49f 100644 --- a/types/account.go +++ b/types/account.go @@ -62,6 +62,15 @@ func GetAccAddressBech32(address string) (addr Address, err error) { return Address(bz), nil } +// must create an Address from a string +func MustGetAccAddressBech32(address string) Address { + addr, err := GetAccAddressBech32(address) + if err != nil { + panic(err) + } + return addr +} + // create a Pubkey from a string func GetAccPubKeyBech32(address string) (pk crypto.PubKey, err error) { bz, err := getFromBech32(address, Bech32PrefixAccPub) @@ -77,6 +86,15 @@ func GetAccPubKeyBech32(address string) (pk crypto.PubKey, err error) { return pk, nil } +// must create a Pubkey from a string +func MustGetAccPubkeyBec32(address string) crypto.PubKey { + pk, err := GetAccPubKeyBech32(address) + if err != nil { + panic(err) + } + return pk +} + // create an Address from a hex string func GetValAddressHex(address string) (addr Address, err error) { if len(address) == 0 { @@ -98,7 +116,16 @@ func GetValAddressBech32(address string) (addr Address, err error) { return Address(bz), nil } -//Decode a validator publickey into a public key +// must create an Address from a bech32 string +func MustGetValAddressBech32(address string) Address { + addr, err := GetValAddressBech32(address) + if err != nil { + panic(err) + } + return addr +} + +// decode a validator public key into a PubKey func GetValPubKeyBech32(pubkey string) (pk crypto.PubKey, err error) { bz, err := getFromBech32(pubkey, Bech32PrefixValPub) if err != nil { @@ -113,6 +140,15 @@ func GetValPubKeyBech32(pubkey string) (pk crypto.PubKey, err error) { return pk, nil } +// must decode a validator public key into a PubKey +func MustGetValPubKeyBech32(pubkey string) crypto.PubKey { + pk, err := GetValPubKeyBech32(pubkey) + if err != nil { + panic(err) + } + return pk +} + func getFromBech32(bech32str, prefix string) ([]byte, error) { if len(bech32str) == 0 { return nil, errors.New("must provide non-empty string") From cabb6e68fc7b1afe0693865cb4e4d0278e2f0735 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 7 Jun 2018 23:42:37 +0200 Subject: [PATCH 188/548] bech32ify x/bank/MsgSend --- x/bank/msgs.go | 53 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/x/bank/msgs.go b/x/bank/msgs.go index 7836056de0..ff91ba40fd 100644 --- a/x/bank/msgs.go +++ b/x/bank/msgs.go @@ -1,6 +1,8 @@ package bank import ( + "encoding/json" + sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -53,7 +55,20 @@ func (msg MsgSend) ValidateBasic() sdk.Error { // Implements Msg. func (msg MsgSend) GetSignBytes() []byte { - b, err := msgCdc.MarshalJSON(msg) // XXX: ensure some canonical form + var inputs, outputs []json.RawMessage + for _, input := range msg.Inputs { + inputs = append(inputs, input.GetSignBytes()) + } + for _, output := range msg.Outputs { + outputs = append(outputs, output.GetSignBytes()) + } + b, err := msgCdc.MarshalJSON(struct { + Inputs []json.RawMessage `json:"inputs"` + Outputs []json.RawMessage `json:"outputs"` + }{ + Inputs: inputs, + Outputs: outputs, + }) if err != nil { panic(err) } @@ -123,6 +138,24 @@ type Input struct { Coins sdk.Coins `json:"coins"` } +func (in Input) GetSignBytes() []byte { + addr, err := sdk.Bech32ifyAcc(in.Address) + if err != nil { + panic(err) + } + bin, err := msgCdc.MarshalJSON(struct { + Address string `json:"address"` + Coins sdk.Coins `json:"coins"` + }{ + Address: addr, + Coins: in.Coins, + }) + if err != nil { + panic(err) + } + return bin +} + // ValidateBasic - validate transaction input func (in Input) ValidateBasic() sdk.Error { if len(in.Address) == 0 { @@ -155,6 +188,24 @@ type Output struct { Coins sdk.Coins `json:"coins"` } +func (out Output) GetSignBytes() []byte { + addr, err := sdk.Bech32ifyAcc(out.Address) + if err != nil { + panic(err) + } + bin, err := msgCdc.MarshalJSON(struct { + Address string `json:"address"` + Coins sdk.Coins `json:"coins"` + }{ + Address: addr, + Coins: out.Coins, + }) + if err != nil { + panic(err) + } + return bin +} + // ValidateBasic - validate transaction output func (out Output) ValidateBasic() sdk.Error { if len(out.Address) == 0 { From f8896ee7aa374a4e5acf8584618fe990bc0166af Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 7 Jun 2018 23:47:23 +0200 Subject: [PATCH 189/548] Fix x/bank Msg testcases --- x/bank/msgs_test.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/x/bank/msgs_test.go b/x/bank/msgs_test.go index 8f9791c8d7..82d61c7653 100644 --- a/x/bank/msgs_test.go +++ b/x/bank/msgs_test.go @@ -187,12 +187,14 @@ func TestMsgSendGetSignBytes(t *testing.T) { } res := msg.GetSignBytes() - unmarshaledMsg := &MsgSend{} - msgCdc.UnmarshalJSON(res, unmarshaledMsg) - assert.Equal(t, &msg, unmarshaledMsg) + // TODO Why did we assert this? + /* + unmarshaledMsg := &MsgSend{} + msgCdc.UnmarshalJSON(res, unmarshaledMsg) + assert.Equal(t, &msg, unmarshaledMsg) + */ - // TODO bad results - expected := `{"type":"EAFDE32A2C87F8","value":{"inputs":[{"address":"696E707574","coins":[{"denom":"atom","amount":10}]}],"outputs":[{"address":"6F7574707574","coins":[{"denom":"atom","amount":10}]}]}}` + expected := `{"inputs":[{"address":"cosmosaccaddr1d9h8qat5e4ehc5","coins":[{"denom":"atom","amount":10}]}],"outputs":[{"address":"cosmosaccaddr1da6hgur4wse3jx32","coins":[{"denom":"atom","amount":10}]}]}` assert.Equal(t, expected, string(res)) } From a6c0db71e5d68a71499bb23e3aa01286506a70a9 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 8 Jun 2018 00:32:14 +0200 Subject: [PATCH 190/548] Bech32ify GetSignBytes() for x/bank --- types/account.go | 36 ++++++++++++++++++++++++++++++++++++ x/bank/msgs.go | 26 +++++++++++++++----------- x/bank/msgs_test.go | 7 ------- 3 files changed, 51 insertions(+), 18 deletions(-) diff --git a/types/account.go b/types/account.go index fa471ab49f..2c35ca77d2 100644 --- a/types/account.go +++ b/types/account.go @@ -26,21 +26,57 @@ func Bech32ifyAcc(addr Address) (string, error) { return bech32.ConvertAndEncode(Bech32PrefixAccAddr, addr.Bytes()) } +// MustBech32ifyAcc panics on bech32-encoding failure +func MustBech32ifyAcc(addr Address) string { + enc, err := Bech32ifyAcc(addr) + if err != nil { + panic(err) + } + return enc +} + // Bech32ifyAccPub takes AccountPubKey and returns the bech32 encoded string func Bech32ifyAccPub(pub crypto.PubKey) (string, error) { return bech32.ConvertAndEncode(Bech32PrefixAccPub, pub.Bytes()) } +// MustBech32ifyAccPub panics on bech32-encoding failure +func MustBech32ifyAccPub(pub crypto.PubKey) string { + enc, err := Bech32ifyAccPub(pub) + if err != nil { + panic(err) + } + return enc +} + // Bech32ifyVal returns the bech32 encoded string for a validator address func Bech32ifyVal(addr Address) (string, error) { return bech32.ConvertAndEncode(Bech32PrefixValAddr, addr.Bytes()) } +// MustBech32ifyVal panics on bech32-encoding failure +func MustBech32ifyVal(addr Address) string { + enc, err := Bech32ifyVal(addr) + if err != nil { + panic(err) + } + return enc +} + // Bech32ifyValPub returns the bech32 encoded string for a validator pubkey func Bech32ifyValPub(pub crypto.PubKey) (string, error) { return bech32.ConvertAndEncode(Bech32PrefixValPub, pub.Bytes()) } +// MustBech32ifyValPub pancis on bech32-encoding failure +func MustBech32ifyValPub(pub crypto.PubKey) string { + enc, err := Bech32ifyValPub(pub) + if err != nil { + panic(err) + } + return enc +} + // create an Address from a string func GetAccAddressHex(address string) (addr Address, err error) { if len(address) == 0 { diff --git a/x/bank/msgs.go b/x/bank/msgs.go index ff91ba40fd..e0d73bf08a 100644 --- a/x/bank/msgs.go +++ b/x/bank/msgs.go @@ -93,6 +93,8 @@ type MsgIssue struct { Outputs []Output `json:"outputs"` } +var _ sdk.Msg = MsgIssue{} + // NewMsgIssue - construct arbitrary multi-in, multi-out send msg. func NewMsgIssue(banker sdk.Address, out []Output) MsgIssue { return MsgIssue{Banker: banker, Outputs: out} @@ -117,7 +119,17 @@ func (msg MsgIssue) ValidateBasic() sdk.Error { // Implements Msg. func (msg MsgIssue) GetSignBytes() []byte { - b, err := msgCdc.MarshalJSON(msg) // XXX: ensure some canonical form + var outputs []json.RawMessage + for _, output := range msg.Outputs { + outputs = append(outputs, output.GetSignBytes()) + } + b, err := msgCdc.MarshalJSON(struct { + Banker string `json:"banker"` + Outputs []json.RawMessage `json:"outputs"` + }{ + Banker: sdk.MustBech32ifyAcc(msg.Banker), + Outputs: outputs, + }) if err != nil { panic(err) } @@ -139,15 +151,11 @@ type Input struct { } func (in Input) GetSignBytes() []byte { - addr, err := sdk.Bech32ifyAcc(in.Address) - if err != nil { - panic(err) - } bin, err := msgCdc.MarshalJSON(struct { Address string `json:"address"` Coins sdk.Coins `json:"coins"` }{ - Address: addr, + Address: sdk.MustBech32ifyAcc(in.Address), Coins: in.Coins, }) if err != nil { @@ -189,15 +197,11 @@ type Output struct { } func (out Output) GetSignBytes() []byte { - addr, err := sdk.Bech32ifyAcc(out.Address) - if err != nil { - panic(err) - } bin, err := msgCdc.MarshalJSON(struct { Address string `json:"address"` Coins sdk.Coins `json:"coins"` }{ - Address: addr, + Address: sdk.MustBech32ifyAcc(out.Address), Coins: out.Coins, }) if err != nil { diff --git a/x/bank/msgs_test.go b/x/bank/msgs_test.go index 82d61c7653..06adad1ef7 100644 --- a/x/bank/msgs_test.go +++ b/x/bank/msgs_test.go @@ -187,13 +187,6 @@ func TestMsgSendGetSignBytes(t *testing.T) { } res := msg.GetSignBytes() - // TODO Why did we assert this? - /* - unmarshaledMsg := &MsgSend{} - msgCdc.UnmarshalJSON(res, unmarshaledMsg) - assert.Equal(t, &msg, unmarshaledMsg) - */ - expected := `{"inputs":[{"address":"cosmosaccaddr1d9h8qat5e4ehc5","coins":[{"denom":"atom","amount":10}]}],"outputs":[{"address":"cosmosaccaddr1da6hgur4wse3jx32","coins":[{"denom":"atom","amount":10}]}]}` assert.Equal(t, expected, string(res)) } From b166cc237faabab225a76fce7e692a794b390f10 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 8 Jun 2018 00:35:13 +0200 Subject: [PATCH 191/548] Testcase/linter fixes --- x/bank/msgs.go | 2 ++ x/bank/msgs_test.go | 7 +------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/x/bank/msgs.go b/x/bank/msgs.go index e0d73bf08a..48e62d8350 100644 --- a/x/bank/msgs.go +++ b/x/bank/msgs.go @@ -150,6 +150,7 @@ type Input struct { Coins sdk.Coins `json:"coins"` } +// Return bytes to sign for Input func (in Input) GetSignBytes() []byte { bin, err := msgCdc.MarshalJSON(struct { Address string `json:"address"` @@ -196,6 +197,7 @@ type Output struct { Coins sdk.Coins `json:"coins"` } +// Return bytes to sign for Output func (out Output) GetSignBytes() []byte { bin, err := msgCdc.MarshalJSON(struct { Address string `json:"address"` diff --git a/x/bank/msgs_test.go b/x/bank/msgs_test.go index 06adad1ef7..90b4869db0 100644 --- a/x/bank/msgs_test.go +++ b/x/bank/msgs_test.go @@ -257,12 +257,7 @@ func TestMsgIssueGetSignBytes(t *testing.T) { } res := msg.GetSignBytes() - unmarshaledMsg := &MsgIssue{} - msgCdc.UnmarshalJSON(res, unmarshaledMsg) - assert.Equal(t, &msg, unmarshaledMsg) - - // TODO bad results - expected := `{"type":"72E617C06ABAD0","value":{"banker":"696E707574","outputs":[{"address":"6C6F616E2D66726F6D2D62616E6B","coins":[{"denom":"atom","amount":10}]}]}}` + expected := `{"banker":"cosmosaccaddr1d9h8qat5e4ehc5","outputs":[{"address":"cosmosaccaddr1d3hkzm3dveex7mfdvfsku6cwsauqd","coins":[{"denom":"atom","amount":10}]}]}` assert.Equal(t, expected, string(res)) } From f58b454985a146d1aebcf53588d56cbf8c08d273 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 7 Jun 2018 16:13:11 -0700 Subject: [PATCH 192/548] mock application framework compiling --- tests/mock/app.go | 85 +++++++++++++++++++++++++++++ tests/mock/simulate_block.go | 100 +++++++++++++++++++++++++++++++++++ x/bank/app_test.go | 96 +++++++++++++++++++++++++++++++++ 3 files changed, 281 insertions(+) create mode 100644 tests/mock/app.go create mode 100644 tests/mock/simulate_block.go create mode 100644 x/bank/app_test.go diff --git a/tests/mock/app.go b/tests/mock/app.go new file mode 100644 index 0000000000..f7b7a0a34c --- /dev/null +++ b/tests/mock/app.go @@ -0,0 +1,85 @@ +package mock + +import ( + "testing" + + "os" + + "github.com/stretchr/testify/require" + abci "github.com/tendermint/abci/types" + dbm "github.com/tendermint/tmlibs/db" + "github.com/tendermint/tmlibs/log" + + bam "github.com/cosmos/cosmos-sdk/baseapp" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" +) + +// Extended ABCI application +type App struct { + *bam.BaseApp + Cdc *wire.Codec // public since the codec is passed into the module anyways. + KeyMain *sdk.KVStoreKey + KeyAccount *sdk.KVStoreKey + + // TODO: Abstract this out from not needing to be auth specifically + AccountMapper auth.AccountMapper + FeeCollectionKeeper auth.FeeCollectionKeeper + + GenesisAccounts []auth.Account +} + +// NewApp is used for testing the server. For the internal mock app stuff, it uses code in helpers.go +func NewApp() *App { + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") + db := dbm.NewMemDB() + + // create the cdc with some standard codecs + cdc := wire.NewCodec() + sdk.RegisterWire(cdc) + wire.RegisterCrypto(cdc) + + // create your application object + app := &App{ + BaseApp: bam.NewBaseApp("mock", cdc, logger, db), + Cdc: cdc, + KeyMain: sdk.NewKVStoreKey("main"), + KeyAccount: sdk.NewKVStoreKey("acc"), + } + + // define the accountMapper + app.AccountMapper = auth.NewAccountMapper( + app.Cdc, + app.KeyAccount, // target store + &auth.BaseAccount{}, // prototype + ) + + // initialize the app, the chainers and blockers can be overwritten before calling complete setup + app.SetInitChainer(app.initChainer) + + app.SetAnteHandler(auth.NewAnteHandler(app.AccountMapper, app.FeeCollectionKeeper)) + + return app +} + +// complete the application setup after the routes have been registered +func (app App) CompleteSetup(t *testing.T, newKeys []*sdk.KVStoreKey) { + + newKeys = append(newKeys, app.KeyMain) + newKeys = append(newKeys, app.KeyAccount) + app.MountStoresIAVL(newKeys...) + err := app.LoadLatestVersion(app.KeyMain) + require.NoError(t, err) +} + +// custom logic for initialization +func (app App) initChainer(ctx sdk.Context, _ abci.RequestInitChain) abci.ResponseInitChain { + + // load the accounts + for _, acc := range app.GenesisAccounts { + app.AccountMapper.SetAccount(ctx, acc) + } + + return abci.ResponseInitChain{} +} diff --git a/tests/mock/simulate_block.go b/tests/mock/simulate_block.go new file mode 100644 index 0000000000..fa1000af79 --- /dev/null +++ b/tests/mock/simulate_block.go @@ -0,0 +1,100 @@ +package mock + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + crypto "github.com/tendermint/go-crypto" + + abci "github.com/tendermint/abci/types" +) + +var chainID = "" // TODO + +// set the mock app genesis +func SetGenesis(app *App, accs []auth.Account) { + + // pass the accounts in via the application (lazy) instead of through RequestInitChain + app.GenesisAccounts = accs + + app.InitChain(abci.RequestInitChain{}) + app.Commit() +} + +// check an account balance +func CheckBalance(t *testing.T, app *App, addr sdk.Address, exp sdk.Coins) { + ctxDeliver := app.BaseApp.NewContext(false, abci.Header{}) + res := app.AccountMapper.GetAccount(ctxDeliver, addr) + assert.Equal(t, exp, res.GetCoins()) +} + +// generate a signed transaction +func GenTx(msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) auth.StdTx { + + // make the transaction free + fee := auth.StdFee{ + sdk.Coins{{"foocoin", 0}}, + 100000, + } + + sigs := make([]auth.StdSignature, len(priv)) + for i, p := range priv { + sigs[i] = auth.StdSignature{ + PubKey: p.PubKey(), + Signature: p.Sign(auth.StdSignBytes(chainID, seq, fee, msg)), + Sequence: seq[i], + } + } + return auth.NewStdTx(msg, fee, sigs) +} + +// simulate a block +func SignCheckDeliver(t *testing.T, app *App, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { + + // Sign the tx + tx := GenTx(msg, seq, priv...) + + // Run a Check + res := app.Check(tx) + if expPass { + require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) + } else { + require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) + } + + // Simulate a Block + app.BeginBlock(abci.RequestBeginBlock{}) + res = app.Deliver(tx) + if expPass { + require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) + } else { + require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) + } + app.EndBlock(abci.RequestEndBlock{}) + + // XXX fix code or add explaination as to why using commit breaks a bunch of these tests + //app.Commit() +} + +// XXX the only reason we are using Sign Deliver here is because the tests +// break on check tx the second time you use SignCheckDeliver in a test because +// the checktx state has not been updated likely because commit is not being +// called! +func SignDeliver(t *testing.T, app App, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { + + // Sign the tx + tx := GenTx(msg, seq, priv...) + + // Simulate a Block + app.BeginBlock(abci.RequestBeginBlock{}) + res := app.Deliver(tx) + if expPass { + require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) + } else { + require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) + } + app.EndBlock(abci.RequestEndBlock{}) +} diff --git a/x/bank/app_test.go b/x/bank/app_test.go new file mode 100644 index 0000000000..3dcf37c220 --- /dev/null +++ b/x/bank/app_test.go @@ -0,0 +1,96 @@ +package bank + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/tests/mock" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" + + abci "github.com/tendermint/abci/types" + crypto "github.com/tendermint/go-crypto" +) + +// test bank module in a mock application +var ( + chainID = "" // TODO + + accName = "foobart" + + priv1 = crypto.GenPrivKeyEd25519() + addr1 = priv1.PubKey().Address() + priv2 = crypto.GenPrivKeyEd25519() + addr2 = priv2.PubKey().Address() + addr3 = crypto.GenPrivKeyEd25519().PubKey().Address() + priv4 = crypto.GenPrivKeyEd25519() + addr4 = priv4.PubKey().Address() + coins = sdk.Coins{{"foocoin", 10}} + halfCoins = sdk.Coins{{"foocoin", 5}} + manyCoins = sdk.Coins{{"foocoin", 1}, {"barcoin", 1}} + fee = auth.StdFee{ + sdk.Coins{{"foocoin", 0}}, + 100000, + } + + sendMsg1 = MsgSend{ + Inputs: []Input{NewInput(addr1, coins)}, + Outputs: []Output{NewOutput(addr2, coins)}, + } +) + +func TestMsgSendWithAccounts(t *testing.T) { + + // initialize the mock application + mapp := mock.NewApp() + + RegisterWire(mapp.Cdc) + coinKeeper := NewKeeper(mapp.AccountMapper) + mapp.Router().AddRoute("bank", NewHandler(coinKeeper)) + + mapp.CompleteSetup(t, []*sdk.KVStoreKey{}) + + // Add an account at genesis + coins, err := sdk.ParseCoins("77foocoin") + require.Nil(t, err) + //acc := auth.NewAccountWithAddress(addr1) + //acc.SetCoins(coins) + //accs := []auth.Account{acc} + + baseAcc := &auth.BaseAccount{ + Address: addr1, + Coins: coins, + } + baseAccs := []auth.Account{baseAcc} + + // Construct genesis state + mock.SetGenesis(mapp, baseAccs) + + // A checkTx context (true) + ctxCheck := mapp.BaseApp.NewContext(true, abci.Header{}) + res1 := mapp.AccountMapper.GetAccount(ctxCheck, addr1) + require.NotNil(t, res1) + assert.Equal(t, baseAcc, res1.(*auth.BaseAccount)) + + // Run a CheckDeliver + mock.SignCheckDeliver(t, mapp, sendMsg1, []int64{0}, true, priv1) + + // Check balances + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 67}}) + mock.CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 10}}) + + // Delivering again should cause replay error + mock.SignCheckDeliver(t, mapp, sendMsg1, []int64{0}, false, priv1) + + // bumping the txnonce number without resigning should be an auth error + tx := mock.GenTx(sendMsg1, []int64{0}, priv1) + tx.Signatures[0].Sequence = 1 + res := mapp.Deliver(tx) + + assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), res.Code, res.Log) + + // resigning the tx with the bumped sequence should work + mock.SignCheckDeliver(t, mapp, sendMsg1, []int64{1}, true, priv1) +} From 971e1489b21214a05ef7ce5623eaf5ec3c12adac Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 8 Jun 2018 01:24:08 +0200 Subject: [PATCH 193/548] Bech32ify msg.GetSignBytes() for x/slashing & x/stake --- x/slashing/msg.go | 6 +++++- x/stake/msg.go | 43 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/x/slashing/msg.go b/x/slashing/msg.go index d2676af81a..acf5f9d932 100644 --- a/x/slashing/msg.go +++ b/x/slashing/msg.go @@ -30,7 +30,11 @@ func (msg MsgUnrevoke) GetSigners() []sdk.Address { return []sdk.Address{msg.Val // get the bytes for the message signer to sign on func (msg MsgUnrevoke) GetSignBytes() []byte { - b, err := cdc.MarshalJSON(msg) + b, err := cdc.MarshalJSON(struct { + ValidatorAddr string `json:"address"` + }{ + ValidatorAddr: sdk.MustBech32ifyAcc(msg.ValidatorAddr), + }) if err != nil { panic(err) } diff --git a/x/stake/msg.go b/x/stake/msg.go index 40bf609eec..a0922bb872 100644 --- a/x/stake/msg.go +++ b/x/stake/msg.go @@ -45,7 +45,20 @@ func (msg MsgCreateValidator) GetSigners() []sdk.Address { // get the bytes for the message signer to sign on func (msg MsgCreateValidator) GetSignBytes() []byte { - return msgCdc.MustMarshalBinary(msg) + b, err := msgCdc.MarshalJSON(struct { + Description + ValidatorAddr string `json:"address"` + PubKey string `json:"pubkey"` + Bond sdk.Coin `json:"bond"` + }{ + Description: msg.Description, + ValidatorAddr: sdk.MustBech32ifyVal(msg.ValidatorAddr), + PubKey: sdk.MustBech32ifyValPub(msg.PubKey), + }) + if err != nil { + panic(err) + } + return b } // quick validity check @@ -89,7 +102,13 @@ func (msg MsgEditValidator) GetSigners() []sdk.Address { // get the bytes for the message signer to sign on func (msg MsgEditValidator) GetSignBytes() []byte { - b, err := msgCdc.MarshalJSON(msg) + b, err := msgCdc.MarshalJSON(struct { + Description + ValidatorAddr string `json:"address"` + }{ + Description: msg.Description, + ValidatorAddr: sdk.MustBech32ifyVal(msg.ValidatorAddr), + }) if err != nil { panic(err) } @@ -133,7 +152,15 @@ func (msg MsgDelegate) GetSigners() []sdk.Address { // get the bytes for the message signer to sign on func (msg MsgDelegate) GetSignBytes() []byte { - b, err := msgCdc.MarshalJSON(msg) + b, err := msgCdc.MarshalJSON(struct { + DelegatorAddr string `json:"delegator_addr"` + ValidatorAddr string `json:"validator_addr"` + Bond sdk.Coin `json:"bond"` + }{ + DelegatorAddr: sdk.MustBech32ifyAcc(msg.DelegatorAddr), + ValidatorAddr: sdk.MustBech32ifyVal(msg.ValidatorAddr), + Bond: msg.Bond, + }) if err != nil { panic(err) } @@ -180,7 +207,15 @@ func (msg MsgUnbond) GetSigners() []sdk.Address { return []sdk.Address{msg.Deleg // get the bytes for the message signer to sign on func (msg MsgUnbond) GetSignBytes() []byte { - b, err := msgCdc.MarshalJSON(msg) + b, err := msgCdc.MarshalJSON(struct { + DelegatorAddr string `json:"delegator_addr"` + ValidatorAddr string `json:"validator_addr"` + Shares string `json:"shares"` + }{ + DelegatorAddr: sdk.MustBech32ifyAcc(msg.DelegatorAddr), + ValidatorAddr: sdk.MustBech32ifyVal(msg.ValidatorAddr), + Shares: msg.Shares, + }) if err != nil { panic(err) } From cbc6989ed60036e99ec74b02333a891bbabc50fc Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 8 Jun 2018 01:49:37 +0200 Subject: [PATCH 194/548] Bech32ify msg.GetSignBytes() for x/ibc --- x/ibc/types.go | 51 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/x/ibc/types.go b/x/ibc/types.go index 09a853b208..76239102a0 100644 --- a/x/ibc/types.go +++ b/x/ibc/types.go @@ -1,11 +1,20 @@ package ibc import ( - sdk "github.com/cosmos/cosmos-sdk/types" + "encoding/json" + sdk "github.com/cosmos/cosmos-sdk/types" wire "github.com/cosmos/cosmos-sdk/wire" ) +var ( + msgCdc *wire.Codec +) + +func init() { + msgCdc = wire.NewCodec() +} + // ------------------------------ // IBCPacket @@ -32,6 +41,26 @@ func NewIBCPacket(srcAddr sdk.Address, destAddr sdk.Address, coins sdk.Coins, } } +func (p IBCPacket) GetSignBytes() []byte { + b, err := msgCdc.MarshalJSON(struct { + SrcAddr string + DestAddr string + Coins sdk.Coins + SrcChain string + DestChain string + }{ + SrcAddr: sdk.MustBech32ifyAcc(p.SrcAddr), + DestAddr: sdk.MustBech32ifyAcc(p.DestAddr), + Coins: p.Coins, + SrcChain: p.SrcChain, + DestChain: p.DestChain, + }) + if err != nil { + panic(err) + } + return b +} + // validator the ibc packey func (ibcp IBCPacket) ValidateBasic() sdk.Error { if ibcp.SrcChain == ibcp.DestChain { @@ -60,12 +89,7 @@ func (msg IBCTransferMsg) GetSigners() []sdk.Address { return []sdk.Address{msg. // get the sign bytes for ibc transfer message func (msg IBCTransferMsg) GetSignBytes() []byte { - cdc := wire.NewCodec() - bz, err := cdc.MarshalBinary(msg) - if err != nil { - panic(err) - } - return bz + return msg.IBCPacket.GetSignBytes() } // validate ibc transfer message @@ -94,10 +118,17 @@ func (msg IBCReceiveMsg) GetSigners() []sdk.Address { return []sdk.Address{msg.R // get the sign bytes for ibc receive message func (msg IBCReceiveMsg) GetSignBytes() []byte { - cdc := wire.NewCodec() - bz, err := cdc.MarshalBinary(msg) + b, err := msgCdc.MarshalJSON(struct { + IBCPacket json.RawMessage + Relayer string + Sequence int64 + }{ + IBCPacket: json.RawMessage(msg.IBCPacket.GetSignBytes()), + Relayer: sdk.MustBech32ifyAcc(msg.Relayer), + Sequence: msg.Sequence, + }) if err != nil { panic(err) } - return bz + return b } From 34ec53a76139d8f76b485d9b6d808d75338dc17b Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 8 Jun 2018 01:50:59 +0200 Subject: [PATCH 195/548] Update CHANGELOG.md, update x/auth to avoid base64 --- CHANGELOG.md | 1 + x/auth/stdtx.go | 16 +++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d65416915..e34a1468b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog BREAKING CHANGES +* msg.GetSignBytes() now returns bech32-encoded addresses in all cases FEATURES diff --git a/x/auth/stdtx.go b/x/auth/stdtx.go index 4858ae0b43..e08f77ee48 100644 --- a/x/auth/stdtx.go +++ b/x/auth/stdtx.go @@ -1,6 +1,8 @@ package auth import ( + "encoding/json" + sdk "github.com/cosmos/cosmos-sdk/types" crypto "github.com/tendermint/go-crypto" ) @@ -83,11 +85,11 @@ func (fee StdFee) Bytes() []byte { // and the Sequence numbers for each signature (prevent // inchain replay and enforce tx ordering per account). type StdSignDoc struct { - ChainID string `json:"chain_id"` - Sequences []int64 `json:"sequences"` - FeeBytes []byte `json:"fee_bytes"` - MsgBytes []byte `json:"msg_bytes"` - AltBytes []byte `json:"alt_bytes"` + ChainID string `json:"chain_id"` + Sequences []int64 `json:"sequences"` + FeeBytes json.RawMessage `json:"fee_bytes"` + MsgBytes json.RawMessage `json:"msg_bytes"` + AltBytes json.RawMessage `json:"alt_bytes"` } // StdSignBytes returns the bytes to sign for a transaction. @@ -96,8 +98,8 @@ func StdSignBytes(chainID string, sequences []int64, fee StdFee, msg sdk.Msg) [] bz, err := msgCdc.MarshalJSON(StdSignDoc{ ChainID: chainID, Sequences: sequences, - FeeBytes: fee.Bytes(), - MsgBytes: msg.GetSignBytes(), + FeeBytes: json.RawMessage(fee.Bytes()), + MsgBytes: json.RawMessage(msg.GetSignBytes()), }) if err != nil { panic(err) From a583a70b7c5c09ef10b381affbfb465c91a85e77 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 8 Jun 2018 01:59:10 +0200 Subject: [PATCH 196/548] Fix address type for x/slashing/MsgUnrevoke --- x/slashing/msg.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/slashing/msg.go b/x/slashing/msg.go index acf5f9d932..561c922665 100644 --- a/x/slashing/msg.go +++ b/x/slashing/msg.go @@ -33,7 +33,7 @@ func (msg MsgUnrevoke) GetSignBytes() []byte { b, err := cdc.MarshalJSON(struct { ValidatorAddr string `json:"address"` }{ - ValidatorAddr: sdk.MustBech32ifyAcc(msg.ValidatorAddr), + ValidatorAddr: sdk.MustBech32ifyVal(msg.ValidatorAddr), }) if err != nil { panic(err) From 496d4681c2d0167713effc34b4a580ae267cee28 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 8 Jun 2018 02:05:34 +0200 Subject: [PATCH 197/548] Add MsgUnrevoke.GetSignBytes() testcase, remove unused functions --- types/account.go | 36 ------------------------------------ x/slashing/msg_test.go | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 36 deletions(-) create mode 100644 x/slashing/msg_test.go diff --git a/types/account.go b/types/account.go index 2c35ca77d2..381fb7af8a 100644 --- a/types/account.go +++ b/types/account.go @@ -98,15 +98,6 @@ func GetAccAddressBech32(address string) (addr Address, err error) { return Address(bz), nil } -// must create an Address from a string -func MustGetAccAddressBech32(address string) Address { - addr, err := GetAccAddressBech32(address) - if err != nil { - panic(err) - } - return addr -} - // create a Pubkey from a string func GetAccPubKeyBech32(address string) (pk crypto.PubKey, err error) { bz, err := getFromBech32(address, Bech32PrefixAccPub) @@ -122,15 +113,6 @@ func GetAccPubKeyBech32(address string) (pk crypto.PubKey, err error) { return pk, nil } -// must create a Pubkey from a string -func MustGetAccPubkeyBec32(address string) crypto.PubKey { - pk, err := GetAccPubKeyBech32(address) - if err != nil { - panic(err) - } - return pk -} - // create an Address from a hex string func GetValAddressHex(address string) (addr Address, err error) { if len(address) == 0 { @@ -152,15 +134,6 @@ func GetValAddressBech32(address string) (addr Address, err error) { return Address(bz), nil } -// must create an Address from a bech32 string -func MustGetValAddressBech32(address string) Address { - addr, err := GetValAddressBech32(address) - if err != nil { - panic(err) - } - return addr -} - // decode a validator public key into a PubKey func GetValPubKeyBech32(pubkey string) (pk crypto.PubKey, err error) { bz, err := getFromBech32(pubkey, Bech32PrefixValPub) @@ -176,15 +149,6 @@ func GetValPubKeyBech32(pubkey string) (pk crypto.PubKey, err error) { return pk, nil } -// must decode a validator public key into a PubKey -func MustGetValPubKeyBech32(pubkey string) crypto.PubKey { - pk, err := GetValPubKeyBech32(pubkey) - if err != nil { - panic(err) - } - return pk -} - func getFromBech32(bech32str, prefix string) ([]byte, error) { if len(bech32str) == 0 { return nil, errors.New("must provide non-empty string") diff --git a/x/slashing/msg_test.go b/x/slashing/msg_test.go new file mode 100644 index 0000000000..be7797107e --- /dev/null +++ b/x/slashing/msg_test.go @@ -0,0 +1,16 @@ +package slashing + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func TestMsgUnrevokeGetSignBytes(t *testing.T) { + addr := sdk.Address("abcd") + msg := NewMsgUnrevoke(addr) + bytes := msg.GetSignBytes() + assert.Equal(t, string(bytes), `{"address":"cosmosvaladdr1v93xxeqamr0mv"}`) +} From 1e6776848552fa90d63519d50042edf7c8e07dfb Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 7 Jun 2018 17:20:35 -0700 Subject: [PATCH 198/548] ported ibc tests --- cmd/gaia/app/app_test.go | 213 --------------------------------------- tests/mock/app.go | 5 +- x/bank/app_test.go | 149 +++++++++++++++++++++++---- x/ibc/app_test.go | 79 +++++++++++++++ 4 files changed, 213 insertions(+), 233 deletions(-) create mode 100644 x/ibc/app_test.go diff --git a/cmd/gaia/app/app_test.go b/cmd/gaia/app/app_test.go index 0fe1cfe5b9..1ec24d0179 100644 --- a/cmd/gaia/app/app_test.go +++ b/cmd/gaia/app/app_test.go @@ -12,7 +12,6 @@ import ( "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/ibc" "github.com/cosmos/cosmos-sdk/x/stake" abci "github.com/tendermint/abci/types" @@ -46,43 +45,6 @@ var ( Inputs: []bank.Input{bank.NewInput(addr1, coins)}, Outputs: []bank.Output{bank.NewOutput(addr2, coins)}, } - - sendMsg2 = bank.MsgSend{ - Inputs: []bank.Input{bank.NewInput(addr1, coins)}, - Outputs: []bank.Output{ - bank.NewOutput(addr2, halfCoins), - bank.NewOutput(addr3, halfCoins), - }, - } - - sendMsg3 = bank.MsgSend{ - Inputs: []bank.Input{ - bank.NewInput(addr1, coins), - bank.NewInput(addr4, coins), - }, - Outputs: []bank.Output{ - bank.NewOutput(addr2, coins), - bank.NewOutput(addr3, coins), - }, - } - - sendMsg4 = bank.MsgSend{ - Inputs: []bank.Input{ - bank.NewInput(addr2, coins), - }, - Outputs: []bank.Output{ - bank.NewOutput(addr1, coins), - }, - } - - sendMsg5 = bank.MsgSend{ - Inputs: []bank.Input{ - bank.NewInput(addr1, manyCoins), - }, - Outputs: []bank.Output{ - bank.NewOutput(addr2, manyCoins), - }, - } ) func loggerAndDB() (log.Logger, dbm.DB) { @@ -167,181 +129,6 @@ func TestGenesis(t *testing.T) { assert.Equal(t, baseAcc, res1) } -func TestMsgSendWithAccounts(t *testing.T) { - gapp := newGaiaApp() - - // Construct some genesis bytes to reflect GaiaAccount - // Give 77 foocoin to the first key - coins, err := sdk.ParseCoins("77foocoin") - require.Nil(t, err) - baseAcc := &auth.BaseAccount{ - Address: addr1, - Coins: coins, - } - - // Construct genesis state - err = setGenesis(gapp, baseAcc) - require.Nil(t, err) - - // A checkTx context (true) - ctxCheck := gapp.BaseApp.NewContext(true, abci.Header{}) - res1 := gapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, baseAcc, res1.(*auth.BaseAccount)) - - // Run a CheckDeliver - SignCheckDeliver(t, gapp, sendMsg1, []int64{0}, true, priv1) - - // Check balances - CheckBalance(t, gapp, addr1, "67foocoin") - CheckBalance(t, gapp, addr2, "10foocoin") - - // Delivering again should cause replay error - SignCheckDeliver(t, gapp, sendMsg1, []int64{0}, false, priv1) - - // bumping the txnonce number without resigning should be an auth error - tx := genTx(sendMsg1, []int64{0}, priv1) - tx.Signatures[0].Sequence = 1 - res := gapp.Deliver(tx) - - assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), res.Code, res.Log) - - // resigning the tx with the bumped sequence should work - SignCheckDeliver(t, gapp, sendMsg1, []int64{1}, true, priv1) -} - -func TestMsgSendMultipleOut(t *testing.T) { - gapp := newGaiaApp() - - genCoins, err := sdk.ParseCoins("42foocoin") - require.Nil(t, err) - - acc1 := &auth.BaseAccount{ - Address: addr1, - Coins: genCoins, - } - - acc2 := &auth.BaseAccount{ - Address: addr2, - Coins: genCoins, - } - - err = setGenesis(gapp, acc1, acc2) - require.Nil(t, err) - - // Simulate a Block - SignCheckDeliver(t, gapp, sendMsg2, []int64{0}, true, priv1) - - // Check balances - CheckBalance(t, gapp, addr1, "32foocoin") - CheckBalance(t, gapp, addr2, "47foocoin") - CheckBalance(t, gapp, addr3, "5foocoin") -} - -func TestSengMsgMultipleInOut(t *testing.T) { - gapp := newGaiaApp() - - genCoins, err := sdk.ParseCoins("42foocoin") - require.Nil(t, err) - - acc1 := &auth.BaseAccount{ - Address: addr1, - Coins: genCoins, - } - acc2 := &auth.BaseAccount{ - Address: addr2, - Coins: genCoins, - } - acc4 := &auth.BaseAccount{ - Address: addr4, - Coins: genCoins, - } - - err = setGenesis(gapp, acc1, acc2, acc4) - assert.Nil(t, err) - - // CheckDeliver - SignCheckDeliver(t, gapp, sendMsg3, []int64{0, 0}, true, priv1, priv4) - - // Check balances - CheckBalance(t, gapp, addr1, "32foocoin") - CheckBalance(t, gapp, addr4, "32foocoin") - CheckBalance(t, gapp, addr2, "52foocoin") - CheckBalance(t, gapp, addr3, "10foocoin") -} - -func TestMsgSendDependent(t *testing.T) { - gapp := newGaiaApp() - - genCoins, err := sdk.ParseCoins("42foocoin") - require.Nil(t, err) - - acc1 := &auth.BaseAccount{ - Address: addr1, - Coins: genCoins, - } - - err = setGenesis(gapp, acc1) - require.Nil(t, err) - - // CheckDeliver - SignCheckDeliver(t, gapp, sendMsg1, []int64{0}, true, priv1) - - // Check balances - CheckBalance(t, gapp, addr1, "32foocoin") - CheckBalance(t, gapp, addr2, "10foocoin") - - // Simulate a Block - SignCheckDeliver(t, gapp, sendMsg4, []int64{0}, true, priv2) - - // Check balances - CheckBalance(t, gapp, addr1, "42foocoin") -} - -func TestIBCMsgs(t *testing.T) { - gapp := newGaiaApp() - - sourceChain := "source-chain" - destChain := "dest-chain" - - baseAcc := &auth.BaseAccount{ - Address: addr1, - Coins: coins, - } - - err := setGenesis(gapp, baseAcc) - require.Nil(t, err) - - // A checkTx context (true) - ctxCheck := gapp.BaseApp.NewContext(true, abci.Header{}) - res1 := gapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, baseAcc, res1) - - packet := ibc.IBCPacket{ - SrcAddr: addr1, - DestAddr: addr1, - Coins: coins, - SrcChain: sourceChain, - DestChain: destChain, - } - - transferMsg := ibc.IBCTransferMsg{ - IBCPacket: packet, - } - - receiveMsg := ibc.IBCReceiveMsg{ - IBCPacket: packet, - Relayer: addr1, - Sequence: 0, - } - - SignCheckDeliver(t, gapp, transferMsg, []int64{0}, true, priv1) - CheckBalance(t, gapp, addr1, "") - SignCheckDeliver(t, gapp, transferMsg, []int64{1}, false, priv1) - SignCheckDeliver(t, gapp, receiveMsg, []int64{2}, true, priv1) - CheckBalance(t, gapp, addr1, "10foocoin") - SignCheckDeliver(t, gapp, receiveMsg, []int64{3}, false, priv1) -} - func TestStakeMsgs(t *testing.T) { gapp := newGaiaApp() diff --git a/tests/mock/app.go b/tests/mock/app.go index f7b7a0a34c..6a39330055 100644 --- a/tests/mock/app.go +++ b/tests/mock/app.go @@ -39,6 +39,7 @@ func NewApp() *App { cdc := wire.NewCodec() sdk.RegisterWire(cdc) wire.RegisterCrypto(cdc) + auth.RegisterWire(cdc) // create your application object app := &App{ @@ -64,7 +65,7 @@ func NewApp() *App { } // complete the application setup after the routes have been registered -func (app App) CompleteSetup(t *testing.T, newKeys []*sdk.KVStoreKey) { +func (app *App) CompleteSetup(t *testing.T, newKeys []*sdk.KVStoreKey) { newKeys = append(newKeys, app.KeyMain) newKeys = append(newKeys, app.KeyAccount) @@ -74,7 +75,7 @@ func (app App) CompleteSetup(t *testing.T, newKeys []*sdk.KVStoreKey) { } // custom logic for initialization -func (app App) initChainer(ctx sdk.Context, _ abci.RequestInitChain) abci.ResponseInitChain { +func (app *App) initChainer(ctx sdk.Context, _ abci.RequestInitChain) abci.ResponseInitChain { // load the accounts for _, acc := range app.GenesisAccounts { diff --git a/x/bank/app_test.go b/x/bank/app_test.go index 3dcf37c220..ecbb661455 100644 --- a/x/bank/app_test.go +++ b/x/bank/app_test.go @@ -18,8 +18,6 @@ import ( var ( chainID = "" // TODO - accName = "foobart" - priv1 = crypto.GenPrivKeyEd25519() addr1 = priv1.PubKey().Address() priv2 = crypto.GenPrivKeyEd25519() @@ -30,7 +28,8 @@ var ( coins = sdk.Coins{{"foocoin", 10}} halfCoins = sdk.Coins{{"foocoin", 5}} manyCoins = sdk.Coins{{"foocoin", 1}, {"barcoin", 1}} - fee = auth.StdFee{ + + freeFee = auth.StdFee{ // no fees for a buncha gas sdk.Coins{{"foocoin", 0}}, 100000, } @@ -39,11 +38,47 @@ var ( Inputs: []Input{NewInput(addr1, coins)}, Outputs: []Output{NewOutput(addr2, coins)}, } + + sendMsg2 = MsgSend{ + Inputs: []Input{NewInput(addr1, coins)}, + Outputs: []Output{ + NewOutput(addr2, halfCoins), + NewOutput(addr3, halfCoins), + }, + } + + sendMsg3 = MsgSend{ + Inputs: []Input{ + NewInput(addr1, coins), + NewInput(addr4, coins), + }, + Outputs: []Output{ + NewOutput(addr2, coins), + NewOutput(addr3, coins), + }, + } + + sendMsg4 = MsgSend{ + Inputs: []Input{ + NewInput(addr2, coins), + }, + Outputs: []Output{ + NewOutput(addr1, coins), + }, + } + + sendMsg5 = MsgSend{ + Inputs: []Input{ + NewInput(addr1, manyCoins), + }, + Outputs: []Output{ + NewOutput(addr2, manyCoins), + }, + } ) -func TestMsgSendWithAccounts(t *testing.T) { - - // initialize the mock application +// initialize the mock application for this module +func getMockApp(t *testing.T) *mock.App { mapp := mock.NewApp() RegisterWire(mapp.Cdc) @@ -51,34 +86,33 @@ func TestMsgSendWithAccounts(t *testing.T) { mapp.Router().AddRoute("bank", NewHandler(coinKeeper)) mapp.CompleteSetup(t, []*sdk.KVStoreKey{}) + return mapp +} + +func TestMsgSendWithAccounts(t *testing.T) { + mapp := getMockApp(t) // Add an account at genesis - coins, err := sdk.ParseCoins("77foocoin") - require.Nil(t, err) - //acc := auth.NewAccountWithAddress(addr1) - //acc.SetCoins(coins) - //accs := []auth.Account{acc} - - baseAcc := &auth.BaseAccount{ + acc := &auth.BaseAccount{ Address: addr1, - Coins: coins, + Coins: sdk.Coins{{"foocoin", 67}}, } - baseAccs := []auth.Account{baseAcc} + accs := []auth.Account{acc} // Construct genesis state - mock.SetGenesis(mapp, baseAccs) + mock.SetGenesis(mapp, accs) // A checkTx context (true) ctxCheck := mapp.BaseApp.NewContext(true, abci.Header{}) res1 := mapp.AccountMapper.GetAccount(ctxCheck, addr1) require.NotNil(t, res1) - assert.Equal(t, baseAcc, res1.(*auth.BaseAccount)) + assert.Equal(t, acc, res1.(*auth.BaseAccount)) // Run a CheckDeliver mock.SignCheckDeliver(t, mapp, sendMsg1, []int64{0}, true, priv1) // Check balances - mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 67}}) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 57}}) mock.CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 10}}) // Delivering again should cause replay error @@ -94,3 +128,82 @@ func TestMsgSendWithAccounts(t *testing.T) { // resigning the tx with the bumped sequence should work mock.SignCheckDeliver(t, mapp, sendMsg1, []int64{1}, true, priv1) } + +func TestMsgSendMultipleOut(t *testing.T) { + mapp := getMockApp(t) + + acc1 := &auth.BaseAccount{ + Address: addr1, + Coins: sdk.Coins{{"foocoin", 42}}, + } + + acc2 := &auth.BaseAccount{ + Address: addr2, + Coins: sdk.Coins{{"foocoin", 42}}, + } + accs := []auth.Account{acc1, acc2} + + mock.SetGenesis(mapp, accs) + + // Simulate a Block + mock.SignCheckDeliver(t, mapp, sendMsg2, []int64{0}, true, priv1) + + // Check balances + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 32}}) + mock.CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 47}}) + mock.CheckBalance(t, mapp, addr3, sdk.Coins{{"foocoin", 5}}) +} + +func TestSengMsgMultipleInOut(t *testing.T) { + mapp := getMockApp(t) + + acc1 := &auth.BaseAccount{ + Address: addr1, + Coins: sdk.Coins{{"foocoin", 42}}, + } + acc2 := &auth.BaseAccount{ + Address: addr2, + Coins: sdk.Coins{{"foocoin", 42}}, + } + acc4 := &auth.BaseAccount{ + Address: addr4, + Coins: sdk.Coins{{"foocoin", 42}}, + } + accs := []auth.Account{acc1, acc2, acc4} + + mock.SetGenesis(mapp, accs) + + // CheckDeliver + mock.SignCheckDeliver(t, mapp, sendMsg3, []int64{0, 0}, true, priv1, priv4) + + // Check balances + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 32}}) + mock.CheckBalance(t, mapp, addr4, sdk.Coins{{"foocoin", 32}}) + mock.CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 52}}) + mock.CheckBalance(t, mapp, addr3, sdk.Coins{{"foocoin", 10}}) +} + +func TestMsgSendDependent(t *testing.T) { + mapp := getMockApp(t) + + acc1 := &auth.BaseAccount{ + Address: addr1, + Coins: sdk.Coins{{"foocoin", 42}}, + } + accs := []auth.Account{acc1} + + mock.SetGenesis(mapp, accs) + + // CheckDeliver + mock.SignCheckDeliver(t, mapp, sendMsg1, []int64{0}, true, priv1) + + // Check balances + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 32}}) + mock.CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 10}}) + + // Simulate a Block + mock.SignCheckDeliver(t, mapp, sendMsg4, []int64{0}, true, priv2) + + // Check balances + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 42}}) +} diff --git a/x/ibc/app_test.go b/x/ibc/app_test.go new file mode 100644 index 0000000000..0124e417e5 --- /dev/null +++ b/x/ibc/app_test.go @@ -0,0 +1,79 @@ +package ibc + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/cosmos/cosmos-sdk/tests/mock" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/bank" + + abci "github.com/tendermint/abci/types" + crypto "github.com/tendermint/go-crypto" +) + +// initialize the mock application for this module +func getMockApp(t *testing.T) *mock.App { + mapp := mock.NewApp() + + RegisterWire(mapp.Cdc) + keyIBC := sdk.NewKVStoreKey("ibc") + ibcMapper := NewMapper(mapp.Cdc, keyIBC, mapp.RegisterCodespace(DefaultCodespace)) + coinKeeper := bank.NewKeeper(mapp.AccountMapper) + mapp.Router().AddRoute("ibc", NewHandler(ibcMapper, coinKeeper)) + + mapp.CompleteSetup(t, []*sdk.KVStoreKey{keyIBC}) + return mapp +} + +func TestIBCMsgs(t *testing.T) { + gapp := getMockApp(t) + + sourceChain := "source-chain" + destChain := "dest-chain" + + priv1 := crypto.GenPrivKeyEd25519() + addr1 := priv1.PubKey().Address() + coins := sdk.Coins{{"foocoin", 10}} + var emptyCoins sdk.Coins + + acc := &auth.BaseAccount{ + Address: addr1, + Coins: coins, + } + accs := []auth.Account{acc} + + mock.SetGenesis(gapp, accs) + + // A checkTx context (true) + ctxCheck := gapp.BaseApp.NewContext(true, abci.Header{}) + res1 := gapp.AccountMapper.GetAccount(ctxCheck, addr1) + assert.Equal(t, acc, res1) + + packet := IBCPacket{ + SrcAddr: addr1, + DestAddr: addr1, + Coins: coins, + SrcChain: sourceChain, + DestChain: destChain, + } + + transferMsg := IBCTransferMsg{ + IBCPacket: packet, + } + + receiveMsg := IBCReceiveMsg{ + IBCPacket: packet, + Relayer: addr1, + Sequence: 0, + } + + mock.SignCheckDeliver(t, gapp, transferMsg, []int64{0}, true, priv1) + mock.CheckBalance(t, gapp, addr1, emptyCoins) + mock.SignCheckDeliver(t, gapp, transferMsg, []int64{1}, false, priv1) + mock.SignCheckDeliver(t, gapp, receiveMsg, []int64{2}, true, priv1) + mock.CheckBalance(t, gapp, addr1, coins) + mock.SignCheckDeliver(t, gapp, receiveMsg, []int64{3}, false, priv1) +} From 946f952de1cf3d7fee2bbae5c0180814671ec799 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 8 Jun 2018 03:28:40 +0200 Subject: [PATCH 199/548] Linter fixes --- x/ibc/types.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/x/ibc/types.go b/x/ibc/types.go index 76239102a0..4924aec4b7 100644 --- a/x/ibc/types.go +++ b/x/ibc/types.go @@ -41,6 +41,7 @@ func NewIBCPacket(srcAddr sdk.Address, destAddr sdk.Address, coins sdk.Coins, } } +//nolint func (p IBCPacket) GetSignBytes() []byte { b, err := msgCdc.MarshalJSON(struct { SrcAddr string @@ -62,11 +63,11 @@ func (p IBCPacket) GetSignBytes() []byte { } // validator the ibc packey -func (ibcp IBCPacket) ValidateBasic() sdk.Error { - if ibcp.SrcChain == ibcp.DestChain { +func (p IBCPacket) ValidateBasic() sdk.Error { + if p.SrcChain == p.DestChain { return ErrIdenticalChains(DefaultCodespace).Trace("") } - if !ibcp.Coins.IsValid() { + if !p.Coins.IsValid() { return sdk.ErrInvalidCoins("") } return nil From abab7c2e42eb694147879b755faae8534274f94a Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 7 Jun 2018 20:55:14 -0700 Subject: [PATCH 200/548] modules test within mock application --- cmd/gaia/app/app_test.go | 212 +--------- examples/basecoin/app/app_test.go | 473 +---------------------- examples/democoin/app/app_test.go | 368 +----------------- examples/democoin/x/cool/app_test.go | 105 +++++ examples/democoin/x/pow/app_test.go | 83 ++++ {tests => x/auth}/mock/app.go | 4 +- x/auth/mock/auth_app_test.go | 111 ++++++ {tests => x/auth}/mock/simulate_block.go | 5 +- x/bank/app_test.go | 18 +- x/ibc/app_test.go | 22 +- x/stake/app_test.go | 152 ++++++++ 11 files changed, 497 insertions(+), 1056 deletions(-) create mode 100644 examples/democoin/x/cool/app_test.go create mode 100644 examples/democoin/x/pow/app_test.go rename {tests => x/auth}/mock/app.go (95%) create mode 100644 x/auth/mock/auth_app_test.go rename {tests => x/auth}/mock/simulate_block.go (89%) create mode 100644 x/stake/app_test.go diff --git a/cmd/gaia/app/app_test.go b/cmd/gaia/app/app_test.go index 1ec24d0179..0f6bab134b 100644 --- a/cmd/gaia/app/app_test.go +++ b/cmd/gaia/app/app_test.go @@ -1,17 +1,16 @@ package app import ( - "fmt" "os" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/cosmos/cosmos-sdk/x/auth/mock" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/bank" "github.com/cosmos/cosmos-sdk/x/stake" abci "github.com/tendermint/abci/types" @@ -20,31 +19,13 @@ import ( "github.com/tendermint/tmlibs/log" ) -// Construct some global addrs and txs for tests. var ( chainID = "" // TODO - accName = "foobart" - - priv1 = crypto.GenPrivKeyEd25519() - addr1 = priv1.PubKey().Address() - priv2 = crypto.GenPrivKeyEd25519() - addr2 = priv2.PubKey().Address() - addr3 = crypto.GenPrivKeyEd25519().PubKey().Address() - priv4 = crypto.GenPrivKeyEd25519() - addr4 = priv4.PubKey().Address() - coins = sdk.Coins{{"foocoin", 10}} - halfCoins = sdk.Coins{{"foocoin", 5}} - manyCoins = sdk.Coins{{"foocoin", 1}, {"barcoin", 1}} - fee = auth.StdFee{ - sdk.Coins{{"foocoin", 0}}, - 100000, - } - - sendMsg1 = bank.MsgSend{ - Inputs: []bank.Input{bank.NewInput(addr1, coins)}, - Outputs: []bank.Output{bank.NewOutput(addr2, coins)}, - } + priv1 = crypto.GenPrivKeyEd25519() + addr1 = priv1.PubKey().Address() + priv2 = crypto.GenPrivKeyEd25519() + addr2 = priv2.PubKey().Address() ) func loggerAndDB() (log.Logger, dbm.DB) { @@ -53,11 +34,6 @@ func loggerAndDB() (log.Logger, dbm.DB) { return logger, db } -func newGaiaApp() *GaiaApp { - logger, db := loggerAndDB() - return NewGaiaApp(logger, db) -} - func setGenesis(gapp *GaiaApp, accs ...*auth.BaseAccount) error { genaccs := make([]GenesisAccount, len(accs)) for i, acc := range accs { @@ -84,22 +60,6 @@ func setGenesis(gapp *GaiaApp, accs ...*auth.BaseAccount) error { //_______________________________________________________________________ -func TestMsgs(t *testing.T) { - gapp := newGaiaApp() - require.Nil(t, setGenesis(gapp)) - - msgs := []struct { - msg sdk.Msg - }{ - {sendMsg1}, - } - - for i, m := range msgs { - // Run a CheckDeliver - SignCheckDeliver(t, gapp, m.msg, []int64{int64(i)}, false, priv1) - } -} - func TestGenesis(t *testing.T) { logger, dbs := loggerAndDB() gapp := NewGaiaApp(logger, dbs) @@ -129,96 +89,9 @@ func TestGenesis(t *testing.T) { assert.Equal(t, baseAcc, res1) } -func TestStakeMsgs(t *testing.T) { - gapp := newGaiaApp() - - genCoins, err := sdk.ParseCoins("42steak") - require.Nil(t, err) - bondCoin, err := sdk.ParseCoin("10steak") - require.Nil(t, err) - - acc1 := &auth.BaseAccount{ - Address: addr1, - Coins: genCoins, - } - acc2 := &auth.BaseAccount{ - Address: addr2, - Coins: genCoins, - } - - err = setGenesis(gapp, acc1, acc2) - require.Nil(t, err) - - // A checkTx context (true) - ctxCheck := gapp.BaseApp.NewContext(true, abci.Header{}) - res1 := gapp.accountMapper.GetAccount(ctxCheck, addr1) - res2 := gapp.accountMapper.GetAccount(ctxCheck, addr2) - require.Equal(t, acc1, res1) - require.Equal(t, acc2, res2) - - // Create Validator - - description := stake.NewDescription("foo_moniker", "", "", "") - createValidatorMsg := stake.NewMsgCreateValidator( - addr1, priv1.PubKey(), bondCoin, description, - ) - SignCheckDeliver(t, gapp, createValidatorMsg, []int64{0}, true, priv1) - - ctxDeliver := gapp.BaseApp.NewContext(false, abci.Header{}) - res1 = gapp.accountMapper.GetAccount(ctxDeliver, addr1) - require.Equal(t, genCoins.Minus(sdk.Coins{bondCoin}), res1.GetCoins()) - validator, found := gapp.stakeKeeper.GetValidator(ctxDeliver, addr1) - require.True(t, found) - require.Equal(t, addr1, validator.Owner) - require.Equal(t, sdk.Bonded, validator.Status()) - require.True(sdk.RatEq(t, sdk.NewRat(10), validator.PoolShares.Bonded())) - - // check the bond that should have been created as well - bond, found := gapp.stakeKeeper.GetDelegation(ctxDeliver, addr1, addr1) - require.True(sdk.RatEq(t, sdk.NewRat(10), bond.Shares)) - - // Edit Validator - - description = stake.NewDescription("bar_moniker", "", "", "") - editValidatorMsg := stake.NewMsgEditValidator( - addr1, description, - ) - SignDeliver(t, gapp, editValidatorMsg, []int64{1}, true, priv1) - - validator, found = gapp.stakeKeeper.GetValidator(ctxDeliver, addr1) - require.True(t, found) - require.Equal(t, description, validator.Description) - - // Delegate - - delegateMsg := stake.NewMsgDelegate( - addr2, addr1, bondCoin, - ) - SignDeliver(t, gapp, delegateMsg, []int64{0}, true, priv2) - - res2 = gapp.accountMapper.GetAccount(ctxDeliver, addr2) - require.Equal(t, genCoins.Minus(sdk.Coins{bondCoin}), res2.GetCoins()) - bond, found = gapp.stakeKeeper.GetDelegation(ctxDeliver, addr2, addr1) - require.True(t, found) - require.Equal(t, addr2, bond.DelegatorAddr) - require.Equal(t, addr1, bond.ValidatorAddr) - require.True(sdk.RatEq(t, sdk.NewRat(10), bond.Shares)) - - // Unbond - - unbondMsg := stake.NewMsgUnbond( - addr2, addr1, "MAX", - ) - SignDeliver(t, gapp, unbondMsg, []int64{1}, true, priv2) - - res2 = gapp.accountMapper.GetAccount(ctxDeliver, addr2) - require.Equal(t, genCoins, res2.GetCoins()) - _, found = gapp.stakeKeeper.GetDelegation(ctxDeliver, addr2, addr1) - require.False(t, found) -} - func TestExportValidators(t *testing.T) { - gapp := newGaiaApp() + logger, dbs := loggerAndDB() + gapp := NewGaiaApp(logger, dbs) genCoins, err := sdk.ParseCoins("42steak") require.Nil(t, err) @@ -242,7 +115,7 @@ func TestExportValidators(t *testing.T) { createValidatorMsg := stake.NewMsgCreateValidator( addr1, priv1.PubKey(), bondCoin, description, ) - SignCheckDeliver(t, gapp, createValidatorMsg, []int64{0}, true, priv1) + mock.SignCheckDeliver(t, gapp.BaseApp, createValidatorMsg, []int64{0}, true, priv1) gapp.Commit() // Export validator set @@ -252,72 +125,3 @@ func TestExportValidators(t *testing.T) { require.Equal(t, priv1.PubKey(), validators[0].PubKey) require.Equal(t, int64(10), validators[0].Power) } - -//____________________________________________________________________________________ - -func CheckBalance(t *testing.T, gapp *GaiaApp, addr sdk.Address, balExpected string) { - ctxDeliver := gapp.BaseApp.NewContext(false, abci.Header{}) - res2 := gapp.accountMapper.GetAccount(ctxDeliver, addr) - assert.Equal(t, balExpected, fmt.Sprintf("%v", res2.GetCoins())) -} - -func genTx(msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) auth.StdTx { - sigs := make([]auth.StdSignature, len(priv)) - for i, p := range priv { - sigs[i] = auth.StdSignature{ - PubKey: p.PubKey(), - Signature: p.Sign(auth.StdSignBytes(chainID, seq, fee, msg)), - Sequence: seq[i], - } - } - - return auth.NewStdTx(msg, fee, sigs) - -} - -func SignCheckDeliver(t *testing.T, gapp *GaiaApp, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { - - // Sign the tx - tx := genTx(msg, seq, priv...) - - // Run a Check - res := gapp.Check(tx) - if expPass { - require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - } else { - require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) - } - - // Simulate a Block - gapp.BeginBlock(abci.RequestBeginBlock{}) - res = gapp.Deliver(tx) - if expPass { - require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - } else { - require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) - } - gapp.EndBlock(abci.RequestEndBlock{}) - - // XXX fix code or add explaination as to why using commit breaks a bunch of these tests - //gapp.Commit() -} - -// XXX the only reason we are using Sign Deliver here is because the tests -// break on check tx the second time you use SignCheckDeliver in a test because -// the checktx state has not been updated likely because commit is not being -// called! -func SignDeliver(t *testing.T, gapp *GaiaApp, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { - - // Sign the tx - tx := genTx(msg, seq, priv...) - - // Simulate a Block - gapp.BeginBlock(abci.RequestBeginBlock{}) - res := gapp.Deliver(tx) - if expPass { - require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - } else { - require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) - } - gapp.EndBlock(abci.RequestEndBlock{}) -} diff --git a/examples/basecoin/app/app_test.go b/examples/basecoin/app/app_test.go index 3027a84707..a1f7d53702 100644 --- a/examples/basecoin/app/app_test.go +++ b/examples/basecoin/app/app_test.go @@ -1,26 +1,23 @@ package app import ( - "encoding/json" - "fmt" "os" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/cosmos/cosmos-sdk/examples/basecoin/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/wire" - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/ibc" - "github.com/cosmos/cosmos-sdk/x/stake" - abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" + + "github.com/cosmos/cosmos-sdk/examples/basecoin/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/stake" ) // Construct some global addrs and txs for tests. @@ -28,66 +25,9 @@ var ( chainID = "" // TODO accName = "foobart" - - priv1 = crypto.GenPrivKeyEd25519() - addr1 = priv1.PubKey().Address() - priv2 = crypto.GenPrivKeyEd25519() - addr2 = priv2.PubKey().Address() - addr3 = crypto.GenPrivKeyEd25519().PubKey().Address() - priv4 = crypto.GenPrivKeyEd25519() - addr4 = priv4.PubKey().Address() - coins = sdk.Coins{{"foocoin", 10}} - halfCoins = sdk.Coins{{"foocoin", 5}} - manyCoins = sdk.Coins{{"foocoin", 1}, {"barcoin", 1}} - fee = auth.StdFee{ - sdk.Coins{{"foocoin", 0}}, - 100000, - } - - sendMsg1 = bank.MsgSend{ - Inputs: []bank.Input{bank.NewInput(addr1, coins)}, - Outputs: []bank.Output{bank.NewOutput(addr2, coins)}, - } - - sendMsg2 = bank.MsgSend{ - Inputs: []bank.Input{bank.NewInput(addr1, coins)}, - Outputs: []bank.Output{ - bank.NewOutput(addr2, halfCoins), - bank.NewOutput(addr3, halfCoins), - }, - } - - sendMsg3 = bank.MsgSend{ - Inputs: []bank.Input{ - bank.NewInput(addr1, coins), - bank.NewInput(addr4, coins), - }, - Outputs: []bank.Output{ - bank.NewOutput(addr2, coins), - bank.NewOutput(addr3, coins), - }, - } - - sendMsg4 = bank.MsgSend{ - Inputs: []bank.Input{ - bank.NewInput(addr2, coins), - }, - Outputs: []bank.Output{ - bank.NewOutput(addr1, coins), - }, - } - - sendMsg5 = bank.MsgSend{ - Inputs: []bank.Input{ - bank.NewInput(addr1, manyCoins), - }, - Outputs: []bank.Output{ - bank.NewOutput(addr2, manyCoins), - }, - } ) -func setGenesis(bapp *BasecoinApp, accs ...auth.BaseAccount) error { +func setGenesis(t *testing.T, bapp *BasecoinApp, accs ...auth.BaseAccount) error { genaccs := make([]*types.GenesisAccount, len(accs)) for i, acc := range accs { genaccs[i] = types.NewGenesisAccount(&types.AppAccount{acc, accName}) @@ -99,9 +39,7 @@ func setGenesis(bapp *BasecoinApp, accs ...auth.BaseAccount) error { } stateBytes, err := wire.MarshalJSONIndent(bapp.cdc, genesisState) - if err != nil { - return err - } + require.NoError(t, err) // Initialize the chain vals := []abci.Validator{} @@ -111,94 +49,24 @@ func setGenesis(bapp *BasecoinApp, accs ...auth.BaseAccount) error { return nil } -func loggerAndDB() (log.Logger, dbm.DB) { - logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") - db := dbm.NewMemDB() - return logger, db -} - -func newBasecoinApp() *BasecoinApp { - logger, db := loggerAndDB() - return NewBasecoinApp(logger, db) -} - //_______________________________________________________________________ -func TestMsgs(t *testing.T) { - bapp := newBasecoinApp() - require.Nil(t, setGenesis(bapp)) - - msgs := []struct { - msg sdk.Msg - }{ - {sendMsg1}, - } - - for i, m := range msgs { - // Run a CheckDeliver - SignCheckDeliver(t, bapp, m.msg, []int64{int64(i)}, false, priv1) - } -} - -func TestSortGenesis(t *testing.T) { - logger, db := loggerAndDB() - bapp := NewBasecoinApp(logger, db) - - // Note the order: the coins are unsorted! - coinDenom1, coinDenom2 := "foocoin", "barcoin" - - genState := fmt.Sprintf(`{ - "accounts": [{ - "address": "%s", - "coins": [ - { - "denom": "%s", - "amount": 10 - }, - { - "denom": "%s", - "amount": 20 - } - ] - }] - }`, addr1.String(), coinDenom1, coinDenom2) - - // Initialize the chain - vals := []abci.Validator{} - bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: []byte(genState)}) - bapp.Commit() - - // Unsorted coins means invalid - err := sendMsg5.ValidateBasic() - require.Equal(t, sdk.CodeInvalidCoins, err.Code(), err.ABCILog()) - - // Sort coins, should be valid - sendMsg5.Inputs[0].Coins.Sort() - sendMsg5.Outputs[0].Coins.Sort() - err = sendMsg5.ValidateBasic() - require.Nil(t, err) - - // Ensure we can send - SignCheckDeliver(t, bapp, sendMsg5, []int64{0}, true, priv1) -} - func TestGenesis(t *testing.T) { - logger, db := loggerAndDB() + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") + db := dbm.NewMemDB() bapp := NewBasecoinApp(logger, db) // Construct some genesis bytes to reflect basecoin/types/AppAccount pk := crypto.GenPrivKeyEd25519().PubKey() addr := pk.Address() - coins, err := sdk.ParseCoins("77foocoin,99barcoin") - require.Nil(t, err) + coins := sdk.Coins{{"foocoin", 77}, {"barcoin", 99}} baseAcc := auth.BaseAccount{ Address: addr, Coins: coins, } acc := &types.AppAccount{baseAcc, "foobart"} - err = setGenesis(bapp, baseAcc) - require.Nil(t, err) + setGenesis(t, bapp, baseAcc) // A checkTx context ctx := bapp.BaseApp.NewContext(true, abci.Header{}) @@ -211,318 +79,3 @@ func TestGenesis(t *testing.T) { res1 = bapp.accountMapper.GetAccount(ctx, baseAcc.Address) assert.Equal(t, acc, res1) } - -func TestMsgChangePubKey(t *testing.T) { - - bapp := newBasecoinApp() - - // Construct some genesis bytes to reflect basecoin/types/AppAccount - // Give 77 foocoin to the first key - coins, err := sdk.ParseCoins("77foocoin") - require.Nil(t, err) - baseAcc := auth.BaseAccount{ - Address: addr1, - Coins: coins, - } - - // Construct genesis state - err = setGenesis(bapp, baseAcc) - require.Nil(t, err) - - // A checkTx context (true) - ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) - res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, baseAcc, res1.(*types.AppAccount).BaseAccount) - - // Run a CheckDeliver - SignCheckDeliver(t, bapp, sendMsg1, []int64{0}, true, priv1) - - // Check balances - CheckBalance(t, bapp, addr1, "67foocoin") - CheckBalance(t, bapp, addr2, "10foocoin") - - changePubKeyMsg := auth.MsgChangeKey{ - Address: addr1, - NewPubKey: priv2.PubKey(), - } - - ctxDeliver := bapp.BaseApp.NewContext(false, abci.Header{}) - acc := bapp.accountMapper.GetAccount(ctxDeliver, addr1) - - // send a MsgChangePubKey - SignCheckDeliver(t, bapp, changePubKeyMsg, []int64{1}, true, priv1) - acc = bapp.accountMapper.GetAccount(ctxDeliver, addr1) - - assert.True(t, priv2.PubKey().Equals(acc.GetPubKey())) - - // signing a SendMsg with the old privKey should be an auth error - tx := genTx(sendMsg1, []int64{2}, priv1) - res := bapp.Deliver(tx) - assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), res.Code, res.Log) - - // resigning the tx with the new correct priv key should work - SignCheckDeliver(t, bapp, sendMsg1, []int64{2}, true, priv2) - - // Check balances - CheckBalance(t, bapp, addr1, "57foocoin") - CheckBalance(t, bapp, addr2, "20foocoin") -} - -func TestMsgSendWithAccounts(t *testing.T) { - bapp := newBasecoinApp() - - // Construct some genesis bytes to reflect basecoin/types/AppAccount - // Give 77 foocoin to the first key - coins, err := sdk.ParseCoins("77foocoin") - require.Nil(t, err) - baseAcc := auth.BaseAccount{ - Address: addr1, - Coins: coins, - } - - // Construct genesis state - err = setGenesis(bapp, baseAcc) - require.Nil(t, err) - - // A checkTx context (true) - ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) - res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, baseAcc, res1.(*types.AppAccount).BaseAccount) - - // Run a CheckDeliver - SignCheckDeliver(t, bapp, sendMsg1, []int64{0}, true, priv1) - - // Check balances - CheckBalance(t, bapp, addr1, "67foocoin") - CheckBalance(t, bapp, addr2, "10foocoin") - - // Delivering again should cause replay error - SignCheckDeliver(t, bapp, sendMsg1, []int64{0}, false, priv1) - - // bumping the txnonce number without resigning should be an auth error - tx := genTx(sendMsg1, []int64{0}, priv1) - tx.Signatures[0].Sequence = 1 - res := bapp.Deliver(tx) - - assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), res.Code, res.Log) - - // resigning the tx with the bumped sequence should work - SignCheckDeliver(t, bapp, sendMsg1, []int64{1}, true, priv1) -} - -func TestMsgSendMultipleOut(t *testing.T) { - bapp := newBasecoinApp() - - genCoins, err := sdk.ParseCoins("42foocoin") - require.Nil(t, err) - - acc1 := auth.BaseAccount{ - Address: addr1, - Coins: genCoins, - } - - acc2 := auth.BaseAccount{ - Address: addr2, - Coins: genCoins, - } - - // Construct genesis state - err = setGenesis(bapp, acc1, acc2) - require.Nil(t, err) - - // Simulate a Block - SignCheckDeliver(t, bapp, sendMsg2, []int64{0}, true, priv1) - - // Check balances - CheckBalance(t, bapp, addr1, "32foocoin") - CheckBalance(t, bapp, addr2, "47foocoin") - CheckBalance(t, bapp, addr3, "5foocoin") -} - -func TestSengMsgMultipleInOut(t *testing.T) { - bapp := newBasecoinApp() - - genCoins, err := sdk.ParseCoins("42foocoin") - require.Nil(t, err) - - acc1 := auth.BaseAccount{ - Address: addr1, - Coins: genCoins, - } - - acc2 := auth.BaseAccount{ - Address: addr2, - Coins: genCoins, - } - - acc4 := auth.BaseAccount{ - Address: addr4, - Coins: genCoins, - } - - err = setGenesis(bapp, acc1, acc2, acc4) - assert.Nil(t, err) - - // CheckDeliver - SignCheckDeliver(t, bapp, sendMsg3, []int64{0, 0}, true, priv1, priv4) - - // Check balances - CheckBalance(t, bapp, addr1, "32foocoin") - CheckBalance(t, bapp, addr4, "32foocoin") - CheckBalance(t, bapp, addr2, "52foocoin") - CheckBalance(t, bapp, addr3, "10foocoin") -} - -func TestMsgSendDependent(t *testing.T) { - bapp := newBasecoinApp() - - genCoins, err := sdk.ParseCoins("42foocoin") - require.Nil(t, err) - - acc1 := auth.BaseAccount{ - Address: addr1, - Coins: genCoins, - } - - // Construct genesis state - err = setGenesis(bapp, acc1) - require.Nil(t, err) - - err = setGenesis(bapp, acc1) - assert.Nil(t, err) - - // CheckDeliver - SignCheckDeliver(t, bapp, sendMsg1, []int64{0}, true, priv1) - - // Check balances - CheckBalance(t, bapp, addr1, "32foocoin") - CheckBalance(t, bapp, addr2, "10foocoin") - - // Simulate a Block - SignCheckDeliver(t, bapp, sendMsg4, []int64{0}, true, priv2) - - // Check balances - CheckBalance(t, bapp, addr1, "42foocoin") -} - -func TestMsgQuiz(t *testing.T) { - bapp := newBasecoinApp() - - // Construct genesis state - // Construct some genesis bytes to reflect basecoin/types/AppAccount - baseAcc := auth.BaseAccount{ - Address: addr1, - Coins: nil, - } - acc1 := &types.AppAccount{baseAcc, "foobart"} - - // Construct genesis state - genesisState := map[string]interface{}{ - "accounts": []*types.GenesisAccount{ - types.NewGenesisAccount(acc1), - }, - } - stateBytes, err := json.MarshalIndent(genesisState, "", "\t") - require.Nil(t, err) - - // Initialize the chain (nil) - vals := []abci.Validator{} - bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) - bapp.Commit() - - // A checkTx context (true) - ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) - res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, acc1, res1) - -} - -func TestIBCMsgs(t *testing.T) { - bapp := newBasecoinApp() - - sourceChain := "source-chain" - destChain := "dest-chain" - - baseAcc := auth.BaseAccount{ - Address: addr1, - Coins: coins, - } - acc1 := &types.AppAccount{baseAcc, "foobart"} - - err := setGenesis(bapp, baseAcc) - assert.Nil(t, err) - - // A checkTx context (true) - ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) - res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, acc1, res1) - - packet := ibc.IBCPacket{ - SrcAddr: addr1, - DestAddr: addr1, - Coins: coins, - SrcChain: sourceChain, - DestChain: destChain, - } - - transferMsg := ibc.IBCTransferMsg{ - IBCPacket: packet, - } - - receiveMsg := ibc.IBCReceiveMsg{ - IBCPacket: packet, - Relayer: addr1, - Sequence: 0, - } - - SignCheckDeliver(t, bapp, transferMsg, []int64{0}, true, priv1) - CheckBalance(t, bapp, addr1, "") - SignCheckDeliver(t, bapp, transferMsg, []int64{1}, false, priv1) - SignCheckDeliver(t, bapp, receiveMsg, []int64{2}, true, priv1) - CheckBalance(t, bapp, addr1, "10foocoin") - SignCheckDeliver(t, bapp, receiveMsg, []int64{3}, false, priv1) -} - -func genTx(msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) auth.StdTx { - sigs := make([]auth.StdSignature, len(priv)) - for i, p := range priv { - sigs[i] = auth.StdSignature{ - PubKey: p.PubKey(), - Signature: p.Sign(auth.StdSignBytes(chainID, seq, fee, msg)), - Sequence: seq[i], - } - } - - return auth.NewStdTx(msg, fee, sigs) - -} - -func SignCheckDeliver(t *testing.T, bapp *BasecoinApp, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { - - // Sign the tx - tx := genTx(msg, seq, priv...) - // Run a Check - res := bapp.Check(tx) - if expPass { - require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - } else { - require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) - } - - // Simulate a Block - bapp.BeginBlock(abci.RequestBeginBlock{}) - res = bapp.Deliver(tx) - if expPass { - require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - } else { - require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) - } - bapp.EndBlock(abci.RequestEndBlock{}) - //bapp.Commit() -} - -func CheckBalance(t *testing.T, bapp *BasecoinApp, addr sdk.Address, balExpected string) { - ctxDeliver := bapp.BaseApp.NewContext(false, abci.Header{}) - res2 := bapp.accountMapper.GetAccount(ctxDeliver, addr) - assert.Equal(t, balExpected, fmt.Sprintf("%v", res2.GetCoins())) -} diff --git a/examples/democoin/app/app_test.go b/examples/democoin/app/app_test.go index ba041bcff1..01264399ae 100644 --- a/examples/democoin/app/app_test.go +++ b/examples/democoin/app/app_test.go @@ -2,7 +2,6 @@ package app import ( "encoding/json" - "fmt" "os" "testing" @@ -10,12 +9,8 @@ import ( "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/examples/democoin/types" - "github.com/cosmos/cosmos-sdk/examples/democoin/x/cool" - "github.com/cosmos/cosmos-sdk/examples/democoin/x/pow" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/ibc" abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" @@ -23,101 +18,9 @@ import ( "github.com/tendermint/tmlibs/log" ) -// Construct some global addrs and txs for tests. -var ( - chainID = "" // TODO - - priv1 = crypto.GenPrivKeyEd25519() - addr1 = priv1.PubKey().Address() - addr2 = crypto.GenPrivKeyEd25519().PubKey().Address() - coins = sdk.Coins{{"foocoin", 10}} - fee = auth.StdFee{ - sdk.Coins{{"foocoin", 0}}, - 1000000, - } - - sendMsg = bank.MsgSend{ - Inputs: []bank.Input{bank.NewInput(addr1, coins)}, - Outputs: []bank.Output{bank.NewOutput(addr2, coins)}, - } - - quizMsg1 = cool.MsgQuiz{ - Sender: addr1, - CoolAnswer: "icecold", - } - - quizMsg2 = cool.MsgQuiz{ - Sender: addr1, - CoolAnswer: "badvibesonly", - } - - setTrendMsg1 = cool.MsgSetTrend{ - Sender: addr1, - Cool: "icecold", - } - - setTrendMsg2 = cool.MsgSetTrend{ - Sender: addr1, - Cool: "badvibesonly", - } - - setTrendMsg3 = cool.MsgSetTrend{ - Sender: addr1, - Cool: "warmandkind", - } -) - -func loggerAndDB() (log.Logger, dbm.DB) { +func TestGenesis(t *testing.T) { logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") db := dbm.NewMemDB() - return logger, db -} - -func newDemocoinApp() *DemocoinApp { - logger, db := loggerAndDB() - return NewDemocoinApp(logger, db) -} - -//_______________________________________________________________________ - -func TestMsgs(t *testing.T) { - bapp := newDemocoinApp() - - msgs := []struct { - msg sdk.Msg - }{ - {sendMsg}, - {quizMsg1}, - {setTrendMsg1}, - } - - sequences := []int64{0} - for i, m := range msgs { - sig := priv1.Sign(auth.StdSignBytes(chainID, sequences, fee, m.msg)) - tx := auth.NewStdTx(m.msg, fee, []auth.StdSignature{{ - PubKey: priv1.PubKey(), - Signature: sig, - }}) - - // just marshal/unmarshal! - txBytes, err := bapp.cdc.MarshalBinary(tx) - require.NoError(t, err, "i: %v", i) - - // Run a Check - cres := bapp.CheckTx(txBytes) - assert.Equal(t, sdk.CodeUnknownAddress, - sdk.CodeType(cres.Code), "i: %v, log: %v", i, cres.Log) - - // Simulate a Block - bapp.BeginBlock(abci.RequestBeginBlock{}) - dres := bapp.DeliverTx(txBytes) - assert.Equal(t, sdk.CodeUnknownAddress, - sdk.CodeType(dres.Code), "i: %v, log: %v", i, dres.Log) - } -} - -func TestGenesis(t *testing.T) { - logger, db := loggerAndDB() bapp := NewDemocoinApp(logger, db) // Construct some genesis bytes to reflect democoin/types/AppAccount @@ -156,272 +59,3 @@ func TestGenesis(t *testing.T) { res1 = bapp.accountMapper.GetAccount(ctx, baseAcc.Address) assert.Equal(t, acc, res1) } - -func TestMsgSendWithAccounts(t *testing.T) { - bapp := newDemocoinApp() - - // Construct some genesis bytes to reflect democoin/types/AppAccount - // Give 77 foocoin to the first key - coins, err := sdk.ParseCoins("77foocoin") - require.Nil(t, err) - baseAcc := auth.BaseAccount{ - Address: addr1, - Coins: coins, - } - acc1 := &types.AppAccount{baseAcc, "foobart"} - - // Construct genesis state - genesisState := map[string]interface{}{ - "accounts": []*types.GenesisAccount{ - types.NewGenesisAccount(acc1), - }, - "cool": map[string]string{ - "trend": "ice-cold", - }, - } - stateBytes, err := json.MarshalIndent(genesisState, "", "\t") - require.Nil(t, err) - - // Initialize the chain - vals := []abci.Validator{} - bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) - bapp.Commit() - - // A checkTx context (true) - ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) - res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, acc1, res1) - - // Sign the tx - sequences := []int64{0} - sig := priv1.Sign(auth.StdSignBytes(chainID, sequences, fee, sendMsg)) - tx := auth.NewStdTx(sendMsg, fee, []auth.StdSignature{{ - PubKey: priv1.PubKey(), - Signature: sig, - }}) - - // Run a Check - res := bapp.Check(tx) - assert.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - - // Simulate a Block - bapp.BeginBlock(abci.RequestBeginBlock{}) - res = bapp.Deliver(tx) - assert.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - - // Check balances - ctxDeliver := bapp.BaseApp.NewContext(false, abci.Header{}) - res2 := bapp.accountMapper.GetAccount(ctxDeliver, addr1) - res3 := bapp.accountMapper.GetAccount(ctxDeliver, addr2) - assert.Equal(t, fmt.Sprintf("%v", res2.GetCoins()), "67foocoin") - assert.Equal(t, fmt.Sprintf("%v", res3.GetCoins()), "10foocoin") - - // Delivering again should cause replay error - res = bapp.Deliver(tx) - assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeInvalidSequence), sdk.ABCICodeType(res.Code), res.Log) - - // bumping the txnonce number without resigning should be an auth error - tx.Signatures[0].Sequence = 1 - res = bapp.Deliver(tx) - assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), sdk.ABCICodeType(res.Code), res.Log) - - // resigning the tx with the bumped sequence should work - sequences = []int64{1} - sig = priv1.Sign(auth.StdSignBytes(chainID, sequences, fee, tx.Msg)) - tx.Signatures[0].Signature = sig - res = bapp.Deliver(tx) - assert.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) -} - -func TestMsgMine(t *testing.T) { - bapp := newDemocoinApp() - - // Construct genesis state - // Construct some genesis bytes to reflect democoin/types/AppAccount - baseAcc := auth.BaseAccount{ - Address: addr1, - Coins: nil, - } - acc1 := &types.AppAccount{baseAcc, "foobart"} - - // Construct genesis state - genesisState := map[string]interface{}{ - "accounts": []*types.GenesisAccount{ - types.NewGenesisAccount(acc1), - }, - "cool": map[string]string{ - "trend": "ice-cold", - }, - "pow": map[string]uint64{ - "difficulty": 1, - "count": 0, - }, - } - stateBytes, err := json.MarshalIndent(genesisState, "", "\t") - require.Nil(t, err) - - // Initialize the chain (nil) - vals := []abci.Validator{} - bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) - bapp.Commit() - - // A checkTx context (true) - ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) - res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, acc1, res1) - - // Mine and check for reward - mineMsg1 := pow.GenerateMsgMine(addr1, 1, 2) - SignCheckDeliver(t, bapp, mineMsg1, 0, true) - CheckBalance(t, bapp, "1pow") - // Mine again and check for reward - mineMsg2 := pow.GenerateMsgMine(addr1, 2, 3) - SignCheckDeliver(t, bapp, mineMsg2, 1, true) - CheckBalance(t, bapp, "2pow") - // Mine again - should be invalid - SignCheckDeliver(t, bapp, mineMsg2, 1, false) - CheckBalance(t, bapp, "2pow") - -} - -func TestMsgQuiz(t *testing.T) { - bapp := newDemocoinApp() - - // Construct genesis state - // Construct some genesis bytes to reflect democoin/types/AppAccount - baseAcc := auth.BaseAccount{ - Address: addr1, - Coins: nil, - } - acc1 := &types.AppAccount{baseAcc, "foobart"} - - // Construct genesis state - genesisState := map[string]interface{}{ - "accounts": []*types.GenesisAccount{ - types.NewGenesisAccount(acc1), - }, - "cool": map[string]string{ - "trend": "ice-cold", - }, - } - stateBytes, err := json.MarshalIndent(genesisState, "", "\t") - require.Nil(t, err) - - // Initialize the chain (nil) - vals := []abci.Validator{} - bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) - bapp.Commit() - - // A checkTx context (true) - ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) - res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, acc1, res1) - - // Set the trend, submit a really cool quiz and check for reward - SignCheckDeliver(t, bapp, setTrendMsg1, 0, true) - SignCheckDeliver(t, bapp, quizMsg1, 1, true) - CheckBalance(t, bapp, "69icecold") - SignCheckDeliver(t, bapp, quizMsg2, 2, false) // result without reward - CheckBalance(t, bapp, "69icecold") - SignCheckDeliver(t, bapp, quizMsg1, 3, true) - CheckBalance(t, bapp, "138icecold") - SignCheckDeliver(t, bapp, setTrendMsg2, 4, true) // reset the trend - SignCheckDeliver(t, bapp, quizMsg1, 5, false) // the same answer will nolonger do! - CheckBalance(t, bapp, "138icecold") - SignCheckDeliver(t, bapp, quizMsg2, 6, true) // earlier answer now relavent again - CheckBalance(t, bapp, "69badvibesonly,138icecold") - SignCheckDeliver(t, bapp, setTrendMsg3, 7, false) // expect to fail to set the trend to something which is not cool - -} - -func TestHandler(t *testing.T) { - bapp := newDemocoinApp() - - sourceChain := "source-chain" - destChain := "dest-chain" - - vals := []abci.Validator{} - baseAcc := auth.BaseAccount{ - Address: addr1, - Coins: coins, - } - acc1 := &types.AppAccount{baseAcc, "foobart"} - genesisState := map[string]interface{}{ - "accounts": []*types.GenesisAccount{ - types.NewGenesisAccount(acc1), - }, - "cool": map[string]string{ - "trend": "ice-cold", - }, - } - stateBytes, err := json.MarshalIndent(genesisState, "", "\t") - require.Nil(t, err) - bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) - bapp.Commit() - - // A checkTx context (true) - ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) - res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, acc1, res1) - - packet := ibc.IBCPacket{ - SrcAddr: addr1, - DestAddr: addr1, - Coins: coins, - SrcChain: sourceChain, - DestChain: destChain, - } - - transferMsg := ibc.IBCTransferMsg{ - IBCPacket: packet, - } - - receiveMsg := ibc.IBCReceiveMsg{ - IBCPacket: packet, - Relayer: addr1, - Sequence: 0, - } - - SignCheckDeliver(t, bapp, transferMsg, 0, true) - CheckBalance(t, bapp, "") - SignCheckDeliver(t, bapp, transferMsg, 1, false) - SignCheckDeliver(t, bapp, receiveMsg, 2, true) - CheckBalance(t, bapp, "10foocoin") - SignCheckDeliver(t, bapp, receiveMsg, 3, false) -} - -// TODO describe the use of this function -func SignCheckDeliver(t *testing.T, bapp *DemocoinApp, msg sdk.Msg, seq int64, expPass bool) { - - // Sign the tx - tx := auth.NewStdTx(msg, fee, []auth.StdSignature{{ - PubKey: priv1.PubKey(), - Signature: priv1.Sign(auth.StdSignBytes(chainID, []int64{seq}, fee, msg)), - Sequence: seq, - }}) - - // Run a Check - res := bapp.Check(tx) - if expPass { - require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - } else { - require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) - } - - // Simulate a Block - bapp.BeginBlock(abci.RequestBeginBlock{}) - res = bapp.Deliver(tx) - if expPass { - require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - } else { - require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) - } - bapp.EndBlock(abci.RequestEndBlock{}) - //bapp.Commit() -} - -func CheckBalance(t *testing.T, bapp *DemocoinApp, balExpected string) { - ctxDeliver := bapp.BaseApp.NewContext(false, abci.Header{}) - res2 := bapp.accountMapper.GetAccount(ctxDeliver, addr1) - assert.Equal(t, balExpected, fmt.Sprintf("%v", res2.GetCoins())) -} diff --git a/examples/democoin/x/cool/app_test.go b/examples/democoin/x/cool/app_test.go new file mode 100644 index 0000000000..d41c8ea824 --- /dev/null +++ b/examples/democoin/x/cool/app_test.go @@ -0,0 +1,105 @@ +package cool + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + abci "github.com/tendermint/abci/types" + crypto "github.com/tendermint/go-crypto" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/auth/mock" + bank "github.com/cosmos/cosmos-sdk/x/bank" +) + +var ( + priv1 = crypto.GenPrivKeyEd25519() + addr1 = priv1.PubKey().Address() + + quizMsg1 = MsgQuiz{ + Sender: addr1, + CoolAnswer: "icecold", + } + + quizMsg2 = MsgQuiz{ + Sender: addr1, + CoolAnswer: "badvibesonly", + } + + setTrendMsg1 = MsgSetTrend{ + Sender: addr1, + Cool: "icecold", + } + + setTrendMsg2 = MsgSetTrend{ + Sender: addr1, + Cool: "badvibesonly", + } + + setTrendMsg3 = MsgSetTrend{ + Sender: addr1, + Cool: "warmandkind", + } +) + +// initialize the mock application for this module +func getMockApp(t *testing.T) *mock.App { + mapp := mock.NewApp() + + RegisterWire(mapp.Cdc) + keyCool := sdk.NewKVStoreKey("cool") + coinKeeper := bank.NewKeeper(mapp.AccountMapper) + keeper := NewKeeper(keyCool, coinKeeper, mapp.RegisterCodespace(DefaultCodespace)) + mapp.Router().AddRoute("cool", NewHandler(keeper)) + + mapp.SetInitChainer(getInitChainer(mapp, keeper, "ice-cold")) + + mapp.CompleteSetup(t, []*sdk.KVStoreKey{keyCool}) + return mapp +} + +// overwrite the mock init chainer +func getInitChainer(mapp *mock.App, keeper Keeper, newTrend string) sdk.InitChainer { + return func(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { + mapp.InitChainer(ctx, req) + keeper.setTrend(ctx, newTrend) + + return abci.ResponseInitChain{} + } +} + +func TestMsgQuiz(t *testing.T) { + mapp := getMockApp(t) + + // Construct genesis state + acc1 := &auth.BaseAccount{ + Address: addr1, + Coins: nil, + } + accs := []auth.Account{acc1} + + // Initialize the chain (nil) + mock.SetGenesis(mapp, accs) + + // A checkTx context (true) + ctxCheck := mapp.BaseApp.NewContext(true, abci.Header{}) + res1 := mapp.AccountMapper.GetAccount(ctxCheck, addr1) + assert.Equal(t, acc1, res1) + + // Set the trend, submit a really cool quiz and check for reward + mock.SignCheckDeliver(t, mapp.BaseApp, setTrendMsg1, []int64{0}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg1, []int64{1}, true, priv1) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"icecold", 69}}) + mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg2, []int64{2}, false, priv1) // result without reward + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"icecold", 69}}) + mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg1, []int64{3}, true, priv1) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"icecold", 138}}) + mock.SignCheckDeliver(t, mapp.BaseApp, setTrendMsg2, []int64{4}, true, priv1) // reset the trend + mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg1, []int64{5}, false, priv1) // the same answer will nolonger do! + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"icecold", 138}}) + mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg2, []int64{6}, true, priv1) // earlier answer now relavent again + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"badvibesonly", 69}, {"icecold", 138}}) + mock.SignCheckDeliver(t, mapp.BaseApp, setTrendMsg3, []int64{7}, false, priv1) // expect to fail to set the trend to something which is not cool +} diff --git a/examples/democoin/x/pow/app_test.go b/examples/democoin/x/pow/app_test.go new file mode 100644 index 0000000000..0539df5560 --- /dev/null +++ b/examples/democoin/x/pow/app_test.go @@ -0,0 +1,83 @@ +package pow + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/auth/mock" + "github.com/cosmos/cosmos-sdk/x/bank" + + abci "github.com/tendermint/abci/types" + crypto "github.com/tendermint/go-crypto" +) + +var ( + priv1 = crypto.GenPrivKeyEd25519() + addr1 = priv1.PubKey().Address() +) + +// initialize the mock application for this module +func getMockApp(t *testing.T) *mock.App { + mapp := mock.NewApp() + + RegisterWire(mapp.Cdc) + keyPOW := sdk.NewKVStoreKey("pow") + coinKeeper := bank.NewKeeper(mapp.AccountMapper) + config := Config{"pow", 1} + keeper := NewKeeper(keyPOW, config, coinKeeper, mapp.RegisterCodespace(DefaultCodespace)) + mapp.Router().AddRoute("pow", keeper.Handler) + + mapp.SetInitChainer(getInitChainer(mapp, keeper)) + + mapp.CompleteSetup(t, []*sdk.KVStoreKey{keyPOW}) + return mapp +} + +// overwrite the mock init chainer +func getInitChainer(mapp *mock.App, keeper Keeper) sdk.InitChainer { + return func(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { + mapp.InitChainer(ctx, req) + + genesis := Genesis{ + Difficulty: 1, + Count: 0, + } + InitGenesis(ctx, keeper, genesis) + + return abci.ResponseInitChain{} + } +} + +func TestMsgMine(t *testing.T) { + mapp := getMockApp(t) + + // Construct genesis state + acc1 := &auth.BaseAccount{ + Address: addr1, + Coins: nil, + } + accs := []auth.Account{acc1} + + // Initialize the chain (nil) + mock.SetGenesis(mapp, accs) + + // A checkTx context (true) + ctxCheck := mapp.BaseApp.NewContext(true, abci.Header{}) + res1 := mapp.AccountMapper.GetAccount(ctxCheck, addr1) + assert.Equal(t, acc1, res1) + + // Mine and check for reward + mineMsg1 := GenerateMsgMine(addr1, 1, 2) + mock.SignCheckDeliver(t, mapp.BaseApp, mineMsg1, []int64{0}, true, priv1) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"pow", 1}}) + // Mine again and check for reward + mineMsg2 := GenerateMsgMine(addr1, 2, 3) + mock.SignCheckDeliver(t, mapp.BaseApp, mineMsg2, []int64{1}, true, priv1) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"pow", 2}}) + // Mine again - should be invalid + mock.SignCheckDeliver(t, mapp.BaseApp, mineMsg2, []int64{1}, false, priv1) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"pow", 2}}) +} diff --git a/tests/mock/app.go b/x/auth/mock/app.go similarity index 95% rename from tests/mock/app.go rename to x/auth/mock/app.go index 6a39330055..6ceff482bf 100644 --- a/tests/mock/app.go +++ b/x/auth/mock/app.go @@ -57,7 +57,7 @@ func NewApp() *App { ) // initialize the app, the chainers and blockers can be overwritten before calling complete setup - app.SetInitChainer(app.initChainer) + app.SetInitChainer(app.InitChainer) app.SetAnteHandler(auth.NewAnteHandler(app.AccountMapper, app.FeeCollectionKeeper)) @@ -75,7 +75,7 @@ func (app *App) CompleteSetup(t *testing.T, newKeys []*sdk.KVStoreKey) { } // custom logic for initialization -func (app *App) initChainer(ctx sdk.Context, _ abci.RequestInitChain) abci.ResponseInitChain { +func (app *App) InitChainer(ctx sdk.Context, _ abci.RequestInitChain) abci.ResponseInitChain { // load the accounts for _, acc := range app.GenesisAccounts { diff --git a/x/auth/mock/auth_app_test.go b/x/auth/mock/auth_app_test.go new file mode 100644 index 0000000000..a3ff6710ee --- /dev/null +++ b/x/auth/mock/auth_app_test.go @@ -0,0 +1,111 @@ +package mock + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/bank" + + abci "github.com/tendermint/abci/types" + crypto "github.com/tendermint/go-crypto" +) + +// test auth module messages + +var ( + priv1 = crypto.GenPrivKeyEd25519() + addr1 = priv1.PubKey().Address() + priv2 = crypto.GenPrivKeyEd25519() + addr2 = priv2.PubKey().Address() + + coins = sdk.Coins{{"foocoin", 10}} + sendMsg1 = bank.MsgSend{ + Inputs: []bank.Input{bank.NewInput(addr1, coins)}, + Outputs: []bank.Output{bank.NewOutput(addr2, coins)}, + } +) + +// initialize the mock application for this module +func getMockApp(t *testing.T) *App { + mapp := NewApp() + + coinKeeper := bank.NewKeeper(mapp.AccountMapper) + mapp.Router().AddRoute("bank", bank.NewHandler(coinKeeper)) + mapp.Router().AddRoute("auth", auth.NewHandler(mapp.AccountMapper)) + + mapp.CompleteSetup(t, []*sdk.KVStoreKey{}) + return mapp +} + +func TestMsgChangePubKey(t *testing.T) { + fmt.Println("wackydebugoutput TestMsgChangePubKey 0") + mapp := getMockApp(t) + + // Construct some genesis bytes to reflect basecoin/types/AppAccount + // Give 77 foocoin to the first key + coins := sdk.Coins{{"foocoin", 77}} + fmt.Println("wackydebugoutput TestMsgChangePubKey 1") + acc1 := &auth.BaseAccount{ + Address: addr1, + Coins: coins, + } + fmt.Println("wackydebugoutput TestMsgChangePubKey 3") + accs := []auth.Account{acc1} + fmt.Println("wackydebugoutput TestMsgChangePubKey 4") + + // Construct genesis state + SetGenesis(mapp, accs) + + // A checkTx context (true) + ctxCheck := mapp.BaseApp.NewContext(true, abci.Header{}) + fmt.Println("wackydebugoutput TestMsgChangePubKey 5") + res1 := mapp.AccountMapper.GetAccount(ctxCheck, addr1) + assert.Equal(t, acc1, res1.(*auth.BaseAccount)) + + // Run a CheckDeliver + SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, true, priv1) + fmt.Println("wackydebugoutput TestMsgChangePubKey 6") + + // Check balances + CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 67}}) + fmt.Println("wackydebugoutput TestMsgChangePubKey 7") + CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 10}}) + fmt.Println("wackydebugoutput TestMsgChangePubKey 8") + + changePubKeyMsg := auth.MsgChangeKey{ + Address: addr1, + NewPubKey: priv2.PubKey(), + } + fmt.Println("wackydebugoutput TestMsgChangePubKey 10") + + ctxDeliver := mapp.BaseApp.NewContext(false, abci.Header{}) + fmt.Println("wackydebugoutput TestMsgChangePubKey 11") + acc2 := mapp.AccountMapper.GetAccount(ctxDeliver, addr1) + + // send a MsgChangePubKey + SignCheckDeliver(t, mapp.BaseApp, changePubKeyMsg, []int64{1}, true, priv1) + fmt.Println("wackydebugoutput TestMsgChangePubKey 12") + acc2 = mapp.AccountMapper.GetAccount(ctxDeliver, addr1) + + assert.True(t, priv2.PubKey().Equals(acc2.GetPubKey())) + + // signing a SendMsg with the old privKey should be an auth error + tx := GenTx(sendMsg1, []int64{2}, priv1) + fmt.Println("wackydebugoutput TestMsgChangePubKey 13") + res := mapp.Deliver(tx) + assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), res.Code, res.Log) + + // resigning the tx with the new correct priv key should work + SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{2}, true, priv2) + fmt.Println("wackydebugoutput TestMsgChangePubKey 14") + + // Check balances + CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 57}}) + fmt.Println("wackydebugoutput TestMsgChangePubKey 15") + CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 20}}) + fmt.Println("wackydebugoutput TestMsgChangePubKey 16") +} diff --git a/tests/mock/simulate_block.go b/x/auth/mock/simulate_block.go similarity index 89% rename from tests/mock/simulate_block.go rename to x/auth/mock/simulate_block.go index fa1000af79..cf0c303a3f 100644 --- a/tests/mock/simulate_block.go +++ b/x/auth/mock/simulate_block.go @@ -3,6 +3,7 @@ package mock import ( "testing" + "github.com/cosmos/cosmos-sdk/baseapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/stretchr/testify/assert" @@ -52,7 +53,7 @@ func GenTx(msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) auth.StdTx { } // simulate a block -func SignCheckDeliver(t *testing.T, app *App, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { +func SignCheckDeliver(t *testing.T, app *baseapp.BaseApp, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { // Sign the tx tx := GenTx(msg, seq, priv...) @@ -83,7 +84,7 @@ func SignCheckDeliver(t *testing.T, app *App, msg sdk.Msg, seq []int64, expPass // break on check tx the second time you use SignCheckDeliver in a test because // the checktx state has not been updated likely because commit is not being // called! -func SignDeliver(t *testing.T, app App, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { +func SignDeliver(t *testing.T, app *baseapp.BaseApp, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { // Sign the tx tx := GenTx(msg, seq, priv...) diff --git a/x/bank/app_test.go b/x/bank/app_test.go index ecbb661455..507f9e3f89 100644 --- a/x/bank/app_test.go +++ b/x/bank/app_test.go @@ -6,9 +6,9 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/cosmos/cosmos-sdk/tests/mock" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/auth/mock" abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" @@ -16,8 +16,6 @@ import ( // test bank module in a mock application var ( - chainID = "" // TODO - priv1 = crypto.GenPrivKeyEd25519() addr1 = priv1.PubKey().Address() priv2 = crypto.GenPrivKeyEd25519() @@ -109,14 +107,14 @@ func TestMsgSendWithAccounts(t *testing.T) { assert.Equal(t, acc, res1.(*auth.BaseAccount)) // Run a CheckDeliver - mock.SignCheckDeliver(t, mapp, sendMsg1, []int64{0}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, true, priv1) // Check balances mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 57}}) mock.CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 10}}) // Delivering again should cause replay error - mock.SignCheckDeliver(t, mapp, sendMsg1, []int64{0}, false, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, false, priv1) // bumping the txnonce number without resigning should be an auth error tx := mock.GenTx(sendMsg1, []int64{0}, priv1) @@ -126,7 +124,7 @@ func TestMsgSendWithAccounts(t *testing.T) { assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), res.Code, res.Log) // resigning the tx with the bumped sequence should work - mock.SignCheckDeliver(t, mapp, sendMsg1, []int64{1}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{1}, true, priv1) } func TestMsgSendMultipleOut(t *testing.T) { @@ -146,7 +144,7 @@ func TestMsgSendMultipleOut(t *testing.T) { mock.SetGenesis(mapp, accs) // Simulate a Block - mock.SignCheckDeliver(t, mapp, sendMsg2, []int64{0}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg2, []int64{0}, true, priv1) // Check balances mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 32}}) @@ -174,7 +172,7 @@ func TestSengMsgMultipleInOut(t *testing.T) { mock.SetGenesis(mapp, accs) // CheckDeliver - mock.SignCheckDeliver(t, mapp, sendMsg3, []int64{0, 0}, true, priv1, priv4) + mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg3, []int64{0, 0}, true, priv1, priv4) // Check balances mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 32}}) @@ -195,14 +193,14 @@ func TestMsgSendDependent(t *testing.T) { mock.SetGenesis(mapp, accs) // CheckDeliver - mock.SignCheckDeliver(t, mapp, sendMsg1, []int64{0}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, true, priv1) // Check balances mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 32}}) mock.CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 10}}) // Simulate a Block - mock.SignCheckDeliver(t, mapp, sendMsg4, []int64{0}, true, priv2) + mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg4, []int64{0}, true, priv2) // Check balances mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 42}}) diff --git a/x/ibc/app_test.go b/x/ibc/app_test.go index 0124e417e5..9e4b4bf56d 100644 --- a/x/ibc/app_test.go +++ b/x/ibc/app_test.go @@ -5,7 +5,7 @@ import ( "github.com/stretchr/testify/assert" - "github.com/cosmos/cosmos-sdk/tests/mock" + "github.com/cosmos/cosmos-sdk/x/auth/mock" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" @@ -29,7 +29,7 @@ func getMockApp(t *testing.T) *mock.App { } func TestIBCMsgs(t *testing.T) { - gapp := getMockApp(t) + mapp := getMockApp(t) sourceChain := "source-chain" destChain := "dest-chain" @@ -45,11 +45,11 @@ func TestIBCMsgs(t *testing.T) { } accs := []auth.Account{acc} - mock.SetGenesis(gapp, accs) + mock.SetGenesis(mapp, accs) // A checkTx context (true) - ctxCheck := gapp.BaseApp.NewContext(true, abci.Header{}) - res1 := gapp.AccountMapper.GetAccount(ctxCheck, addr1) + ctxCheck := mapp.BaseApp.NewContext(true, abci.Header{}) + res1 := mapp.AccountMapper.GetAccount(ctxCheck, addr1) assert.Equal(t, acc, res1) packet := IBCPacket{ @@ -70,10 +70,10 @@ func TestIBCMsgs(t *testing.T) { Sequence: 0, } - mock.SignCheckDeliver(t, gapp, transferMsg, []int64{0}, true, priv1) - mock.CheckBalance(t, gapp, addr1, emptyCoins) - mock.SignCheckDeliver(t, gapp, transferMsg, []int64{1}, false, priv1) - mock.SignCheckDeliver(t, gapp, receiveMsg, []int64{2}, true, priv1) - mock.CheckBalance(t, gapp, addr1, coins) - mock.SignCheckDeliver(t, gapp, receiveMsg, []int64{3}, false, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, transferMsg, []int64{0}, true, priv1) + mock.CheckBalance(t, mapp, addr1, emptyCoins) + mock.SignCheckDeliver(t, mapp.BaseApp, transferMsg, []int64{1}, false, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, receiveMsg, []int64{2}, true, priv1) + mock.CheckBalance(t, mapp, addr1, coins) + mock.SignCheckDeliver(t, mapp.BaseApp, receiveMsg, []int64{3}, false, priv1) } diff --git a/x/stake/app_test.go b/x/stake/app_test.go new file mode 100644 index 0000000000..4e3d1f422e --- /dev/null +++ b/x/stake/app_test.go @@ -0,0 +1,152 @@ +package stake + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/auth/mock" + "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/stretchr/testify/require" + + abci "github.com/tendermint/abci/types" + crypto "github.com/tendermint/go-crypto" +) + +var ( + priv1 = crypto.GenPrivKeyEd25519() + addr1 = priv1.PubKey().Address() + priv2 = crypto.GenPrivKeyEd25519() + addr2 = priv2.PubKey().Address() + addr3 = crypto.GenPrivKeyEd25519().PubKey().Address() + priv4 = crypto.GenPrivKeyEd25519() + addr4 = priv4.PubKey().Address() + coins = sdk.Coins{{"foocoin", 10}} + fee = auth.StdFee{ + sdk.Coins{{"foocoin", 0}}, + 100000, + } +) + +// initialize the mock application for this module +func getMockApp(t *testing.T) (*mock.App, Keeper) { + mapp := mock.NewApp() + + RegisterWire(mapp.Cdc) + keyStake := sdk.NewKVStoreKey("stake") + coinKeeper := bank.NewKeeper(mapp.AccountMapper) + keeper := NewKeeper(mapp.Cdc, keyStake, coinKeeper, mapp.RegisterCodespace(DefaultCodespace)) + mapp.Router().AddRoute("stake", NewHandler(keeper)) + + mapp.SetEndBlocker(getEndBlocker(keeper)) + mapp.SetInitChainer(getInitChainer(mapp, keeper)) + + mapp.CompleteSetup(t, []*sdk.KVStoreKey{keyStake}) + return mapp, keeper +} + +// stake endblocker +func getEndBlocker(keeper Keeper) sdk.EndBlocker { + return func(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { + validatorUpdates := EndBlocker(ctx, keeper) + return abci.ResponseEndBlock{ + ValidatorUpdates: validatorUpdates, + } + } +} + +// overwrite the mock init chainer +func getInitChainer(mapp *mock.App, keeper Keeper) sdk.InitChainer { + return func(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { + mapp.InitChainer(ctx, req) + InitGenesis(ctx, keeper, DefaultGenesisState()) + + return abci.ResponseInitChain{} + } +} + +func TestStakeMsgs(t *testing.T) { + mapp, keeper := getMockApp(t) + + genCoin := sdk.Coin{"steak", 42} + bondCoin := sdk.Coin{"steak", 10} + + acc1 := &auth.BaseAccount{ + Address: addr1, + Coins: sdk.Coins{genCoin}, + } + acc2 := &auth.BaseAccount{ + Address: addr2, + Coins: sdk.Coins{genCoin}, + } + accs := []auth.Account{acc1, acc2} + + mock.SetGenesis(mapp, accs) + + // A checkTx context (true) + ctxCheck := mapp.BaseApp.NewContext(true, abci.Header{}) + res1 := mapp.AccountMapper.GetAccount(ctxCheck, addr1) + res2 := mapp.AccountMapper.GetAccount(ctxCheck, addr2) + require.Equal(t, acc1, res1) + require.Equal(t, acc2, res2) + + // Create Validator + + description := NewDescription("foo_moniker", "", "", "") + createValidatorMsg := NewMsgCreateValidator( + addr1, priv1.PubKey(), bondCoin, description, + ) + mock.SignCheckDeliver(t, mapp.BaseApp, createValidatorMsg, []int64{0}, true, priv1) + + ctxDeliver := mapp.BaseApp.NewContext(false, abci.Header{}) + res1 = mapp.AccountMapper.GetAccount(ctxDeliver, addr1) + require.Equal(t, sdk.Coins{genCoin.Minus(bondCoin)}, res1.GetCoins()) + validator, found := keeper.GetValidator(ctxDeliver, addr1) + require.True(t, found) + require.Equal(t, addr1, validator.Owner) + require.Equal(t, sdk.Bonded, validator.Status()) + require.True(sdk.RatEq(t, sdk.NewRat(10), validator.PoolShares.Bonded())) + + // check the bond that should have been created as well + bond, found := keeper.GetDelegation(ctxDeliver, addr1, addr1) + require.True(sdk.RatEq(t, sdk.NewRat(10), bond.Shares)) + + // Edit Validator + + description = NewDescription("bar_moniker", "", "", "") + editValidatorMsg := NewMsgEditValidator( + addr1, description, + ) + mock.SignDeliver(t, mapp.BaseApp, editValidatorMsg, []int64{1}, true, priv1) + + validator, found = keeper.GetValidator(ctxDeliver, addr1) + require.True(t, found) + require.Equal(t, description, validator.Description) + + // Delegate + + delegateMsg := NewMsgDelegate( + addr2, addr1, bondCoin, + ) + mock.SignDeliver(t, mapp.BaseApp, delegateMsg, []int64{0}, true, priv2) + + res2 = mapp.AccountMapper.GetAccount(ctxDeliver, addr2) + require.Equal(t, sdk.Coins{genCoin.Minus(bondCoin)}, res2.GetCoins()) + bond, found = keeper.GetDelegation(ctxDeliver, addr2, addr1) + require.True(t, found) + require.Equal(t, addr2, bond.DelegatorAddr) + require.Equal(t, addr1, bond.ValidatorAddr) + require.True(sdk.RatEq(t, sdk.NewRat(10), bond.Shares)) + + // Unbond + + unbondMsg := NewMsgUnbond( + addr2, addr1, "MAX", + ) + mock.SignDeliver(t, mapp.BaseApp, unbondMsg, []int64{1}, true, priv2) + + res2 = mapp.AccountMapper.GetAccount(ctxDeliver, addr2) + require.Equal(t, sdk.Coins{genCoin}, res2.GetCoins()) + _, found = keeper.GetDelegation(ctxDeliver, addr2, addr1) + require.False(t, found) +} From 40f5928898d4c8d019d92f09f73d6b41aa2c1e2c Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 7 Jun 2018 20:59:35 -0700 Subject: [PATCH 201/548] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d65416915..f8157594ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ FEATURES IMPROVEMENTS * export command now writes current validator set for Tendermint +* [tests] Application module tests now use a mock application FIXES * [lcd] Switch to bech32 for addresses on all human readable inputs and outputs From b5d847288d8c0faa5504a0cfa116f7bd230f39b0 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 7 Jun 2018 21:33:06 -0700 Subject: [PATCH 202/548] move original mock into server --- CHANGELOG.md | 1 - cmd/gaia/app/app_test.go | 425 ++++++++++++++++++++++++- examples/basecoin/app/app_test.go | 475 +++++++++++++++++++++++++++- examples/democoin/app/app_test.go | 368 ++++++++++++++++++++- server/init_test.go | 2 +- {mock => server/mock}/app.go | 0 {mock => server/mock}/app_test.go | 0 {mock => server/mock}/helpers.go | 0 {mock => server/mock}/store.go | 0 {mock => server/mock}/store_test.go | 0 {mock => server/mock}/tx.go | 0 server/start_test.go | 2 +- x/auth/mock/app.go | 2 +- 13 files changed, 1248 insertions(+), 27 deletions(-) rename {mock => server/mock}/app.go (100%) rename {mock => server/mock}/app_test.go (100%) rename {mock => server/mock}/helpers.go (100%) rename {mock => server/mock}/store.go (100%) rename {mock => server/mock}/store_test.go (100%) rename {mock => server/mock}/tx.go (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8157594ae..6d65416915 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,6 @@ FEATURES IMPROVEMENTS * export command now writes current validator set for Tendermint -* [tests] Application module tests now use a mock application FIXES * [lcd] Switch to bech32 for addresses on all human readable inputs and outputs diff --git a/cmd/gaia/app/app_test.go b/cmd/gaia/app/app_test.go index 0f6bab134b..0fe1cfe5b9 100644 --- a/cmd/gaia/app/app_test.go +++ b/cmd/gaia/app/app_test.go @@ -1,16 +1,18 @@ package app import ( + "fmt" "os" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/cosmos/cosmos-sdk/x/auth/mock" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/cosmos/cosmos-sdk/x/ibc" "github.com/cosmos/cosmos-sdk/x/stake" abci "github.com/tendermint/abci/types" @@ -19,13 +21,68 @@ import ( "github.com/tendermint/tmlibs/log" ) +// Construct some global addrs and txs for tests. var ( chainID = "" // TODO - priv1 = crypto.GenPrivKeyEd25519() - addr1 = priv1.PubKey().Address() - priv2 = crypto.GenPrivKeyEd25519() - addr2 = priv2.PubKey().Address() + accName = "foobart" + + priv1 = crypto.GenPrivKeyEd25519() + addr1 = priv1.PubKey().Address() + priv2 = crypto.GenPrivKeyEd25519() + addr2 = priv2.PubKey().Address() + addr3 = crypto.GenPrivKeyEd25519().PubKey().Address() + priv4 = crypto.GenPrivKeyEd25519() + addr4 = priv4.PubKey().Address() + coins = sdk.Coins{{"foocoin", 10}} + halfCoins = sdk.Coins{{"foocoin", 5}} + manyCoins = sdk.Coins{{"foocoin", 1}, {"barcoin", 1}} + fee = auth.StdFee{ + sdk.Coins{{"foocoin", 0}}, + 100000, + } + + sendMsg1 = bank.MsgSend{ + Inputs: []bank.Input{bank.NewInput(addr1, coins)}, + Outputs: []bank.Output{bank.NewOutput(addr2, coins)}, + } + + sendMsg2 = bank.MsgSend{ + Inputs: []bank.Input{bank.NewInput(addr1, coins)}, + Outputs: []bank.Output{ + bank.NewOutput(addr2, halfCoins), + bank.NewOutput(addr3, halfCoins), + }, + } + + sendMsg3 = bank.MsgSend{ + Inputs: []bank.Input{ + bank.NewInput(addr1, coins), + bank.NewInput(addr4, coins), + }, + Outputs: []bank.Output{ + bank.NewOutput(addr2, coins), + bank.NewOutput(addr3, coins), + }, + } + + sendMsg4 = bank.MsgSend{ + Inputs: []bank.Input{ + bank.NewInput(addr2, coins), + }, + Outputs: []bank.Output{ + bank.NewOutput(addr1, coins), + }, + } + + sendMsg5 = bank.MsgSend{ + Inputs: []bank.Input{ + bank.NewInput(addr1, manyCoins), + }, + Outputs: []bank.Output{ + bank.NewOutput(addr2, manyCoins), + }, + } ) func loggerAndDB() (log.Logger, dbm.DB) { @@ -34,6 +91,11 @@ func loggerAndDB() (log.Logger, dbm.DB) { return logger, db } +func newGaiaApp() *GaiaApp { + logger, db := loggerAndDB() + return NewGaiaApp(logger, db) +} + func setGenesis(gapp *GaiaApp, accs ...*auth.BaseAccount) error { genaccs := make([]GenesisAccount, len(accs)) for i, acc := range accs { @@ -60,6 +122,22 @@ func setGenesis(gapp *GaiaApp, accs ...*auth.BaseAccount) error { //_______________________________________________________________________ +func TestMsgs(t *testing.T) { + gapp := newGaiaApp() + require.Nil(t, setGenesis(gapp)) + + msgs := []struct { + msg sdk.Msg + }{ + {sendMsg1}, + } + + for i, m := range msgs { + // Run a CheckDeliver + SignCheckDeliver(t, gapp, m.msg, []int64{int64(i)}, false, priv1) + } +} + func TestGenesis(t *testing.T) { logger, dbs := loggerAndDB() gapp := NewGaiaApp(logger, dbs) @@ -89,9 +167,271 @@ func TestGenesis(t *testing.T) { assert.Equal(t, baseAcc, res1) } +func TestMsgSendWithAccounts(t *testing.T) { + gapp := newGaiaApp() + + // Construct some genesis bytes to reflect GaiaAccount + // Give 77 foocoin to the first key + coins, err := sdk.ParseCoins("77foocoin") + require.Nil(t, err) + baseAcc := &auth.BaseAccount{ + Address: addr1, + Coins: coins, + } + + // Construct genesis state + err = setGenesis(gapp, baseAcc) + require.Nil(t, err) + + // A checkTx context (true) + ctxCheck := gapp.BaseApp.NewContext(true, abci.Header{}) + res1 := gapp.accountMapper.GetAccount(ctxCheck, addr1) + assert.Equal(t, baseAcc, res1.(*auth.BaseAccount)) + + // Run a CheckDeliver + SignCheckDeliver(t, gapp, sendMsg1, []int64{0}, true, priv1) + + // Check balances + CheckBalance(t, gapp, addr1, "67foocoin") + CheckBalance(t, gapp, addr2, "10foocoin") + + // Delivering again should cause replay error + SignCheckDeliver(t, gapp, sendMsg1, []int64{0}, false, priv1) + + // bumping the txnonce number without resigning should be an auth error + tx := genTx(sendMsg1, []int64{0}, priv1) + tx.Signatures[0].Sequence = 1 + res := gapp.Deliver(tx) + + assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), res.Code, res.Log) + + // resigning the tx with the bumped sequence should work + SignCheckDeliver(t, gapp, sendMsg1, []int64{1}, true, priv1) +} + +func TestMsgSendMultipleOut(t *testing.T) { + gapp := newGaiaApp() + + genCoins, err := sdk.ParseCoins("42foocoin") + require.Nil(t, err) + + acc1 := &auth.BaseAccount{ + Address: addr1, + Coins: genCoins, + } + + acc2 := &auth.BaseAccount{ + Address: addr2, + Coins: genCoins, + } + + err = setGenesis(gapp, acc1, acc2) + require.Nil(t, err) + + // Simulate a Block + SignCheckDeliver(t, gapp, sendMsg2, []int64{0}, true, priv1) + + // Check balances + CheckBalance(t, gapp, addr1, "32foocoin") + CheckBalance(t, gapp, addr2, "47foocoin") + CheckBalance(t, gapp, addr3, "5foocoin") +} + +func TestSengMsgMultipleInOut(t *testing.T) { + gapp := newGaiaApp() + + genCoins, err := sdk.ParseCoins("42foocoin") + require.Nil(t, err) + + acc1 := &auth.BaseAccount{ + Address: addr1, + Coins: genCoins, + } + acc2 := &auth.BaseAccount{ + Address: addr2, + Coins: genCoins, + } + acc4 := &auth.BaseAccount{ + Address: addr4, + Coins: genCoins, + } + + err = setGenesis(gapp, acc1, acc2, acc4) + assert.Nil(t, err) + + // CheckDeliver + SignCheckDeliver(t, gapp, sendMsg3, []int64{0, 0}, true, priv1, priv4) + + // Check balances + CheckBalance(t, gapp, addr1, "32foocoin") + CheckBalance(t, gapp, addr4, "32foocoin") + CheckBalance(t, gapp, addr2, "52foocoin") + CheckBalance(t, gapp, addr3, "10foocoin") +} + +func TestMsgSendDependent(t *testing.T) { + gapp := newGaiaApp() + + genCoins, err := sdk.ParseCoins("42foocoin") + require.Nil(t, err) + + acc1 := &auth.BaseAccount{ + Address: addr1, + Coins: genCoins, + } + + err = setGenesis(gapp, acc1) + require.Nil(t, err) + + // CheckDeliver + SignCheckDeliver(t, gapp, sendMsg1, []int64{0}, true, priv1) + + // Check balances + CheckBalance(t, gapp, addr1, "32foocoin") + CheckBalance(t, gapp, addr2, "10foocoin") + + // Simulate a Block + SignCheckDeliver(t, gapp, sendMsg4, []int64{0}, true, priv2) + + // Check balances + CheckBalance(t, gapp, addr1, "42foocoin") +} + +func TestIBCMsgs(t *testing.T) { + gapp := newGaiaApp() + + sourceChain := "source-chain" + destChain := "dest-chain" + + baseAcc := &auth.BaseAccount{ + Address: addr1, + Coins: coins, + } + + err := setGenesis(gapp, baseAcc) + require.Nil(t, err) + + // A checkTx context (true) + ctxCheck := gapp.BaseApp.NewContext(true, abci.Header{}) + res1 := gapp.accountMapper.GetAccount(ctxCheck, addr1) + assert.Equal(t, baseAcc, res1) + + packet := ibc.IBCPacket{ + SrcAddr: addr1, + DestAddr: addr1, + Coins: coins, + SrcChain: sourceChain, + DestChain: destChain, + } + + transferMsg := ibc.IBCTransferMsg{ + IBCPacket: packet, + } + + receiveMsg := ibc.IBCReceiveMsg{ + IBCPacket: packet, + Relayer: addr1, + Sequence: 0, + } + + SignCheckDeliver(t, gapp, transferMsg, []int64{0}, true, priv1) + CheckBalance(t, gapp, addr1, "") + SignCheckDeliver(t, gapp, transferMsg, []int64{1}, false, priv1) + SignCheckDeliver(t, gapp, receiveMsg, []int64{2}, true, priv1) + CheckBalance(t, gapp, addr1, "10foocoin") + SignCheckDeliver(t, gapp, receiveMsg, []int64{3}, false, priv1) +} + +func TestStakeMsgs(t *testing.T) { + gapp := newGaiaApp() + + genCoins, err := sdk.ParseCoins("42steak") + require.Nil(t, err) + bondCoin, err := sdk.ParseCoin("10steak") + require.Nil(t, err) + + acc1 := &auth.BaseAccount{ + Address: addr1, + Coins: genCoins, + } + acc2 := &auth.BaseAccount{ + Address: addr2, + Coins: genCoins, + } + + err = setGenesis(gapp, acc1, acc2) + require.Nil(t, err) + + // A checkTx context (true) + ctxCheck := gapp.BaseApp.NewContext(true, abci.Header{}) + res1 := gapp.accountMapper.GetAccount(ctxCheck, addr1) + res2 := gapp.accountMapper.GetAccount(ctxCheck, addr2) + require.Equal(t, acc1, res1) + require.Equal(t, acc2, res2) + + // Create Validator + + description := stake.NewDescription("foo_moniker", "", "", "") + createValidatorMsg := stake.NewMsgCreateValidator( + addr1, priv1.PubKey(), bondCoin, description, + ) + SignCheckDeliver(t, gapp, createValidatorMsg, []int64{0}, true, priv1) + + ctxDeliver := gapp.BaseApp.NewContext(false, abci.Header{}) + res1 = gapp.accountMapper.GetAccount(ctxDeliver, addr1) + require.Equal(t, genCoins.Minus(sdk.Coins{bondCoin}), res1.GetCoins()) + validator, found := gapp.stakeKeeper.GetValidator(ctxDeliver, addr1) + require.True(t, found) + require.Equal(t, addr1, validator.Owner) + require.Equal(t, sdk.Bonded, validator.Status()) + require.True(sdk.RatEq(t, sdk.NewRat(10), validator.PoolShares.Bonded())) + + // check the bond that should have been created as well + bond, found := gapp.stakeKeeper.GetDelegation(ctxDeliver, addr1, addr1) + require.True(sdk.RatEq(t, sdk.NewRat(10), bond.Shares)) + + // Edit Validator + + description = stake.NewDescription("bar_moniker", "", "", "") + editValidatorMsg := stake.NewMsgEditValidator( + addr1, description, + ) + SignDeliver(t, gapp, editValidatorMsg, []int64{1}, true, priv1) + + validator, found = gapp.stakeKeeper.GetValidator(ctxDeliver, addr1) + require.True(t, found) + require.Equal(t, description, validator.Description) + + // Delegate + + delegateMsg := stake.NewMsgDelegate( + addr2, addr1, bondCoin, + ) + SignDeliver(t, gapp, delegateMsg, []int64{0}, true, priv2) + + res2 = gapp.accountMapper.GetAccount(ctxDeliver, addr2) + require.Equal(t, genCoins.Minus(sdk.Coins{bondCoin}), res2.GetCoins()) + bond, found = gapp.stakeKeeper.GetDelegation(ctxDeliver, addr2, addr1) + require.True(t, found) + require.Equal(t, addr2, bond.DelegatorAddr) + require.Equal(t, addr1, bond.ValidatorAddr) + require.True(sdk.RatEq(t, sdk.NewRat(10), bond.Shares)) + + // Unbond + + unbondMsg := stake.NewMsgUnbond( + addr2, addr1, "MAX", + ) + SignDeliver(t, gapp, unbondMsg, []int64{1}, true, priv2) + + res2 = gapp.accountMapper.GetAccount(ctxDeliver, addr2) + require.Equal(t, genCoins, res2.GetCoins()) + _, found = gapp.stakeKeeper.GetDelegation(ctxDeliver, addr2, addr1) + require.False(t, found) +} + func TestExportValidators(t *testing.T) { - logger, dbs := loggerAndDB() - gapp := NewGaiaApp(logger, dbs) + gapp := newGaiaApp() genCoins, err := sdk.ParseCoins("42steak") require.Nil(t, err) @@ -115,7 +455,7 @@ func TestExportValidators(t *testing.T) { createValidatorMsg := stake.NewMsgCreateValidator( addr1, priv1.PubKey(), bondCoin, description, ) - mock.SignCheckDeliver(t, gapp.BaseApp, createValidatorMsg, []int64{0}, true, priv1) + SignCheckDeliver(t, gapp, createValidatorMsg, []int64{0}, true, priv1) gapp.Commit() // Export validator set @@ -125,3 +465,72 @@ func TestExportValidators(t *testing.T) { require.Equal(t, priv1.PubKey(), validators[0].PubKey) require.Equal(t, int64(10), validators[0].Power) } + +//____________________________________________________________________________________ + +func CheckBalance(t *testing.T, gapp *GaiaApp, addr sdk.Address, balExpected string) { + ctxDeliver := gapp.BaseApp.NewContext(false, abci.Header{}) + res2 := gapp.accountMapper.GetAccount(ctxDeliver, addr) + assert.Equal(t, balExpected, fmt.Sprintf("%v", res2.GetCoins())) +} + +func genTx(msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) auth.StdTx { + sigs := make([]auth.StdSignature, len(priv)) + for i, p := range priv { + sigs[i] = auth.StdSignature{ + PubKey: p.PubKey(), + Signature: p.Sign(auth.StdSignBytes(chainID, seq, fee, msg)), + Sequence: seq[i], + } + } + + return auth.NewStdTx(msg, fee, sigs) + +} + +func SignCheckDeliver(t *testing.T, gapp *GaiaApp, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { + + // Sign the tx + tx := genTx(msg, seq, priv...) + + // Run a Check + res := gapp.Check(tx) + if expPass { + require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) + } else { + require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) + } + + // Simulate a Block + gapp.BeginBlock(abci.RequestBeginBlock{}) + res = gapp.Deliver(tx) + if expPass { + require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) + } else { + require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) + } + gapp.EndBlock(abci.RequestEndBlock{}) + + // XXX fix code or add explaination as to why using commit breaks a bunch of these tests + //gapp.Commit() +} + +// XXX the only reason we are using Sign Deliver here is because the tests +// break on check tx the second time you use SignCheckDeliver in a test because +// the checktx state has not been updated likely because commit is not being +// called! +func SignDeliver(t *testing.T, gapp *GaiaApp, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { + + // Sign the tx + tx := genTx(msg, seq, priv...) + + // Simulate a Block + gapp.BeginBlock(abci.RequestBeginBlock{}) + res := gapp.Deliver(tx) + if expPass { + require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) + } else { + require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) + } + gapp.EndBlock(abci.RequestEndBlock{}) +} diff --git a/examples/basecoin/app/app_test.go b/examples/basecoin/app/app_test.go index a1f7d53702..3027a84707 100644 --- a/examples/basecoin/app/app_test.go +++ b/examples/basecoin/app/app_test.go @@ -1,23 +1,26 @@ package app import ( + "encoding/json" + "fmt" "os" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/cosmos/cosmos-sdk/examples/basecoin/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/cosmos/cosmos-sdk/x/ibc" + "github.com/cosmos/cosmos-sdk/x/stake" + abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" - - "github.com/cosmos/cosmos-sdk/examples/basecoin/types" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/wire" - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/stake" ) // Construct some global addrs and txs for tests. @@ -25,9 +28,66 @@ var ( chainID = "" // TODO accName = "foobart" + + priv1 = crypto.GenPrivKeyEd25519() + addr1 = priv1.PubKey().Address() + priv2 = crypto.GenPrivKeyEd25519() + addr2 = priv2.PubKey().Address() + addr3 = crypto.GenPrivKeyEd25519().PubKey().Address() + priv4 = crypto.GenPrivKeyEd25519() + addr4 = priv4.PubKey().Address() + coins = sdk.Coins{{"foocoin", 10}} + halfCoins = sdk.Coins{{"foocoin", 5}} + manyCoins = sdk.Coins{{"foocoin", 1}, {"barcoin", 1}} + fee = auth.StdFee{ + sdk.Coins{{"foocoin", 0}}, + 100000, + } + + sendMsg1 = bank.MsgSend{ + Inputs: []bank.Input{bank.NewInput(addr1, coins)}, + Outputs: []bank.Output{bank.NewOutput(addr2, coins)}, + } + + sendMsg2 = bank.MsgSend{ + Inputs: []bank.Input{bank.NewInput(addr1, coins)}, + Outputs: []bank.Output{ + bank.NewOutput(addr2, halfCoins), + bank.NewOutput(addr3, halfCoins), + }, + } + + sendMsg3 = bank.MsgSend{ + Inputs: []bank.Input{ + bank.NewInput(addr1, coins), + bank.NewInput(addr4, coins), + }, + Outputs: []bank.Output{ + bank.NewOutput(addr2, coins), + bank.NewOutput(addr3, coins), + }, + } + + sendMsg4 = bank.MsgSend{ + Inputs: []bank.Input{ + bank.NewInput(addr2, coins), + }, + Outputs: []bank.Output{ + bank.NewOutput(addr1, coins), + }, + } + + sendMsg5 = bank.MsgSend{ + Inputs: []bank.Input{ + bank.NewInput(addr1, manyCoins), + }, + Outputs: []bank.Output{ + bank.NewOutput(addr2, manyCoins), + }, + } ) -func setGenesis(t *testing.T, bapp *BasecoinApp, accs ...auth.BaseAccount) error { +func setGenesis(bapp *BasecoinApp, accs ...auth.BaseAccount) error { genaccs := make([]*types.GenesisAccount, len(accs)) for i, acc := range accs { genaccs[i] = types.NewGenesisAccount(&types.AppAccount{acc, accName}) @@ -39,7 +99,9 @@ func setGenesis(t *testing.T, bapp *BasecoinApp, accs ...auth.BaseAccount) error } stateBytes, err := wire.MarshalJSONIndent(bapp.cdc, genesisState) - require.NoError(t, err) + if err != nil { + return err + } // Initialize the chain vals := []abci.Validator{} @@ -49,24 +111,94 @@ func setGenesis(t *testing.T, bapp *BasecoinApp, accs ...auth.BaseAccount) error return nil } -//_______________________________________________________________________ - -func TestGenesis(t *testing.T) { +func loggerAndDB() (log.Logger, dbm.DB) { logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") db := dbm.NewMemDB() + return logger, db +} + +func newBasecoinApp() *BasecoinApp { + logger, db := loggerAndDB() + return NewBasecoinApp(logger, db) +} + +//_______________________________________________________________________ + +func TestMsgs(t *testing.T) { + bapp := newBasecoinApp() + require.Nil(t, setGenesis(bapp)) + + msgs := []struct { + msg sdk.Msg + }{ + {sendMsg1}, + } + + for i, m := range msgs { + // Run a CheckDeliver + SignCheckDeliver(t, bapp, m.msg, []int64{int64(i)}, false, priv1) + } +} + +func TestSortGenesis(t *testing.T) { + logger, db := loggerAndDB() + bapp := NewBasecoinApp(logger, db) + + // Note the order: the coins are unsorted! + coinDenom1, coinDenom2 := "foocoin", "barcoin" + + genState := fmt.Sprintf(`{ + "accounts": [{ + "address": "%s", + "coins": [ + { + "denom": "%s", + "amount": 10 + }, + { + "denom": "%s", + "amount": 20 + } + ] + }] + }`, addr1.String(), coinDenom1, coinDenom2) + + // Initialize the chain + vals := []abci.Validator{} + bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: []byte(genState)}) + bapp.Commit() + + // Unsorted coins means invalid + err := sendMsg5.ValidateBasic() + require.Equal(t, sdk.CodeInvalidCoins, err.Code(), err.ABCILog()) + + // Sort coins, should be valid + sendMsg5.Inputs[0].Coins.Sort() + sendMsg5.Outputs[0].Coins.Sort() + err = sendMsg5.ValidateBasic() + require.Nil(t, err) + + // Ensure we can send + SignCheckDeliver(t, bapp, sendMsg5, []int64{0}, true, priv1) +} + +func TestGenesis(t *testing.T) { + logger, db := loggerAndDB() bapp := NewBasecoinApp(logger, db) // Construct some genesis bytes to reflect basecoin/types/AppAccount pk := crypto.GenPrivKeyEd25519().PubKey() addr := pk.Address() - coins := sdk.Coins{{"foocoin", 77}, {"barcoin", 99}} + coins, err := sdk.ParseCoins("77foocoin,99barcoin") + require.Nil(t, err) baseAcc := auth.BaseAccount{ Address: addr, Coins: coins, } acc := &types.AppAccount{baseAcc, "foobart"} - setGenesis(t, bapp, baseAcc) + err = setGenesis(bapp, baseAcc) + require.Nil(t, err) // A checkTx context ctx := bapp.BaseApp.NewContext(true, abci.Header{}) @@ -79,3 +211,318 @@ func TestGenesis(t *testing.T) { res1 = bapp.accountMapper.GetAccount(ctx, baseAcc.Address) assert.Equal(t, acc, res1) } + +func TestMsgChangePubKey(t *testing.T) { + + bapp := newBasecoinApp() + + // Construct some genesis bytes to reflect basecoin/types/AppAccount + // Give 77 foocoin to the first key + coins, err := sdk.ParseCoins("77foocoin") + require.Nil(t, err) + baseAcc := auth.BaseAccount{ + Address: addr1, + Coins: coins, + } + + // Construct genesis state + err = setGenesis(bapp, baseAcc) + require.Nil(t, err) + + // A checkTx context (true) + ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) + res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) + assert.Equal(t, baseAcc, res1.(*types.AppAccount).BaseAccount) + + // Run a CheckDeliver + SignCheckDeliver(t, bapp, sendMsg1, []int64{0}, true, priv1) + + // Check balances + CheckBalance(t, bapp, addr1, "67foocoin") + CheckBalance(t, bapp, addr2, "10foocoin") + + changePubKeyMsg := auth.MsgChangeKey{ + Address: addr1, + NewPubKey: priv2.PubKey(), + } + + ctxDeliver := bapp.BaseApp.NewContext(false, abci.Header{}) + acc := bapp.accountMapper.GetAccount(ctxDeliver, addr1) + + // send a MsgChangePubKey + SignCheckDeliver(t, bapp, changePubKeyMsg, []int64{1}, true, priv1) + acc = bapp.accountMapper.GetAccount(ctxDeliver, addr1) + + assert.True(t, priv2.PubKey().Equals(acc.GetPubKey())) + + // signing a SendMsg with the old privKey should be an auth error + tx := genTx(sendMsg1, []int64{2}, priv1) + res := bapp.Deliver(tx) + assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), res.Code, res.Log) + + // resigning the tx with the new correct priv key should work + SignCheckDeliver(t, bapp, sendMsg1, []int64{2}, true, priv2) + + // Check balances + CheckBalance(t, bapp, addr1, "57foocoin") + CheckBalance(t, bapp, addr2, "20foocoin") +} + +func TestMsgSendWithAccounts(t *testing.T) { + bapp := newBasecoinApp() + + // Construct some genesis bytes to reflect basecoin/types/AppAccount + // Give 77 foocoin to the first key + coins, err := sdk.ParseCoins("77foocoin") + require.Nil(t, err) + baseAcc := auth.BaseAccount{ + Address: addr1, + Coins: coins, + } + + // Construct genesis state + err = setGenesis(bapp, baseAcc) + require.Nil(t, err) + + // A checkTx context (true) + ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) + res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) + assert.Equal(t, baseAcc, res1.(*types.AppAccount).BaseAccount) + + // Run a CheckDeliver + SignCheckDeliver(t, bapp, sendMsg1, []int64{0}, true, priv1) + + // Check balances + CheckBalance(t, bapp, addr1, "67foocoin") + CheckBalance(t, bapp, addr2, "10foocoin") + + // Delivering again should cause replay error + SignCheckDeliver(t, bapp, sendMsg1, []int64{0}, false, priv1) + + // bumping the txnonce number without resigning should be an auth error + tx := genTx(sendMsg1, []int64{0}, priv1) + tx.Signatures[0].Sequence = 1 + res := bapp.Deliver(tx) + + assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), res.Code, res.Log) + + // resigning the tx with the bumped sequence should work + SignCheckDeliver(t, bapp, sendMsg1, []int64{1}, true, priv1) +} + +func TestMsgSendMultipleOut(t *testing.T) { + bapp := newBasecoinApp() + + genCoins, err := sdk.ParseCoins("42foocoin") + require.Nil(t, err) + + acc1 := auth.BaseAccount{ + Address: addr1, + Coins: genCoins, + } + + acc2 := auth.BaseAccount{ + Address: addr2, + Coins: genCoins, + } + + // Construct genesis state + err = setGenesis(bapp, acc1, acc2) + require.Nil(t, err) + + // Simulate a Block + SignCheckDeliver(t, bapp, sendMsg2, []int64{0}, true, priv1) + + // Check balances + CheckBalance(t, bapp, addr1, "32foocoin") + CheckBalance(t, bapp, addr2, "47foocoin") + CheckBalance(t, bapp, addr3, "5foocoin") +} + +func TestSengMsgMultipleInOut(t *testing.T) { + bapp := newBasecoinApp() + + genCoins, err := sdk.ParseCoins("42foocoin") + require.Nil(t, err) + + acc1 := auth.BaseAccount{ + Address: addr1, + Coins: genCoins, + } + + acc2 := auth.BaseAccount{ + Address: addr2, + Coins: genCoins, + } + + acc4 := auth.BaseAccount{ + Address: addr4, + Coins: genCoins, + } + + err = setGenesis(bapp, acc1, acc2, acc4) + assert.Nil(t, err) + + // CheckDeliver + SignCheckDeliver(t, bapp, sendMsg3, []int64{0, 0}, true, priv1, priv4) + + // Check balances + CheckBalance(t, bapp, addr1, "32foocoin") + CheckBalance(t, bapp, addr4, "32foocoin") + CheckBalance(t, bapp, addr2, "52foocoin") + CheckBalance(t, bapp, addr3, "10foocoin") +} + +func TestMsgSendDependent(t *testing.T) { + bapp := newBasecoinApp() + + genCoins, err := sdk.ParseCoins("42foocoin") + require.Nil(t, err) + + acc1 := auth.BaseAccount{ + Address: addr1, + Coins: genCoins, + } + + // Construct genesis state + err = setGenesis(bapp, acc1) + require.Nil(t, err) + + err = setGenesis(bapp, acc1) + assert.Nil(t, err) + + // CheckDeliver + SignCheckDeliver(t, bapp, sendMsg1, []int64{0}, true, priv1) + + // Check balances + CheckBalance(t, bapp, addr1, "32foocoin") + CheckBalance(t, bapp, addr2, "10foocoin") + + // Simulate a Block + SignCheckDeliver(t, bapp, sendMsg4, []int64{0}, true, priv2) + + // Check balances + CheckBalance(t, bapp, addr1, "42foocoin") +} + +func TestMsgQuiz(t *testing.T) { + bapp := newBasecoinApp() + + // Construct genesis state + // Construct some genesis bytes to reflect basecoin/types/AppAccount + baseAcc := auth.BaseAccount{ + Address: addr1, + Coins: nil, + } + acc1 := &types.AppAccount{baseAcc, "foobart"} + + // Construct genesis state + genesisState := map[string]interface{}{ + "accounts": []*types.GenesisAccount{ + types.NewGenesisAccount(acc1), + }, + } + stateBytes, err := json.MarshalIndent(genesisState, "", "\t") + require.Nil(t, err) + + // Initialize the chain (nil) + vals := []abci.Validator{} + bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) + bapp.Commit() + + // A checkTx context (true) + ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) + res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) + assert.Equal(t, acc1, res1) + +} + +func TestIBCMsgs(t *testing.T) { + bapp := newBasecoinApp() + + sourceChain := "source-chain" + destChain := "dest-chain" + + baseAcc := auth.BaseAccount{ + Address: addr1, + Coins: coins, + } + acc1 := &types.AppAccount{baseAcc, "foobart"} + + err := setGenesis(bapp, baseAcc) + assert.Nil(t, err) + + // A checkTx context (true) + ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) + res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) + assert.Equal(t, acc1, res1) + + packet := ibc.IBCPacket{ + SrcAddr: addr1, + DestAddr: addr1, + Coins: coins, + SrcChain: sourceChain, + DestChain: destChain, + } + + transferMsg := ibc.IBCTransferMsg{ + IBCPacket: packet, + } + + receiveMsg := ibc.IBCReceiveMsg{ + IBCPacket: packet, + Relayer: addr1, + Sequence: 0, + } + + SignCheckDeliver(t, bapp, transferMsg, []int64{0}, true, priv1) + CheckBalance(t, bapp, addr1, "") + SignCheckDeliver(t, bapp, transferMsg, []int64{1}, false, priv1) + SignCheckDeliver(t, bapp, receiveMsg, []int64{2}, true, priv1) + CheckBalance(t, bapp, addr1, "10foocoin") + SignCheckDeliver(t, bapp, receiveMsg, []int64{3}, false, priv1) +} + +func genTx(msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) auth.StdTx { + sigs := make([]auth.StdSignature, len(priv)) + for i, p := range priv { + sigs[i] = auth.StdSignature{ + PubKey: p.PubKey(), + Signature: p.Sign(auth.StdSignBytes(chainID, seq, fee, msg)), + Sequence: seq[i], + } + } + + return auth.NewStdTx(msg, fee, sigs) + +} + +func SignCheckDeliver(t *testing.T, bapp *BasecoinApp, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { + + // Sign the tx + tx := genTx(msg, seq, priv...) + // Run a Check + res := bapp.Check(tx) + if expPass { + require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) + } else { + require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) + } + + // Simulate a Block + bapp.BeginBlock(abci.RequestBeginBlock{}) + res = bapp.Deliver(tx) + if expPass { + require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) + } else { + require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) + } + bapp.EndBlock(abci.RequestEndBlock{}) + //bapp.Commit() +} + +func CheckBalance(t *testing.T, bapp *BasecoinApp, addr sdk.Address, balExpected string) { + ctxDeliver := bapp.BaseApp.NewContext(false, abci.Header{}) + res2 := bapp.accountMapper.GetAccount(ctxDeliver, addr) + assert.Equal(t, balExpected, fmt.Sprintf("%v", res2.GetCoins())) +} diff --git a/examples/democoin/app/app_test.go b/examples/democoin/app/app_test.go index 01264399ae..ba041bcff1 100644 --- a/examples/democoin/app/app_test.go +++ b/examples/democoin/app/app_test.go @@ -2,6 +2,7 @@ package app import ( "encoding/json" + "fmt" "os" "testing" @@ -9,8 +10,12 @@ import ( "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/examples/democoin/types" + "github.com/cosmos/cosmos-sdk/examples/democoin/x/cool" + "github.com/cosmos/cosmos-sdk/examples/democoin/x/pow" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/cosmos/cosmos-sdk/x/ibc" abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" @@ -18,9 +23,101 @@ import ( "github.com/tendermint/tmlibs/log" ) -func TestGenesis(t *testing.T) { +// Construct some global addrs and txs for tests. +var ( + chainID = "" // TODO + + priv1 = crypto.GenPrivKeyEd25519() + addr1 = priv1.PubKey().Address() + addr2 = crypto.GenPrivKeyEd25519().PubKey().Address() + coins = sdk.Coins{{"foocoin", 10}} + fee = auth.StdFee{ + sdk.Coins{{"foocoin", 0}}, + 1000000, + } + + sendMsg = bank.MsgSend{ + Inputs: []bank.Input{bank.NewInput(addr1, coins)}, + Outputs: []bank.Output{bank.NewOutput(addr2, coins)}, + } + + quizMsg1 = cool.MsgQuiz{ + Sender: addr1, + CoolAnswer: "icecold", + } + + quizMsg2 = cool.MsgQuiz{ + Sender: addr1, + CoolAnswer: "badvibesonly", + } + + setTrendMsg1 = cool.MsgSetTrend{ + Sender: addr1, + Cool: "icecold", + } + + setTrendMsg2 = cool.MsgSetTrend{ + Sender: addr1, + Cool: "badvibesonly", + } + + setTrendMsg3 = cool.MsgSetTrend{ + Sender: addr1, + Cool: "warmandkind", + } +) + +func loggerAndDB() (log.Logger, dbm.DB) { logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") db := dbm.NewMemDB() + return logger, db +} + +func newDemocoinApp() *DemocoinApp { + logger, db := loggerAndDB() + return NewDemocoinApp(logger, db) +} + +//_______________________________________________________________________ + +func TestMsgs(t *testing.T) { + bapp := newDemocoinApp() + + msgs := []struct { + msg sdk.Msg + }{ + {sendMsg}, + {quizMsg1}, + {setTrendMsg1}, + } + + sequences := []int64{0} + for i, m := range msgs { + sig := priv1.Sign(auth.StdSignBytes(chainID, sequences, fee, m.msg)) + tx := auth.NewStdTx(m.msg, fee, []auth.StdSignature{{ + PubKey: priv1.PubKey(), + Signature: sig, + }}) + + // just marshal/unmarshal! + txBytes, err := bapp.cdc.MarshalBinary(tx) + require.NoError(t, err, "i: %v", i) + + // Run a Check + cres := bapp.CheckTx(txBytes) + assert.Equal(t, sdk.CodeUnknownAddress, + sdk.CodeType(cres.Code), "i: %v, log: %v", i, cres.Log) + + // Simulate a Block + bapp.BeginBlock(abci.RequestBeginBlock{}) + dres := bapp.DeliverTx(txBytes) + assert.Equal(t, sdk.CodeUnknownAddress, + sdk.CodeType(dres.Code), "i: %v, log: %v", i, dres.Log) + } +} + +func TestGenesis(t *testing.T) { + logger, db := loggerAndDB() bapp := NewDemocoinApp(logger, db) // Construct some genesis bytes to reflect democoin/types/AppAccount @@ -59,3 +156,272 @@ func TestGenesis(t *testing.T) { res1 = bapp.accountMapper.GetAccount(ctx, baseAcc.Address) assert.Equal(t, acc, res1) } + +func TestMsgSendWithAccounts(t *testing.T) { + bapp := newDemocoinApp() + + // Construct some genesis bytes to reflect democoin/types/AppAccount + // Give 77 foocoin to the first key + coins, err := sdk.ParseCoins("77foocoin") + require.Nil(t, err) + baseAcc := auth.BaseAccount{ + Address: addr1, + Coins: coins, + } + acc1 := &types.AppAccount{baseAcc, "foobart"} + + // Construct genesis state + genesisState := map[string]interface{}{ + "accounts": []*types.GenesisAccount{ + types.NewGenesisAccount(acc1), + }, + "cool": map[string]string{ + "trend": "ice-cold", + }, + } + stateBytes, err := json.MarshalIndent(genesisState, "", "\t") + require.Nil(t, err) + + // Initialize the chain + vals := []abci.Validator{} + bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) + bapp.Commit() + + // A checkTx context (true) + ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) + res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) + assert.Equal(t, acc1, res1) + + // Sign the tx + sequences := []int64{0} + sig := priv1.Sign(auth.StdSignBytes(chainID, sequences, fee, sendMsg)) + tx := auth.NewStdTx(sendMsg, fee, []auth.StdSignature{{ + PubKey: priv1.PubKey(), + Signature: sig, + }}) + + // Run a Check + res := bapp.Check(tx) + assert.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) + + // Simulate a Block + bapp.BeginBlock(abci.RequestBeginBlock{}) + res = bapp.Deliver(tx) + assert.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) + + // Check balances + ctxDeliver := bapp.BaseApp.NewContext(false, abci.Header{}) + res2 := bapp.accountMapper.GetAccount(ctxDeliver, addr1) + res3 := bapp.accountMapper.GetAccount(ctxDeliver, addr2) + assert.Equal(t, fmt.Sprintf("%v", res2.GetCoins()), "67foocoin") + assert.Equal(t, fmt.Sprintf("%v", res3.GetCoins()), "10foocoin") + + // Delivering again should cause replay error + res = bapp.Deliver(tx) + assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeInvalidSequence), sdk.ABCICodeType(res.Code), res.Log) + + // bumping the txnonce number without resigning should be an auth error + tx.Signatures[0].Sequence = 1 + res = bapp.Deliver(tx) + assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), sdk.ABCICodeType(res.Code), res.Log) + + // resigning the tx with the bumped sequence should work + sequences = []int64{1} + sig = priv1.Sign(auth.StdSignBytes(chainID, sequences, fee, tx.Msg)) + tx.Signatures[0].Signature = sig + res = bapp.Deliver(tx) + assert.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) +} + +func TestMsgMine(t *testing.T) { + bapp := newDemocoinApp() + + // Construct genesis state + // Construct some genesis bytes to reflect democoin/types/AppAccount + baseAcc := auth.BaseAccount{ + Address: addr1, + Coins: nil, + } + acc1 := &types.AppAccount{baseAcc, "foobart"} + + // Construct genesis state + genesisState := map[string]interface{}{ + "accounts": []*types.GenesisAccount{ + types.NewGenesisAccount(acc1), + }, + "cool": map[string]string{ + "trend": "ice-cold", + }, + "pow": map[string]uint64{ + "difficulty": 1, + "count": 0, + }, + } + stateBytes, err := json.MarshalIndent(genesisState, "", "\t") + require.Nil(t, err) + + // Initialize the chain (nil) + vals := []abci.Validator{} + bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) + bapp.Commit() + + // A checkTx context (true) + ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) + res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) + assert.Equal(t, acc1, res1) + + // Mine and check for reward + mineMsg1 := pow.GenerateMsgMine(addr1, 1, 2) + SignCheckDeliver(t, bapp, mineMsg1, 0, true) + CheckBalance(t, bapp, "1pow") + // Mine again and check for reward + mineMsg2 := pow.GenerateMsgMine(addr1, 2, 3) + SignCheckDeliver(t, bapp, mineMsg2, 1, true) + CheckBalance(t, bapp, "2pow") + // Mine again - should be invalid + SignCheckDeliver(t, bapp, mineMsg2, 1, false) + CheckBalance(t, bapp, "2pow") + +} + +func TestMsgQuiz(t *testing.T) { + bapp := newDemocoinApp() + + // Construct genesis state + // Construct some genesis bytes to reflect democoin/types/AppAccount + baseAcc := auth.BaseAccount{ + Address: addr1, + Coins: nil, + } + acc1 := &types.AppAccount{baseAcc, "foobart"} + + // Construct genesis state + genesisState := map[string]interface{}{ + "accounts": []*types.GenesisAccount{ + types.NewGenesisAccount(acc1), + }, + "cool": map[string]string{ + "trend": "ice-cold", + }, + } + stateBytes, err := json.MarshalIndent(genesisState, "", "\t") + require.Nil(t, err) + + // Initialize the chain (nil) + vals := []abci.Validator{} + bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) + bapp.Commit() + + // A checkTx context (true) + ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) + res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) + assert.Equal(t, acc1, res1) + + // Set the trend, submit a really cool quiz and check for reward + SignCheckDeliver(t, bapp, setTrendMsg1, 0, true) + SignCheckDeliver(t, bapp, quizMsg1, 1, true) + CheckBalance(t, bapp, "69icecold") + SignCheckDeliver(t, bapp, quizMsg2, 2, false) // result without reward + CheckBalance(t, bapp, "69icecold") + SignCheckDeliver(t, bapp, quizMsg1, 3, true) + CheckBalance(t, bapp, "138icecold") + SignCheckDeliver(t, bapp, setTrendMsg2, 4, true) // reset the trend + SignCheckDeliver(t, bapp, quizMsg1, 5, false) // the same answer will nolonger do! + CheckBalance(t, bapp, "138icecold") + SignCheckDeliver(t, bapp, quizMsg2, 6, true) // earlier answer now relavent again + CheckBalance(t, bapp, "69badvibesonly,138icecold") + SignCheckDeliver(t, bapp, setTrendMsg3, 7, false) // expect to fail to set the trend to something which is not cool + +} + +func TestHandler(t *testing.T) { + bapp := newDemocoinApp() + + sourceChain := "source-chain" + destChain := "dest-chain" + + vals := []abci.Validator{} + baseAcc := auth.BaseAccount{ + Address: addr1, + Coins: coins, + } + acc1 := &types.AppAccount{baseAcc, "foobart"} + genesisState := map[string]interface{}{ + "accounts": []*types.GenesisAccount{ + types.NewGenesisAccount(acc1), + }, + "cool": map[string]string{ + "trend": "ice-cold", + }, + } + stateBytes, err := json.MarshalIndent(genesisState, "", "\t") + require.Nil(t, err) + bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) + bapp.Commit() + + // A checkTx context (true) + ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) + res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) + assert.Equal(t, acc1, res1) + + packet := ibc.IBCPacket{ + SrcAddr: addr1, + DestAddr: addr1, + Coins: coins, + SrcChain: sourceChain, + DestChain: destChain, + } + + transferMsg := ibc.IBCTransferMsg{ + IBCPacket: packet, + } + + receiveMsg := ibc.IBCReceiveMsg{ + IBCPacket: packet, + Relayer: addr1, + Sequence: 0, + } + + SignCheckDeliver(t, bapp, transferMsg, 0, true) + CheckBalance(t, bapp, "") + SignCheckDeliver(t, bapp, transferMsg, 1, false) + SignCheckDeliver(t, bapp, receiveMsg, 2, true) + CheckBalance(t, bapp, "10foocoin") + SignCheckDeliver(t, bapp, receiveMsg, 3, false) +} + +// TODO describe the use of this function +func SignCheckDeliver(t *testing.T, bapp *DemocoinApp, msg sdk.Msg, seq int64, expPass bool) { + + // Sign the tx + tx := auth.NewStdTx(msg, fee, []auth.StdSignature{{ + PubKey: priv1.PubKey(), + Signature: priv1.Sign(auth.StdSignBytes(chainID, []int64{seq}, fee, msg)), + Sequence: seq, + }}) + + // Run a Check + res := bapp.Check(tx) + if expPass { + require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) + } else { + require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) + } + + // Simulate a Block + bapp.BeginBlock(abci.RequestBeginBlock{}) + res = bapp.Deliver(tx) + if expPass { + require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) + } else { + require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) + } + bapp.EndBlock(abci.RequestEndBlock{}) + //bapp.Commit() +} + +func CheckBalance(t *testing.T, bapp *DemocoinApp, balExpected string) { + ctxDeliver := bapp.BaseApp.NewContext(false, abci.Header{}) + res2 := bapp.accountMapper.GetAccount(ctxDeliver, addr1) + assert.Equal(t, balExpected, fmt.Sprintf("%v", res2.GetCoins())) +} diff --git a/server/init_test.go b/server/init_test.go index eca5295052..300decf334 100644 --- a/server/init_test.go +++ b/server/init_test.go @@ -7,7 +7,7 @@ import ( "github.com/tendermint/tmlibs/log" - "github.com/cosmos/cosmos-sdk/mock" + "github.com/cosmos/cosmos-sdk/server/mock" "github.com/cosmos/cosmos-sdk/wire" tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" ) diff --git a/mock/app.go b/server/mock/app.go similarity index 100% rename from mock/app.go rename to server/mock/app.go diff --git a/mock/app_test.go b/server/mock/app_test.go similarity index 100% rename from mock/app_test.go rename to server/mock/app_test.go diff --git a/mock/helpers.go b/server/mock/helpers.go similarity index 100% rename from mock/helpers.go rename to server/mock/helpers.go diff --git a/mock/store.go b/server/mock/store.go similarity index 100% rename from mock/store.go rename to server/mock/store.go diff --git a/mock/store_test.go b/server/mock/store_test.go similarity index 100% rename from mock/store_test.go rename to server/mock/store_test.go diff --git a/mock/tx.go b/server/mock/tx.go similarity index 100% rename from mock/tx.go rename to server/mock/tx.go diff --git a/server/start_test.go b/server/start_test.go index 454f2d4922..1c1ad671ec 100644 --- a/server/start_test.go +++ b/server/start_test.go @@ -9,7 +9,7 @@ import ( "github.com/spf13/viper" "github.com/stretchr/testify/require" - "github.com/cosmos/cosmos-sdk/mock" + "github.com/cosmos/cosmos-sdk/server/mock" "github.com/cosmos/cosmos-sdk/wire" "github.com/tendermint/abci/server" tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" diff --git a/x/auth/mock/app.go b/x/auth/mock/app.go index 6ceff482bf..fcd130b44b 100644 --- a/x/auth/mock/app.go +++ b/x/auth/mock/app.go @@ -30,7 +30,7 @@ type App struct { GenesisAccounts []auth.Account } -// NewApp is used for testing the server. For the internal mock app stuff, it uses code in helpers.go +// partially construct a new app on the memstore for module and genesis testing func NewApp() *App { logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") db := dbm.NewMemDB() From 61a510ed08d6eaddc391676fffe8b9b04c5742ec Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 7 Jun 2018 21:46:27 -0700 Subject: [PATCH 203/548] ... --- CHANGELOG.md | 1 + cmd/gaia/app/app_test.go | 471 +----------------------------- examples/basecoin/app/app_test.go | 455 +---------------------------- examples/democoin/app/app_test.go | 368 +---------------------- 4 files changed, 9 insertions(+), 1286 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d65416915..bcdcf73020 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ IMPROVEMENTS FIXES * [lcd] Switch to bech32 for addresses on all human readable inputs and outputs +* [lcd] Switch to bech32 for addresses on all human readable inputs and outputs ## 0.18.0 diff --git a/cmd/gaia/app/app_test.go b/cmd/gaia/app/app_test.go index 0fe1cfe5b9..f79703fefe 100644 --- a/cmd/gaia/app/app_test.go +++ b/cmd/gaia/app/app_test.go @@ -1,7 +1,6 @@ package app import ( - "fmt" "os" "testing" @@ -11,8 +10,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/ibc" "github.com/cosmos/cosmos-sdk/x/stake" abci "github.com/tendermint/abci/types" @@ -21,81 +18,6 @@ import ( "github.com/tendermint/tmlibs/log" ) -// Construct some global addrs and txs for tests. -var ( - chainID = "" // TODO - - accName = "foobart" - - priv1 = crypto.GenPrivKeyEd25519() - addr1 = priv1.PubKey().Address() - priv2 = crypto.GenPrivKeyEd25519() - addr2 = priv2.PubKey().Address() - addr3 = crypto.GenPrivKeyEd25519().PubKey().Address() - priv4 = crypto.GenPrivKeyEd25519() - addr4 = priv4.PubKey().Address() - coins = sdk.Coins{{"foocoin", 10}} - halfCoins = sdk.Coins{{"foocoin", 5}} - manyCoins = sdk.Coins{{"foocoin", 1}, {"barcoin", 1}} - fee = auth.StdFee{ - sdk.Coins{{"foocoin", 0}}, - 100000, - } - - sendMsg1 = bank.MsgSend{ - Inputs: []bank.Input{bank.NewInput(addr1, coins)}, - Outputs: []bank.Output{bank.NewOutput(addr2, coins)}, - } - - sendMsg2 = bank.MsgSend{ - Inputs: []bank.Input{bank.NewInput(addr1, coins)}, - Outputs: []bank.Output{ - bank.NewOutput(addr2, halfCoins), - bank.NewOutput(addr3, halfCoins), - }, - } - - sendMsg3 = bank.MsgSend{ - Inputs: []bank.Input{ - bank.NewInput(addr1, coins), - bank.NewInput(addr4, coins), - }, - Outputs: []bank.Output{ - bank.NewOutput(addr2, coins), - bank.NewOutput(addr3, coins), - }, - } - - sendMsg4 = bank.MsgSend{ - Inputs: []bank.Input{ - bank.NewInput(addr2, coins), - }, - Outputs: []bank.Output{ - bank.NewOutput(addr1, coins), - }, - } - - sendMsg5 = bank.MsgSend{ - Inputs: []bank.Input{ - bank.NewInput(addr1, manyCoins), - }, - Outputs: []bank.Output{ - bank.NewOutput(addr2, manyCoins), - }, - } -) - -func loggerAndDB() (log.Logger, dbm.DB) { - logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") - db := dbm.NewMemDB() - return logger, db -} - -func newGaiaApp() *GaiaApp { - logger, db := loggerAndDB() - return NewGaiaApp(logger, db) -} - func setGenesis(gapp *GaiaApp, accs ...*auth.BaseAccount) error { genaccs := make([]GenesisAccount, len(accs)) for i, acc := range accs { @@ -120,27 +42,10 @@ func setGenesis(gapp *GaiaApp, accs ...*auth.BaseAccount) error { return nil } -//_______________________________________________________________________ - -func TestMsgs(t *testing.T) { - gapp := newGaiaApp() - require.Nil(t, setGenesis(gapp)) - - msgs := []struct { - msg sdk.Msg - }{ - {sendMsg1}, - } - - for i, m := range msgs { - // Run a CheckDeliver - SignCheckDeliver(t, gapp, m.msg, []int64{int64(i)}, false, priv1) - } -} - func TestGenesis(t *testing.T) { - logger, dbs := loggerAndDB() - gapp := NewGaiaApp(logger, dbs) + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") + db := dbm.NewMemDB() + gapp := NewGaiaApp(logger, db) // Construct some genesis bytes to reflect GaiaAccount pk := crypto.GenPrivKeyEd25519().PubKey() @@ -161,376 +66,8 @@ func TestGenesis(t *testing.T) { assert.Equal(t, baseAcc, res1) // reload app and ensure the account is still there - gapp = NewGaiaApp(logger, dbs) + gapp = NewGaiaApp(logger, db) ctx = gapp.BaseApp.NewContext(true, abci.Header{}) res1 = gapp.accountMapper.GetAccount(ctx, baseAcc.Address) assert.Equal(t, baseAcc, res1) } - -func TestMsgSendWithAccounts(t *testing.T) { - gapp := newGaiaApp() - - // Construct some genesis bytes to reflect GaiaAccount - // Give 77 foocoin to the first key - coins, err := sdk.ParseCoins("77foocoin") - require.Nil(t, err) - baseAcc := &auth.BaseAccount{ - Address: addr1, - Coins: coins, - } - - // Construct genesis state - err = setGenesis(gapp, baseAcc) - require.Nil(t, err) - - // A checkTx context (true) - ctxCheck := gapp.BaseApp.NewContext(true, abci.Header{}) - res1 := gapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, baseAcc, res1.(*auth.BaseAccount)) - - // Run a CheckDeliver - SignCheckDeliver(t, gapp, sendMsg1, []int64{0}, true, priv1) - - // Check balances - CheckBalance(t, gapp, addr1, "67foocoin") - CheckBalance(t, gapp, addr2, "10foocoin") - - // Delivering again should cause replay error - SignCheckDeliver(t, gapp, sendMsg1, []int64{0}, false, priv1) - - // bumping the txnonce number without resigning should be an auth error - tx := genTx(sendMsg1, []int64{0}, priv1) - tx.Signatures[0].Sequence = 1 - res := gapp.Deliver(tx) - - assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), res.Code, res.Log) - - // resigning the tx with the bumped sequence should work - SignCheckDeliver(t, gapp, sendMsg1, []int64{1}, true, priv1) -} - -func TestMsgSendMultipleOut(t *testing.T) { - gapp := newGaiaApp() - - genCoins, err := sdk.ParseCoins("42foocoin") - require.Nil(t, err) - - acc1 := &auth.BaseAccount{ - Address: addr1, - Coins: genCoins, - } - - acc2 := &auth.BaseAccount{ - Address: addr2, - Coins: genCoins, - } - - err = setGenesis(gapp, acc1, acc2) - require.Nil(t, err) - - // Simulate a Block - SignCheckDeliver(t, gapp, sendMsg2, []int64{0}, true, priv1) - - // Check balances - CheckBalance(t, gapp, addr1, "32foocoin") - CheckBalance(t, gapp, addr2, "47foocoin") - CheckBalance(t, gapp, addr3, "5foocoin") -} - -func TestSengMsgMultipleInOut(t *testing.T) { - gapp := newGaiaApp() - - genCoins, err := sdk.ParseCoins("42foocoin") - require.Nil(t, err) - - acc1 := &auth.BaseAccount{ - Address: addr1, - Coins: genCoins, - } - acc2 := &auth.BaseAccount{ - Address: addr2, - Coins: genCoins, - } - acc4 := &auth.BaseAccount{ - Address: addr4, - Coins: genCoins, - } - - err = setGenesis(gapp, acc1, acc2, acc4) - assert.Nil(t, err) - - // CheckDeliver - SignCheckDeliver(t, gapp, sendMsg3, []int64{0, 0}, true, priv1, priv4) - - // Check balances - CheckBalance(t, gapp, addr1, "32foocoin") - CheckBalance(t, gapp, addr4, "32foocoin") - CheckBalance(t, gapp, addr2, "52foocoin") - CheckBalance(t, gapp, addr3, "10foocoin") -} - -func TestMsgSendDependent(t *testing.T) { - gapp := newGaiaApp() - - genCoins, err := sdk.ParseCoins("42foocoin") - require.Nil(t, err) - - acc1 := &auth.BaseAccount{ - Address: addr1, - Coins: genCoins, - } - - err = setGenesis(gapp, acc1) - require.Nil(t, err) - - // CheckDeliver - SignCheckDeliver(t, gapp, sendMsg1, []int64{0}, true, priv1) - - // Check balances - CheckBalance(t, gapp, addr1, "32foocoin") - CheckBalance(t, gapp, addr2, "10foocoin") - - // Simulate a Block - SignCheckDeliver(t, gapp, sendMsg4, []int64{0}, true, priv2) - - // Check balances - CheckBalance(t, gapp, addr1, "42foocoin") -} - -func TestIBCMsgs(t *testing.T) { - gapp := newGaiaApp() - - sourceChain := "source-chain" - destChain := "dest-chain" - - baseAcc := &auth.BaseAccount{ - Address: addr1, - Coins: coins, - } - - err := setGenesis(gapp, baseAcc) - require.Nil(t, err) - - // A checkTx context (true) - ctxCheck := gapp.BaseApp.NewContext(true, abci.Header{}) - res1 := gapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, baseAcc, res1) - - packet := ibc.IBCPacket{ - SrcAddr: addr1, - DestAddr: addr1, - Coins: coins, - SrcChain: sourceChain, - DestChain: destChain, - } - - transferMsg := ibc.IBCTransferMsg{ - IBCPacket: packet, - } - - receiveMsg := ibc.IBCReceiveMsg{ - IBCPacket: packet, - Relayer: addr1, - Sequence: 0, - } - - SignCheckDeliver(t, gapp, transferMsg, []int64{0}, true, priv1) - CheckBalance(t, gapp, addr1, "") - SignCheckDeliver(t, gapp, transferMsg, []int64{1}, false, priv1) - SignCheckDeliver(t, gapp, receiveMsg, []int64{2}, true, priv1) - CheckBalance(t, gapp, addr1, "10foocoin") - SignCheckDeliver(t, gapp, receiveMsg, []int64{3}, false, priv1) -} - -func TestStakeMsgs(t *testing.T) { - gapp := newGaiaApp() - - genCoins, err := sdk.ParseCoins("42steak") - require.Nil(t, err) - bondCoin, err := sdk.ParseCoin("10steak") - require.Nil(t, err) - - acc1 := &auth.BaseAccount{ - Address: addr1, - Coins: genCoins, - } - acc2 := &auth.BaseAccount{ - Address: addr2, - Coins: genCoins, - } - - err = setGenesis(gapp, acc1, acc2) - require.Nil(t, err) - - // A checkTx context (true) - ctxCheck := gapp.BaseApp.NewContext(true, abci.Header{}) - res1 := gapp.accountMapper.GetAccount(ctxCheck, addr1) - res2 := gapp.accountMapper.GetAccount(ctxCheck, addr2) - require.Equal(t, acc1, res1) - require.Equal(t, acc2, res2) - - // Create Validator - - description := stake.NewDescription("foo_moniker", "", "", "") - createValidatorMsg := stake.NewMsgCreateValidator( - addr1, priv1.PubKey(), bondCoin, description, - ) - SignCheckDeliver(t, gapp, createValidatorMsg, []int64{0}, true, priv1) - - ctxDeliver := gapp.BaseApp.NewContext(false, abci.Header{}) - res1 = gapp.accountMapper.GetAccount(ctxDeliver, addr1) - require.Equal(t, genCoins.Minus(sdk.Coins{bondCoin}), res1.GetCoins()) - validator, found := gapp.stakeKeeper.GetValidator(ctxDeliver, addr1) - require.True(t, found) - require.Equal(t, addr1, validator.Owner) - require.Equal(t, sdk.Bonded, validator.Status()) - require.True(sdk.RatEq(t, sdk.NewRat(10), validator.PoolShares.Bonded())) - - // check the bond that should have been created as well - bond, found := gapp.stakeKeeper.GetDelegation(ctxDeliver, addr1, addr1) - require.True(sdk.RatEq(t, sdk.NewRat(10), bond.Shares)) - - // Edit Validator - - description = stake.NewDescription("bar_moniker", "", "", "") - editValidatorMsg := stake.NewMsgEditValidator( - addr1, description, - ) - SignDeliver(t, gapp, editValidatorMsg, []int64{1}, true, priv1) - - validator, found = gapp.stakeKeeper.GetValidator(ctxDeliver, addr1) - require.True(t, found) - require.Equal(t, description, validator.Description) - - // Delegate - - delegateMsg := stake.NewMsgDelegate( - addr2, addr1, bondCoin, - ) - SignDeliver(t, gapp, delegateMsg, []int64{0}, true, priv2) - - res2 = gapp.accountMapper.GetAccount(ctxDeliver, addr2) - require.Equal(t, genCoins.Minus(sdk.Coins{bondCoin}), res2.GetCoins()) - bond, found = gapp.stakeKeeper.GetDelegation(ctxDeliver, addr2, addr1) - require.True(t, found) - require.Equal(t, addr2, bond.DelegatorAddr) - require.Equal(t, addr1, bond.ValidatorAddr) - require.True(sdk.RatEq(t, sdk.NewRat(10), bond.Shares)) - - // Unbond - - unbondMsg := stake.NewMsgUnbond( - addr2, addr1, "MAX", - ) - SignDeliver(t, gapp, unbondMsg, []int64{1}, true, priv2) - - res2 = gapp.accountMapper.GetAccount(ctxDeliver, addr2) - require.Equal(t, genCoins, res2.GetCoins()) - _, found = gapp.stakeKeeper.GetDelegation(ctxDeliver, addr2, addr1) - require.False(t, found) -} - -func TestExportValidators(t *testing.T) { - gapp := newGaiaApp() - - genCoins, err := sdk.ParseCoins("42steak") - require.Nil(t, err) - bondCoin, err := sdk.ParseCoin("10steak") - require.Nil(t, err) - - acc1 := &auth.BaseAccount{ - Address: addr1, - Coins: genCoins, - } - acc2 := &auth.BaseAccount{ - Address: addr2, - Coins: genCoins, - } - - err = setGenesis(gapp, acc1, acc2) - require.Nil(t, err) - - // Create Validator - description := stake.NewDescription("foo_moniker", "", "", "") - createValidatorMsg := stake.NewMsgCreateValidator( - addr1, priv1.PubKey(), bondCoin, description, - ) - SignCheckDeliver(t, gapp, createValidatorMsg, []int64{0}, true, priv1) - gapp.Commit() - - // Export validator set - _, validators, err := gapp.ExportAppStateAndValidators() - require.Nil(t, err) - require.Equal(t, 1, len(validators)) // 1 validator - require.Equal(t, priv1.PubKey(), validators[0].PubKey) - require.Equal(t, int64(10), validators[0].Power) -} - -//____________________________________________________________________________________ - -func CheckBalance(t *testing.T, gapp *GaiaApp, addr sdk.Address, balExpected string) { - ctxDeliver := gapp.BaseApp.NewContext(false, abci.Header{}) - res2 := gapp.accountMapper.GetAccount(ctxDeliver, addr) - assert.Equal(t, balExpected, fmt.Sprintf("%v", res2.GetCoins())) -} - -func genTx(msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) auth.StdTx { - sigs := make([]auth.StdSignature, len(priv)) - for i, p := range priv { - sigs[i] = auth.StdSignature{ - PubKey: p.PubKey(), - Signature: p.Sign(auth.StdSignBytes(chainID, seq, fee, msg)), - Sequence: seq[i], - } - } - - return auth.NewStdTx(msg, fee, sigs) - -} - -func SignCheckDeliver(t *testing.T, gapp *GaiaApp, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { - - // Sign the tx - tx := genTx(msg, seq, priv...) - - // Run a Check - res := gapp.Check(tx) - if expPass { - require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - } else { - require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) - } - - // Simulate a Block - gapp.BeginBlock(abci.RequestBeginBlock{}) - res = gapp.Deliver(tx) - if expPass { - require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - } else { - require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) - } - gapp.EndBlock(abci.RequestEndBlock{}) - - // XXX fix code or add explaination as to why using commit breaks a bunch of these tests - //gapp.Commit() -} - -// XXX the only reason we are using Sign Deliver here is because the tests -// break on check tx the second time you use SignCheckDeliver in a test because -// the checktx state has not been updated likely because commit is not being -// called! -func SignDeliver(t *testing.T, gapp *GaiaApp, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { - - // Sign the tx - tx := genTx(msg, seq, priv...) - - // Simulate a Block - gapp.BeginBlock(abci.RequestBeginBlock{}) - res := gapp.Deliver(tx) - if expPass { - require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - } else { - require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) - } - gapp.EndBlock(abci.RequestEndBlock{}) -} diff --git a/examples/basecoin/app/app_test.go b/examples/basecoin/app/app_test.go index 3027a84707..521516d472 100644 --- a/examples/basecoin/app/app_test.go +++ b/examples/basecoin/app/app_test.go @@ -1,8 +1,6 @@ package app import ( - "encoding/json" - "fmt" "os" "testing" @@ -13,8 +11,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/ibc" "github.com/cosmos/cosmos-sdk/x/stake" abci "github.com/tendermint/abci/types" @@ -23,69 +19,7 @@ import ( "github.com/tendermint/tmlibs/log" ) -// Construct some global addrs and txs for tests. -var ( - chainID = "" // TODO - - accName = "foobart" - - priv1 = crypto.GenPrivKeyEd25519() - addr1 = priv1.PubKey().Address() - priv2 = crypto.GenPrivKeyEd25519() - addr2 = priv2.PubKey().Address() - addr3 = crypto.GenPrivKeyEd25519().PubKey().Address() - priv4 = crypto.GenPrivKeyEd25519() - addr4 = priv4.PubKey().Address() - coins = sdk.Coins{{"foocoin", 10}} - halfCoins = sdk.Coins{{"foocoin", 5}} - manyCoins = sdk.Coins{{"foocoin", 1}, {"barcoin", 1}} - fee = auth.StdFee{ - sdk.Coins{{"foocoin", 0}}, - 100000, - } - - sendMsg1 = bank.MsgSend{ - Inputs: []bank.Input{bank.NewInput(addr1, coins)}, - Outputs: []bank.Output{bank.NewOutput(addr2, coins)}, - } - - sendMsg2 = bank.MsgSend{ - Inputs: []bank.Input{bank.NewInput(addr1, coins)}, - Outputs: []bank.Output{ - bank.NewOutput(addr2, halfCoins), - bank.NewOutput(addr3, halfCoins), - }, - } - - sendMsg3 = bank.MsgSend{ - Inputs: []bank.Input{ - bank.NewInput(addr1, coins), - bank.NewInput(addr4, coins), - }, - Outputs: []bank.Output{ - bank.NewOutput(addr2, coins), - bank.NewOutput(addr3, coins), - }, - } - - sendMsg4 = bank.MsgSend{ - Inputs: []bank.Input{ - bank.NewInput(addr2, coins), - }, - Outputs: []bank.Output{ - bank.NewOutput(addr1, coins), - }, - } - - sendMsg5 = bank.MsgSend{ - Inputs: []bank.Input{ - bank.NewInput(addr1, manyCoins), - }, - Outputs: []bank.Output{ - bank.NewOutput(addr2, manyCoins), - }, - } -) +var accName = "foobart" func setGenesis(bapp *BasecoinApp, accs ...auth.BaseAccount) error { genaccs := make([]*types.GenesisAccount, len(accs)) @@ -111,79 +45,11 @@ func setGenesis(bapp *BasecoinApp, accs ...auth.BaseAccount) error { return nil } -func loggerAndDB() (log.Logger, dbm.DB) { - logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") - db := dbm.NewMemDB() - return logger, db -} - -func newBasecoinApp() *BasecoinApp { - logger, db := loggerAndDB() - return NewBasecoinApp(logger, db) -} - //_______________________________________________________________________ -func TestMsgs(t *testing.T) { - bapp := newBasecoinApp() - require.Nil(t, setGenesis(bapp)) - - msgs := []struct { - msg sdk.Msg - }{ - {sendMsg1}, - } - - for i, m := range msgs { - // Run a CheckDeliver - SignCheckDeliver(t, bapp, m.msg, []int64{int64(i)}, false, priv1) - } -} - -func TestSortGenesis(t *testing.T) { - logger, db := loggerAndDB() - bapp := NewBasecoinApp(logger, db) - - // Note the order: the coins are unsorted! - coinDenom1, coinDenom2 := "foocoin", "barcoin" - - genState := fmt.Sprintf(`{ - "accounts": [{ - "address": "%s", - "coins": [ - { - "denom": "%s", - "amount": 10 - }, - { - "denom": "%s", - "amount": 20 - } - ] - }] - }`, addr1.String(), coinDenom1, coinDenom2) - - // Initialize the chain - vals := []abci.Validator{} - bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: []byte(genState)}) - bapp.Commit() - - // Unsorted coins means invalid - err := sendMsg5.ValidateBasic() - require.Equal(t, sdk.CodeInvalidCoins, err.Code(), err.ABCILog()) - - // Sort coins, should be valid - sendMsg5.Inputs[0].Coins.Sort() - sendMsg5.Outputs[0].Coins.Sort() - err = sendMsg5.ValidateBasic() - require.Nil(t, err) - - // Ensure we can send - SignCheckDeliver(t, bapp, sendMsg5, []int64{0}, true, priv1) -} - func TestGenesis(t *testing.T) { - logger, db := loggerAndDB() + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") + db := dbm.NewMemDB() bapp := NewBasecoinApp(logger, db) // Construct some genesis bytes to reflect basecoin/types/AppAccount @@ -211,318 +77,3 @@ func TestGenesis(t *testing.T) { res1 = bapp.accountMapper.GetAccount(ctx, baseAcc.Address) assert.Equal(t, acc, res1) } - -func TestMsgChangePubKey(t *testing.T) { - - bapp := newBasecoinApp() - - // Construct some genesis bytes to reflect basecoin/types/AppAccount - // Give 77 foocoin to the first key - coins, err := sdk.ParseCoins("77foocoin") - require.Nil(t, err) - baseAcc := auth.BaseAccount{ - Address: addr1, - Coins: coins, - } - - // Construct genesis state - err = setGenesis(bapp, baseAcc) - require.Nil(t, err) - - // A checkTx context (true) - ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) - res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, baseAcc, res1.(*types.AppAccount).BaseAccount) - - // Run a CheckDeliver - SignCheckDeliver(t, bapp, sendMsg1, []int64{0}, true, priv1) - - // Check balances - CheckBalance(t, bapp, addr1, "67foocoin") - CheckBalance(t, bapp, addr2, "10foocoin") - - changePubKeyMsg := auth.MsgChangeKey{ - Address: addr1, - NewPubKey: priv2.PubKey(), - } - - ctxDeliver := bapp.BaseApp.NewContext(false, abci.Header{}) - acc := bapp.accountMapper.GetAccount(ctxDeliver, addr1) - - // send a MsgChangePubKey - SignCheckDeliver(t, bapp, changePubKeyMsg, []int64{1}, true, priv1) - acc = bapp.accountMapper.GetAccount(ctxDeliver, addr1) - - assert.True(t, priv2.PubKey().Equals(acc.GetPubKey())) - - // signing a SendMsg with the old privKey should be an auth error - tx := genTx(sendMsg1, []int64{2}, priv1) - res := bapp.Deliver(tx) - assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), res.Code, res.Log) - - // resigning the tx with the new correct priv key should work - SignCheckDeliver(t, bapp, sendMsg1, []int64{2}, true, priv2) - - // Check balances - CheckBalance(t, bapp, addr1, "57foocoin") - CheckBalance(t, bapp, addr2, "20foocoin") -} - -func TestMsgSendWithAccounts(t *testing.T) { - bapp := newBasecoinApp() - - // Construct some genesis bytes to reflect basecoin/types/AppAccount - // Give 77 foocoin to the first key - coins, err := sdk.ParseCoins("77foocoin") - require.Nil(t, err) - baseAcc := auth.BaseAccount{ - Address: addr1, - Coins: coins, - } - - // Construct genesis state - err = setGenesis(bapp, baseAcc) - require.Nil(t, err) - - // A checkTx context (true) - ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) - res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, baseAcc, res1.(*types.AppAccount).BaseAccount) - - // Run a CheckDeliver - SignCheckDeliver(t, bapp, sendMsg1, []int64{0}, true, priv1) - - // Check balances - CheckBalance(t, bapp, addr1, "67foocoin") - CheckBalance(t, bapp, addr2, "10foocoin") - - // Delivering again should cause replay error - SignCheckDeliver(t, bapp, sendMsg1, []int64{0}, false, priv1) - - // bumping the txnonce number without resigning should be an auth error - tx := genTx(sendMsg1, []int64{0}, priv1) - tx.Signatures[0].Sequence = 1 - res := bapp.Deliver(tx) - - assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), res.Code, res.Log) - - // resigning the tx with the bumped sequence should work - SignCheckDeliver(t, bapp, sendMsg1, []int64{1}, true, priv1) -} - -func TestMsgSendMultipleOut(t *testing.T) { - bapp := newBasecoinApp() - - genCoins, err := sdk.ParseCoins("42foocoin") - require.Nil(t, err) - - acc1 := auth.BaseAccount{ - Address: addr1, - Coins: genCoins, - } - - acc2 := auth.BaseAccount{ - Address: addr2, - Coins: genCoins, - } - - // Construct genesis state - err = setGenesis(bapp, acc1, acc2) - require.Nil(t, err) - - // Simulate a Block - SignCheckDeliver(t, bapp, sendMsg2, []int64{0}, true, priv1) - - // Check balances - CheckBalance(t, bapp, addr1, "32foocoin") - CheckBalance(t, bapp, addr2, "47foocoin") - CheckBalance(t, bapp, addr3, "5foocoin") -} - -func TestSengMsgMultipleInOut(t *testing.T) { - bapp := newBasecoinApp() - - genCoins, err := sdk.ParseCoins("42foocoin") - require.Nil(t, err) - - acc1 := auth.BaseAccount{ - Address: addr1, - Coins: genCoins, - } - - acc2 := auth.BaseAccount{ - Address: addr2, - Coins: genCoins, - } - - acc4 := auth.BaseAccount{ - Address: addr4, - Coins: genCoins, - } - - err = setGenesis(bapp, acc1, acc2, acc4) - assert.Nil(t, err) - - // CheckDeliver - SignCheckDeliver(t, bapp, sendMsg3, []int64{0, 0}, true, priv1, priv4) - - // Check balances - CheckBalance(t, bapp, addr1, "32foocoin") - CheckBalance(t, bapp, addr4, "32foocoin") - CheckBalance(t, bapp, addr2, "52foocoin") - CheckBalance(t, bapp, addr3, "10foocoin") -} - -func TestMsgSendDependent(t *testing.T) { - bapp := newBasecoinApp() - - genCoins, err := sdk.ParseCoins("42foocoin") - require.Nil(t, err) - - acc1 := auth.BaseAccount{ - Address: addr1, - Coins: genCoins, - } - - // Construct genesis state - err = setGenesis(bapp, acc1) - require.Nil(t, err) - - err = setGenesis(bapp, acc1) - assert.Nil(t, err) - - // CheckDeliver - SignCheckDeliver(t, bapp, sendMsg1, []int64{0}, true, priv1) - - // Check balances - CheckBalance(t, bapp, addr1, "32foocoin") - CheckBalance(t, bapp, addr2, "10foocoin") - - // Simulate a Block - SignCheckDeliver(t, bapp, sendMsg4, []int64{0}, true, priv2) - - // Check balances - CheckBalance(t, bapp, addr1, "42foocoin") -} - -func TestMsgQuiz(t *testing.T) { - bapp := newBasecoinApp() - - // Construct genesis state - // Construct some genesis bytes to reflect basecoin/types/AppAccount - baseAcc := auth.BaseAccount{ - Address: addr1, - Coins: nil, - } - acc1 := &types.AppAccount{baseAcc, "foobart"} - - // Construct genesis state - genesisState := map[string]interface{}{ - "accounts": []*types.GenesisAccount{ - types.NewGenesisAccount(acc1), - }, - } - stateBytes, err := json.MarshalIndent(genesisState, "", "\t") - require.Nil(t, err) - - // Initialize the chain (nil) - vals := []abci.Validator{} - bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) - bapp.Commit() - - // A checkTx context (true) - ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) - res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, acc1, res1) - -} - -func TestIBCMsgs(t *testing.T) { - bapp := newBasecoinApp() - - sourceChain := "source-chain" - destChain := "dest-chain" - - baseAcc := auth.BaseAccount{ - Address: addr1, - Coins: coins, - } - acc1 := &types.AppAccount{baseAcc, "foobart"} - - err := setGenesis(bapp, baseAcc) - assert.Nil(t, err) - - // A checkTx context (true) - ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) - res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, acc1, res1) - - packet := ibc.IBCPacket{ - SrcAddr: addr1, - DestAddr: addr1, - Coins: coins, - SrcChain: sourceChain, - DestChain: destChain, - } - - transferMsg := ibc.IBCTransferMsg{ - IBCPacket: packet, - } - - receiveMsg := ibc.IBCReceiveMsg{ - IBCPacket: packet, - Relayer: addr1, - Sequence: 0, - } - - SignCheckDeliver(t, bapp, transferMsg, []int64{0}, true, priv1) - CheckBalance(t, bapp, addr1, "") - SignCheckDeliver(t, bapp, transferMsg, []int64{1}, false, priv1) - SignCheckDeliver(t, bapp, receiveMsg, []int64{2}, true, priv1) - CheckBalance(t, bapp, addr1, "10foocoin") - SignCheckDeliver(t, bapp, receiveMsg, []int64{3}, false, priv1) -} - -func genTx(msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) auth.StdTx { - sigs := make([]auth.StdSignature, len(priv)) - for i, p := range priv { - sigs[i] = auth.StdSignature{ - PubKey: p.PubKey(), - Signature: p.Sign(auth.StdSignBytes(chainID, seq, fee, msg)), - Sequence: seq[i], - } - } - - return auth.NewStdTx(msg, fee, sigs) - -} - -func SignCheckDeliver(t *testing.T, bapp *BasecoinApp, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { - - // Sign the tx - tx := genTx(msg, seq, priv...) - // Run a Check - res := bapp.Check(tx) - if expPass { - require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - } else { - require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) - } - - // Simulate a Block - bapp.BeginBlock(abci.RequestBeginBlock{}) - res = bapp.Deliver(tx) - if expPass { - require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - } else { - require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) - } - bapp.EndBlock(abci.RequestEndBlock{}) - //bapp.Commit() -} - -func CheckBalance(t *testing.T, bapp *BasecoinApp, addr sdk.Address, balExpected string) { - ctxDeliver := bapp.BaseApp.NewContext(false, abci.Header{}) - res2 := bapp.accountMapper.GetAccount(ctxDeliver, addr) - assert.Equal(t, balExpected, fmt.Sprintf("%v", res2.GetCoins())) -} diff --git a/examples/democoin/app/app_test.go b/examples/democoin/app/app_test.go index ba041bcff1..01264399ae 100644 --- a/examples/democoin/app/app_test.go +++ b/examples/democoin/app/app_test.go @@ -2,7 +2,6 @@ package app import ( "encoding/json" - "fmt" "os" "testing" @@ -10,12 +9,8 @@ import ( "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/examples/democoin/types" - "github.com/cosmos/cosmos-sdk/examples/democoin/x/cool" - "github.com/cosmos/cosmos-sdk/examples/democoin/x/pow" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/ibc" abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" @@ -23,101 +18,9 @@ import ( "github.com/tendermint/tmlibs/log" ) -// Construct some global addrs and txs for tests. -var ( - chainID = "" // TODO - - priv1 = crypto.GenPrivKeyEd25519() - addr1 = priv1.PubKey().Address() - addr2 = crypto.GenPrivKeyEd25519().PubKey().Address() - coins = sdk.Coins{{"foocoin", 10}} - fee = auth.StdFee{ - sdk.Coins{{"foocoin", 0}}, - 1000000, - } - - sendMsg = bank.MsgSend{ - Inputs: []bank.Input{bank.NewInput(addr1, coins)}, - Outputs: []bank.Output{bank.NewOutput(addr2, coins)}, - } - - quizMsg1 = cool.MsgQuiz{ - Sender: addr1, - CoolAnswer: "icecold", - } - - quizMsg2 = cool.MsgQuiz{ - Sender: addr1, - CoolAnswer: "badvibesonly", - } - - setTrendMsg1 = cool.MsgSetTrend{ - Sender: addr1, - Cool: "icecold", - } - - setTrendMsg2 = cool.MsgSetTrend{ - Sender: addr1, - Cool: "badvibesonly", - } - - setTrendMsg3 = cool.MsgSetTrend{ - Sender: addr1, - Cool: "warmandkind", - } -) - -func loggerAndDB() (log.Logger, dbm.DB) { +func TestGenesis(t *testing.T) { logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") db := dbm.NewMemDB() - return logger, db -} - -func newDemocoinApp() *DemocoinApp { - logger, db := loggerAndDB() - return NewDemocoinApp(logger, db) -} - -//_______________________________________________________________________ - -func TestMsgs(t *testing.T) { - bapp := newDemocoinApp() - - msgs := []struct { - msg sdk.Msg - }{ - {sendMsg}, - {quizMsg1}, - {setTrendMsg1}, - } - - sequences := []int64{0} - for i, m := range msgs { - sig := priv1.Sign(auth.StdSignBytes(chainID, sequences, fee, m.msg)) - tx := auth.NewStdTx(m.msg, fee, []auth.StdSignature{{ - PubKey: priv1.PubKey(), - Signature: sig, - }}) - - // just marshal/unmarshal! - txBytes, err := bapp.cdc.MarshalBinary(tx) - require.NoError(t, err, "i: %v", i) - - // Run a Check - cres := bapp.CheckTx(txBytes) - assert.Equal(t, sdk.CodeUnknownAddress, - sdk.CodeType(cres.Code), "i: %v, log: %v", i, cres.Log) - - // Simulate a Block - bapp.BeginBlock(abci.RequestBeginBlock{}) - dres := bapp.DeliverTx(txBytes) - assert.Equal(t, sdk.CodeUnknownAddress, - sdk.CodeType(dres.Code), "i: %v, log: %v", i, dres.Log) - } -} - -func TestGenesis(t *testing.T) { - logger, db := loggerAndDB() bapp := NewDemocoinApp(logger, db) // Construct some genesis bytes to reflect democoin/types/AppAccount @@ -156,272 +59,3 @@ func TestGenesis(t *testing.T) { res1 = bapp.accountMapper.GetAccount(ctx, baseAcc.Address) assert.Equal(t, acc, res1) } - -func TestMsgSendWithAccounts(t *testing.T) { - bapp := newDemocoinApp() - - // Construct some genesis bytes to reflect democoin/types/AppAccount - // Give 77 foocoin to the first key - coins, err := sdk.ParseCoins("77foocoin") - require.Nil(t, err) - baseAcc := auth.BaseAccount{ - Address: addr1, - Coins: coins, - } - acc1 := &types.AppAccount{baseAcc, "foobart"} - - // Construct genesis state - genesisState := map[string]interface{}{ - "accounts": []*types.GenesisAccount{ - types.NewGenesisAccount(acc1), - }, - "cool": map[string]string{ - "trend": "ice-cold", - }, - } - stateBytes, err := json.MarshalIndent(genesisState, "", "\t") - require.Nil(t, err) - - // Initialize the chain - vals := []abci.Validator{} - bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) - bapp.Commit() - - // A checkTx context (true) - ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) - res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, acc1, res1) - - // Sign the tx - sequences := []int64{0} - sig := priv1.Sign(auth.StdSignBytes(chainID, sequences, fee, sendMsg)) - tx := auth.NewStdTx(sendMsg, fee, []auth.StdSignature{{ - PubKey: priv1.PubKey(), - Signature: sig, - }}) - - // Run a Check - res := bapp.Check(tx) - assert.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - - // Simulate a Block - bapp.BeginBlock(abci.RequestBeginBlock{}) - res = bapp.Deliver(tx) - assert.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - - // Check balances - ctxDeliver := bapp.BaseApp.NewContext(false, abci.Header{}) - res2 := bapp.accountMapper.GetAccount(ctxDeliver, addr1) - res3 := bapp.accountMapper.GetAccount(ctxDeliver, addr2) - assert.Equal(t, fmt.Sprintf("%v", res2.GetCoins()), "67foocoin") - assert.Equal(t, fmt.Sprintf("%v", res3.GetCoins()), "10foocoin") - - // Delivering again should cause replay error - res = bapp.Deliver(tx) - assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeInvalidSequence), sdk.ABCICodeType(res.Code), res.Log) - - // bumping the txnonce number without resigning should be an auth error - tx.Signatures[0].Sequence = 1 - res = bapp.Deliver(tx) - assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), sdk.ABCICodeType(res.Code), res.Log) - - // resigning the tx with the bumped sequence should work - sequences = []int64{1} - sig = priv1.Sign(auth.StdSignBytes(chainID, sequences, fee, tx.Msg)) - tx.Signatures[0].Signature = sig - res = bapp.Deliver(tx) - assert.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) -} - -func TestMsgMine(t *testing.T) { - bapp := newDemocoinApp() - - // Construct genesis state - // Construct some genesis bytes to reflect democoin/types/AppAccount - baseAcc := auth.BaseAccount{ - Address: addr1, - Coins: nil, - } - acc1 := &types.AppAccount{baseAcc, "foobart"} - - // Construct genesis state - genesisState := map[string]interface{}{ - "accounts": []*types.GenesisAccount{ - types.NewGenesisAccount(acc1), - }, - "cool": map[string]string{ - "trend": "ice-cold", - }, - "pow": map[string]uint64{ - "difficulty": 1, - "count": 0, - }, - } - stateBytes, err := json.MarshalIndent(genesisState, "", "\t") - require.Nil(t, err) - - // Initialize the chain (nil) - vals := []abci.Validator{} - bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) - bapp.Commit() - - // A checkTx context (true) - ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) - res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, acc1, res1) - - // Mine and check for reward - mineMsg1 := pow.GenerateMsgMine(addr1, 1, 2) - SignCheckDeliver(t, bapp, mineMsg1, 0, true) - CheckBalance(t, bapp, "1pow") - // Mine again and check for reward - mineMsg2 := pow.GenerateMsgMine(addr1, 2, 3) - SignCheckDeliver(t, bapp, mineMsg2, 1, true) - CheckBalance(t, bapp, "2pow") - // Mine again - should be invalid - SignCheckDeliver(t, bapp, mineMsg2, 1, false) - CheckBalance(t, bapp, "2pow") - -} - -func TestMsgQuiz(t *testing.T) { - bapp := newDemocoinApp() - - // Construct genesis state - // Construct some genesis bytes to reflect democoin/types/AppAccount - baseAcc := auth.BaseAccount{ - Address: addr1, - Coins: nil, - } - acc1 := &types.AppAccount{baseAcc, "foobart"} - - // Construct genesis state - genesisState := map[string]interface{}{ - "accounts": []*types.GenesisAccount{ - types.NewGenesisAccount(acc1), - }, - "cool": map[string]string{ - "trend": "ice-cold", - }, - } - stateBytes, err := json.MarshalIndent(genesisState, "", "\t") - require.Nil(t, err) - - // Initialize the chain (nil) - vals := []abci.Validator{} - bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) - bapp.Commit() - - // A checkTx context (true) - ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) - res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, acc1, res1) - - // Set the trend, submit a really cool quiz and check for reward - SignCheckDeliver(t, bapp, setTrendMsg1, 0, true) - SignCheckDeliver(t, bapp, quizMsg1, 1, true) - CheckBalance(t, bapp, "69icecold") - SignCheckDeliver(t, bapp, quizMsg2, 2, false) // result without reward - CheckBalance(t, bapp, "69icecold") - SignCheckDeliver(t, bapp, quizMsg1, 3, true) - CheckBalance(t, bapp, "138icecold") - SignCheckDeliver(t, bapp, setTrendMsg2, 4, true) // reset the trend - SignCheckDeliver(t, bapp, quizMsg1, 5, false) // the same answer will nolonger do! - CheckBalance(t, bapp, "138icecold") - SignCheckDeliver(t, bapp, quizMsg2, 6, true) // earlier answer now relavent again - CheckBalance(t, bapp, "69badvibesonly,138icecold") - SignCheckDeliver(t, bapp, setTrendMsg3, 7, false) // expect to fail to set the trend to something which is not cool - -} - -func TestHandler(t *testing.T) { - bapp := newDemocoinApp() - - sourceChain := "source-chain" - destChain := "dest-chain" - - vals := []abci.Validator{} - baseAcc := auth.BaseAccount{ - Address: addr1, - Coins: coins, - } - acc1 := &types.AppAccount{baseAcc, "foobart"} - genesisState := map[string]interface{}{ - "accounts": []*types.GenesisAccount{ - types.NewGenesisAccount(acc1), - }, - "cool": map[string]string{ - "trend": "ice-cold", - }, - } - stateBytes, err := json.MarshalIndent(genesisState, "", "\t") - require.Nil(t, err) - bapp.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes}) - bapp.Commit() - - // A checkTx context (true) - ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) - res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) - assert.Equal(t, acc1, res1) - - packet := ibc.IBCPacket{ - SrcAddr: addr1, - DestAddr: addr1, - Coins: coins, - SrcChain: sourceChain, - DestChain: destChain, - } - - transferMsg := ibc.IBCTransferMsg{ - IBCPacket: packet, - } - - receiveMsg := ibc.IBCReceiveMsg{ - IBCPacket: packet, - Relayer: addr1, - Sequence: 0, - } - - SignCheckDeliver(t, bapp, transferMsg, 0, true) - CheckBalance(t, bapp, "") - SignCheckDeliver(t, bapp, transferMsg, 1, false) - SignCheckDeliver(t, bapp, receiveMsg, 2, true) - CheckBalance(t, bapp, "10foocoin") - SignCheckDeliver(t, bapp, receiveMsg, 3, false) -} - -// TODO describe the use of this function -func SignCheckDeliver(t *testing.T, bapp *DemocoinApp, msg sdk.Msg, seq int64, expPass bool) { - - // Sign the tx - tx := auth.NewStdTx(msg, fee, []auth.StdSignature{{ - PubKey: priv1.PubKey(), - Signature: priv1.Sign(auth.StdSignBytes(chainID, []int64{seq}, fee, msg)), - Sequence: seq, - }}) - - // Run a Check - res := bapp.Check(tx) - if expPass { - require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - } else { - require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) - } - - // Simulate a Block - bapp.BeginBlock(abci.RequestBeginBlock{}) - res = bapp.Deliver(tx) - if expPass { - require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - } else { - require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) - } - bapp.EndBlock(abci.RequestEndBlock{}) - //bapp.Commit() -} - -func CheckBalance(t *testing.T, bapp *DemocoinApp, balExpected string) { - ctxDeliver := bapp.BaseApp.NewContext(false, abci.Header{}) - res2 := bapp.accountMapper.GetAccount(ctxDeliver, addr1) - assert.Equal(t, balExpected, fmt.Sprintf("%v", res2.GetCoins())) -} From 42def02ae93b5a6d2c9af0b4e244a43723e78534 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Fri, 8 Jun 2018 10:03:37 -0700 Subject: [PATCH 204/548] pr comments --- CHANGELOG.md | 2 +- examples/basecoin/app/app_test.go | 4 +--- x/auth/mock/auth_app_test.go | 16 ---------------- 3 files changed, 2 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bcdcf73020..f8157594ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,10 +6,10 @@ FEATURES IMPROVEMENTS * export command now writes current validator set for Tendermint +* [tests] Application module tests now use a mock application FIXES * [lcd] Switch to bech32 for addresses on all human readable inputs and outputs -* [lcd] Switch to bech32 for addresses on all human readable inputs and outputs ## 0.18.0 diff --git a/examples/basecoin/app/app_test.go b/examples/basecoin/app/app_test.go index 521516d472..23bc531c03 100644 --- a/examples/basecoin/app/app_test.go +++ b/examples/basecoin/app/app_test.go @@ -19,12 +19,10 @@ import ( "github.com/tendermint/tmlibs/log" ) -var accName = "foobart" - func setGenesis(bapp *BasecoinApp, accs ...auth.BaseAccount) error { genaccs := make([]*types.GenesisAccount, len(accs)) for i, acc := range accs { - genaccs[i] = types.NewGenesisAccount(&types.AppAccount{acc, accName}) + genaccs[i] = types.NewGenesisAccount(&types.AppAccount{acc, "foobart"}) } genesisState := types.GenesisState{ diff --git a/x/auth/mock/auth_app_test.go b/x/auth/mock/auth_app_test.go index a3ff6710ee..641c8a3665 100644 --- a/x/auth/mock/auth_app_test.go +++ b/x/auth/mock/auth_app_test.go @@ -1,7 +1,6 @@ package mock import ( - "fmt" "testing" "github.com/stretchr/testify/assert" @@ -42,70 +41,55 @@ func getMockApp(t *testing.T) *App { } func TestMsgChangePubKey(t *testing.T) { - fmt.Println("wackydebugoutput TestMsgChangePubKey 0") mapp := getMockApp(t) // Construct some genesis bytes to reflect basecoin/types/AppAccount // Give 77 foocoin to the first key coins := sdk.Coins{{"foocoin", 77}} - fmt.Println("wackydebugoutput TestMsgChangePubKey 1") acc1 := &auth.BaseAccount{ Address: addr1, Coins: coins, } - fmt.Println("wackydebugoutput TestMsgChangePubKey 3") accs := []auth.Account{acc1} - fmt.Println("wackydebugoutput TestMsgChangePubKey 4") // Construct genesis state SetGenesis(mapp, accs) // A checkTx context (true) ctxCheck := mapp.BaseApp.NewContext(true, abci.Header{}) - fmt.Println("wackydebugoutput TestMsgChangePubKey 5") res1 := mapp.AccountMapper.GetAccount(ctxCheck, addr1) assert.Equal(t, acc1, res1.(*auth.BaseAccount)) // Run a CheckDeliver SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, true, priv1) - fmt.Println("wackydebugoutput TestMsgChangePubKey 6") // Check balances CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 67}}) - fmt.Println("wackydebugoutput TestMsgChangePubKey 7") CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 10}}) - fmt.Println("wackydebugoutput TestMsgChangePubKey 8") changePubKeyMsg := auth.MsgChangeKey{ Address: addr1, NewPubKey: priv2.PubKey(), } - fmt.Println("wackydebugoutput TestMsgChangePubKey 10") ctxDeliver := mapp.BaseApp.NewContext(false, abci.Header{}) - fmt.Println("wackydebugoutput TestMsgChangePubKey 11") acc2 := mapp.AccountMapper.GetAccount(ctxDeliver, addr1) // send a MsgChangePubKey SignCheckDeliver(t, mapp.BaseApp, changePubKeyMsg, []int64{1}, true, priv1) - fmt.Println("wackydebugoutput TestMsgChangePubKey 12") acc2 = mapp.AccountMapper.GetAccount(ctxDeliver, addr1) assert.True(t, priv2.PubKey().Equals(acc2.GetPubKey())) // signing a SendMsg with the old privKey should be an auth error tx := GenTx(sendMsg1, []int64{2}, priv1) - fmt.Println("wackydebugoutput TestMsgChangePubKey 13") res := mapp.Deliver(tx) assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), res.Code, res.Log) // resigning the tx with the new correct priv key should work SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{2}, true, priv2) - fmt.Println("wackydebugoutput TestMsgChangePubKey 14") // Check balances CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 57}}) - fmt.Println("wackydebugoutput TestMsgChangePubKey 15") CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 20}}) - fmt.Println("wackydebugoutput TestMsgChangePubKey 16") } From 17948ccf0411f9ea685651d68a6f21cbfe6e56b2 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Fri, 8 Jun 2018 11:28:07 -0700 Subject: [PATCH 205/548] auth-mock simulate block now commits, stake app_test cleanup --- baseapp/baseapp.go | 5 +- x/auth/mock/auth_app_test.go | 2 + x/auth/mock/simulate_block.go | 32 ++++++------- x/bank/app_test.go | 1 + x/stake/app_test.go | 89 ++++++++++++++++++----------------- 5 files changed, 70 insertions(+), 59 deletions(-) diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 4d32b92f5c..0664f18eba 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -237,7 +237,10 @@ func (app *BaseApp) NewContext(isCheckTx bool, header abci.Header) sdk.Context { if isCheckTx { return sdk.NewContext(app.checkState.ms, header, true, nil, app.Logger) } - return sdk.NewContext(app.deliverState.ms, header, false, nil, app.Logger) + aa := app.deliverState + a := aa.ms + b := app.Logger + return sdk.NewContext(a, header, false, nil, b) } type state struct { diff --git a/x/auth/mock/auth_app_test.go b/x/auth/mock/auth_app_test.go index 641c8a3665..716037d600 100644 --- a/x/auth/mock/auth_app_test.go +++ b/x/auth/mock/auth_app_test.go @@ -72,6 +72,7 @@ func TestMsgChangePubKey(t *testing.T) { NewPubKey: priv2.PubKey(), } + mapp.BeginBlock(abci.RequestBeginBlock{}) ctxDeliver := mapp.BaseApp.NewContext(false, abci.Header{}) acc2 := mapp.AccountMapper.GetAccount(ctxDeliver, addr1) @@ -82,6 +83,7 @@ func TestMsgChangePubKey(t *testing.T) { assert.True(t, priv2.PubKey().Equals(acc2.GetPubKey())) // signing a SendMsg with the old privKey should be an auth error + mapp.BeginBlock(abci.RequestBeginBlock{}) tx := GenTx(sendMsg1, []int64{2}, priv1) res := mapp.Deliver(tx) assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), res.Code, res.Log) diff --git a/x/auth/mock/simulate_block.go b/x/auth/mock/simulate_block.go index cf0c303a3f..f8be0c65a3 100644 --- a/x/auth/mock/simulate_block.go +++ b/x/auth/mock/simulate_block.go @@ -27,8 +27,8 @@ func SetGenesis(app *App, accs []auth.Account) { // check an account balance func CheckBalance(t *testing.T, app *App, addr sdk.Address, exp sdk.Coins) { - ctxDeliver := app.BaseApp.NewContext(false, abci.Header{}) - res := app.AccountMapper.GetAccount(ctxDeliver, addr) + ctxCheck := app.BaseApp.NewContext(true, abci.Header{}) + res := app.AccountMapper.GetAccount(ctxCheck, addr) assert.Equal(t, exp, res.GetCoins()) } @@ -77,25 +77,25 @@ func SignCheckDeliver(t *testing.T, app *baseapp.BaseApp, msg sdk.Msg, seq []int app.EndBlock(abci.RequestEndBlock{}) // XXX fix code or add explaination as to why using commit breaks a bunch of these tests - //app.Commit() + app.Commit() } // XXX the only reason we are using Sign Deliver here is because the tests // break on check tx the second time you use SignCheckDeliver in a test because // the checktx state has not been updated likely because commit is not being // called! -func SignDeliver(t *testing.T, app *baseapp.BaseApp, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { +//func SignDeliver(t *testing.T, app *baseapp.BaseApp, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { - // Sign the tx - tx := GenTx(msg, seq, priv...) +//// Sign the tx +//tx := GenTx(msg, seq, priv...) - // Simulate a Block - app.BeginBlock(abci.RequestBeginBlock{}) - res := app.Deliver(tx) - if expPass { - require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) - } else { - require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) - } - app.EndBlock(abci.RequestEndBlock{}) -} +//// Simulate a Block +//app.BeginBlock(abci.RequestBeginBlock{}) +//res := app.Deliver(tx) +//if expPass { +//require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) +//} else { +//require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) +//} +//app.EndBlock(abci.RequestEndBlock{}) +//} diff --git a/x/bank/app_test.go b/x/bank/app_test.go index 507f9e3f89..21d7d03a03 100644 --- a/x/bank/app_test.go +++ b/x/bank/app_test.go @@ -117,6 +117,7 @@ func TestMsgSendWithAccounts(t *testing.T) { mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, false, priv1) // bumping the txnonce number without resigning should be an auth error + mapp.BeginBlock(abci.RequestBeginBlock{}) tx := mock.GenTx(sendMsg1, []int64{0}, priv1) tx.Signatures[0].Sequence = 1 res := mapp.Deliver(tx) diff --git a/x/stake/app_test.go b/x/stake/app_test.go index 4e3d1f422e..8e20633a02 100644 --- a/x/stake/app_test.go +++ b/x/stake/app_test.go @@ -7,6 +7,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/auth/mock" "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" abci "github.com/tendermint/abci/types" @@ -65,6 +66,30 @@ func getInitChainer(mapp *mock.App, keeper Keeper) sdk.InitChainer { } } +//__________________________________________________________________________________________ + +func checkValidator(t *testing.T, mapp *mock.App, keeper Keeper, + addr sdk.Address, expFound bool) Validator { + + ctxCheck := mapp.BaseApp.NewContext(true, abci.Header{}) + validator, found := keeper.GetValidator(ctxCheck, addr1) + assert.Equal(t, expFound, found) + return validator +} + +func checkDelegation(t *testing.T, mapp *mock.App, keeper Keeper, delegatorAddr, + validatorAddr sdk.Address, expFound bool, expShares sdk.Rat) { + + ctxCheck := mapp.BaseApp.NewContext(true, abci.Header{}) + delegation, found := keeper.GetDelegation(ctxCheck, delegatorAddr, validatorAddr) + if expFound { + assert.True(t, found) + assert.True(sdk.RatEq(t, expShares, delegation.Shares)) + return + } + assert.False(t, found) +} + func TestStakeMsgs(t *testing.T) { mapp, keeper := getMockApp(t) @@ -82,14 +107,10 @@ func TestStakeMsgs(t *testing.T) { accs := []auth.Account{acc1, acc2} mock.SetGenesis(mapp, accs) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{genCoin}) + mock.CheckBalance(t, mapp, addr2, sdk.Coins{genCoin}) - // A checkTx context (true) - ctxCheck := mapp.BaseApp.NewContext(true, abci.Header{}) - res1 := mapp.AccountMapper.GetAccount(ctxCheck, addr1) - res2 := mapp.AccountMapper.GetAccount(ctxCheck, addr2) - require.Equal(t, acc1, res1) - require.Equal(t, acc2, res2) - + //////////////////// // Create Validator description := NewDescription("foo_moniker", "", "", "") @@ -97,56 +118,40 @@ func TestStakeMsgs(t *testing.T) { addr1, priv1.PubKey(), bondCoin, description, ) mock.SignCheckDeliver(t, mapp.BaseApp, createValidatorMsg, []int64{0}, true, priv1) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{genCoin.Minus(bondCoin)}) + mapp.BeginBlock(abci.RequestBeginBlock{}) - ctxDeliver := mapp.BaseApp.NewContext(false, abci.Header{}) - res1 = mapp.AccountMapper.GetAccount(ctxDeliver, addr1) - require.Equal(t, sdk.Coins{genCoin.Minus(bondCoin)}, res1.GetCoins()) - validator, found := keeper.GetValidator(ctxDeliver, addr1) - require.True(t, found) + validator := checkValidator(t, mapp, keeper, addr1, true) require.Equal(t, addr1, validator.Owner) require.Equal(t, sdk.Bonded, validator.Status()) require.True(sdk.RatEq(t, sdk.NewRat(10), validator.PoolShares.Bonded())) // check the bond that should have been created as well - bond, found := keeper.GetDelegation(ctxDeliver, addr1, addr1) - require.True(sdk.RatEq(t, sdk.NewRat(10), bond.Shares)) + checkDelegation(t, mapp, keeper, addr1, addr1, true, sdk.NewRat(10)) + //////////////////// // Edit Validator description = NewDescription("bar_moniker", "", "", "") - editValidatorMsg := NewMsgEditValidator( - addr1, description, - ) - mock.SignDeliver(t, mapp.BaseApp, editValidatorMsg, []int64{1}, true, priv1) - - validator, found = keeper.GetValidator(ctxDeliver, addr1) - require.True(t, found) + editValidatorMsg := NewMsgEditValidator(addr1, description) + mock.SignCheckDeliver(t, mapp.BaseApp, editValidatorMsg, []int64{1}, true, priv1) + validator = checkValidator(t, mapp, keeper, addr1, true) require.Equal(t, description, validator.Description) + //////////////////// // Delegate - delegateMsg := NewMsgDelegate( - addr2, addr1, bondCoin, - ) - mock.SignDeliver(t, mapp.BaseApp, delegateMsg, []int64{0}, true, priv2) - - res2 = mapp.AccountMapper.GetAccount(ctxDeliver, addr2) - require.Equal(t, sdk.Coins{genCoin.Minus(bondCoin)}, res2.GetCoins()) - bond, found = keeper.GetDelegation(ctxDeliver, addr2, addr1) - require.True(t, found) - require.Equal(t, addr2, bond.DelegatorAddr) - require.Equal(t, addr1, bond.ValidatorAddr) - require.True(sdk.RatEq(t, sdk.NewRat(10), bond.Shares)) + mock.CheckBalance(t, mapp, addr2, sdk.Coins{genCoin}) + delegateMsg := NewMsgDelegate(addr2, addr1, bondCoin) + mock.SignCheckDeliver(t, mapp.BaseApp, delegateMsg, []int64{0}, true, priv2) + mock.CheckBalance(t, mapp, addr2, sdk.Coins{genCoin.Minus(bondCoin)}) + checkDelegation(t, mapp, keeper, addr2, addr1, true, sdk.NewRat(10)) + //////////////////// // Unbond - unbondMsg := NewMsgUnbond( - addr2, addr1, "MAX", - ) - mock.SignDeliver(t, mapp.BaseApp, unbondMsg, []int64{1}, true, priv2) - - res2 = mapp.AccountMapper.GetAccount(ctxDeliver, addr2) - require.Equal(t, sdk.Coins{genCoin}, res2.GetCoins()) - _, found = keeper.GetDelegation(ctxDeliver, addr2, addr1) - require.False(t, found) + unbondMsg := NewMsgUnbond(addr2, addr1, "MAX") + mock.SignCheckDeliver(t, mapp.BaseApp, unbondMsg, []int64{1}, true, priv2) + mock.CheckBalance(t, mapp, addr2, sdk.Coins{genCoin}) + checkDelegation(t, mapp, keeper, addr2, addr1, false, sdk.Rat{}) } From 6af81fc62e54246b7ad45ca30b5b6d1fdd3baa51 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Fri, 8 Jun 2018 13:13:51 -0700 Subject: [PATCH 206/548] cleanup --- baseapp/baseapp.go | 5 +---- x/auth/mock/simulate_block.go | 21 --------------------- 2 files changed, 1 insertion(+), 25 deletions(-) diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 0664f18eba..4d32b92f5c 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -237,10 +237,7 @@ func (app *BaseApp) NewContext(isCheckTx bool, header abci.Header) sdk.Context { if isCheckTx { return sdk.NewContext(app.checkState.ms, header, true, nil, app.Logger) } - aa := app.deliverState - a := aa.ms - b := app.Logger - return sdk.NewContext(a, header, false, nil, b) + return sdk.NewContext(app.deliverState.ms, header, false, nil, app.Logger) } type state struct { diff --git a/x/auth/mock/simulate_block.go b/x/auth/mock/simulate_block.go index f8be0c65a3..72ec8411fa 100644 --- a/x/auth/mock/simulate_block.go +++ b/x/auth/mock/simulate_block.go @@ -76,26 +76,5 @@ func SignCheckDeliver(t *testing.T, app *baseapp.BaseApp, msg sdk.Msg, seq []int } app.EndBlock(abci.RequestEndBlock{}) - // XXX fix code or add explaination as to why using commit breaks a bunch of these tests app.Commit() } - -// XXX the only reason we are using Sign Deliver here is because the tests -// break on check tx the second time you use SignCheckDeliver in a test because -// the checktx state has not been updated likely because commit is not being -// called! -//func SignDeliver(t *testing.T, app *baseapp.BaseApp, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { - -//// Sign the tx -//tx := GenTx(msg, seq, priv...) - -//// Simulate a Block -//app.BeginBlock(abci.RequestBeginBlock{}) -//res := app.Deliver(tx) -//if expPass { -//require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) -//} else { -//require.NotEqual(t, sdk.ABCICodeOK, res.Code, res.Log) -//} -//app.EndBlock(abci.RequestEndBlock{}) -//} From 5ddcf23aca71a2adb13051c900b3dd6c65559b26 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Fri, 8 Jun 2018 21:34:26 -0700 Subject: [PATCH 207/548] update godep --- Gopkg.lock | 38 +++++++++----------------------------- Gopkg.toml | 6 +----- 2 files changed, 10 insertions(+), 34 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 0e62793003..612e8e3b32 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -256,7 +256,7 @@ "leveldb/table", "leveldb/util" ] - revision = "5d6fca44a948d2be89a9702de7717f0168403d3d" + revision = "e2150783cd35f5b607daca48afd8c57ec54cc995" [[projects]] name = "github.com/tendermint/abci" @@ -267,8 +267,8 @@ "server", "types" ] - revision = "9af8b7a7c87478869f8c280ed9539470b8f470b4" - version = "v0.11.0-rc4" + revision = "ebee2fe114020aa49c70bbbae50b7079fc7e7b90" + version = "v0.11.0" [[projects]] branch = "master" @@ -347,13 +347,8 @@ "types", "version" ] -<<<<<<< HEAD - revision = "b5baab0238c9ec26e3b2d229b0243f9ff9220bdb" - version = "v0.20.0-rc3" -======= - revision = "775fef31c2b8fb7ea36f0d57bae3bfa74d353100" - version = "v0.19.9-rc0" ->>>>>>> master + revision = "27bd1deabe4ba6a2d9b463b8f3e3f1e31b993e61" + version = "v0.20.0" [[projects]] branch = "develop" @@ -368,17 +363,10 @@ "db", "flowrate", "log", -<<<<<<< HEAD "merkle", "merkle/tmhash" ] - revision = "44f1bdb0d55cc6527e38d0a7aab406e2580f56a4" -======= - "merkle" - ] - revision = "692f1d86a6e2c0efa698fd1e4541b68c74ffaf38" - version = "v0.8.4" ->>>>>>> master + revision = "640af0205d98d1f45fb2f912f9c35c8bf816adc9" [[projects]] branch = "master" @@ -394,11 +382,7 @@ "ripemd160", "salsa20/salsa" ] -<<<<<<< HEAD - revision = "5ba7f63082460102a45837dbd1827e10f9479ac0" -======= - revision = "78e79280f680f7dd6b8e48c751887111ebdbcbd8" ->>>>>>> master + revision = "8ac0e0d97ce45cd83d1d7243c060cb8461dda5e9" [[projects]] branch = "master" @@ -418,7 +402,7 @@ branch = "master" name = "golang.org/x/sys" packages = ["unix"] - revision = "c11f84a56e43e20a78cee75a7c034031ecf57d1f" + revision = "9527bec2660bd847c050fda93a0f0c6dee0800bb" [[projects]] name = "golang.org/x/text" @@ -479,10 +463,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 -<<<<<<< HEAD - inputs-digest = "ccb2ab7644a38c2d0326280582f758256e37fc98c3ef0403581e3b85cff42188" -======= - inputs-digest = "71d11bd2a8f3f46ba3fd16759b501ad5b6b48037717d82020ebb25e021b67117" ->>>>>>> master + inputs-digest = "31f69b235b2d8f879a215c9e8ca0919adc62d21f6830b17931a3a0efb058721f" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 141371304a..77de1b78de 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -54,7 +54,7 @@ [[constraint]] name = "github.com/tendermint/abci" - version = "=0.11.0-rc4" + version = "=0.11.0" [[constraint]] name = "github.com/tendermint/go-crypto" @@ -76,10 +76,6 @@ name = "github.com/tendermint/tmlibs" branch = "develop" -[[override]] - name = "github.com/tendermint/tmlibs" - version = "~0.8.4" - # this got updated and broke, so locked to an old working commit ... [[override]] name = "google.golang.org/genproto" From a277ba91c712d5df20e1d9e91e4e5ba0e84d0f4f Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Fri, 8 Jun 2018 21:34:27 -0700 Subject: [PATCH 208/548] Merge PR #1178: Merge master (Tendermint updates) * update to tm v0.19.6 * update tm to 0.17.4 * update for tm v0.19.9 * update godep --- CHANGELOG.md | 19 +++++++++++++++++++ Gopkg.lock | 24 ++++++++++++------------ Gopkg.toml | 4 ++-- client/lcd/lcd_test.go | 2 +- server/init.go | 2 +- server/start.go | 2 +- server/tm_cmds.go | 2 +- 7 files changed, 37 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7a4ae4096..7da9d60d7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -80,6 +80,25 @@ BUG FIXES +## 0.17.5 + +*June 5, 2018* + +Update to Tendermint v0.19.9 (Fix evidence reactor, mempool deadlock, WAL panic, +memory leak) + +## 0.17.4 + +*May 31, 2018* + +Update to Tendermint v0.19.7 (WAL fixes and more) + +## 0.17.3 + +*May 29, 2018* + +Update to Tendermint v0.19.6 (fix fast-sync halt) + ## 0.17.2 _May 20, 2018_ diff --git a/Gopkg.lock b/Gopkg.lock index 3e7d8c9d98..612e8e3b32 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -170,8 +170,8 @@ [[projects]] name = "github.com/pelletier/go-toml" packages = ["."] - revision = "acdc4509485b587f5e675510c4f2c63e90ff68a8" - version = "v1.1.0" + revision = "c01d1270ff3e442a8a57cddc1c92dc1138598194" + version = "v1.2.0" [[projects]] name = "github.com/pkg/errors" @@ -256,7 +256,7 @@ "leveldb/table", "leveldb/util" ] - revision = "5d6fca44a948d2be89a9702de7717f0168403d3d" + revision = "e2150783cd35f5b607daca48afd8c57ec54cc995" [[projects]] name = "github.com/tendermint/abci" @@ -267,8 +267,8 @@ "server", "types" ] - revision = "9af8b7a7c87478869f8c280ed9539470b8f470b4" - version = "v0.11.0-rc4" + revision = "ebee2fe114020aa49c70bbbae50b7079fc7e7b90" + version = "v0.11.0" [[projects]] branch = "master" @@ -330,6 +330,7 @@ "p2p/conn", "p2p/pex", "p2p/upnp", + "privval", "proxy", "rpc/client", "rpc/core", @@ -344,11 +345,10 @@ "state/txindex/kv", "state/txindex/null", "types", - "types/priv_validator", "version" ] - revision = "b5baab0238c9ec26e3b2d229b0243f9ff9220bdb" - version = "v0.20.0-rc3" + revision = "27bd1deabe4ba6a2d9b463b8f3e3f1e31b993e61" + version = "v0.20.0" [[projects]] branch = "develop" @@ -366,7 +366,7 @@ "merkle", "merkle/tmhash" ] - revision = "44f1bdb0d55cc6527e38d0a7aab406e2580f56a4" + revision = "640af0205d98d1f45fb2f912f9c35c8bf816adc9" [[projects]] branch = "master" @@ -382,7 +382,7 @@ "ripemd160", "salsa20/salsa" ] - revision = "5ba7f63082460102a45837dbd1827e10f9479ac0" + revision = "8ac0e0d97ce45cd83d1d7243c060cb8461dda5e9" [[projects]] branch = "master" @@ -402,7 +402,7 @@ branch = "master" name = "golang.org/x/sys" packages = ["unix"] - revision = "c11f84a56e43e20a78cee75a7c034031ecf57d1f" + revision = "9527bec2660bd847c050fda93a0f0c6dee0800bb" [[projects]] name = "golang.org/x/text" @@ -463,6 +463,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "ccb2ab7644a38c2d0326280582f758256e37fc98c3ef0403581e3b85cff42188" + inputs-digest = "31f69b235b2d8f879a215c9e8ca0919adc62d21f6830b17931a3a0efb058721f" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 05b14be60c..77de1b78de 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -54,7 +54,7 @@ [[constraint]] name = "github.com/tendermint/abci" - version = "=0.11.0-rc4" + version = "=0.11.0" [[constraint]] name = "github.com/tendermint/go-crypto" @@ -70,7 +70,7 @@ [[constraint]] name = "github.com/tendermint/tendermint" - version = "=0.20.0-rc3" + version = "=0.20.0" [[override]] name = "github.com/tendermint/tmlibs" diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 47df51e7e3..076b422625 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -26,7 +26,7 @@ import ( ctypes "github.com/tendermint/tendermint/rpc/core/types" tmrpc "github.com/tendermint/tendermint/rpc/lib/server" tmtypes "github.com/tendermint/tendermint/types" - pvm "github.com/tendermint/tendermint/types/priv_validator" + pvm "github.com/tendermint/tendermint/privval" "github.com/tendermint/tmlibs/cli" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" diff --git a/server/init.go b/server/init.go index 68a1709bc8..512751bed0 100644 --- a/server/init.go +++ b/server/init.go @@ -20,7 +20,7 @@ import ( cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/p2p" tmtypes "github.com/tendermint/tendermint/types" - pvm "github.com/tendermint/tendermint/types/priv_validator" + pvm "github.com/tendermint/tendermint/privval" tmcli "github.com/tendermint/tmlibs/cli" cmn "github.com/tendermint/tmlibs/common" dbm "github.com/tendermint/tmlibs/db" diff --git a/server/start.go b/server/start.go index 23e38749be..9bf2d30cdb 100644 --- a/server/start.go +++ b/server/start.go @@ -10,7 +10,7 @@ import ( tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" "github.com/tendermint/tendermint/node" "github.com/tendermint/tendermint/proxy" - pvm "github.com/tendermint/tendermint/types/priv_validator" + pvm "github.com/tendermint/tendermint/privval" cmn "github.com/tendermint/tmlibs/common" ) diff --git a/server/tm_cmds.go b/server/tm_cmds.go index 60eb5a2fa6..7dccaf5319 100644 --- a/server/tm_cmds.go +++ b/server/tm_cmds.go @@ -10,7 +10,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" "github.com/tendermint/tendermint/p2p" - pvm "github.com/tendermint/tendermint/types/priv_validator" + pvm "github.com/tendermint/tendermint/privval" ) // ShowNodeIDCmd - ported from Tendermint, dump node ID to stdout From 9c4bbf7dfda0a80e6bced24294985e6dd0ae5717 Mon Sep 17 00:00:00 2001 From: Dev Ojha Date: Fri, 8 Jun 2018 23:40:22 -0700 Subject: [PATCH 209/548] Merge PR #1195: gaiacli - Add error message for when account isn't found --- CHANGELOG.md | 1 + x/auth/client/cli/account.go | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7da9d60d7d..79432a9713 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ FEATURES IMPROVEMENTS * export command now writes current validator set for Tendermint * [tests] Application module tests now use a mock application +* [gaiacli] Fix error message when account isn't found when running gaiacli account FIXES * [lcd] Switch to bech32 for addresses on all human readable inputs and outputs diff --git a/x/auth/client/cli/account.go b/x/auth/client/cli/account.go index b5af6a686a..e82b074148 100644 --- a/x/auth/client/cli/account.go +++ b/x/auth/client/cli/account.go @@ -52,6 +52,12 @@ func GetAccountCmd(storeName string, cdc *wire.Codec, decoder auth.AccountDecode return err } + // Check if account was found + if res == nil { + return sdk.ErrUnknownAddress("No account with address " + addr + + " was found in the state.\nAre you sure there has been a transaction involving it?") + } + // decode the value account, err := decoder(res) if err != nil { From d47b7cf5fa822daca1f0a4afcdbd372a4d8348dc Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Sat, 9 Jun 2018 06:44:08 +0200 Subject: [PATCH 210/548] Add --gas flag to specify gas limit for a transaction --- CHANGELOG.md | 1 + client/context/helpers.go | 2 +- client/context/types.go | 7 +++++++ client/context/viper.go | 1 + client/flags.go | 2 ++ client/lcd/lcd_test.go | 3 ++- 6 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79432a9713..71a8faa626 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ IMPROVEMENTS FIXES * [lcd] Switch to bech32 for addresses on all human readable inputs and outputs +* [cli] Added `--gas` flag to specify transaction gas limit ## 0.18.0 diff --git a/client/context/helpers.go b/client/context/helpers.go index f47cc7ff41..880c4adb37 100644 --- a/client/context/helpers.go +++ b/client/context/helpers.go @@ -114,7 +114,7 @@ func (ctx CoreContext) SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *w ChainID: chainID, Sequences: []int64{sequence}, Msg: msg, - Fee: auth.NewStdFee(10000, sdk.Coin{}), // TODO run simulate to estimate gas? + Fee: auth.NewStdFee(ctx.Gas, sdk.Coin{}), // TODO run simulate to estimate gas? } keybase, err := keys.GetKeyBase() diff --git a/client/context/types.go b/client/context/types.go index da15b32936..e9c97ffbc7 100644 --- a/client/context/types.go +++ b/client/context/types.go @@ -10,6 +10,7 @@ import ( type CoreContext struct { ChainID string Height int64 + Gas int64 TrustNode bool NodeURI string FromAddressName string @@ -31,6 +32,12 @@ func (c CoreContext) WithHeight(height int64) CoreContext { return c } +// WithGas - return a copy of the context with an updated gas +func (c CoreContext) WithGas(gas int64) CoreContext { + c.Gas = gas + return c +} + // WithTrustNode - return a copy of the context with an updated TrustNode flag func (c CoreContext) WithTrustNode(trustNode bool) CoreContext { c.TrustNode = trustNode diff --git a/client/context/viper.go b/client/context/viper.go index 4b3007f12a..081c9f5c28 100644 --- a/client/context/viper.go +++ b/client/context/viper.go @@ -30,6 +30,7 @@ func NewCoreContextFromViper() CoreContext { return CoreContext{ ChainID: chainID, Height: viper.GetInt64(client.FlagHeight), + Gas: viper.GetInt64(client.FlagGas), TrustNode: viper.GetBool(client.FlagTrustNode), FromAddressName: viper.GetString(client.FlagName), NodeURI: nodeURI, diff --git a/client/flags.go b/client/flags.go index ceaf5a3a9d..aacd4ba1d3 100644 --- a/client/flags.go +++ b/client/flags.go @@ -7,6 +7,7 @@ const ( FlagChainID = "chain-id" FlagNode = "node" FlagHeight = "height" + FlagGas = "gas" FlagTrustNode = "trust-node" FlagName = "name" FlagSequence = "sequence" @@ -25,6 +26,7 @@ func GetCommands(cmds ...*cobra.Command) []*cobra.Command { c.Flags().String(FlagChainID, "", "Chain ID of tendermint node") c.Flags().String(FlagNode, "tcp://localhost:46657", ": to tendermint rpc interface for this chain") c.Flags().Int64(FlagHeight, 0, "block height to query, omit to get most recent provable block") + c.Flags().Int64(FlagGas, 200000, "gas limit to set per-transaction") } return cmds } diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 076b422625..59f5b24646 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -22,11 +22,11 @@ import ( tmcfg "github.com/tendermint/tendermint/config" nm "github.com/tendermint/tendermint/node" p2p "github.com/tendermint/tendermint/p2p" + pvm "github.com/tendermint/tendermint/privval" "github.com/tendermint/tendermint/proxy" ctypes "github.com/tendermint/tendermint/rpc/core/types" tmrpc "github.com/tendermint/tendermint/rpc/lib/server" tmtypes "github.com/tendermint/tendermint/types" - pvm "github.com/tendermint/tendermint/privval" "github.com/tendermint/tmlibs/cli" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" @@ -392,6 +392,7 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { return nil, nil, err } viper.Set(cli.HomeFlag, dir) + viper.Set(client.FlagGas, 200000) kb, err := keys.GetKeyBase() // dbm.NewMemDB()) // :( if err != nil { return nil, nil, err From c08a3fec04b1b931153c4db2b3da3481ace8b4c6 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Sat, 9 Jun 2018 01:04:40 -0700 Subject: [PATCH 211/548] lawl viper --- client/flags.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/flags.go b/client/flags.go index aacd4ba1d3..2d68d31462 100644 --- a/client/flags.go +++ b/client/flags.go @@ -26,7 +26,6 @@ func GetCommands(cmds ...*cobra.Command) []*cobra.Command { c.Flags().String(FlagChainID, "", "Chain ID of tendermint node") c.Flags().String(FlagNode, "tcp://localhost:46657", ": to tendermint rpc interface for this chain") c.Flags().Int64(FlagHeight, 0, "block height to query, omit to get most recent provable block") - c.Flags().Int64(FlagGas, 200000, "gas limit to set per-transaction") } return cmds } @@ -39,6 +38,7 @@ func PostCommands(cmds ...*cobra.Command) []*cobra.Command { c.Flags().String(FlagFee, "", "Fee to pay along with transaction") c.Flags().String(FlagChainID, "", "Chain ID of tendermint node") c.Flags().String(FlagNode, "tcp://localhost:46657", ": to tendermint rpc interface for this chain") + c.Flags().Int64(FlagGas, 200000, "gas limit to set per-transaction") } return cmds } From aaaa0e16a294269ea4c9799443c39a0627715432 Mon Sep 17 00:00:00 2001 From: Dev Ojha Date: Fri, 8 Jun 2018 23:40:22 -0700 Subject: [PATCH 212/548] Merge PR #1195: gaiacli - Add error message for when account isn't found --- CHANGELOG.md | 14 +++++++++++++- x/auth/client/cli/account.go | 6 ++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0ed96190a..f8629ea1aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +BREAKING CHANGES +* msg.GetSignBytes() now returns bech32-encoded addresses in all cases + +FEATURES + +IMPROVEMENTS +* export command now writes current validator set for Tendermint +* [tests] Application module tests now use a mock application + +FIXES +* [lcd] Switch to bech32 for addresses on all human readable inputs and outputs + ## 0.18.0 _2018-06-05_ @@ -65,7 +77,7 @@ BUG FIXES * query sequence via account store * fixed duplicate pub_key in stake.Validator * Auto-sequencing now works correctly - +* [gaiacli] Fix error message when account isn't found when running gaiacli account ## 0.17.5 diff --git a/x/auth/client/cli/account.go b/x/auth/client/cli/account.go index b5af6a686a..e82b074148 100644 --- a/x/auth/client/cli/account.go +++ b/x/auth/client/cli/account.go @@ -52,6 +52,12 @@ func GetAccountCmd(storeName string, cdc *wire.Codec, decoder auth.AccountDecode return err } + // Check if account was found + if res == nil { + return sdk.ErrUnknownAddress("No account with address " + addr + + " was found in the state.\nAre you sure there has been a transaction involving it?") + } + // decode the value account, err := decoder(res) if err != nil { From d84296ed3731304e579ef339826740cc534a83f3 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Sat, 9 Jun 2018 01:04:40 -0700 Subject: [PATCH 213/548] lawl viper --- client/flags.go | 1 + 1 file changed, 1 insertion(+) diff --git a/client/flags.go b/client/flags.go index ceaf5a3a9d..0b907604a2 100644 --- a/client/flags.go +++ b/client/flags.go @@ -37,6 +37,7 @@ func PostCommands(cmds ...*cobra.Command) []*cobra.Command { c.Flags().String(FlagFee, "", "Fee to pay along with transaction") c.Flags().String(FlagChainID, "", "Chain ID of tendermint node") c.Flags().String(FlagNode, "tcp://localhost:46657", ": to tendermint rpc interface for this chain") + c.Flags().Int64(FlagGas, 200000, "gas limit to set per-transaction") } return cmds } From c6796b8fba067ae1b1ff4dc3f6a7c5614e2de947 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Sat, 9 Jun 2018 06:44:08 +0200 Subject: [PATCH 214/548] Add --gas flag to specify gas limit for a transaction --- CHANGELOG.md | 1 + client/context/helpers.go | 2 +- client/context/types.go | 7 +++++++ client/context/viper.go | 1 + client/flags.go | 2 ++ client/lcd/lcd_test.go | 3 ++- 6 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8629ea1aa..5c3190842d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ IMPROVEMENTS FIXES * [lcd] Switch to bech32 for addresses on all human readable inputs and outputs +* [cli] Added `--gas` flag to specify transaction gas limit ## 0.18.0 diff --git a/client/context/helpers.go b/client/context/helpers.go index f47cc7ff41..880c4adb37 100644 --- a/client/context/helpers.go +++ b/client/context/helpers.go @@ -114,7 +114,7 @@ func (ctx CoreContext) SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *w ChainID: chainID, Sequences: []int64{sequence}, Msg: msg, - Fee: auth.NewStdFee(10000, sdk.Coin{}), // TODO run simulate to estimate gas? + Fee: auth.NewStdFee(ctx.Gas, sdk.Coin{}), // TODO run simulate to estimate gas? } keybase, err := keys.GetKeyBase() diff --git a/client/context/types.go b/client/context/types.go index da15b32936..e9c97ffbc7 100644 --- a/client/context/types.go +++ b/client/context/types.go @@ -10,6 +10,7 @@ import ( type CoreContext struct { ChainID string Height int64 + Gas int64 TrustNode bool NodeURI string FromAddressName string @@ -31,6 +32,12 @@ func (c CoreContext) WithHeight(height int64) CoreContext { return c } +// WithGas - return a copy of the context with an updated gas +func (c CoreContext) WithGas(gas int64) CoreContext { + c.Gas = gas + return c +} + // WithTrustNode - return a copy of the context with an updated TrustNode flag func (c CoreContext) WithTrustNode(trustNode bool) CoreContext { c.TrustNode = trustNode diff --git a/client/context/viper.go b/client/context/viper.go index 4b3007f12a..081c9f5c28 100644 --- a/client/context/viper.go +++ b/client/context/viper.go @@ -30,6 +30,7 @@ func NewCoreContextFromViper() CoreContext { return CoreContext{ ChainID: chainID, Height: viper.GetInt64(client.FlagHeight), + Gas: viper.GetInt64(client.FlagGas), TrustNode: viper.GetBool(client.FlagTrustNode), FromAddressName: viper.GetString(client.FlagName), NodeURI: nodeURI, diff --git a/client/flags.go b/client/flags.go index 0b907604a2..f4ee4279b4 100644 --- a/client/flags.go +++ b/client/flags.go @@ -7,6 +7,7 @@ const ( FlagChainID = "chain-id" FlagNode = "node" FlagHeight = "height" + FlagGas = "gas" FlagTrustNode = "trust-node" FlagName = "name" FlagSequence = "sequence" @@ -25,6 +26,7 @@ func GetCommands(cmds ...*cobra.Command) []*cobra.Command { c.Flags().String(FlagChainID, "", "Chain ID of tendermint node") c.Flags().String(FlagNode, "tcp://localhost:46657", ": to tendermint rpc interface for this chain") c.Flags().Int64(FlagHeight, 0, "block height to query, omit to get most recent provable block") + c.Flags().Int64(FlagGas, 200000, "gas limit to set per-transaction") } return cmds } diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 19eff52c4c..1b1257f34c 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -22,11 +22,11 @@ import ( tmcfg "github.com/tendermint/tendermint/config" nm "github.com/tendermint/tendermint/node" p2p "github.com/tendermint/tendermint/p2p" + pvm "github.com/tendermint/tendermint/privval" "github.com/tendermint/tendermint/proxy" ctypes "github.com/tendermint/tendermint/rpc/core/types" tmrpc "github.com/tendermint/tendermint/rpc/lib/server" tmtypes "github.com/tendermint/tendermint/types" - pvm "github.com/tendermint/tendermint/privval" "github.com/tendermint/tmlibs/cli" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" @@ -385,6 +385,7 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { return nil, nil, err } viper.Set(cli.HomeFlag, dir) + viper.Set(client.FlagGas, 200000) kb, err := keys.GetKeyBase() // dbm.NewMemDB()) // :( if err != nil { return nil, nil, err From cb6534a8f89ad227c9d73b5edc6ecdbb26aa8fed Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Sat, 9 Jun 2018 09:32:59 -0700 Subject: [PATCH 215/548] version and changelog --- CHANGELOG.md | 2 +- version/version.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c3190842d..e2c7a09c4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ FIXES ## 0.18.0 -_2018-06-05_ +*June 9, 2018* BREAKING CHANGES diff --git a/version/version.go b/version/version.go index 116f1ff287..20074c7bcd 100644 --- a/version/version.go +++ b/version/version.go @@ -9,7 +9,7 @@ const Maj = "0" const Min = "18" const Fix = "0" -const Version = "0.18.0-dev" +const Version = "0.18.0" // GitCommit set by build flags var GitCommit = "" From d309abb4b9bdb01272e54e048063502110c801fa Mon Sep 17 00:00:00 2001 From: Rigel Date: Sat, 9 Jun 2018 21:11:27 -0700 Subject: [PATCH 216/548] Merge PR #1195: PR template improvement --- .github/PULL_REQUEST_TEMPLATE.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 9d234c3262..caa5415105 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,8 +1,12 @@ - + * [ ] Updated all relevant documentation in docs * [ ] Updated all code comments where relevant * [ ] Wrote tests * [ ] Updated CHANGELOG.md -* [ ] Updated Basecoin / other examples -* [ ] Squashed related commits and prefixed with PR number per [coding standards](https://github.com/tendermint/coding/blob/master/README.md#merging-a-pr) +* [ ] Updated Gaia/Examples +* [ ] Squashed all commits, uses message "Merge pull request #XYZ: [title]" ([coding standards](https://github.com/tendermint/coding/blob/master/README.md#merging-a-pr)) From e699e251f5ee1680a9d4246d1c57bc94b15dd75a Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Sun, 10 Jun 2018 10:41:37 -0700 Subject: [PATCH 217/548] add cmd/gaia/testnets folder to deprecate cosmos/testnets repo --- cmd/gaia/testnets/README.md | 296 +++++ cmd/gaia/testnets/STATUS.md | 38 + cmd/gaia/testnets/gaia-5001/adrian.json | 20 + cmd/gaia/testnets/gaia-5001/anton.json | 20 + cmd/gaia/testnets/gaia-5001/aurel.json | 20 + cmd/gaia/testnets/gaia-5001/bucky.json | 20 + cmd/gaia/testnets/gaia-5001/cwgoes.json | 20 + cmd/gaia/testnets/gaia-5001/iris.json | 20 + cmd/gaia/testnets/gaia-5001/lino.json | 20 + cmd/gaia/testnets/gaia-5001/pbostrom.json | 20 + cmd/gaia/testnets/gaia-5001/poldsam.json | 20 + cmd/gaia/testnets/gaia-5001/staked.json | 20 + cmd/gaia/testnets/gaia-5001/zach.json | 20 + cmd/gaia/testnets/gaia-5001/zaki.json | 20 + cmd/gaia/testnets/gaia-6000/genesis.json | 1459 +++++++++++++++++++++ cmd/gaia/testnets/gaia-6001/genesis.json | 1459 +++++++++++++++++++++ 16 files changed, 3492 insertions(+) create mode 100644 cmd/gaia/testnets/README.md create mode 100644 cmd/gaia/testnets/STATUS.md create mode 100644 cmd/gaia/testnets/gaia-5001/adrian.json create mode 100644 cmd/gaia/testnets/gaia-5001/anton.json create mode 100644 cmd/gaia/testnets/gaia-5001/aurel.json create mode 100644 cmd/gaia/testnets/gaia-5001/bucky.json create mode 100644 cmd/gaia/testnets/gaia-5001/cwgoes.json create mode 100644 cmd/gaia/testnets/gaia-5001/iris.json create mode 100644 cmd/gaia/testnets/gaia-5001/lino.json create mode 100644 cmd/gaia/testnets/gaia-5001/pbostrom.json create mode 100644 cmd/gaia/testnets/gaia-5001/poldsam.json create mode 100644 cmd/gaia/testnets/gaia-5001/staked.json create mode 100644 cmd/gaia/testnets/gaia-5001/zach.json create mode 100644 cmd/gaia/testnets/gaia-5001/zaki.json create mode 100644 cmd/gaia/testnets/gaia-6000/genesis.json create mode 100644 cmd/gaia/testnets/gaia-6001/genesis.json diff --git a/cmd/gaia/testnets/README.md b/cmd/gaia/testnets/README.md new file mode 100644 index 0000000000..e5c6522796 --- /dev/null +++ b/cmd/gaia/testnets/README.md @@ -0,0 +1,296 @@ +# Connect to a Testnet + +This document explains how to connect to the Testnet of a [Cosmos-SDK](https://github.com/cosmos/cosmos-sdk/) based blockchain. It can be used to connect to the latest Testnet for the Cosmos Hub. + +## Software Setup (Manual Installation) + +Follow these instructions to install the Cosmos-SDK and connect to the latest Testnet. This instructions work for both a local machine and a VM in a cloud server. + +If you want to run a non-validator full-node, installing the SDK on a Cloud server is a good option. However, if you are want to become a validator for the Hub's `mainnet` you should look at more complex setups, including [Sentry Node Architecture](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#how-can-validators-protect-themselves-from-denial-of-service-attacks), to protect your node from DDOS and ensure high-availability (see the [technical requirements](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#technical-requirements)). You can find more information on validators in our [website](https://cosmos.network/validators), in the [Validator FAQ](https://cosmos.network/resources/validator-faq) and in the [Validator Chat](https://riot.im/app/#/room/#cosmos_validators:matrix.org). + +### Install [Go](https://golang.org/) + +Install `go` following the [instructions](https://golang.org/doc/install) in the official golang website. +You will require **Go 1.10+** for this tutorial. + +#### Set GOPATH + +First, you will need to set up your `GOPATH`. Make sure that the location `$HOME` is something like `/Users/`, you can corroborate it by typing `echo $HOME` in your terminal. + +Go to `$HOME` with the command `cd $HOME` and open the the hidden file `.bashrc` with a code editor and paste the following lines \(or `.bash_profile` if your're using OS X\). + +``` +export GOPATH=$HOME/go +export PATH=$PATH:$GOROOT/bin:$GOPATH/bin +``` + +Save and restart the terminal. + +_Note_: If you can't see the hidden file, use the shortcut `Command + Shift + .` in Finder. + + +### Install [GNU Wget](https://www.gnu.org/software/wget/) + +**MacOS** + +``` +brew install wget +``` + +**Linux** + +``` +sudo apt-get install wget +``` + +Note: You can check other available options for downloading `wget` [here](https://www.gnu.org/software/wget/faq.html#download). + +### Install Gaia + +Now we can fetch the correct versions of each dependency by running: + +``` +mkdir -p $GOPATH/src/github.com/cosmos/cosmos-sdk +git clone https://github.com/cosmos/cosmos-sdk.git +git checkout v0.18.0-rc0 +make get_tools // run $ make update_tools if already installed +make get_vendor_deps +make install +``` + +This will install the `gaiad` and `gaiacli` binaries. Verify that everything is OK by running: + +``` +gaiad version +``` + +You should see: + +``` +0.18.0-dev-af15f89 +``` + +And also: + +``` +gaiacli version +``` + +You should see: + +``` +0.18.0-dev-af15f89 +``` + +## Full Node Setup + +Clone the testnet repo. + +``` +git clone https://github.com/cosmos/testnets + +mkdir -p $HOME/.gaiad/config +cp -a testnets/gaia-6001/genesis.json $HOME/.gaiad/config/genesis.json +gaiad unsafe_reset_all +``` + +Add a seed node by changing `seed = ""` in `config.toml` to `seed = "80a35a46ce09cfb31ee220c8141a25e73e0b239b@35.198.166.171:46656"`. + +Lastly change the `moniker` string in the`config.toml`to identify your node. + +``` +# A custom human readable name for this node +moniker = "" +``` + +## Upgrading from a previous network + +These instructions are for anyone that ran a previous network and would like to upgrade to a newer version. + +Remove the ephemeral files and reset the data. +``` +rm $HOME/.gaiad/config/addrbook.json $HOME/.gaiad/config/genesis.json +gaiad unsafe_reset_all +``` + +Now your node is in a prestine state without changing your validator key. If you had any +sentry nodes or full nodes setup correctly previously they should work. + +**Make sure that every node has a unique `priv_validator.json`. Do not copy the `priv_validator.json` from an old node to multiple new nodes. Running two nodes with the same `priv_validator.json` will cause you to double sign.**\ + + +Now it is time to upgrade the software. +``` +cd $GOPATH/src/github.com/cosmos/cosmos-sdk +git fetch --all +git checkout v0.18.0-rc0 +make update_tools +make get_vendor_deps +make install +``` + +The next step is to obtain the new genesis file from `https://github.com/cosmos/testnets`. +``` +cd $HOME/testnets +git pull origin master + +cp -a gaia-6001/genesis.json $HOME/.gaiad/config +``` + +The last step is the adjust the `config.toml`. Make sure that you are connected to healthy peers or seed nodes. +These are some seeds nodes and they can be put into the config under the `seeds` key. Alternatively you can also +ask user validators directly for a persistent peer and add it under the `persisent_peers` key. +``` +80a35a46ce09cfb31ee220c8141a25e73e0b239b@cosmos.cryptium.ch:46656 +``` + +## Run a Full Node + +Start the full node: + +``` +gaiad start +``` + +Check the everything is running smoothly: + +``` +gaiacli status +``` + +## Generate keys + +You'll need a private and public key pair \(a.k.a. `sk, pk` respectively\) to be able to receive funds, send txs, bond tx, etc. + +To generate your a new key \(default _ed25519_ elliptic curve\): + +``` +gaiacli keys add +``` + +Next, you will have to enter a passphrase for your key twice. Save the _seed_ _phrase_ in a safe place in case you forget the password. + +Now if you check your private keys you will see the `` key among them: + +``` +gaiacli keys show +``` + +You can see all your other available keys by typing: + +``` +gaiacli keys list +``` + +The validator pubkey from your node should be the same as the one printed with the command: + +``` +gaiad tendermint show_validator +``` + +Finally, save your address and pubkey into a variable to use them afterwards. + +``` +MYADDR= +MYPUBKEY= +``` + +**IMPORTANT:** We strongly recommend to **NOT** use the same passphrase for your different keys. The Tendermint team and the Interchain Foundation will not be responsible for the lost of funds. + +### Get coins + +The best way to get coins at the moment is to ask in Riot chat. We plan to have a reliable faucet in future testnets. + +## Send tokens + +``` +gaiacli send --amount=1000fermion --chain-id= --sequence=0 --name= --to= +``` + +The `--amount` flag defines the corresponding amount of the coin in the format `--amount=` + +The `--sequence` flag corresponds to the sequence number to sign the tx. + +Now check the destination account and your own account to check the updated balances \(by default the latest block\): + +``` +gaiacli account +gaiacli account +``` + +You can also check your balance at a given block by using the `--block` flag: + +``` +gaiacli account --block= +``` + +## Run a Validator Node + +[Validators](https://cosmos.network/validators) are actors from the network that are responsible from committing new blocks to the blockchain by submitting their votes. In terms of security, validators' stake is slashed in all the zones they belong if they become unavailable, double sign a transaction, or don't cast their votes. We strongly recommend entities intending to run validators in the Cosmos Hub's `mainnet` to check the [technical requirements](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#technical-requirements) and take the necessary precautions to ensure high-availability, such as setting a Sentry Node architecture. If you have any question about validators, read the [Validator FAQ](https://cosmos.network/resources/validator-faq) and join the [Validator Chat](https://riot.im/app/#/room/#cosmos_validators:matrix.org). + +This section covers the instructions necessary to stake tokens to become a testnet validator candidate. + +Your `pubkey` can be used to create a new validator candidate by staking some tokens: + +You can find your node pubkey by running +``` +gaiad tendermint show_validator +``` + +and this returns your public key for the declare-candidate command + + +``` +gaiacli stake create-validator --amount=500steak --pubkey= --address-candidate= --moniker=satoshi --chain-id= --sequence=1 --name= +``` + +You can add more information of the validator candidate such as`--website`, `--keybase-sig `or additional `--details`. If you want to edit the candidate info: + +``` +gaiacli stake edit-validator --details="To the cosmos !" --website="https://cosmos.network" +``` + +Finally, you can check all the candidate information by typing: + +``` +gaiacli stake validator --address-candidate= --chain-id= +``` + +To check that the validator is active you can find it on the validator set list: + +``` +gaiacli advanced tendermint validator-set +``` + +**Note:** Remember that to be in the validator set you need to have more total power than the Xnd validator, where X is the assigned size for the validator set \(by default _`X = 100`_\). + +## Delegate your tokens + +You can delegate \(_i.e._ bind\) **Atoms** to a validator to become a [delegator](https://cosmos.network/resources/delegators) and obtain a part of its fee revenue in **Photons**. For more information about the Cosmos Token Model, refer to our [whitepaper](https://github.com/cosmos/cosmos/raw/master/Cosmos_Token_Model.pdf). + +### Bond your tokens + +Bond your tokens to a validator candidate with the following command: + +``` +gaiacli stake delegate --amount=10steak --address-delegator= --address-candidate= --name= --chain-id= --sequence=2 +``` + +When tokens are bonded, they are pooled with all the other bonded tokens in the network. Validators and delegators obtain shares that represent their stake in this pool. + +### Unbond + +If for any reason the validator misbehaves or you just want to unbond a certain amount of the bonded tokens: + +``` +gaiacli stake unbond --address-delegator= --address-candidate= --shares=MAX --name= --chain-id= --sequence=3 +``` + +You can unbond a specific amount of`shares`\(eg:`12.1`\) or all of them \(`MAX`\). + +You should now see the unbonded tokens reflected in your balance and in your delegator bond: + +``` +gaiacli account +gaiacli stake delegation --address-delegator= --address-candidate= --chain-id= +``` diff --git a/cmd/gaia/testnets/STATUS.md b/cmd/gaia/testnets/STATUS.md new file mode 100644 index 0000000000..fb21ff9a44 --- /dev/null +++ b/cmd/gaia/testnets/STATUS.md @@ -0,0 +1,38 @@ +# TESTNET STATUS + +## *June 5, 2018, 21:00 EST* - New Release + +- Released gaia + [v0.17.5](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.17.5) + with update for Tendermint + [v0.19.9](https://github.com/tendermint/tendermint/releases/tag/v0.19.9) +- Fixes many bugs! + - evidence gossipping + - mempool deadlock + - WAL panic + - memory leak +- Please update to this to put a stop to the rampant invalid evidence gossiping + :) + +## *May 31, 2018, 14:00 EST* - New Release + +- Released gaia + [v0.17.4](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.17.4) with update for Tendermint v0.19.7 +- Fixes a WAL bug and some more +- Please update to this if you have trouble restarting a node + +## *May 31, 2018, 2:00 EST* - Testnet Halt + +- A validator equivocated last week and Evidence is being rampantly gossipped +- Peers that can't process the evidence (either too far behind or too far ahead) are disconnecting from the peers that + sent it, causing high peer turn-over +- The high peer turn-over may be causing a memory-leak, resulting in some nodes + crashing and the testnet halting +- We need to fix some issues in the EvidenceReactor to address this and also + investigate the possible memory-leak + +## *May 29, 2018* - New Release + +- Released v0.17.3 with update for Tendermint v0.19.6 +- Fixes fast-sync bug +- Please update to this to sync with the testnet diff --git a/cmd/gaia/testnets/gaia-5001/adrian.json b/cmd/gaia/testnets/gaia-5001/adrian.json new file mode 100644 index 0000000000..7ca99cb1e9 --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/adrian.json @@ -0,0 +1,20 @@ +{ + "node_id": "1ebc5ca705b3ae1c06a0888ff1287ada82149dc3", + "ip": "138.68.77.24", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" + }, + "power": 100, + "name": "adrian" + }, + "app_gen_tx": { + "name": "default", + "address": "D9C12CB5186FE0018179742FD3110EE534C63460", + "pub_key": { + "type": "AC26791624DE60", + "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/anton.json b/cmd/gaia/testnets/gaia-5001/anton.json new file mode 100644 index 0000000000..701e858874 --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/anton.json @@ -0,0 +1,20 @@ +{ + "node_id": "c272ae3cff7558db2c6195eea38fd43fd08406dc", + "ip": "206.189.31.178", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "tJlZJWjOpYvRitYFTWNPTaUtvQVf+hoNjlfI84VPqvI=" + }, + "power": 100, + "name": "anton" + }, + "app_gen_tx": { + "name": "default", + "address": "E766088FD171906289617F60BF0014C46F0F85EC", + "pub_key": { + "type": "AC26791624DE60", + "value": "tJlZJWjOpYvRitYFTWNPTaUtvQVf+hoNjlfI84VPqvI=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/aurel.json b/cmd/gaia/testnets/gaia-5001/aurel.json new file mode 100644 index 0000000000..0c2ea81668 --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/aurel.json @@ -0,0 +1,20 @@ +{ + "node_id": "aef085c4bfed0c1ffc6705f2e1e3bf85e5164600", + "ip": "45.77.53.208", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" + }, + "power": 100, + "name": "aurel" + }, + "app_gen_tx": { + "name": "aurel", + "address": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "pub_key": { + "type": "AC26791624DE60", + "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/bucky.json b/cmd/gaia/testnets/gaia-5001/bucky.json new file mode 100644 index 0000000000..fc4bb51cde --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/bucky.json @@ -0,0 +1,20 @@ +{ + "node_id": "b0dd378c3fbc4c156cd6d302a799f0d2e4227201", + "ip": "159.89.121.174", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" + }, + "power": 100, + "name": "bucky" + }, + "app_gen_tx": { + "name": "bucky", + "address": "935E48ED79F1006ED135553768E1D9A768747CF6", + "pub_key": { + "type": "AC26791624DE60", + "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/cwgoes.json b/cmd/gaia/testnets/gaia-5001/cwgoes.json new file mode 100644 index 0000000000..dce7e20c9f --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/cwgoes.json @@ -0,0 +1,20 @@ +{ + "node_id": "e25603602d8cf8542570ad0e311d50f55f497f85", + "ip": "158.69.63.13", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" + }, + "power": 100, + "name": "cwgoes" + }, + "app_gen_tx": { + "name": "cwgoes", + "address": "328FBB8EA315D070DF908982A5F91A3618001D20", + "pub_key": { + "type": "AC26791624DE60", + "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/iris.json b/cmd/gaia/testnets/gaia-5001/iris.json new file mode 100644 index 0000000000..1a1019672c --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/iris.json @@ -0,0 +1,20 @@ +{ + "node_id": "aabf05a67b2f399807dc602d05bf97b0ed283ac2", + "ip": "116.62.62.39", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" + }, + "power": 100, + "name": "iris" + }, + "app_gen_tx": { + "name": "=suyu", + "address": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "pub_key": { + "type": "AC26791624DE60", + "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" + } + } +} \ No newline at end of file diff --git a/cmd/gaia/testnets/gaia-5001/lino.json b/cmd/gaia/testnets/gaia-5001/lino.json new file mode 100644 index 0000000000..5bc98bb6ed --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/lino.json @@ -0,0 +1,20 @@ +{ + "node_id": "79466a03e9d4b4648a7dd8cead1fa7121ce76ee3", + "ip": "34.235.130.1", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" + }, + "power": 100, + "name": "lino" + }, + "app_gen_tx": { + "name": "lino", + "address": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "pub_key": { + "type": "AC26791624DE60", + "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/pbostrom.json b/cmd/gaia/testnets/gaia-5001/pbostrom.json new file mode 100644 index 0000000000..59cd469504 --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/pbostrom.json @@ -0,0 +1,20 @@ +{ + "node_id": "adb290585a2753bf1a520c76802b0dab3dffa895", + "ip": "34.201.21.179", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" + }, + "power": 100, + "name": "pbostrom" + }, + "app_gen_tx": { + "name": "default", + "address": "109720515B4F8C0858DA3521E448262334534FFD", + "pub_key": { + "type": "AC26791624DE60", + "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/poldsam.json b/cmd/gaia/testnets/gaia-5001/poldsam.json new file mode 100644 index 0000000000..8149a92592 --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/poldsam.json @@ -0,0 +1,20 @@ +{ + "node_id": "678503e6c8f50db7279c7da3cb9b072aac4bc0d5", + "ip": "35.193.188.125", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" + }, + "power": 100, + "name": "polsdam" + }, + "app_gen_tx": { + "name": "poldsam", + "address": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "pub_key": { + "type": "AC26791624DE60", + "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/staked.json b/cmd/gaia/testnets/gaia-5001/staked.json new file mode 100644 index 0000000000..f39cced6b8 --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/staked.json @@ -0,0 +1,20 @@ +{ + "node_id": "3519f05985394107e0b2e285361b7e012adb1113", + "ip": "54.209.118.64", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "vq0V0BjpmIh6WyNnFpMaO5LyUK2FamkNt65eJYa5AaQ=" + }, + "power": 100, + "name": "staked" + }, + "app_gen_tx": { + "name": "default", + "address": "935E04662697134905706A4CCDB822AC6FC11C2E", + "pub_key": { + "type": "AC26791624DE60", + "value": "vq0V0BjpmIh6WyNnFpMaO5LyUK2FamkNt65eJYa5AaQ=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/zach.json b/cmd/gaia/testnets/gaia-5001/zach.json new file mode 100644 index 0000000000..76a08cc925 --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/zach.json @@ -0,0 +1,20 @@ +{ + "node_id": "8a2802fb25d352f3e7e277559a4f683780c3ef22", + "ip": "167.99.191.184", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" + }, + "power": 100, + "name": "" + }, + "app_gen_tx": { + "name": "zach", + "address": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "pub_key": { + "type": "AC26791624DE60", + "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/zaki.json b/cmd/gaia/testnets/gaia-5001/zaki.json new file mode 100644 index 0000000000..956f2bf8ce --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/zaki.json @@ -0,0 +1,20 @@ +{ + "node_id": "30b45459e4881680c0ef1750fde136fefa6c3b98", + "ip": "35.184.182.143", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" + }, + "power": 100, + "name": "zaki" + }, + "app_gen_tx": { + "name": "zaki", + "address": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "pub_key": { + "type": "AC26791624DE60", + "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-6000/genesis.json b/cmd/gaia/testnets/gaia-6000/genesis.json new file mode 100644 index 0000000000..aefab92869 --- /dev/null +++ b/cmd/gaia/testnets/gaia-6000/genesis.json @@ -0,0 +1,1459 @@ +{ + "genesis_time": "2018-05-15T18:29:12.38288148Z", + "chain_id": "gaia-6000", + "consensus_params": { + "block_size_params": { + "max_bytes": 22020096, + "max_txs": 100000, + "max_gas": -1 + }, + "tx_size_params": { + "max_bytes": 10240, + "max_gas": -1 + }, + "block_gossip_params": { + "block_part_size_bytes": 65536 + }, + "evidence_params": { + "max_age": 100000 + } + }, + "validators": [ + { + "pub_key": { + "type": "AC26791624DE60", + "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" + }, + "power": 1000, + "name": "adrian" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" + }, + "power": 1000, + "name": "zaki" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "bIvXwf0qlOy0rO0SY/h8FfsqyW/AMpGL2yUhUNOY7hs=" + }, + "power": 100, + "name": "staked" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" + }, + "power": 1000, + "name": "polsdam" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" + }, + "power": 1000, + "name": "lino" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" + }, + "power": 100, + "name": "" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" + }, + "power": 1000, + "name": "iris" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" + }, + "power": 1000, + "name": "pbostrom" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" + }, + "power": 1000, + "name": "aurel" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" + }, + "power": 1000, + "name": "bucky" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" + }, + "power": 100, + "name": "cwgoes" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "TNPLvN6f6QoSLJqGHzIfbraBoSw3emr9Sk2Us94M4gM=" + }, + "power": 1000, + "name": "bdnet" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "cvGYknYP9XMUzqlXZde7lRpvAp/kZiSRYHg66krJNxQ=" + }, + "power": 1000, + "name": "melea-trust" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" + }, + "power": 1000, + "name": "naruemon" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "rcl+kuM69Un/a7e+fQsQrCEtT1g04tFviOeq2GygSIw=" + }, + "power": 1000, + "name": "idoor" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "S9urD5q7je21qp5vEobiURdWrtJwvqMsfZGQhb8GOBQ=" + }, + "power": 1000, + "name": "ATEAM1" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "vSr94aI+zfF3D8Cr2VtCXPpfgj7t2ck8SlZxRsfn7gk=" + }, + "power": 1000, + "name": "figmatt" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "p5ijoVwp2zmA7RkXXvPl+yqdnlaWMwoV2pYIN8bDyFs=" + }, + "power": 1000, + "name": "jla-bsd" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "KOdWpo4aQFrLxVlkyc66p7m6mBNnPLmGuO4Z4L+CI1Y=" + }, + "power": 1000, + "name": "Gold" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "VfOsmcON77auerRc9zKwOR+CvL0sj1nA45hS2WqX1xE=" + }, + "power": 1000, + "name": "nylira" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "QYONAknaJqx3OKPSKraDrOPkx6xssezYtXVS84nZvZE=" + }, + "power": 1000, + "name": "BKCM" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "PyFJmNrUres3QOkj2BjxplCxrOF+HDFGohi3tRKsToY=" + }, + "power": 1000, + "name": "Dev's Validator" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "s4ER09+WeX10euzGyK7xDW7+myQVXt3Plup8IHUE4nk=" + }, + "power": 1000, + "name": "Staking Facilities" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "OPxj9edXgufNEjYNhZKqLgmYnK4A3nGw3rxaFQrHn24=" + }, + "power": 1000, + "name": "nuevax" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "Hi2rtbdJdQtOe3Kq4OoD/xkWJbIjIsUI9qgLQ6TlhiM=" + }, + "power": 1000, + "name": "vultr.guest" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "ah3JtmBA7gbxSiimPsLqQlV85gpNOUBJMvnxGx8eVlo=" + }, + "power": 1000, + "name": "forebole" + } + ], + "app_hash": "", + "app_state": { + "accounts": [ + { + "address": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "coins": [ + { + "denom": "devToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "coins": [ + { + "denom": "adrianToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "109720515B4F8C0858DA3521E448262334534FFD", + "coins": [ + { + "denom": "defaultToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "coins": [ + { + "denom": "aurelToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "328FBB8EA315D070DF908982A5F91A3618001D20", + "coins": [ + { + "denom": "cwgoesToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "coins": [ + { + "denom": "BKCMToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "coins": [ + { + "denom": "BDToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "coins": [ + { + "denom": "suyuToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "coins": [ + { + "denom": "linoToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "coins": [ + { + "denom": "stakingToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "935E04662697134905706A4CCDB822AC6FC11C2E", + "coins": [ + { + "denom": "defaultToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "935E48ED79F1006ED135553768E1D9A768747CF6", + "coins": [ + { + "denom": "buckyToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "99FFAEE5BF6040EADA2F26548C4A702619797C9F", + "coins": [ + { + "denom": "kwunyeungToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "zachToken", + "amount": 1000 + } + ] + }, + { + "address": "A323EC45243D600204BA3D298E3C20322D08C84C", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "nuevaxToken", + "amount": 1000 + } + ] + }, + { + "address": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "dokiaToken", + "amount": 1000 + } + ] + }, + { + "address": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "forboleToken", + "amount": 1000 + } + ] + }, + { + "address": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "coins": [ + { + "denom": "steak", + "amount": 100 + }, + { + "denom": "pengToken", + "amount": 1000 + } + ] + }, + { + "address": "FD30D5C983FFEDEC069C3DDFCF270E41A556A86E", + "coins": [ + { + "denom": "steak", + "amount": 900 + }, + { + "denom": "faucetToken", + "amount": 10000000 + } + ] + }, + { + "address": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "goldToken", + "amount": 100 + } + ] + }, + { + "address": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "jlaToken", + "amount": 100 + } + ] + }, + { + "address": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "figmattToken", + "amount": 100 + } + ] + }, + { + "address": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "ATEAM1Token", + "amount": 100 + } + ] + }, + { + "address": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "idoorToken", + "amount": 100 + } + ] + }, + { + "address": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "naruemonToken", + "amount": 100 + } + ] + }, + { + "address": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "zakiToken", + "amount": 1000 + } + ] + }, + { + "address": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "trustToken", + "amount": 1000 + } + ] + }, + { + "address": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "coins": [ + { + "denom": "poldsamToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + } + ], + "stake": { + "pool": { + "loose_unbonded_tokens": 2350, + "unbonded_tokens": 0, + "unbonding_tokens": 0, + "bonded_tokens": 25200, + "unbonded_shares": "0", + "unbonding_shares": "0", + "bonded_shares": "25200", + "inflation_last_time": 0, + "inflation": "9012837/100000000", + "date_last_commission_reset": 0, + "prev_bonded_shares": "0" + }, + "params": { + "inflation_rate_change": "13/100", + "inflation_max": "1/5", + "inflation_min": "7/100", + "goal_bonded": "67/100", + "max_validators": 100, + "bond_denom": "steak" + }, + "bonds": [ + { + "delegator_addr": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "validator_addr": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "109720515B4F8C0858DA3521E448262334534FFD", + "validator_addr": "109720515B4F8C0858DA3521E448262334534FFD", + "shares": "100", + "height": 0 + }, + { + "delegator_addr": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "validator_addr": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "328FBB8EA315D070DF908982A5F91A3618001D20", + "validator_addr": "328FBB8EA315D070DF908982A5F91A3618001D20", + "shares": "100", + "height": 0 + }, + { + "delegator_addr": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "validator_addr": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "validator_addr": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "validator_addr": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "validator_addr": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "validator_addr": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "935E04662697134905706A4CCDB822AC6FC11C2E", + "validator_addr": "935E04662697134905706A4CCDB822AC6FC11C2E", + "shares": "100", + "height": 0 + }, + { + "delegator_addr": "935E48ED79F1006ED135553768E1D9A768747CF6", + "validator_addr": "935E48ED79F1006ED135553768E1D9A768747CF6", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "validator_addr": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "shares": "100", + "height": 0 + }, + { + "delegator_addr": "A323EC45243D600204BA3D298E3C20322D08C84C", + "validator_addr": "A323EC45243D600204BA3D298E3C20322D08C84C", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "validator_addr": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "validator_addr": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "validator_addr": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "validator_addr": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "validator_addr": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "validator_addr": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "validator_addr": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "validator_addr": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "validator_addr": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "validator_addr": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "validator_addr": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "validator_addr": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "validator_addr": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "shares": "1000", + "height": 0 + } + ], + "validators": [ + { + "owner": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "pub_key": { + "type": "AC26791624DE60", + "value": "PyFJmNrUres3QOkj2BjxplCxrOF+HDFGohi3tRKsToY=" + }, + "description": { + "moniker": "Dev's Validator", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "109720515B4F8C0858DA3521E448262334534FFD", + "pub_key": { + "type": "AC26791624DE60", + "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" + }, + "description": { + "moniker": "", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "100" + }, + "delegator_shares": "100", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "pub_key": { + "type": "AC26791624DE60", + "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" + }, + "description": { + "moniker": "aurel", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "328FBB8EA315D070DF908982A5F91A3618001D20", + "pub_key": { + "type": "AC26791624DE60", + "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" + }, + "description": { + "moniker": "cwgoes", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "100" + }, + "delegator_shares": "100", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "pub_key": { + "type": "AC26791624DE60", + "value": "QYONAknaJqx3OKPSKraDrOPkx6xssezYtXVS84nZvZE=" + }, + "description": { + "moniker": "BKCM", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "pub_key": { + "type": "AC26791624DE60", + "value": "TNPLvN6f6QoSLJqGHzIfbraBoSw3emr9Sk2Us94M4gM=" + }, + "description": { + "moniker": "bdnet", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "pub_key": { + "type": "AC26791624DE60", + "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" + }, + "description": { + "moniker": "suyu", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "pub_key": { + "type": "AC26791624DE60", + "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" + }, + "description": { + "moniker": "lino", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "pub_key": { + "type": "AC26791624DE60", + "value": "s4ER09+WeX10euzGyK7xDW7+myQVXt3Plup8IHUE4nk=" + }, + "description": { + "moniker": "Staking Facilities", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "935E04662697134905706A4CCDB822AC6FC11C2E", + "pub_key": { + "type": "AC26791624DE60", + "value": "bIvXwf0qlOy0rO0SY/h8FfsqyW/AMpGL2yUhUNOY7hs=" + }, + "description": { + "moniker": "default", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "100" + }, + "delegator_shares": "100", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "935E48ED79F1006ED135553768E1D9A768747CF6", + "pub_key": { + "type": "AC26791624DE60", + "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" + }, + "description": { + "moniker": "bucky", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "pub_key": { + "type": "AC26791624DE60", + "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" + }, + "description": { + "moniker": "zach", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "100" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "A323EC45243D600204BA3D298E3C20322D08C84C", + "pub_key": { + "type": "AC26791624DE60", + "value": "OPxj9edXgufNEjYNhZKqLgmYnK4A3nGw3rxaFQrHn24=" + }, + "description": { + "moniker": "nuevax", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "pub_key": { + "type": "AC26791624DE60", + "value": "Hi2rtbdJdQtOe3Kq4OoD/xkWJbIjIsUI9qgLQ6TlhiM=" + }, + "description": { + "moniker": "vultr.guest", + "identity": "", + "website": "https://ion.dokia.capital/", + "details": "DokiaValidator" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "pub_key": { + "type": "AC26791624DE60", + "value": "ah3JtmBA7gbxSiimPsLqQlV85gpNOUBJMvnxGx8eVlo=" + }, + "description": { + "moniker": "forbole", + "identity": "", + "website": "https://www.forbole.com", + "details": "Recommend. Refer. Reward" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "pub_key": { + "type": "AC26791624DE60", + "value": "VfOsmcON77auerRc9zKwOR+CvL0sj1nA45hS2WqX1xE=" + }, + "description": { + "moniker": "nylira", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "pub_key": { + "type": "AC26791624DE60", + "value": "KOdWpo4aQFrLxVlkyc66p7m6mBNnPLmGuO4Z4L+CI1Y=" + }, + "description": { + "moniker": "Gold", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "pub_key": { + "type": "AC26791624DE60", + "value": "p5ijoVwp2zmA7RkXXvPl+yqdnlaWMwoV2pYIN8bDyFs=" + }, + "description": { + "moniker": "jla-bsd", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "pub_key": { + "type": "AC26791624DE60", + "value": "vSr94aI+zfF3D8Cr2VtCXPpfgj7t2ck8SlZxRsfn7gk=" + }, + "description": { + "moniker": "figmatt", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "pub_key": { + "type": "AC26791624DE60", + "value": "S9urD5q7je21qp5vEobiURdWrtJwvqMsfZGQhb8GOBQ=" + }, + "description": { + "moniker": "ATEAM1", + "identity": "", + "website": "", + "details": "ATEAM1" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "pub_key": { + "type": "AC26791624DE60", + "value": "rcl+kuM69Un/a7e+fQsQrCEtT1g04tFviOeq2GygSIw=" + }, + "description": { + "moniker": "idoor", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "pub_key": { + "type": "AC26791624DE60", + "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" + }, + "description": { + "moniker": "naruemon", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "pub_key": { + "type": "AC26791624DE60", + "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" + }, + "description": { + "moniker": "Adrian Brink - Cryptium Labs", + "identity": "", + "website": "https://cryptium.ch", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "pub_key": { + "type": "AC26791624DE60", + "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" + }, + "description": { + "moniker": "zaki", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "pub_key": { + "type": "AC26791624DE60", + "value": "cvGYknYP9XMUzqlXZde7lRpvAp/kZiSRYHg66krJNxQ=" + }, + "description": { + "moniker": "trust", + "identity": "", + "website": "http://cosmos-trust.com", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "pub_key": { + "type": "AC26791624DE60", + "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" + }, + "description": { + "moniker": "proof-of-audit", + "identity": "", + "website": "https://proof-of-audit.com", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + } + ] + } + } +} diff --git a/cmd/gaia/testnets/gaia-6001/genesis.json b/cmd/gaia/testnets/gaia-6001/genesis.json new file mode 100644 index 0000000000..512d761bed --- /dev/null +++ b/cmd/gaia/testnets/gaia-6001/genesis.json @@ -0,0 +1,1459 @@ +{ + "genesis_time": "2018-05-15T18:29:12.38288148Z", + "chain_id": "gaia-6001", + "consensus_params": { + "block_size_params": { + "max_bytes": 22020096, + "max_txs": 100000, + "max_gas": -1 + }, + "tx_size_params": { + "max_bytes": 10240, + "max_gas": -1 + }, + "block_gossip_params": { + "block_part_size_bytes": 65536 + }, + "evidence_params": { + "max_age": 100000 + } + }, + "validators": [ + { + "pub_key": { + "type": "AC26791624DE60", + "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" + }, + "power": 1000, + "name": "adrian" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" + }, + "power": 1000, + "name": "zaki" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "bIvXwf0qlOy0rO0SY/h8FfsqyW/AMpGL2yUhUNOY7hs=" + }, + "power": 100, + "name": "staked" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" + }, + "power": 1000, + "name": "polsdam" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" + }, + "power": 1000, + "name": "lino" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" + }, + "power": 100, + "name": "" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" + }, + "power": 1000, + "name": "iris" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" + }, + "power": 1000, + "name": "pbostrom" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" + }, + "power": 1000, + "name": "aurel" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" + }, + "power": 1000, + "name": "bucky" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" + }, + "power": 100, + "name": "cwgoes" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "TNPLvN6f6QoSLJqGHzIfbraBoSw3emr9Sk2Us94M4gM=" + }, + "power": 1000, + "name": "bdnet" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "cvGYknYP9XMUzqlXZde7lRpvAp/kZiSRYHg66krJNxQ=" + }, + "power": 1000, + "name": "melea-trust" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" + }, + "power": 1000, + "name": "naruemon" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "rcl+kuM69Un/a7e+fQsQrCEtT1g04tFviOeq2GygSIw=" + }, + "power": 1000, + "name": "idoor" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "S9urD5q7je21qp5vEobiURdWrtJwvqMsfZGQhb8GOBQ=" + }, + "power": 1000, + "name": "ATEAM1" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "vSr94aI+zfF3D8Cr2VtCXPpfgj7t2ck8SlZxRsfn7gk=" + }, + "power": 1000, + "name": "figmatt" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "p5ijoVwp2zmA7RkXXvPl+yqdnlaWMwoV2pYIN8bDyFs=" + }, + "power": 1000, + "name": "jla-bsd" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "KOdWpo4aQFrLxVlkyc66p7m6mBNnPLmGuO4Z4L+CI1Y=" + }, + "power": 1000, + "name": "Gold" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "VfOsmcON77auerRc9zKwOR+CvL0sj1nA45hS2WqX1xE=" + }, + "power": 1000, + "name": "nylira" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "QYONAknaJqx3OKPSKraDrOPkx6xssezYtXVS84nZvZE=" + }, + "power": 1000, + "name": "BKCM" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "PyFJmNrUres3QOkj2BjxplCxrOF+HDFGohi3tRKsToY=" + }, + "power": 1000, + "name": "Dev's Validator" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "s4ER09+WeX10euzGyK7xDW7+myQVXt3Plup8IHUE4nk=" + }, + "power": 1000, + "name": "Staking Facilities" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "OPxj9edXgufNEjYNhZKqLgmYnK4A3nGw3rxaFQrHn24=" + }, + "power": 1000, + "name": "nuevax" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "Hi2rtbdJdQtOe3Kq4OoD/xkWJbIjIsUI9qgLQ6TlhiM=" + }, + "power": 1000, + "name": "vultr.guest" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "ah3JtmBA7gbxSiimPsLqQlV85gpNOUBJMvnxGx8eVlo=" + }, + "power": 1000, + "name": "forebole" + } + ], + "app_hash": "", + "app_state": { + "accounts": [ + { + "address": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "coins": [ + { + "denom": "devToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "coins": [ + { + "denom": "adrianToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "109720515B4F8C0858DA3521E448262334534FFD", + "coins": [ + { + "denom": "defaultToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "coins": [ + { + "denom": "aurelToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "328FBB8EA315D070DF908982A5F91A3618001D20", + "coins": [ + { + "denom": "cwgoesToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "coins": [ + { + "denom": "BKCMToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "coins": [ + { + "denom": "BDToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "coins": [ + { + "denom": "suyuToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "coins": [ + { + "denom": "linoToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "coins": [ + { + "denom": "stakingToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "935E04662697134905706A4CCDB822AC6FC11C2E", + "coins": [ + { + "denom": "defaultToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "935E48ED79F1006ED135553768E1D9A768747CF6", + "coins": [ + { + "denom": "buckyToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "99FFAEE5BF6040EADA2F26548C4A702619797C9F", + "coins": [ + { + "denom": "kwunyeungToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "zachToken", + "amount": 1000 + } + ] + }, + { + "address": "A323EC45243D600204BA3D298E3C20322D08C84C", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "nuevaxToken", + "amount": 1000 + } + ] + }, + { + "address": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "dokiaToken", + "amount": 1000 + } + ] + }, + { + "address": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "forboleToken", + "amount": 1000 + } + ] + }, + { + "address": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "coins": [ + { + "denom": "steak", + "amount": 100 + }, + { + "denom": "pengToken", + "amount": 1000 + } + ] + }, + { + "address": "FD30D5C983FFEDEC069C3DDFCF270E41A556A86E", + "coins": [ + { + "denom": "steak", + "amount": 900 + }, + { + "denom": "faucetToken", + "amount": 10000000 + } + ] + }, + { + "address": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "goldToken", + "amount": 100 + } + ] + }, + { + "address": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "jlaToken", + "amount": 100 + } + ] + }, + { + "address": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "figmattToken", + "amount": 100 + } + ] + }, + { + "address": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "ATEAM1Token", + "amount": 100 + } + ] + }, + { + "address": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "idoorToken", + "amount": 100 + } + ] + }, + { + "address": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "naruemonToken", + "amount": 100 + } + ] + }, + { + "address": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "zakiToken", + "amount": 1000 + } + ] + }, + { + "address": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "trustToken", + "amount": 1000 + } + ] + }, + { + "address": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "coins": [ + { + "denom": "poldsamToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + } + ], + "stake": { + "pool": { + "loose_unbonded_tokens": 2300, + "unbonded_tokens": 0, + "unbonding_tokens": 0, + "bonded_tokens": 23300, + "unbonded_shares": "0", + "unbonding_shares": "0", + "bonded_shares": "23300", + "inflation_last_time": 0, + "inflation": "9012837/100000000", + "date_last_commission_reset": 0, + "prev_bonded_shares": "0" + }, + "params": { + "inflation_rate_change": "13/100", + "inflation_max": "1/5", + "inflation_min": "7/100", + "goal_bonded": "67/100", + "max_validators": 100, + "bond_denom": "steak" + }, + "bonds": [ + { + "delegator_addr": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "validator_addr": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "109720515B4F8C0858DA3521E448262334534FFD", + "validator_addr": "109720515B4F8C0858DA3521E448262334534FFD", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "validator_addr": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "328FBB8EA315D070DF908982A5F91A3618001D20", + "validator_addr": "328FBB8EA315D070DF908982A5F91A3618001D20", + "shares": "100", + "height": 0 + }, + { + "delegator_addr": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "validator_addr": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "validator_addr": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "validator_addr": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "validator_addr": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "validator_addr": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "935E04662697134905706A4CCDB822AC6FC11C2E", + "validator_addr": "935E04662697134905706A4CCDB822AC6FC11C2E", + "shares": "100", + "height": 0 + }, + { + "delegator_addr": "935E48ED79F1006ED135553768E1D9A768747CF6", + "validator_addr": "935E48ED79F1006ED135553768E1D9A768747CF6", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "validator_addr": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "shares": "100", + "height": 0 + }, + { + "delegator_addr": "A323EC45243D600204BA3D298E3C20322D08C84C", + "validator_addr": "A323EC45243D600204BA3D298E3C20322D08C84C", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "validator_addr": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "validator_addr": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "validator_addr": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "validator_addr": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "validator_addr": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "validator_addr": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "validator_addr": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "validator_addr": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "validator_addr": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "validator_addr": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "validator_addr": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "validator_addr": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "validator_addr": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "shares": "1000", + "height": 0 + } + ], + "validators": [ + { + "owner": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "pub_key": { + "type": "AC26791624DE60", + "value": "PyFJmNrUres3QOkj2BjxplCxrOF+HDFGohi3tRKsToY=" + }, + "description": { + "moniker": "Dev's Validator", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "109720515B4F8C0858DA3521E448262334534FFD", + "pub_key": { + "type": "AC26791624DE60", + "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" + }, + "description": { + "moniker": "", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "pub_key": { + "type": "AC26791624DE60", + "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" + }, + "description": { + "moniker": "aurel", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "328FBB8EA315D070DF908982A5F91A3618001D20", + "pub_key": { + "type": "AC26791624DE60", + "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" + }, + "description": { + "moniker": "cwgoes", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "100" + }, + "delegator_shares": "100", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "pub_key": { + "type": "AC26791624DE60", + "value": "QYONAknaJqx3OKPSKraDrOPkx6xssezYtXVS84nZvZE=" + }, + "description": { + "moniker": "BKCM", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "pub_key": { + "type": "AC26791624DE60", + "value": "TNPLvN6f6QoSLJqGHzIfbraBoSw3emr9Sk2Us94M4gM=" + }, + "description": { + "moniker": "bdnet", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "pub_key": { + "type": "AC26791624DE60", + "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" + }, + "description": { + "moniker": "suyu", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "pub_key": { + "type": "AC26791624DE60", + "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" + }, + "description": { + "moniker": "lino", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "pub_key": { + "type": "AC26791624DE60", + "value": "s4ER09+WeX10euzGyK7xDW7+myQVXt3Plup8IHUE4nk=" + }, + "description": { + "moniker": "Staking Facilities", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "935E04662697134905706A4CCDB822AC6FC11C2E", + "pub_key": { + "type": "AC26791624DE60", + "value": "bIvXwf0qlOy0rO0SY/h8FfsqyW/AMpGL2yUhUNOY7hs=" + }, + "description": { + "moniker": "default", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "100" + }, + "delegator_shares": "100", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "935E48ED79F1006ED135553768E1D9A768747CF6", + "pub_key": { + "type": "AC26791624DE60", + "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" + }, + "description": { + "moniker": "bucky", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "pub_key": { + "type": "AC26791624DE60", + "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" + }, + "description": { + "moniker": "zach", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "100" + }, + "delegator_shares": "100", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "A323EC45243D600204BA3D298E3C20322D08C84C", + "pub_key": { + "type": "AC26791624DE60", + "value": "OPxj9edXgufNEjYNhZKqLgmYnK4A3nGw3rxaFQrHn24=" + }, + "description": { + "moniker": "nuevax", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "pub_key": { + "type": "AC26791624DE60", + "value": "Hi2rtbdJdQtOe3Kq4OoD/xkWJbIjIsUI9qgLQ6TlhiM=" + }, + "description": { + "moniker": "vultr.guest", + "identity": "", + "website": "https://ion.dokia.capital/", + "details": "DokiaValidator" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "pub_key": { + "type": "AC26791624DE60", + "value": "ah3JtmBA7gbxSiimPsLqQlV85gpNOUBJMvnxGx8eVlo=" + }, + "description": { + "moniker": "forbole", + "identity": "", + "website": "https://www.forbole.com", + "details": "Recommend. Refer. Reward" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "pub_key": { + "type": "AC26791624DE60", + "value": "VfOsmcON77auerRc9zKwOR+CvL0sj1nA45hS2WqX1xE=" + }, + "description": { + "moniker": "nylira", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "pub_key": { + "type": "AC26791624DE60", + "value": "KOdWpo4aQFrLxVlkyc66p7m6mBNnPLmGuO4Z4L+CI1Y=" + }, + "description": { + "moniker": "Gold", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "pub_key": { + "type": "AC26791624DE60", + "value": "p5ijoVwp2zmA7RkXXvPl+yqdnlaWMwoV2pYIN8bDyFs=" + }, + "description": { + "moniker": "jla-bsd", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "pub_key": { + "type": "AC26791624DE60", + "value": "vSr94aI+zfF3D8Cr2VtCXPpfgj7t2ck8SlZxRsfn7gk=" + }, + "description": { + "moniker": "figmatt", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "pub_key": { + "type": "AC26791624DE60", + "value": "S9urD5q7je21qp5vEobiURdWrtJwvqMsfZGQhb8GOBQ=" + }, + "description": { + "moniker": "ATEAM1", + "identity": "", + "website": "", + "details": "ATEAM1" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "pub_key": { + "type": "AC26791624DE60", + "value": "rcl+kuM69Un/a7e+fQsQrCEtT1g04tFviOeq2GygSIw=" + }, + "description": { + "moniker": "idoor", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "pub_key": { + "type": "AC26791624DE60", + "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" + }, + "description": { + "moniker": "naruemon", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "pub_key": { + "type": "AC26791624DE60", + "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" + }, + "description": { + "moniker": "Adrian Brink - Cryptium Labs", + "identity": "", + "website": "https://cryptium.ch", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "pub_key": { + "type": "AC26791624DE60", + "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" + }, + "description": { + "moniker": "zaki", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "pub_key": { + "type": "AC26791624DE60", + "value": "cvGYknYP9XMUzqlXZde7lRpvAp/kZiSRYHg66krJNxQ=" + }, + "description": { + "moniker": "trust", + "identity": "", + "website": "http://cosmos-trust.com", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "pub_key": { + "type": "AC26791624DE60", + "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" + }, + "description": { + "moniker": "proof-of-audit", + "identity": "", + "website": "https://proof-of-audit.com", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + } + ] + } + } +} From eceb56b709e6d2fb1ec9a401af4d2c0e82a33a18 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Sun, 10 Jun 2018 10:51:18 -0700 Subject: [PATCH 218/548] cmd/gaia/testnets: update status.md with recent history --- cmd/gaia/testnets/STATUS.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/cmd/gaia/testnets/STATUS.md b/cmd/gaia/testnets/STATUS.md index fb21ff9a44..d53c49e092 100644 --- a/cmd/gaia/testnets/STATUS.md +++ b/cmd/gaia/testnets/STATUS.md @@ -1,5 +1,41 @@ # TESTNET STATUS +## *June 10, 2018, 8:30 EST* - Gaia-6001 consensus failure + +- Validator unbonding and revocation activity caused a consensus failure +- There is a bug in the staking module that must be fixed +- The team is taking its time to look into this and release a fix following a + proper protocol for hotfix upgrades to the testnet +- Please stay tuned! + +## *June 9, 2018, 14:00 EST* - New Release + +- Released gaia + [v0.18.0](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.18.0) with + update for Tendermint + [v0.20.0](https://github.com/tendermint/tendermint/releases/tag/v0.20.0) +- Includes bug fix for declaring candidacy from the command line + +## *June 8, 2018, 23:30 EST* - Gaia-6001 is making blocks + +- +2/3 of the voting power is finally online for Gaia-6001 and it is making + blocks! +- This is a momentous achievement - a successful asynchronous decentralized + testnet launch +- Congrats everyone! + +## *June 8, 2018, 12:00 EST* - New Testnet Gaia-6001 + +- After some confusion around testnet deployment and a contention testnet + hardfork, a new genesis file and network was released for `gaia-6001` + +## *June 7, 2018, 9:00 EST* - New Testnet Gaia-6000 + +- Released a new `genesis.json` file for `gaia-6000` +- Initial validators include those that were most active in + the gaia-5001 testnet +- Join the network via gaia `v0.18.0-rc0` + ## *June 5, 2018, 21:00 EST* - New Release - Released gaia From 9430ba1baa3001c2686be2b2ff2991d18a0ca4bf Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Sun, 10 Jun 2018 11:02:19 -0700 Subject: [PATCH 219/548] cmd/gaia/testnets: update versions, use a working seed --- cmd/gaia/testnets/README.md | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/cmd/gaia/testnets/README.md b/cmd/gaia/testnets/README.md index e5c6522796..a6f6bbb5eb 100644 --- a/cmd/gaia/testnets/README.md +++ b/cmd/gaia/testnets/README.md @@ -2,6 +2,12 @@ This document explains how to connect to the Testnet of a [Cosmos-SDK](https://github.com/cosmos/cosmos-sdk/) based blockchain. It can be used to connect to the latest Testnet for the Cosmos Hub. +NOTE: We are aware this documentation is sub-par and are actively working to +improve both the tooling and the documentation to make this as painless as +possible. In the meantime, join the +[chat](https://riot.im/app/#/room/#cosmos_validators:matrix.org) for technical support. Thanks very +much for your patience :) + ## Software Setup (Manual Installation) Follow these instructions to install the Cosmos-SDK and connect to the latest Testnet. This instructions work for both a local machine and a VM in a cloud server. @@ -52,7 +58,7 @@ Now we can fetch the correct versions of each dependency by running: ``` mkdir -p $GOPATH/src/github.com/cosmos/cosmos-sdk git clone https://github.com/cosmos/cosmos-sdk.git -git checkout v0.18.0-rc0 +git checkout v0.18.0 make get_tools // run $ make update_tools if already installed make get_vendor_deps make install @@ -67,7 +73,7 @@ gaiad version You should see: ``` -0.18.0-dev-af15f89 +0.18.0-eceb56b7 ``` And also: @@ -79,22 +85,20 @@ gaiacli version You should see: ``` -0.18.0-dev-af15f89 +0.18.0-eceb56b7 ``` ## Full Node Setup -Clone the testnet repo. +Copy the testnet initialization files to a new data directory: ``` -git clone https://github.com/cosmos/testnets - mkdir -p $HOME/.gaiad/config -cp -a testnets/gaia-6001/genesis.json $HOME/.gaiad/config/genesis.json +cp -a cmd/gaia/testnets/gaia-6001/genesis.json $HOME/.gaiad/config/genesis.json gaiad unsafe_reset_all ``` -Add a seed node by changing `seed = ""` in `config.toml` to `seed = "80a35a46ce09cfb31ee220c8141a25e73e0b239b@35.198.166.171:46656"`. +Add a seed node by changing `seed = ""` in `config.toml` to `seed = "38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6001.coinculture.net:46656" Lastly change the `moniker` string in the`config.toml`to identify your node. @@ -123,25 +127,24 @@ Now it is time to upgrade the software. ``` cd $GOPATH/src/github.com/cosmos/cosmos-sdk git fetch --all -git checkout v0.18.0-rc0 +git checkout v0.18.0 make update_tools make get_vendor_deps make install ``` -The next step is to obtain the new genesis file from `https://github.com/cosmos/testnets`. -``` -cd $HOME/testnets -git pull origin master +The next step is to copy the new genesis file: -cp -a gaia-6001/genesis.json $HOME/.gaiad/config +``` +cp -a cmd/gaia/testnets/gaia-6001/genesis.json $HOME/.gaiad/config/genesis.json ``` The last step is the adjust the `config.toml`. Make sure that you are connected to healthy peers or seed nodes. These are some seeds nodes and they can be put into the config under the `seeds` key. Alternatively you can also ask user validators directly for a persistent peer and add it under the `persisent_peers` key. + ``` -80a35a46ce09cfb31ee220c8141a25e73e0b239b@cosmos.cryptium.ch:46656 +38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6001.coinculture.net:46656" ``` ## Run a Full Node From 3bea85abb367e1c7bd3d17ef7bda70aebcf37f25 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 11 Jun 2018 02:55:54 +0200 Subject: [PATCH 220/548] Register slashing keeper, set startHeight, testcases --- cmd/gaia/app/app.go | 3 +- x/slashing/app_test.go | 124 ++++++++++++++++++++++++++++++++++++++ x/slashing/keeper.go | 6 +- x/slashing/keeper_test.go | 30 +++++++++ 4 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 x/slashing/app_test.go diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index f06ed2be30..717d64c39f 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -82,7 +82,8 @@ func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { app.Router(). AddRoute("bank", bank.NewHandler(app.coinKeeper)). AddRoute("ibc", ibc.NewHandler(app.ibcMapper, app.coinKeeper)). - AddRoute("stake", stake.NewHandler(app.stakeKeeper)) + AddRoute("stake", stake.NewHandler(app.stakeKeeper)). + AddRoute("slashing", slashing.NewHandler(app.slashingKeeper)) // initialize BaseApp app.SetInitChainer(app.initChainer) diff --git a/x/slashing/app_test.go b/x/slashing/app_test.go new file mode 100644 index 0000000000..f0f1f7247a --- /dev/null +++ b/x/slashing/app_test.go @@ -0,0 +1,124 @@ +package slashing + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/auth/mock" + "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/x/stake" + abci "github.com/tendermint/abci/types" + crypto "github.com/tendermint/go-crypto" +) + +var ( + priv1 = crypto.GenPrivKeyEd25519() + addr1 = priv1.PubKey().Address() + priv2 = crypto.GenPrivKeyEd25519() + addr2 = priv2.PubKey().Address() + addr3 = crypto.GenPrivKeyEd25519().PubKey().Address() + priv4 = crypto.GenPrivKeyEd25519() + addr4 = priv4.PubKey().Address() + coins = sdk.Coins{{"foocoin", 10}} + fee = auth.StdFee{ + sdk.Coins{{"foocoin", 0}}, + 100000, + } +) + +// initialize the mock application for this module +func getMockApp(t *testing.T) (*mock.App, stake.Keeper, Keeper) { + mapp := mock.NewApp() + + RegisterWire(mapp.Cdc) + keyStake := sdk.NewKVStoreKey("stake") + keySlashing := sdk.NewKVStoreKey("slashing") + coinKeeper := bank.NewKeeper(mapp.AccountMapper) + stakeKeeper := stake.NewKeeper(mapp.Cdc, keyStake, coinKeeper, mapp.RegisterCodespace(DefaultCodespace)) + keeper := NewKeeper(mapp.Cdc, keySlashing, stakeKeeper, mapp.RegisterCodespace(DefaultCodespace)) + mapp.Router().AddRoute("stake", stake.NewHandler(stakeKeeper)) + mapp.Router().AddRoute("slashing", NewHandler(keeper)) + + mapp.SetEndBlocker(getEndBlocker(stakeKeeper)) + mapp.SetInitChainer(getInitChainer(mapp, stakeKeeper)) + mapp.CompleteSetup(t, []*sdk.KVStoreKey{keyStake, keySlashing}) + + return mapp, stakeKeeper, keeper +} + +// stake endblocker +func getEndBlocker(keeper stake.Keeper) sdk.EndBlocker { + return func(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { + validatorUpdates := stake.EndBlocker(ctx, keeper) + return abci.ResponseEndBlock{ + ValidatorUpdates: validatorUpdates, + } + } +} + +// overwrite the mock init chainer +func getInitChainer(mapp *mock.App, keeper stake.Keeper) sdk.InitChainer { + return func(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { + mapp.InitChainer(ctx, req) + stake.InitGenesis(ctx, keeper, stake.DefaultGenesisState()) + return abci.ResponseInitChain{} + } +} + +func checkValidator(t *testing.T, mapp *mock.App, keeper stake.Keeper, + addr sdk.Address, expFound bool) stake.Validator { + ctxCheck := mapp.BaseApp.NewContext(true, abci.Header{}) + validator, found := keeper.GetValidator(ctxCheck, addr1) + assert.Equal(t, expFound, found) + return validator +} + +func checkValidatorSigningInfo(t *testing.T, mapp *mock.App, keeper Keeper, + addr sdk.Address, expFound bool) ValidatorSigningInfo { + ctxCheck := mapp.BaseApp.NewContext(true, abci.Header{}) + signingInfo, found := keeper.getValidatorSigningInfo(ctxCheck, addr) + assert.Equal(t, expFound, found) + return signingInfo +} + +func TestSlashingMsgs(t *testing.T) { + mapp, stakeKeeper, keeper := getMockApp(t) + + genCoin := sdk.Coin{"steak", 42} + bondCoin := sdk.Coin{"steak", 10} + + acc1 := &auth.BaseAccount{ + Address: addr1, + Coins: sdk.Coins{genCoin}, + } + acc2 := &auth.BaseAccount{ + Address: addr2, + Coins: sdk.Coins{genCoin}, + } + accs := []auth.Account{acc1, acc2} + + mock.SetGenesis(mapp, accs) + description := stake.NewDescription("foo_moniker", "", "", "") + createValidatorMsg := stake.NewMsgCreateValidator( + addr1, priv1.PubKey(), bondCoin, description, + ) + mock.SignCheckDeliver(t, mapp.BaseApp, createValidatorMsg, []int64{0}, true, priv1) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{genCoin.Minus(bondCoin)}) + mapp.BeginBlock(abci.RequestBeginBlock{}) + + validator := checkValidator(t, mapp, stakeKeeper, addr1, true) + require.Equal(t, addr1, validator.Owner) + require.Equal(t, sdk.Bonded, validator.Status()) + require.True(sdk.RatEq(t, sdk.NewRat(10), validator.PoolShares.Bonded())) + unrevokeMsg := MsgUnrevoke{ValidatorAddr: validator.PubKey.Address()} + + // no signing info yet + checkValidatorSigningInfo(t, mapp, keeper, addr1, false) + + // unrevoke should fail + mock.SignCheckDeliver(t, mapp.BaseApp, unrevokeMsg, []int64{1}, false, priv1) +} diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index d558cc04b0..89faf64ed2 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -56,7 +56,11 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, // Local index, so counts blocks validator *should* have signed // Will use the 0-value default signing info if not present - signInfo, _ := k.getValidatorSigningInfo(ctx, address) + signInfo, found := k.getValidatorSigningInfo(ctx, address) + if !found { + // If this validator has never been seen before, set the start height + signInfo.StartHeight = height + } index := signInfo.IndexOffset % SignedBlocksWindow signInfo.IndexOffset++ diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 25ae1686d6..3d49b65c4b 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -129,3 +129,33 @@ func TestHandleAbsentValidator(t *testing.T) { validator, _ = sk.GetValidatorByPubKey(ctx, val) require.Equal(t, sdk.Unbonded, validator.GetStatus()) } + +func TestHandleNewValidator(t *testing.T) { + // initial setup + ctx, ck, sk, keeper := createTestInput(t) + addr, val, amt := addrs[0], pks[0], int64(100) + sh := stake.NewHandler(sk) + got := sh(ctx, newTestMsgCreateValidator(addr, val, amt)) + require.True(t, got.IsOK()) + stake.EndBlocker(ctx, sk) + require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) + require.Equal(t, sdk.NewRat(amt), sk.Validator(ctx, addr).GetPower()) + + // 1000 first blocks not a validator + ctx = ctx.WithBlockHeight(1001) + + // Now a validator + keeper.handleValidatorSignature(ctx, val, true) + info, found := keeper.getValidatorSigningInfo(ctx, val.Address()) + require.True(t, found) + require.Equal(t, int64(1001), info.StartHeight) + require.Equal(t, int64(1), info.IndexOffset) + require.Equal(t, int64(1), info.SignedBlocksCounter) + require.Equal(t, int64(0), info.JailedUntil) + + // validator should be bonded still, should not have been revoked or slashed + validator, _ := sk.GetValidatorByPubKey(ctx, val) + require.Equal(t, sdk.Bonded, validator.GetStatus()) + pool := sk.GetPool(ctx) + require.Equal(t, int64(100), pool.BondedTokens) +} From 2d2b57261c004aa1555b9f54470687e3e3420135 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 11 Jun 2018 02:59:36 +0200 Subject: [PATCH 221/548] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71a8faa626..f6768cff94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ IMPROVEMENTS FIXES * [lcd] Switch to bech32 for addresses on all human readable inputs and outputs * [cli] Added `--gas` flag to specify transaction gas limit +* [gaia] Registered slashing message handler +* [x/slashing] Set signInfo.StartHeight correctly for newly bonded validators ## 0.18.0 From f6a30afbf4f1501ec9edb1801adab3bc94b90413 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 11 Jun 2018 03:03:52 +0200 Subject: [PATCH 222/548] Improve testcase, add comment --- x/slashing/keeper.go | 2 +- x/slashing/keeper_test.go | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index 89faf64ed2..c7cf063692 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -55,7 +55,7 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, address := pubkey.Address() // Local index, so counts blocks validator *should* have signed - // Will use the 0-value default signing info if not present + // Will use the 0-value default signing info if not present, except for start height signInfo, found := k.getValidatorSigningInfo(ctx, address) if !found { // If this validator has never been seen before, set the start height diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 3d49b65c4b..3e78d939d2 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -144,12 +144,15 @@ func TestHandleNewValidator(t *testing.T) { // 1000 first blocks not a validator ctx = ctx.WithBlockHeight(1001) - // Now a validator + // Now a validator, for two blocks keeper.handleValidatorSignature(ctx, val, true) + ctx = ctx.WithBlockHeight(1002) + keeper.handleValidatorSignature(ctx, val, false) + info, found := keeper.getValidatorSigningInfo(ctx, val.Address()) require.True(t, found) require.Equal(t, int64(1001), info.StartHeight) - require.Equal(t, int64(1), info.IndexOffset) + require.Equal(t, int64(2), info.IndexOffset) require.Equal(t, int64(1), info.SignedBlocksCounter) require.Equal(t, int64(0), info.JailedUntil) From a4865ef6aa8b1fd4db193171ec7bc6f40561fcf3 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 11 Jun 2018 03:14:20 +0200 Subject: [PATCH 223/548] Add mock.SignCheck, update testcase to assert error code --- x/auth/mock/simulate_block.go | 6 ++++++ x/slashing/app_test.go | 7 ++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/x/auth/mock/simulate_block.go b/x/auth/mock/simulate_block.go index 72ec8411fa..4db7bf6305 100644 --- a/x/auth/mock/simulate_block.go +++ b/x/auth/mock/simulate_block.go @@ -52,6 +52,12 @@ func GenTx(msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) auth.StdTx { return auth.NewStdTx(msg, fee, sigs) } +func SignCheck(t *testing.T, app *baseapp.BaseApp, msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) sdk.Result { + tx := GenTx(msg, seq, priv...) + res := app.Check(tx) + return res +} + // simulate a block func SignCheckDeliver(t *testing.T, app *baseapp.BaseApp, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { diff --git a/x/slashing/app_test.go b/x/slashing/app_test.go index f0f1f7247a..9253765d58 100644 --- a/x/slashing/app_test.go +++ b/x/slashing/app_test.go @@ -38,7 +38,7 @@ func getMockApp(t *testing.T) (*mock.App, stake.Keeper, Keeper) { keyStake := sdk.NewKVStoreKey("stake") keySlashing := sdk.NewKVStoreKey("slashing") coinKeeper := bank.NewKeeper(mapp.AccountMapper) - stakeKeeper := stake.NewKeeper(mapp.Cdc, keyStake, coinKeeper, mapp.RegisterCodespace(DefaultCodespace)) + stakeKeeper := stake.NewKeeper(mapp.Cdc, keyStake, coinKeeper, mapp.RegisterCodespace(stake.DefaultCodespace)) keeper := NewKeeper(mapp.Cdc, keySlashing, stakeKeeper, mapp.RegisterCodespace(DefaultCodespace)) mapp.Router().AddRoute("stake", stake.NewHandler(stakeKeeper)) mapp.Router().AddRoute("slashing", NewHandler(keeper)) @@ -119,6 +119,7 @@ func TestSlashingMsgs(t *testing.T) { // no signing info yet checkValidatorSigningInfo(t, mapp, keeper, addr1, false) - // unrevoke should fail - mock.SignCheckDeliver(t, mapp.BaseApp, unrevokeMsg, []int64{1}, false, priv1) + // unrevoke should fail with unknown validator + res := mock.SignCheck(t, mapp.BaseApp, unrevokeMsg, []int64{1}, priv1) + require.Equal(t, sdk.ToABCICode(DefaultCodespace, CodeInvalidValidator), res.Code) } From c9a977beae4b1262e5087e49bfb9520e37334870 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 11 Jun 2018 03:15:48 +0200 Subject: [PATCH 224/548] Cleanup testcase --- x/slashing/app_test.go | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/x/slashing/app_test.go b/x/slashing/app_test.go index 9253765d58..3d33f53e73 100644 --- a/x/slashing/app_test.go +++ b/x/slashing/app_test.go @@ -18,16 +18,7 @@ import ( var ( priv1 = crypto.GenPrivKeyEd25519() addr1 = priv1.PubKey().Address() - priv2 = crypto.GenPrivKeyEd25519() - addr2 = priv2.PubKey().Address() - addr3 = crypto.GenPrivKeyEd25519().PubKey().Address() - priv4 = crypto.GenPrivKeyEd25519() - addr4 = priv4.PubKey().Address() coins = sdk.Coins{{"foocoin", 10}} - fee = auth.StdFee{ - sdk.Coins{{"foocoin", 0}}, - 100000, - } ) // initialize the mock application for this module @@ -95,12 +86,7 @@ func TestSlashingMsgs(t *testing.T) { Address: addr1, Coins: sdk.Coins{genCoin}, } - acc2 := &auth.BaseAccount{ - Address: addr2, - Coins: sdk.Coins{genCoin}, - } - accs := []auth.Account{acc1, acc2} - + accs := []auth.Account{acc1} mock.SetGenesis(mapp, accs) description := stake.NewDescription("foo_moniker", "", "", "") createValidatorMsg := stake.NewMsgCreateValidator( From b9c1bcbd74ffbaaa0e9294ea76ed0337b1888a33 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 11 Jun 2018 03:22:38 +0200 Subject: [PATCH 225/548] Tiny linter fix --- x/auth/mock/simulate_block.go | 1 + 1 file changed, 1 insertion(+) diff --git a/x/auth/mock/simulate_block.go b/x/auth/mock/simulate_block.go index 4db7bf6305..16b250f4ca 100644 --- a/x/auth/mock/simulate_block.go +++ b/x/auth/mock/simulate_block.go @@ -52,6 +52,7 @@ func GenTx(msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) auth.StdTx { return auth.NewStdTx(msg, fee, sigs) } +// check a transaction result func SignCheck(t *testing.T, app *baseapp.BaseApp, msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) sdk.Result { tx := GenTx(msg, seq, priv...) res := app.Check(tx) From 74f5b26666b893bb22a679a732c3c0563afeff47 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 11 Jun 2018 11:35:12 -0700 Subject: [PATCH 226/548] readme points to testnet folder --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 3faf2c8afd..7713633d0d 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,14 @@ master | [![CircleCI](https://circleci.com/gh/cosmos/cosmos-sdk/tree/master.s **Note**: Requires [Go 1.10+](https://golang.org/dl/) +## Testnet + +For more information on connecting to the testnet, see +[cmd/gaia/testnets](/cmd/gaia/testnets) + +For the latest status of the testnet, see the [status +file](/cmd/gaia/testnets/status.md). + ## Overview From 5e975fc675cf780de5019427f1e9d9c5cea09d59 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 11 Jun 2018 11:35:18 -0700 Subject: [PATCH 227/548] add fixes from billy --- cmd/gaia/testnets/README.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/cmd/gaia/testnets/README.md b/cmd/gaia/testnets/README.md index a6f6bbb5eb..891cffdfdc 100644 --- a/cmd/gaia/testnets/README.md +++ b/cmd/gaia/testnets/README.md @@ -98,9 +98,13 @@ cp -a cmd/gaia/testnets/gaia-6001/genesis.json $HOME/.gaiad/config/genesis.json gaiad unsafe_reset_all ``` -Add a seed node by changing `seed = ""` in `config.toml` to `seed = "38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6001.coinculture.net:46656" +Add a seed node by changing `seed = ""` in `$HOME/.gaiad/config/config.toml` to -Lastly change the `moniker` string in the`config.toml`to identify your node. +``` +seed = "38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6001.coinculture.net:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@seed.cosmos.cryptium.ch:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@35.198.166.171:46656,032fa56301de335d835057fb6ad9f7ce2242a66d@165.227.236.213:46656" +``` + +Lastly change the `moniker` string in the `$HOME/.gaiad/config/config.toml`to identify your node. ``` # A custom human readable name for this node @@ -139,12 +143,12 @@ The next step is to copy the new genesis file: cp -a cmd/gaia/testnets/gaia-6001/genesis.json $HOME/.gaiad/config/genesis.json ``` -The last step is the adjust the `config.toml`. Make sure that you are connected to healthy peers or seed nodes. +The last step is the adjust the `$HOME/.gaiad/config/config.toml`. Make sure that you are connected to healthy peers or seed nodes. These are some seeds nodes and they can be put into the config under the `seeds` key. Alternatively you can also ask user validators directly for a persistent peer and add it under the `persisent_peers` key. ``` -38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6001.coinculture.net:46656" +38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6001.coinculture.net:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@seed.cosmos.cryptium.ch:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@35.198.166.171:46656,032fa56301de335d835057fb6ad9f7ce2242a66d@165.227.236.213:46656 ``` ## Run a Full Node From f07573708316b429e8e070ae7f03a418861e57a7 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 11 Jun 2018 11:37:05 -0700 Subject: [PATCH 228/548] fix status.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7713633d0d..3af98fb4f2 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ For more information on connecting to the testnet, see [cmd/gaia/testnets](/cmd/gaia/testnets) For the latest status of the testnet, see the [status -file](/cmd/gaia/testnets/status.md). +file](/cmd/gaia/testnets/STATUS.md). ## Overview From 4dcf41df4b4f64c243a45c389abe0ba897d9c5fb Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 11 Jun 2018 11:40:38 -0700 Subject: [PATCH 229/548] seed->seeds --- cmd/gaia/testnets/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/gaia/testnets/README.md b/cmd/gaia/testnets/README.md index 891cffdfdc..42484c5990 100644 --- a/cmd/gaia/testnets/README.md +++ b/cmd/gaia/testnets/README.md @@ -98,10 +98,10 @@ cp -a cmd/gaia/testnets/gaia-6001/genesis.json $HOME/.gaiad/config/genesis.json gaiad unsafe_reset_all ``` -Add a seed node by changing `seed = ""` in `$HOME/.gaiad/config/config.toml` to +Add a seed node by changing `seeds = ""` in `$HOME/.gaiad/config/config.toml` to ``` -seed = "38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6001.coinculture.net:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@seed.cosmos.cryptium.ch:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@35.198.166.171:46656,032fa56301de335d835057fb6ad9f7ce2242a66d@165.227.236.213:46656" +seeds = "38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6001.coinculture.net:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@seed.cosmos.cryptium.ch:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@35.198.166.171:46656,032fa56301de335d835057fb6ad9f7ce2242a66d@165.227.236.213:46656" ``` Lastly change the `moniker` string in the `$HOME/.gaiad/config/config.toml`to identify your node. From ee17b7c9cc7e5167bf4d2eea95c8ef3b25f0ba6a Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 11 Jun 2018 21:47:35 +0200 Subject: [PATCH 230/548] Address PR comments: test descriptions & NewValidatorSigningInfo --- x/slashing/keeper.go | 4 ++-- x/slashing/keeper_test.go | 7 +++++++ x/slashing/signing_info.go | 10 ++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/x/slashing/keeper.go b/x/slashing/keeper.go index c7cf063692..d5ae09ef22 100644 --- a/x/slashing/keeper.go +++ b/x/slashing/keeper.go @@ -58,8 +58,8 @@ func (k Keeper) handleValidatorSignature(ctx sdk.Context, pubkey crypto.PubKey, // Will use the 0-value default signing info if not present, except for start height signInfo, found := k.getValidatorSigningInfo(ctx, address) if !found { - // If this validator has never been seen before, set the start height - signInfo.StartHeight = height + // If this validator has never been seen before, construct a new SigningInfo with the correct start height + signInfo = NewValidatorSigningInfo(height, 0, 0, 0) } index := signInfo.IndexOffset % SignedBlocksWindow signInfo.IndexOffset++ diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 3e78d939d2..1f8f9db073 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -11,6 +11,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/stake" ) +// Test that a validator is slashed correctly +// when we discover evidence of equivocation func TestHandleDoubleSign(t *testing.T) { // initial setup @@ -32,6 +34,8 @@ func TestHandleDoubleSign(t *testing.T) { require.Equal(t, sdk.NewRat(amt).Mul(sdk.NewRat(19).Quo(sdk.NewRat(20))), sk.Validator(ctx, addr).GetPower()) } +// Test a validator through uptime, downtime, revocation, +// unrevocation, starting height reset, and revocation again func TestHandleAbsentValidator(t *testing.T) { // initial setup @@ -130,6 +134,9 @@ func TestHandleAbsentValidator(t *testing.T) { require.Equal(t, sdk.Unbonded, validator.GetStatus()) } +// Test a new validator entering the validator set +// Ensure that SigningInfo.StartHeight is set correctly +// and that they are not immediately revoked func TestHandleNewValidator(t *testing.T) { // initial setup ctx, ck, sk, keeper := createTestInput(t) diff --git a/x/slashing/signing_info.go b/x/slashing/signing_info.go index a2df0505a7..acbe1738b6 100644 --- a/x/slashing/signing_info.go +++ b/x/slashing/signing_info.go @@ -47,6 +47,16 @@ func (k Keeper) setValidatorSigningBitArray(ctx sdk.Context, address sdk.Address store.Set(GetValidatorSigningBitArrayKey(address, index), bz) } +// Construct a new `ValidatorSigningInfo` struct +func NewValidatorSigningInfo(startHeight int64, indexOffset int64, jailedUntil int64, signedBlocksCounter int64) ValidatorSigningInfo { + return ValidatorSigningInfo{ + StartHeight: startHeight, + IndexOffset: indexOffset, + JailedUntil: jailedUntil, + SignedBlocksCounter: signedBlocksCounter, + } +} + // Signing info for a validator type ValidatorSigningInfo struct { StartHeight int64 `json:"start_height"` // height at which validator was first a candidate OR was unrevoked From 8ece8073019f92d0de1d1a4fa67de248ed36dbbd Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 11 Jun 2018 13:09:29 -0700 Subject: [PATCH 231/548] Merge PR #1085: Re-enable tx history in LCD * reenable tx search * removed not needed argument * register types for decoding * trying to fix indexing tests * added tx hash query test * Fix x/bank tagging * remove dead code * remove print * extended tests for tx querying * changelog * added txs address querying * linted * rename * use prefix for bech32 addresses in tags * changed error message * Fix tiny linter issue --- CHANGELOG.md | 1 + client/lcd/helpers.go | 1 - client/lcd/lcd_test.go | 61 +++++++++++++++++++++++++++--------------- client/tx/root.go | 2 +- client/tx/search.go | 49 +++++++++++++++++++++++++-------- types/account.go | 11 ++++---- types/wire.go | 1 + x/auth/wire.go | 1 + x/bank/keeper.go | 4 +-- 9 files changed, 90 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71a8faa626..16346def30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ IMPROVEMENTS FIXES * [lcd] Switch to bech32 for addresses on all human readable inputs and outputs +* fixed tx indexing/querying * [cli] Added `--gas` flag to specify transaction gas limit ## 0.18.0 diff --git a/client/lcd/helpers.go b/client/lcd/helpers.go index 367e1a53de..14cd5c16c7 100644 --- a/client/lcd/helpers.go +++ b/client/lcd/helpers.go @@ -48,7 +48,6 @@ func GetConfig() *cfg.Config { tm, rpc, _ := makeAddrs() globalConfig.P2P.ListenAddress = tm globalConfig.RPC.ListenAddress = rpc - globalConfig.TxIndex.IndexTags = "app.creator" // see kvstore application } return globalConfig } diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 59f5b24646..3565d99c31 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -243,7 +243,7 @@ func TestCoinSend(t *testing.T) { initialBalance := acc.GetCoins() // create TX - receiveAddr, resultTx := doSend(t, port, seed) + receiveAddr, resultTx := doSend(t, port) tests.WaitForHeight(resultTx.Height+1, port) // check if tx was commited @@ -290,39 +290,57 @@ func TestIBCTransfer(t *testing.T) { } func TestTxs(t *testing.T) { - - // TODO: re-enable once we can get txs by tag - // query wrong - // res, body := request(t, port, "GET", "/txs", nil) - // require.Equal(t, http.StatusBadRequest, res.StatusCode, body) + res, body := request(t, port, "GET", "/txs", nil) + require.Equal(t, http.StatusBadRequest, res.StatusCode, body) // query empty - // res, body = request(t, port, "GET", fmt.Sprintf("/txs?tag=coin.sender='%s'", "8FA6AB57AD6870F6B5B2E57735F38F2F30E73CB6"), nil) - // require.Equal(t, http.StatusOK, res.StatusCode, body) - - // assert.Equal(t, "[]", body) + res, body = request(t, port, "GET", fmt.Sprintf("/txs?tag=sender_bech32='%s'", "cosmosaccaddr1jawd35d9aq4u76sr3fjalmcqc8hqygs9gtnmv3"), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + assert.Equal(t, "[]", body) // create TX - _, resultTx := doSend(t, port, seed) + receiveAddr, resultTx := doSend(t, port) tests.WaitForHeight(resultTx.Height+1, port) // check if tx is findable - res, body := request(t, port, "GET", fmt.Sprintf("/txs/%s", resultTx.Hash), nil) + res, body = request(t, port, "GET", fmt.Sprintf("/txs/%s", resultTx.Hash), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - // // query sender - // res, body = request(t, port, "GET", fmt.Sprintf("/txs?tag=coin.sender='%s'", addr), nil) - // require.Equal(t, http.StatusOK, res.StatusCode, body) + type txInfo struct { + Height int64 `json:"height"` + Tx sdk.Tx `json:"tx"` + Result abci.ResponseDeliverTx `json:"result"` + } + var indexedTxs []txInfo - // assert.NotEqual(t, "[]", body) + // check if tx is queryable + res, body = request(t, port, "GET", fmt.Sprintf("/txs?tag=tx.hash='%s'", resultTx.Hash), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + assert.NotEqual(t, "[]", body) - // // query receiver - // res, body = request(t, port, "GET", fmt.Sprintf("/txs?tag=coin.receiver='%s'", receiveAddr), nil) - // require.Equal(t, http.StatusOK, res.StatusCode, body) + err := cdc.UnmarshalJSON([]byte(body), &indexedTxs) + require.NoError(t, err) + assert.Equal(t, len(indexedTxs), 1) - // assert.NotEqual(t, "[]", body) + // query sender + res, body = request(t, port, "GET", fmt.Sprintf("/txs?tag=sender_bech32='%s'", sendAddr), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + err = cdc.UnmarshalJSON([]byte(body), &indexedTxs) + require.NoError(t, err) + assert.Equal(t, 2, len(indexedTxs)) // there are 2 txs created with doSend + assert.Equal(t, resultTx.Height, indexedTxs[1].Height) + + // query recipient + res, body = request(t, port, "GET", fmt.Sprintf("/txs?tag=recipient_bech32='%s'", receiveAddr), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + err = cdc.UnmarshalJSON([]byte(body), &indexedTxs) + require.NoError(t, err) + assert.Equal(t, 1, len(indexedTxs)) + assert.Equal(t, resultTx.Height, indexedTxs[0].Height) } func TestValidatorsQuery(t *testing.T) { @@ -401,6 +419,7 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { config := GetConfig() config.Consensus.TimeoutCommit = 1000 config.Consensus.SkipTimeoutCommit = false + config.TxIndex.IndexAllTags = true logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) logger = log.NewFilter(logger, log.AllowError()) @@ -553,7 +572,7 @@ func getAccount(t *testing.T, sendAddr string) auth.Account { return acc } -func doSend(t *testing.T, port, seed string) (receiveAddr string, resultTx ctypes.ResultBroadcastTxCommit) { +func doSend(t *testing.T, port string) (receiveAddr string, resultTx ctypes.ResultBroadcastTxCommit) { // create receive address kb := client.MockKeyBase() diff --git a/client/tx/root.go b/client/tx/root.go index e8abf33185..5def5a5440 100644 --- a/client/tx/root.go +++ b/client/tx/root.go @@ -19,7 +19,7 @@ func AddCommands(cmd *cobra.Command, cdc *wire.Codec) { // register REST routes func RegisterRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec) { r.HandleFunc("/txs/{hash}", QueryTxRequestHandlerFn(cdc, ctx)).Methods("GET") - // r.HandleFunc("/txs", SearchTxRequestHandler(cdc)).Methods("GET") + r.HandleFunc("/txs", SearchTxRequestHandlerFn(ctx, cdc)).Methods("GET") // r.HandleFunc("/txs/sign", SignTxRequstHandler).Methods("POST") // r.HandleFunc("/txs/broadcast", BroadcastTxRequestHandler).Methods("POST") } diff --git a/client/tx/search.go b/client/tx/search.go index 527661626a..3ab3a3df1b 100644 --- a/client/tx/search.go +++ b/client/tx/search.go @@ -13,6 +13,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/context" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" ) @@ -29,7 +30,11 @@ func SearchTxCmd(cdc *wire.Codec) *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { tags := viper.GetStringSlice(flagTags) - output, err := searchTx(context.NewCoreContextFromViper(), cdc, tags) + txs, err := searchTxs(context.NewCoreContextFromViper(), cdc, tags) + if err != nil { + return err + } + output, err := cdc.MarshalJSON(txs) if err != nil { return err } @@ -47,13 +52,12 @@ func SearchTxCmd(cdc *wire.Codec) *cobra.Command { return cmd } -func searchTx(ctx context.CoreContext, cdc *wire.Codec, tags []string) ([]byte, error) { +func searchTxs(ctx context.CoreContext, cdc *wire.Codec, tags []string) ([]txInfo, error) { if len(tags) == 0 { return nil, errors.New("Must declare at least one tag to search") } // XXX: implement ANY query := strings.Join(tags, " AND ") - // get the node node, err := ctx.GetNode() if err != nil { @@ -74,11 +78,7 @@ func searchTx(ctx context.CoreContext, cdc *wire.Codec, tags []string) ([]byte, return nil, err } - output, err := cdc.MarshalJSON(info) - if err != nil { - return nil, err - } - return output, nil + return info, nil } func formatTxResults(cdc *wire.Codec, res []*ctypes.ResultTx) ([]txInfo, error) { @@ -102,17 +102,44 @@ func SearchTxRequestHandlerFn(ctx context.CoreContext, cdc *wire.Codec) http.Han tag := r.FormValue("tag") if tag == "" { w.WriteHeader(400) - w.Write([]byte("You need to provide a tag to search for.")) + w.Write([]byte("You need to provide at least a tag as a key=value pair to search for. Postfix the key with _bech32 to search bech32-encoded addresses or public keys")) return } + keyValue := strings.Split(tag, "=") + key := keyValue[0] + value := keyValue[1] + if strings.HasSuffix(key, "_bech32") { + bech32address := strings.Trim(value, "'") + prefix := strings.Split(bech32address, "1")[0] + bz, err := sdk.GetFromBech32(bech32address, prefix) + if err != nil { + w.WriteHeader(400) + w.Write([]byte(err.Error())) + return + } - tags := []string{tag} - output, err := searchTx(ctx, cdc, tags) + tag = strings.TrimRight(key, "_bech32") + "='" + sdk.Address(bz).String() + "'" + } + + txs, err := searchTxs(ctx, cdc, []string{tag}) if err != nil { w.WriteHeader(500) w.Write([]byte(err.Error())) return } + + if len(txs) == 0 { + w.Write([]byte("[]")) + return + } + + output, err := cdc.MarshalJSON(txs) + if err != nil { + w.WriteHeader(500) + w.Write([]byte(err.Error())) + return + } + w.Write(output) } } diff --git a/types/account.go b/types/account.go index 381fb7af8a..a7dd50eadc 100644 --- a/types/account.go +++ b/types/account.go @@ -91,7 +91,7 @@ func GetAccAddressHex(address string) (addr Address, err error) { // create an Address from a string func GetAccAddressBech32(address string) (addr Address, err error) { - bz, err := getFromBech32(address, Bech32PrefixAccAddr) + bz, err := GetFromBech32(address, Bech32PrefixAccAddr) if err != nil { return nil, err } @@ -100,7 +100,7 @@ func GetAccAddressBech32(address string) (addr Address, err error) { // create a Pubkey from a string func GetAccPubKeyBech32(address string) (pk crypto.PubKey, err error) { - bz, err := getFromBech32(address, Bech32PrefixAccPub) + bz, err := GetFromBech32(address, Bech32PrefixAccPub) if err != nil { return nil, err } @@ -127,7 +127,7 @@ func GetValAddressHex(address string) (addr Address, err error) { // create an Address from a bech32 string func GetValAddressBech32(address string) (addr Address, err error) { - bz, err := getFromBech32(address, Bech32PrefixValAddr) + bz, err := GetFromBech32(address, Bech32PrefixValAddr) if err != nil { return nil, err } @@ -136,7 +136,7 @@ func GetValAddressBech32(address string) (addr Address, err error) { // decode a validator public key into a PubKey func GetValPubKeyBech32(pubkey string) (pk crypto.PubKey, err error) { - bz, err := getFromBech32(pubkey, Bech32PrefixValPub) + bz, err := GetFromBech32(pubkey, Bech32PrefixValPub) if err != nil { return nil, err } @@ -149,7 +149,8 @@ func GetValPubKeyBech32(pubkey string) (pk crypto.PubKey, err error) { return pk, nil } -func getFromBech32(bech32str, prefix string) ([]byte, error) { +// decode a bytestring from a bech32-encoded string +func GetFromBech32(bech32str, prefix string) ([]byte, error) { if len(bech32str) == 0 { return nil, errors.New("must provide non-empty string") } diff --git a/types/wire.go b/types/wire.go index 245b3677c7..2ef28820db 100644 --- a/types/wire.go +++ b/types/wire.go @@ -5,4 +5,5 @@ import wire "github.com/cosmos/cosmos-sdk/wire" // Register the sdk message type func RegisterWire(cdc *wire.Codec) { cdc.RegisterInterface((*Msg)(nil), nil) + cdc.RegisterInterface((*Tx)(nil), nil) } diff --git a/x/auth/wire.go b/x/auth/wire.go index 309464c864..6e430be4cd 100644 --- a/x/auth/wire.go +++ b/x/auth/wire.go @@ -9,6 +9,7 @@ func RegisterWire(cdc *wire.Codec) { cdc.RegisterInterface((*Account)(nil), nil) cdc.RegisterConcrete(&BaseAccount{}, "auth/Account", nil) cdc.RegisterConcrete(MsgChangeKey{}, "auth/ChangeKey", nil) + cdc.RegisterConcrete(StdTx{}, "auth/StdTx", nil) } var msgCdc = wire.NewCodec() diff --git a/x/bank/keeper.go b/x/bank/keeper.go index b14da4d81f..71c884ffe4 100644 --- a/x/bank/keeper.go +++ b/x/bank/keeper.go @@ -151,7 +151,7 @@ func subtractCoins(ctx sdk.Context, am auth.AccountMapper, addr sdk.Address, amt return amt, nil, sdk.ErrInsufficientCoins(fmt.Sprintf("%s < %s", oldCoins, amt)) } err := setCoins(ctx, am, addr, newCoins) - tags := sdk.NewTags("sender", addr.Bytes()) + tags := sdk.NewTags("sender", []byte(addr.String())) return newCoins, tags, err } @@ -164,7 +164,7 @@ func addCoins(ctx sdk.Context, am auth.AccountMapper, addr sdk.Address, amt sdk. return amt, nil, sdk.ErrInsufficientCoins(fmt.Sprintf("%s < %s", oldCoins, amt)) } err := setCoins(ctx, am, addr, newCoins) - tags := sdk.NewTags("recipient", addr.Bytes()) + tags := sdk.NewTags("recipient", []byte(addr.String())) return newCoins, tags, err } From 1b20adcd22a51b7efc551807e4532ca6b382b72b Mon Sep 17 00:00:00 2001 From: Rigel Date: Mon, 11 Jun 2018 18:12:37 -0700 Subject: [PATCH 232/548] Merge PR #1191: LCD cleanup / add LCD gas field * remove global variables from lcd * added make race, fix lcd race condition * cleanup * Five-character changelog update --- .gitignore | 3 +- CHANGELOG.md | 4 +- Makefile | 3 + client/keys/utils.go | 2 + client/lcd/helpers.go | 53 ---- client/lcd/lcd_test.go | 495 +++++++++++++--------------------- client/lcd/main_test.go | 38 --- client/lcd/root.go | 48 ++-- client/lcd/test_helpers.go | 234 ++++++++++++++++ x/bank/client/rest/sendtx.go | 4 + x/ibc/client/rest/transfer.go | 4 + x/stake/client/rest/query.go | 2 +- x/stake/client/rest/tx.go | 4 + 13 files changed, 464 insertions(+), 430 deletions(-) delete mode 100644 client/lcd/helpers.go delete mode 100644 client/lcd/main_test.go create mode 100644 client/lcd/test_helpers.go diff --git a/.gitignore b/.gitignore index 494e724528..da467c151f 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ docs/_build # Data - ideally these don't exist examples/basecoin/app/data baseapp/data/* +client/lcd/keys/* # Testing coverage.txt @@ -26,4 +27,4 @@ profile.out vagrant # Graphviz -dependency-graph.png \ No newline at end of file +dependency-graph.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 16346def30..2485093891 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ BREAKING CHANGES * msg.GetSignBytes() now returns bech32-encoded addresses in all cases +* [lcd] REST end-points now include gas FEATURES @@ -9,10 +10,11 @@ IMPROVEMENTS * export command now writes current validator set for Tendermint * [tests] Application module tests now use a mock application * [gaiacli] Fix error message when account isn't found when running gaiacli account +* [lcd] refactored to eliminate use of global variables, and interdependent tests FIXES * [lcd] Switch to bech32 for addresses on all human readable inputs and outputs -* fixed tx indexing/querying +* [lcd] fixed tx indexing/querying * [cli] Added `--gas` flag to specify transaction gas limit ## 0.18.0 diff --git a/Makefile b/Makefile index f7e2083c76..d6444b0b62 100644 --- a/Makefile +++ b/Makefile @@ -92,6 +92,9 @@ test_cli: test_unit: @go test $(PACKAGES_NOCLITEST) +test_race: + @go test -race $(PACKAGES_NOCLITEST) + test_cover: @bash tests/test_cover.sh diff --git a/client/keys/utils.go b/client/keys/utils.go index d810dfa1f4..8b6cfcb351 100644 --- a/client/keys/utils.go +++ b/client/keys/utils.go @@ -21,6 +21,8 @@ const KeyDBName = "keys" // keybase is used to make GetKeyBase a singleton var keybase keys.Keybase +// TODO make keybase take a database not load from the directory + // initialize a keybase based on the configuration func GetKeyBase() (keys.Keybase, error) { rootDir := viper.GetString(cli.HomeFlag) diff --git a/client/lcd/helpers.go b/client/lcd/helpers.go deleted file mode 100644 index 14cd5c16c7..0000000000 --- a/client/lcd/helpers.go +++ /dev/null @@ -1,53 +0,0 @@ -package lcd - -// NOTE: COPIED VERBATIM FROM tendermint/tendermint/rpc/test/helpers.go - -import ( - "fmt" - "os" - "path/filepath" - "strings" - - cmn "github.com/tendermint/tmlibs/common" - - cfg "github.com/tendermint/tendermint/config" -) - -var globalConfig *cfg.Config - -// f**ing long, but unique for each test -func makePathname() string { - // get path - p, err := os.Getwd() - if err != nil { - panic(err) - } - // fmt.Println(p) - sep := string(filepath.Separator) - return strings.Replace(p, sep, "_", -1) -} - -func randPort() int { - return int(cmn.RandUint16()/2 + 10000) -} - -func makeAddrs() (string, string, string) { - start := randPort() - return fmt.Sprintf("tcp://0.0.0.0:%d", start), - fmt.Sprintf("tcp://0.0.0.0:%d", start+1), - fmt.Sprintf("tcp://0.0.0.0:%d", start+2) -} - -// GetConfig returns a config for the test cases as a singleton -func GetConfig() *cfg.Config { - if globalConfig == nil { - pathname := makePathname() - globalConfig = cfg.ResetTestRoot(pathname) - - // and we use random ports to run in parallel - tm, rpc, _ := makeAddrs() - globalConfig.P2P.ListenAddress = tm - globalConfig.RPC.ListenAddress = rpc - } - return globalConfig -} diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 3565d99c31..48e2ad0a2d 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -1,146 +1,115 @@ package lcd import ( - "bytes" "encoding/hex" "encoding/json" "fmt" - "io/ioutil" - "net" "net/http" - "os" "regexp" "testing" - "github.com/spf13/viper" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" abci "github.com/tendermint/abci/types" - crypto "github.com/tendermint/go-crypto" cryptoKeys "github.com/tendermint/go-crypto/keys" - tmcfg "github.com/tendermint/tendermint/config" - nm "github.com/tendermint/tendermint/node" p2p "github.com/tendermint/tendermint/p2p" - pvm "github.com/tendermint/tendermint/privval" - "github.com/tendermint/tendermint/proxy" ctypes "github.com/tendermint/tendermint/rpc/core/types" - tmrpc "github.com/tendermint/tendermint/rpc/lib/server" - tmtypes "github.com/tendermint/tendermint/types" - "github.com/tendermint/tmlibs/cli" - dbm "github.com/tendermint/tmlibs/db" - "github.com/tendermint/tmlibs/log" client "github.com/cosmos/cosmos-sdk/client" keys "github.com/cosmos/cosmos-sdk/client/keys" rpc "github.com/cosmos/cosmos-sdk/client/rpc" - gapp "github.com/cosmos/cosmos-sdk/cmd/gaia/app" - "github.com/cosmos/cosmos-sdk/server" tests "github.com/cosmos/cosmos-sdk/tests" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/stake" stakerest "github.com/cosmos/cosmos-sdk/x/stake/client/rest" ) -var ( - coinDenom = "steak" - coinAmount = int64(10000000) - - validatorAddr1Hx = "" - validatorAddr2Hx = "" - validatorAddr1 = "" - validatorAddr2 = "" - - // XXX bad globals - name = "test" - password = "0123456789" - port string - seed string - sendAddr string -) - func TestKeys(t *testing.T) { - - // empty keys - // XXX: the test comes with a key setup - /* - res, body := request(t, port, "GET", "/keys", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - assert.Equal(t, "[]", body, "Expected an empty array") - */ + name, password := "test", "1234567890" + addr, seed := CreateAddr(t, "test", password, GetKB(t)) + cleanup, _, port := InitializeTestLCD(t, 2, []sdk.Address{addr}) + defer cleanup() // get seed - res, body := request(t, port, "GET", "/keys/seed", nil) + res, body := Request(t, port, "GET", "/keys/seed", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) newSeed := body reg, err := regexp.Compile(`([a-z]+ ){12}`) require.Nil(t, err) match := reg.MatchString(seed) - assert.True(t, match, "Returned seed has wrong foramt", seed) + assert.True(t, match, "Returned seed has wrong format", seed) newName := "test_newname" newPassword := "0987654321" // add key var jsonStr = []byte(fmt.Sprintf(`{"name":"test_fail", "password":"%s"}`, password)) - res, body = request(t, port, "POST", "/keys", jsonStr) + res, body = Request(t, port, "POST", "/keys", jsonStr) assert.Equal(t, http.StatusBadRequest, res.StatusCode, "Account creation should require a seed") jsonStr = []byte(fmt.Sprintf(`{"name":"%s", "password":"%s", "seed": "%s"}`, newName, newPassword, newSeed)) - res, body = request(t, port, "POST", "/keys", jsonStr) + res, body = Request(t, port, "POST", "/keys", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) - addr := body - assert.Len(t, addr, 40, "Returned address has wrong format", addr) + addr2 := body + assert.Len(t, addr2, 40, "Returned address has wrong format", addr2) // existing keys - res, body = request(t, port, "GET", "/keys", nil) + res, body = Request(t, port, "GET", "/keys", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) var m [2]keys.KeyOutput err = cdc.UnmarshalJSON([]byte(body), &m) require.Nil(t, err) - addrAcc, _ := sdk.GetAccAddressHex(addr) - addrBech32, _ := sdk.Bech32ifyAcc(addrAcc) + addr2Acc, err := sdk.GetAccAddressHex(addr2) + require.Nil(t, err) + addr2Bech32 := sdk.MustBech32ifyAcc(addr2Acc) + addrBech32 := sdk.MustBech32ifyAcc(addr) assert.Equal(t, name, m[0].Name, "Did not serve keys name correctly") - assert.Equal(t, sendAddr, m[0].Address, "Did not serve keys Address correctly") + assert.Equal(t, addrBech32, m[0].Address, "Did not serve keys Address correctly") assert.Equal(t, newName, m[1].Name, "Did not serve keys name correctly") - assert.Equal(t, addrBech32, m[1].Address, "Did not serve keys Address correctly") + assert.Equal(t, addr2Bech32, m[1].Address, "Did not serve keys Address correctly") // select key keyEndpoint := fmt.Sprintf("/keys/%s", newName) - res, body = request(t, port, "GET", keyEndpoint, nil) + res, body = Request(t, port, "GET", keyEndpoint, nil) require.Equal(t, http.StatusOK, res.StatusCode, body) var m2 keys.KeyOutput err = cdc.UnmarshalJSON([]byte(body), &m2) require.Nil(t, err) assert.Equal(t, newName, m2.Name, "Did not serve keys name correctly") - assert.Equal(t, addrBech32, m2.Address, "Did not serve keys Address correctly") + assert.Equal(t, addr2Bech32, m2.Address, "Did not serve keys Address correctly") // update key - jsonStr = []byte(fmt.Sprintf(`{"old_password":"%s", "new_password":"12345678901"}`, newPassword)) - res, body = request(t, port, "PUT", keyEndpoint, jsonStr) + jsonStr = []byte(fmt.Sprintf(`{ + "old_password":"%s", + "new_password":"12345678901" + }`, newPassword)) + + res, body = Request(t, port, "PUT", keyEndpoint, jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) // here it should say unauthorized as we changed the password before - res, body = request(t, port, "PUT", keyEndpoint, jsonStr) + res, body = Request(t, port, "PUT", keyEndpoint, jsonStr) require.Equal(t, http.StatusUnauthorized, res.StatusCode, body) // delete key jsonStr = []byte(`{"password":"12345678901"}`) - res, body = request(t, port, "DELETE", keyEndpoint, jsonStr) + res, body = Request(t, port, "DELETE", keyEndpoint, jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) } func TestVersion(t *testing.T) { + cleanup, _, port := InitializeTestLCD(t, 1, []sdk.Address{}) + defer cleanup() // node info - res, body := request(t, port, "GET", "/version", nil) + res, body := Request(t, port, "GET", "/version", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) reg, err := regexp.Compile(`\d+\.\d+\.\d+(-dev)?`) @@ -150,9 +119,11 @@ func TestVersion(t *testing.T) { } func TestNodeStatus(t *testing.T) { + cleanup, _, port := InitializeTestLCD(t, 1, []sdk.Address{}) + defer cleanup() // node info - res, body := request(t, port, "GET", "/node_info", nil) + res, body := Request(t, port, "GET", "/node_info", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) var nodeInfo p2p.NodeInfo @@ -162,21 +133,20 @@ func TestNodeStatus(t *testing.T) { assert.NotEqual(t, p2p.NodeInfo{}, nodeInfo, "res: %v", res) // syncing - res, body = request(t, port, "GET", "/syncing", nil) + res, body = Request(t, port, "GET", "/syncing", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) // we expect that there is no other node running so the syncing state is "false" - // we c assert.Equal(t, "false", body) } func TestBlock(t *testing.T) { - - tests.WaitForHeight(2, port) + cleanup, _, port := InitializeTestLCD(t, 1, []sdk.Address{}) + defer cleanup() var resultBlock ctypes.ResultBlock - res, body := request(t, port, "GET", "/blocks/latest", nil) + res, body := Request(t, port, "GET", "/blocks/latest", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) err := cdc.UnmarshalJSON([]byte(body), &resultBlock) @@ -186,7 +156,7 @@ func TestBlock(t *testing.T) { // -- - res, body = request(t, port, "GET", "/blocks/1", nil) + res, body = Request(t, port, "GET", "/blocks/1", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) err = json.Unmarshal([]byte(body), &resultBlock) @@ -196,15 +166,17 @@ func TestBlock(t *testing.T) { // -- - res, body = request(t, port, "GET", "/blocks/1000000000", nil) + res, body = Request(t, port, "GET", "/blocks/1000000000", nil) require.Equal(t, http.StatusNotFound, res.StatusCode, body) } func TestValidators(t *testing.T) { + cleanup, _, port := InitializeTestLCD(t, 1, []sdk.Address{}) + defer cleanup() var resultVals rpc.ResultValidatorsOutput - res, body := request(t, port, "GET", "/validatorsets/latest", nil) + res, body := Request(t, port, "GET", "/validatorsets/latest", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) err := cdc.UnmarshalJSON([]byte(body), &resultVals) @@ -217,7 +189,7 @@ func TestValidators(t *testing.T) { // -- - res, body = request(t, port, "GET", "/validatorsets/1", nil) + res, body = Request(t, port, "GET", "/validatorsets/1", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) err = cdc.UnmarshalJSON([]byte(body), &resultVals) @@ -227,23 +199,29 @@ func TestValidators(t *testing.T) { // -- - res, body = request(t, port, "GET", "/validatorsets/1000000000", nil) + res, body = Request(t, port, "GET", "/validatorsets/1000000000", nil) require.Equal(t, http.StatusNotFound, res.StatusCode) } func TestCoinSend(t *testing.T) { - bz, _ := hex.DecodeString("8FA6AB57AD6870F6B5B2E57735F38F2F30E73CB6") - someFakeAddr, _ := sdk.Bech32ifyAcc(bz) + name, password := "test", "1234567890" + addr, seed := CreateAddr(t, "test", password, GetKB(t)) + cleanup, _, port := InitializeTestLCD(t, 2, []sdk.Address{addr}) + defer cleanup() + + bz, err := hex.DecodeString("8FA6AB57AD6870F6B5B2E57735F38F2F30E73CB6") + require.NoError(t, err) + someFakeAddr := sdk.MustBech32ifyAcc(bz) // query empty - res, body := request(t, port, "GET", "/accounts/"+someFakeAddr, nil) + res, body := Request(t, port, "GET", "/accounts/"+someFakeAddr, nil) require.Equal(t, http.StatusNoContent, res.StatusCode, body) - acc := getAccount(t, sendAddr) + acc := getAccount(t, port, addr) initialBalance := acc.GetCoins() // create TX - receiveAddr, resultTx := doSend(t, port) + receiveAddr, resultTx := doSend(t, port, seed, name, password, addr) tests.WaitForHeight(resultTx.Height+1, port) // check if tx was commited @@ -251,27 +229,31 @@ func TestCoinSend(t *testing.T) { assert.Equal(t, uint32(0), resultTx.DeliverTx.Code) // query sender - acc = getAccount(t, sendAddr) + acc = getAccount(t, port, addr) coins := acc.GetCoins() mycoins := coins[0] - assert.Equal(t, coinDenom, mycoins.Denom) + assert.Equal(t, "steak", mycoins.Denom) assert.Equal(t, initialBalance[0].Amount-1, mycoins.Amount) // query receiver - acc = getAccount(t, receiveAddr) + acc = getAccount(t, port, receiveAddr) coins = acc.GetCoins() mycoins = coins[0] - assert.Equal(t, coinDenom, mycoins.Denom) + assert.Equal(t, "steak", mycoins.Denom) assert.Equal(t, int64(1), mycoins.Amount) } func TestIBCTransfer(t *testing.T) { + name, password := "test", "1234567890" + addr, seed := CreateAddr(t, "test", password, GetKB(t)) + cleanup, _, port := InitializeTestLCD(t, 2, []sdk.Address{addr}) + defer cleanup() - acc := getAccount(t, sendAddr) + acc := getAccount(t, port, addr) initialBalance := acc.GetCoins() // create TX - resultTx := doIBCTransfer(t, port, seed) + resultTx := doIBCTransfer(t, port, seed, name, password, addr) tests.WaitForHeight(resultTx.Height+1, port) @@ -280,32 +262,37 @@ func TestIBCTransfer(t *testing.T) { assert.Equal(t, uint32(0), resultTx.DeliverTx.Code) // query sender - acc = getAccount(t, sendAddr) + acc = getAccount(t, port, addr) coins := acc.GetCoins() mycoins := coins[0] - assert.Equal(t, coinDenom, mycoins.Denom) + assert.Equal(t, "steak", mycoins.Denom) assert.Equal(t, initialBalance[0].Amount-1, mycoins.Amount) // TODO: query ibc egress packet state } func TestTxs(t *testing.T) { + name, password := "test", "1234567890" + addr, seed := CreateAddr(t, "test", password, GetKB(t)) + cleanup, _, port := InitializeTestLCD(t, 2, []sdk.Address{addr}) + defer cleanup() + // query wrong - res, body := request(t, port, "GET", "/txs", nil) + res, body := Request(t, port, "GET", "/txs", nil) require.Equal(t, http.StatusBadRequest, res.StatusCode, body) // query empty - res, body = request(t, port, "GET", fmt.Sprintf("/txs?tag=sender_bech32='%s'", "cosmosaccaddr1jawd35d9aq4u76sr3fjalmcqc8hqygs9gtnmv3"), nil) + res, body = Request(t, port, "GET", fmt.Sprintf("/txs?tag=sender_bech32='%s'", "cosmosaccaddr1jawd35d9aq4u76sr3fjalmcqc8hqygs9gtnmv3"), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) assert.Equal(t, "[]", body) // create TX - receiveAddr, resultTx := doSend(t, port) + receiveAddr, resultTx := doSend(t, port, seed, name, password, addr) tests.WaitForHeight(resultTx.Height+1, port) // check if tx is findable - res, body = request(t, port, "GET", fmt.Sprintf("/txs/%s", resultTx.Hash), nil) + res, body = Request(t, port, "GET", fmt.Sprintf("/txs/%s", resultTx.Hash), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) type txInfo struct { @@ -316,53 +303,67 @@ func TestTxs(t *testing.T) { var indexedTxs []txInfo // check if tx is queryable - res, body = request(t, port, "GET", fmt.Sprintf("/txs?tag=tx.hash='%s'", resultTx.Hash), nil) + res, body = Request(t, port, "GET", fmt.Sprintf("/txs?tag=tx.hash='%s'", resultTx.Hash), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) assert.NotEqual(t, "[]", body) err := cdc.UnmarshalJSON([]byte(body), &indexedTxs) require.NoError(t, err) - assert.Equal(t, len(indexedTxs), 1) + assert.Equal(t, 1, len(indexedTxs)) // query sender - res, body = request(t, port, "GET", fmt.Sprintf("/txs?tag=sender_bech32='%s'", sendAddr), nil) + addrBech := sdk.MustBech32ifyAcc(addr) + res, body = Request(t, port, "GET", fmt.Sprintf("/txs?tag=sender_bech32='%s'", addrBech), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) err = cdc.UnmarshalJSON([]byte(body), &indexedTxs) require.NoError(t, err) - assert.Equal(t, 2, len(indexedTxs)) // there are 2 txs created with doSend - assert.Equal(t, resultTx.Height, indexedTxs[1].Height) + require.Equal(t, 1, len(indexedTxs), "%v", indexedTxs) // there are 2 txs created with doSend + assert.Equal(t, resultTx.Height, indexedTxs[0].Height) // query recipient - res, body = request(t, port, "GET", fmt.Sprintf("/txs?tag=recipient_bech32='%s'", receiveAddr), nil) + receiveAddrBech := sdk.MustBech32ifyAcc(receiveAddr) + res, body = Request(t, port, "GET", fmt.Sprintf("/txs?tag=recipient_bech32='%s'", receiveAddrBech), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) err = cdc.UnmarshalJSON([]byte(body), &indexedTxs) require.NoError(t, err) - assert.Equal(t, 1, len(indexedTxs)) + require.Equal(t, 1, len(indexedTxs)) assert.Equal(t, resultTx.Height, indexedTxs[0].Height) } func TestValidatorsQuery(t *testing.T) { - validators := getValidators(t) + cleanup, pks, port := InitializeTestLCD(t, 2, []sdk.Address{}) + require.Equal(t, 2, len(pks)) + defer cleanup() + + validators := getValidators(t, port) assert.Equal(t, len(validators), 2) // make sure all the validators were found (order unknown because sorted by owner addr) foundVal1, foundVal2 := false, false - if validators[0].Owner == validatorAddr1 || validators[1].Owner == validatorAddr1 { + pk1Bech := sdk.MustBech32ifyValPub(pks[0]) + pk2Bech := sdk.MustBech32ifyValPub(pks[1]) + if validators[0].PubKey == pk1Bech || validators[1].PubKey == pk1Bech { foundVal1 = true } - if validators[0].Owner == validatorAddr2 || validators[1].Owner == validatorAddr2 { + if validators[0].PubKey == pk2Bech || validators[1].PubKey == pk2Bech { foundVal2 = true } - assert.True(t, foundVal1, "validatorAddr1 %v, owner1 %v, owner2 %v", validatorAddr1, validators[0].Owner, validators[1].Owner) - assert.True(t, foundVal2, "validatorAddr2 %v, owner1 %v, owner2 %v", validatorAddr2, validators[0].Owner, validators[1].Owner) + assert.True(t, foundVal1, "pk1Bech %v, owner1 %v, owner2 %v", pk1Bech, validators[0].Owner, validators[1].Owner) + assert.True(t, foundVal2, "pk2Bech %v, owner1 %v, owner2 %v", pk2Bech, validators[0].Owner, validators[1].Owner) } -func TestBond(t *testing.T) { +func TestBonding(t *testing.T) { + name, password, denom := "test", "1234567890", "steak" + addr, seed := CreateAddr(t, "test", password, GetKB(t)) + cleanup, pks, port := InitializeTestLCD(t, 2, []sdk.Address{addr}) + defer cleanup() + + validator1Owner := pks[0].Address() // create bond TX - resultTx := doBond(t, port, seed) + resultTx := doBond(t, port, seed, name, password, addr, validator1Owner) tests.WaitForHeight(resultTx.Height+1, port) // check if tx was commited @@ -370,201 +371,41 @@ func TestBond(t *testing.T) { assert.Equal(t, uint32(0), resultTx.DeliverTx.Code) // query sender - acc := getAccount(t, sendAddr) + acc := getAccount(t, port, addr) coins := acc.GetCoins() - assert.Equal(t, int64(87), coins.AmountOf(coinDenom)) + assert.Equal(t, int64(40), coins.AmountOf(denom)) - // query candidate - bond := getDelegation(t, sendAddr, validatorAddr1) - assert.Equal(t, "10/1", bond.Shares.String()) -} + // query validator + bond := getDelegation(t, port, addr, validator1Owner) + assert.Equal(t, "60/1", bond.Shares.String()) -func TestUnbond(t *testing.T) { + ////////////////////// + // testing unbonding // create unbond TX - resultTx := doUnbond(t, port, seed) + resultTx = doUnbond(t, port, seed, name, password, addr, validator1Owner) tests.WaitForHeight(resultTx.Height+1, port) + // query validator + bond = getDelegation(t, port, addr, validator1Owner) + assert.Equal(t, "30/1", bond.Shares.String()) + // check if tx was commited assert.Equal(t, uint32(0), resultTx.CheckTx.Code) assert.Equal(t, uint32(0), resultTx.DeliverTx.Code) + // TODO fix shares fn in staking // query sender - acc := getAccount(t, sendAddr) - coins := acc.GetCoins() - assert.Equal(t, int64(98), coins.AmountOf(coinDenom)) - - // query candidate - bond := getDelegation(t, sendAddr, validatorAddr1) - assert.Equal(t, "9/1", bond.Shares.String()) + //acc = getAccount(t, port, addr) + //coins = acc.GetCoins() + //assert.Equal(t, int64(70), coins.AmountOf(denom)) } -//__________________________________________________________ -// helpers - -// strt TM and the LCD in process, listening on their respective sockets -func startTMAndLCD() (*nm.Node, net.Listener, error) { - - dir, err := ioutil.TempDir("", "lcd_test") - if err != nil { - return nil, nil, err - } - viper.Set(cli.HomeFlag, dir) - viper.Set(client.FlagGas, 200000) - kb, err := keys.GetKeyBase() // dbm.NewMemDB()) // :( - if err != nil { - return nil, nil, err - } - - config := GetConfig() - config.Consensus.TimeoutCommit = 1000 - config.Consensus.SkipTimeoutCommit = false - config.TxIndex.IndexAllTags = true - - logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) - logger = log.NewFilter(logger, log.AllowError()) - privValidatorFile := config.PrivValidatorFile() - privVal := pvm.LoadOrGenFilePV(privValidatorFile) - db := dbm.NewMemDB() - app := gapp.NewGaiaApp(logger, db) - cdc = gapp.MakeCodec() // XXX - - genesisFile := config.GenesisFile() - genDoc, err := tmtypes.GenesisDocFromFile(genesisFile) - if err != nil { - return nil, nil, err - } - - genDoc.Validators = append(genDoc.Validators, - tmtypes.GenesisValidator{ - PubKey: crypto.GenPrivKeyEd25519().PubKey(), - Power: 1, - Name: "val", - }, - ) - - pk1 := genDoc.Validators[0].PubKey - pk2 := genDoc.Validators[1].PubKey - validatorAddr1Hx = hex.EncodeToString(pk1.Address()) - validatorAddr2Hx = hex.EncodeToString(pk2.Address()) - validatorAddr1, _ = sdk.Bech32ifyVal(pk1.Address()) - validatorAddr2, _ = sdk.Bech32ifyVal(pk2.Address()) - - // NOTE it's bad practice to reuse pk address for the owner address but doing in the - // test for simplicity - var appGenTxs [2]json.RawMessage - appGenTxs[0], _, _, err = gapp.GaiaAppGenTxNF(cdc, pk1, pk1.Address(), "test_val1", true) - if err != nil { - return nil, nil, err - } - appGenTxs[1], _, _, err = gapp.GaiaAppGenTxNF(cdc, pk2, pk2.Address(), "test_val2", true) - if err != nil { - return nil, nil, err - } - - genesisState, err := gapp.GaiaAppGenState(cdc, appGenTxs[:]) - if err != nil { - return nil, nil, err - } - - // add the sendAddr to genesis - var info cryptoKeys.Info - info, seed, err = kb.Create(name, password, cryptoKeys.AlgoEd25519) // XXX global seed - if err != nil { - return nil, nil, err - } - sendAddrHex, _ := sdk.GetAccAddressHex(info.PubKey.Address().String()) - sendAddr, _ = sdk.Bech32ifyAcc(sendAddrHex) // XXX global - accAuth := auth.NewBaseAccountWithAddress(info.PubKey.Address()) - accAuth.Coins = sdk.Coins{{"steak", 100}} - acc := gapp.NewGenesisAccount(&accAuth) - genesisState.Accounts = append(genesisState.Accounts, acc) - - appState, err := wire.MarshalJSONIndent(cdc, genesisState) - if err != nil { - return nil, nil, err - } - genDoc.AppStateJSON = appState - - // LCD listen address - var listenAddr string - listenAddr, port, err = server.FreeTCPAddr() - if err != nil { - return nil, nil, err - } - - // XXX: need to set this so LCD knows the tendermint node address! - viper.Set(client.FlagNode, config.RPC.ListenAddress) - viper.Set(client.FlagChainID, genDoc.ChainID) - - node, err := startTM(config, logger, genDoc, privVal, app) - if err != nil { - return nil, nil, err - } - lcd, err := startLCD(logger, listenAddr, cdc) - if err != nil { - return nil, nil, err - } - - tests.WaitForStart(port) - - return node, lcd, nil -} - -// Create & start in-process tendermint node with memdb -// and in-process abci application. -// TODO: need to clean up the WAL dir or enable it to be not persistent -func startTM(cfg *tmcfg.Config, logger log.Logger, genDoc *tmtypes.GenesisDoc, privVal tmtypes.PrivValidator, app abci.Application) (*nm.Node, error) { - genDocProvider := func() (*tmtypes.GenesisDoc, error) { return genDoc, nil } - dbProvider := func(*nm.DBContext) (dbm.DB, error) { return dbm.NewMemDB(), nil } - n, err := nm.NewNode(cfg, - privVal, - proxy.NewLocalClientCreator(app), - genDocProvider, - dbProvider, - logger.With("module", "node")) - if err != nil { - return nil, err - } - - err = n.Start() - if err != nil { - return nil, err - } - - // wait for rpc - tests.WaitForRPC(GetConfig().RPC.ListenAddress) - - logger.Info("Tendermint running!") - return n, err -} - -// start the LCD. note this blocks! -func startLCD(logger log.Logger, listenAddr string, cdc *wire.Codec) (net.Listener, error) { - handler := createHandler(cdc) - return tmrpc.StartHTTPServer(listenAddr, handler, logger) -} - -func request(t *testing.T, port, method, path string, payload []byte) (*http.Response, string) { - var res *http.Response - var err error - url := fmt.Sprintf("http://localhost:%v%v", port, path) - req, err := http.NewRequest(method, url, bytes.NewBuffer(payload)) - require.Nil(t, err) - res, err = http.DefaultClient.Do(req) - // res, err = http.Post(url, "application/json", bytes.NewBuffer(payload)) - require.Nil(t, err) - - output, err := ioutil.ReadAll(res.Body) - res.Body.Close() - require.Nil(t, err) - - return res, string(output) -} - -func getAccount(t *testing.T, sendAddr string) auth.Account { - // get the account to get the sequence - res, body := request(t, port, "GET", "/accounts/"+sendAddr, nil) +//_____________________________________________________________________________ +// get the account to get the sequence +func getAccount(t *testing.T, port string, addr sdk.Address) auth.Account { + addrBech32 := sdk.MustBech32ifyAcc(addr) + res, body := Request(t, port, "GET", "/accounts/"+addrBech32, nil) require.Equal(t, http.StatusOK, res.StatusCode, body) var acc auth.Account err := cdc.UnmarshalJSON([]byte(body), &acc) @@ -572,20 +413,32 @@ func getAccount(t *testing.T, sendAddr string) auth.Account { return acc } -func doSend(t *testing.T, port string) (receiveAddr string, resultTx ctypes.ResultBroadcastTxCommit) { +func doSend(t *testing.T, port, seed, name, password string, addr sdk.Address) (receiveAddr sdk.Address, resultTx ctypes.ResultBroadcastTxCommit) { // create receive address kb := client.MockKeyBase() receiveInfo, _, err := kb.Create("receive_address", "1234567890", cryptoKeys.CryptoAlgo("ed25519")) require.Nil(t, err) - receiveAddr, _ = sdk.Bech32ifyAcc(receiveInfo.PubKey.Address()) + receiveAddr = receiveInfo.PubKey.Address() + receiveAddrBech := sdk.MustBech32ifyAcc(receiveAddr) - acc := getAccount(t, sendAddr) + acc := getAccount(t, port, addr) sequence := acc.GetSequence() // send - jsonStr := []byte(fmt.Sprintf(`{ "name":"%s", "password":"%s", "sequence":%d, "amount":[{ "denom": "%s", "amount": 1 }] }`, name, password, sequence, coinDenom)) - res, body := request(t, port, "POST", "/accounts/"+receiveAddr+"/send", jsonStr) + jsonStr := []byte(fmt.Sprintf(`{ + "name":"%s", + "password":"%s", + "sequence":%d, + "gas": 10000, + "amount":[ + { + "denom": "%s", + "amount": 1 + } + ] + }`, name, password, sequence, "steak")) + res, body := Request(t, port, "POST", "/accounts/"+receiveAddrBech+"/send", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) err = cdc.UnmarshalJSON([]byte(body), &resultTx) @@ -594,20 +447,32 @@ func doSend(t *testing.T, port string) (receiveAddr string, resultTx ctypes.Resu return receiveAddr, resultTx } -func doIBCTransfer(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxCommit) { +func doIBCTransfer(t *testing.T, port, seed, name, password string, addr sdk.Address) (resultTx ctypes.ResultBroadcastTxCommit) { // create receive address kb := client.MockKeyBase() receiveInfo, _, err := kb.Create("receive_address", "1234567890", cryptoKeys.CryptoAlgo("ed25519")) require.Nil(t, err) - receiveAddr, _ := sdk.Bech32ifyAcc(receiveInfo.PubKey.Address()) + receiveAddr := receiveInfo.PubKey.Address() + receiveAddrBech := sdk.MustBech32ifyAcc(receiveAddr) // get the account to get the sequence - acc := getAccount(t, sendAddr) + acc := getAccount(t, port, addr) sequence := acc.GetSequence() // send - jsonStr := []byte(fmt.Sprintf(`{ "name":"%s", "password":"%s", "sequence":%d, "amount":[{ "denom": "%s", "amount": 1 }] }`, name, password, sequence, coinDenom)) - res, body := request(t, port, "POST", "/ibc/testchain/"+receiveAddr+"/send", jsonStr) + jsonStr := []byte(fmt.Sprintf(`{ + "name":"%s", + "password": "%s", + "sequence": %d, + "gas": 100000, + "amount":[ + { + "denom": "%s", + "amount": 1 + } + ] + }`, name, password, sequence, "steak")) + res, body := Request(t, port, "POST", "/ibc/testchain/"+receiveAddrBech+"/send", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) err = cdc.UnmarshalJSON([]byte(body), &resultTx) @@ -616,9 +481,13 @@ func doIBCTransfer(t *testing.T, port, seed string) (resultTx ctypes.ResultBroad return resultTx } -func getDelegation(t *testing.T, delegatorAddr, candidateAddr string) stake.Delegation { +func getDelegation(t *testing.T, port string, delegatorAddr, validatorAddr sdk.Address) stake.Delegation { + + delegatorAddrBech := sdk.MustBech32ifyAcc(delegatorAddr) + validatorAddrBech := sdk.MustBech32ifyVal(validatorAddr) + // get the account to get the sequence - res, body := request(t, port, "GET", "/stake/"+delegatorAddr+"/bonding_status/"+candidateAddr, nil) + res, body := Request(t, port, "GET", "/stake/"+delegatorAddrBech+"/bonding_status/"+validatorAddrBech, nil) require.Equal(t, http.StatusOK, res.StatusCode, body) var bond stake.Delegation err := cdc.UnmarshalJSON([]byte(body), &bond) @@ -626,26 +495,30 @@ func getDelegation(t *testing.T, delegatorAddr, candidateAddr string) stake.Dele return bond } -func doBond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxCommit) { +func doBond(t *testing.T, port, seed, name, password string, delegatorAddr, validatorAddr sdk.Address) (resultTx ctypes.ResultBroadcastTxCommit) { // get the account to get the sequence - acc := getAccount(t, sendAddr) + acc := getAccount(t, port, delegatorAddr) sequence := acc.GetSequence() + delegatorAddrBech := sdk.MustBech32ifyAcc(delegatorAddr) + validatorAddrBech := sdk.MustBech32ifyVal(validatorAddr) + // send jsonStr := []byte(fmt.Sprintf(`{ "name": "%s", "password": "%s", "sequence": %d, + "gas": 10000, "delegate": [ { "delegator_addr": "%s", "validator_addr": "%s", - "bond": { "denom": "%s", "amount": 10 } + "bond": { "denom": "%s", "amount": 60 } } ], "unbond": [] - }`, name, password, sequence, sendAddr, validatorAddr1, coinDenom)) - res, body := request(t, port, "POST", "/stake/delegations", jsonStr) + }`, name, password, sequence, delegatorAddrBech, validatorAddrBech, "steak")) + res, body := Request(t, port, "POST", "/stake/delegations", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) var results []ctypes.ResultBroadcastTxCommit @@ -655,26 +528,30 @@ func doBond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxC return results[0] } -func doUnbond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxCommit) { +func doUnbond(t *testing.T, port, seed, name, password string, delegatorAddr, validatorAddr sdk.Address) (resultTx ctypes.ResultBroadcastTxCommit) { // get the account to get the sequence - acc := getAccount(t, sendAddr) + acc := getAccount(t, port, delegatorAddr) sequence := acc.GetSequence() + delegatorAddrBech := sdk.MustBech32ifyAcc(delegatorAddr) + validatorAddrBech := sdk.MustBech32ifyVal(validatorAddr) + // send jsonStr := []byte(fmt.Sprintf(`{ "name": "%s", "password": "%s", "sequence": %d, - "bond": [], + "gas": 10000, + "delegate": [], "unbond": [ { "delegator_addr": "%s", "validator_addr": "%s", - "shares": "1" + "shares": "30" } ] - }`, name, password, sequence, sendAddr, validatorAddr1)) - res, body := request(t, port, "POST", "/stake/delegations", jsonStr) + }`, name, password, sequence, delegatorAddrBech, validatorAddrBech)) + res, body := Request(t, port, "POST", "/stake/delegations", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) var results []ctypes.ResultBroadcastTxCommit @@ -684,9 +561,9 @@ func doUnbond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastT return results[0] } -func getValidators(t *testing.T) []stakerest.StakeValidatorOutput { +func getValidators(t *testing.T, port string) []stakerest.StakeValidatorOutput { // get the account to get the sequence - res, body := request(t, port, "GET", "/stake/validators", nil) + res, body := Request(t, port, "GET", "/stake/validators", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) var validators []stakerest.StakeValidatorOutput err := cdc.UnmarshalJSON([]byte(body), &validators) diff --git a/client/lcd/main_test.go b/client/lcd/main_test.go deleted file mode 100644 index 9f0e2bd4f0..0000000000 --- a/client/lcd/main_test.go +++ /dev/null @@ -1,38 +0,0 @@ -package lcd - -import ( - "fmt" - "os" - "testing" - - nm "github.com/tendermint/tendermint/node" -) - -var node *nm.Node - -// See https://golang.org/pkg/testing/#hdr-Main -// for more details -func TestMain(m *testing.M) { - // start a basecoind node and LCD server in the background to test against - - // run all the tests against a single server instance - node, lcd, err := startTMAndLCD() - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - code := m.Run() - - // tear down - // TODO: cleanup - // TODO: it would be great if TM could run without - // persiting anything in the first place - node.Stop() - node.Wait() - - // just a listener ... - lcd.Close() - - os.Exit(code) -} diff --git a/client/lcd/root.go b/client/lcd/root.go index 5071343021..c3ec75c964 100644 --- a/client/lcd/root.go +++ b/client/lcd/root.go @@ -25,19 +25,34 @@ import ( stake "github.com/cosmos/cosmos-sdk/x/stake/client/rest" ) -const ( - flagListenAddr = "laddr" - flagCORS = "cors" -) - // ServeCommand will generate a long-running rest server // (aka Light Client Daemon) that exposes functionality similar // to the cli, but over rest func ServeCommand(cdc *wire.Codec) *cobra.Command { + flagListenAddr := "laddr" + flagCORS := "cors" + cmd := &cobra.Command{ Use: "rest-server", Short: "Start LCD (light-client daemon), a local REST server", - RunE: startRESTServerFn(cdc), + RunE: func(cmd *cobra.Command, args []string) error { + listenAddr := viper.GetString(flagListenAddr) + handler := createHandler(cdc) + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)). + With("module", "rest-server") + listener, err := tmserver.StartHTTPServer(listenAddr, handler, logger) + if err != nil { + return err + } + logger.Info("REST server started") + + // Wait forever and cleanup + cmn.TrapSignal(func() { + err := listener.Close() + logger.Error("Error closing listener", "err", err) + }) + return nil + }, } cmd.Flags().StringP(flagListenAddr, "a", "tcp://localhost:1317", "Address for server to listen on") cmd.Flags().String(flagCORS, "", "Set to domains that can make CORS requests (* for all)") @@ -46,27 +61,6 @@ func ServeCommand(cdc *wire.Codec) *cobra.Command { return cmd } -func startRESTServerFn(cdc *wire.Codec) func(cmd *cobra.Command, args []string) error { - return func(cmd *cobra.Command, args []string) error { - listenAddr := viper.GetString(flagListenAddr) - handler := createHandler(cdc) - logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)). - With("module", "rest-server") - listener, err := tmserver.StartHTTPServer(listenAddr, handler, logger) - if err != nil { - return err - } - logger.Info("REST server started") - - // Wait forever and cleanup - cmn.TrapSignal(func() { - err := listener.Close() - logger.Error("Error closing listener", "err", err) - }) - return nil - } -} - func createHandler(cdc *wire.Codec) http.Handler { r := mux.NewRouter() r.HandleFunc("/version", version.RequestHandler).Methods("GET") diff --git a/client/lcd/test_helpers.go b/client/lcd/test_helpers.go new file mode 100644 index 0000000000..c1898ff81c --- /dev/null +++ b/client/lcd/test_helpers.go @@ -0,0 +1,234 @@ +package lcd + +import ( + "bytes" + "encoding/json" + "fmt" + "io/ioutil" + "net" + "net/http" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/spf13/viper" + "github.com/stretchr/testify/require" + + abci "github.com/tendermint/abci/types" + crypto "github.com/tendermint/go-crypto" + crkeys "github.com/tendermint/go-crypto/keys" + tmcfg "github.com/tendermint/tendermint/config" + nm "github.com/tendermint/tendermint/node" + pvm "github.com/tendermint/tendermint/privval" + "github.com/tendermint/tendermint/proxy" + tmrpc "github.com/tendermint/tendermint/rpc/lib/server" + tmtypes "github.com/tendermint/tendermint/types" + "github.com/tendermint/tmlibs/cli" + dbm "github.com/tendermint/tmlibs/db" + "github.com/tendermint/tmlibs/log" + + "github.com/cosmos/cosmos-sdk/client" + keys "github.com/cosmos/cosmos-sdk/client/keys" + gapp "github.com/cosmos/cosmos-sdk/cmd/gaia/app" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/tests" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" +) + +// f**ing long, but unique for each test +func makePathname() string { + // get path + p, err := os.Getwd() + if err != nil { + panic(err) + } + sep := string(filepath.Separator) + return strings.Replace(p, sep, "_", -1) +} + +// GetConfig returns a config for the test cases as a singleton +func GetConfig() *tmcfg.Config { + pathname := makePathname() + config := tmcfg.ResetTestRoot(pathname) + + tmAddr, _, err := server.FreeTCPAddr() + if err != nil { + panic(err) + } + rcpAddr, _, err := server.FreeTCPAddr() + if err != nil { + panic(err) + } + + config.P2P.ListenAddress = tmAddr + config.RPC.ListenAddress = rcpAddr + return config +} + +// get the lcd test keybase +// note can't use a memdb because the request is expecting to interact with the default location +func GetKB(t *testing.T) crkeys.Keybase { + dir, err := ioutil.TempDir("", "lcd_test") + require.NoError(t, err) + viper.Set(cli.HomeFlag, dir) + keybase, err := keys.GetKeyBase() // dbm.NewMemDB()) // :( + require.NoError(t, err) + return keybase +} + +// add an address to the store return name and password +func CreateAddr(t *testing.T, name, password string, kb crkeys.Keybase) (addr sdk.Address, seed string) { + var info crkeys.Info + var err error + info, seed, err = kb.Create(name, password, crkeys.AlgoEd25519) + require.NoError(t, err) + addr = info.PubKey.Address() + return +} + +// strt TM and the LCD in process, listening on their respective sockets +// nValidators = number of validators +// initAddrs = accounts to initialize with some steaks +func InitializeTestLCD(t *testing.T, nValidators int, initAddrs []sdk.Address) (cleanup func(), validatorsPKs []crypto.PubKey, port string) { + + config := GetConfig() + config.Consensus.TimeoutCommit = 1000 + config.Consensus.SkipTimeoutCommit = false + config.TxIndex.IndexAllTags = true + + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) + logger = log.NewFilter(logger, log.AllowError()) + privValidatorFile := config.PrivValidatorFile() + privVal := pvm.LoadOrGenFilePV(privValidatorFile) + privVal.Reset() + db := dbm.NewMemDB() + app := gapp.NewGaiaApp(logger, db) + cdc = gapp.MakeCodec() // XXX + + genesisFile := config.GenesisFile() + genDoc, err := tmtypes.GenesisDocFromFile(genesisFile) + require.NoError(t, err) + + // add more validators + if nValidators < 1 { + panic("InitializeTestLCD must use at least one validator") + } + for i := 1; i < nValidators; i++ { + genDoc.Validators = append(genDoc.Validators, + tmtypes.GenesisValidator{ + PubKey: crypto.GenPrivKeyEd25519().PubKey(), + Power: 1, + Name: "val", + }, + ) + } + + // NOTE it's bad practice to reuse pk address for the owner address but doing in the + // test for simplicity + var appGenTxs []json.RawMessage + for _, gdValidator := range genDoc.Validators { + pk := gdValidator.PubKey + validatorsPKs = append(validatorsPKs, pk) // append keys for output + appGenTx, _, _, err := gapp.GaiaAppGenTxNF(cdc, pk, pk.Address(), "test_val1", true) + require.NoError(t, err) + appGenTxs = append(appGenTxs, appGenTx) + } + + genesisState, err := gapp.GaiaAppGenState(cdc, appGenTxs[:]) + require.NoError(t, err) + + // add some tokens to init accounts + for _, addr := range initAddrs { + accAuth := auth.NewBaseAccountWithAddress(addr) + accAuth.Coins = sdk.Coins{{"steak", 100}} + acc := gapp.NewGenesisAccount(&accAuth) + genesisState.Accounts = append(genesisState.Accounts, acc) + } + + appState, err := wire.MarshalJSONIndent(cdc, genesisState) + require.NoError(t, err) + genDoc.AppStateJSON = appState + + // LCD listen address + var listenAddr string + listenAddr, port, err = server.FreeTCPAddr() + require.NoError(t, err) + + // XXX: need to set this so LCD knows the tendermint node address! + viper.Set(client.FlagNode, config.RPC.ListenAddress) + viper.Set(client.FlagChainID, genDoc.ChainID) + + node, err := startTM(config, logger, genDoc, privVal, app) + require.NoError(t, err) + lcd, err := startLCD(logger, listenAddr, cdc) + require.NoError(t, err) + + //time.Sleep(time.Second) + //tests.WaitForHeight(2, port) + tests.WaitForStart(port) + tests.WaitForHeight(1, port) + + // for use in defer + cleanup = func() { + node.Stop() + node.Wait() + lcd.Close() + } + + return +} + +// Create & start in-process tendermint node with memdb +// and in-process abci application. +// TODO: need to clean up the WAL dir or enable it to be not persistent +func startTM(tmcfg *tmcfg.Config, logger log.Logger, genDoc *tmtypes.GenesisDoc, privVal tmtypes.PrivValidator, app abci.Application) (*nm.Node, error) { + genDocProvider := func() (*tmtypes.GenesisDoc, error) { return genDoc, nil } + dbProvider := func(*nm.DBContext) (dbm.DB, error) { return dbm.NewMemDB(), nil } + n, err := nm.NewNode(tmcfg, + privVal, + proxy.NewLocalClientCreator(app), + genDocProvider, + dbProvider, + logger.With("module", "node")) + if err != nil { + return nil, err + } + + err = n.Start() + if err != nil { + return nil, err + } + + // wait for rpc + tests.WaitForRPC(tmcfg.RPC.ListenAddress) + + logger.Info("Tendermint running!") + return n, err +} + +// start the LCD. note this blocks! +func startLCD(logger log.Logger, listenAddr string, cdc *wire.Codec) (net.Listener, error) { + handler := createHandler(cdc) + return tmrpc.StartHTTPServer(listenAddr, handler, logger) +} + +// make a test lcd test request +func Request(t *testing.T, port, method, path string, payload []byte) (*http.Response, string) { + var res *http.Response + var err error + url := fmt.Sprintf("http://localhost:%v%v", port, path) + req, err := http.NewRequest(method, url, bytes.NewBuffer(payload)) + require.Nil(t, err) + res, err = http.DefaultClient.Do(req) + // res, err = http.Post(url, "application/json", bytes.NewBuffer(payload)) + require.Nil(t, err) + + output, err := ioutil.ReadAll(res.Body) + res.Body.Close() + require.Nil(t, err) + + return res, string(output) +} diff --git a/x/bank/client/rest/sendtx.go b/x/bank/client/rest/sendtx.go index 83ab3b843f..28a2946179 100644 --- a/x/bank/client/rest/sendtx.go +++ b/x/bank/client/rest/sendtx.go @@ -28,6 +28,7 @@ type sendBody struct { Password string `json:"password"` ChainID string `json:"chain_id"` Sequence int64 `json:"sequence"` + Gas int64 `json:"gas"` } var msgCdc = wire.NewCodec() @@ -86,6 +87,9 @@ func SendRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx context.CoreCont return } + // add gas to context + ctx = ctx.WithGas(m.Gas) + // sign ctx = ctx.WithSequence(m.Sequence) txBytes, err := ctx.SignAndBuild(m.LocalAccountName, m.Password, msg, cdc) diff --git a/x/ibc/client/rest/transfer.go b/x/ibc/client/rest/transfer.go index d897c6e4f6..2b26b9f01c 100644 --- a/x/ibc/client/rest/transfer.go +++ b/x/ibc/client/rest/transfer.go @@ -26,6 +26,7 @@ type transferBody struct { Password string `json:"password"` SrcChainID string `json:"src_chain_id"` Sequence int64 `json:"sequence"` + Gas int64 `json:"gas"` } // TransferRequestHandler - http request handler to transfer coins to a address @@ -77,6 +78,9 @@ func TransferRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx context.Core packet := ibc.NewIBCPacket(info.PubKey.Address(), to, m.Amount, m.SrcChainID, destChainID) msg := ibc.IBCTransferMsg{packet} + // add gas to context + ctx = ctx.WithGas(m.Gas) + // sign ctx = ctx.WithSequence(m.Sequence) txBytes, err := ctx.SignAndBuild(m.LocalAccountName, m.Password, msg, cdc) diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index 0da3260cb8..f8a2f00e5f 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -80,7 +80,7 @@ func bondingStatusHandlerFn(ctx context.CoreContext, storeName string, cdc *wire } } -// TODO inherit from Validator +// TODO move exist next to validator struct for maintainability type StakeValidatorOutput struct { Owner string `json:"owner"` // in bech32 PubKey string `json:"pub_key"` // in bech32 diff --git a/x/stake/client/rest/tx.go b/x/stake/client/rest/tx.go index 33fe73c699..19eca4c447 100644 --- a/x/stake/client/rest/tx.go +++ b/x/stake/client/rest/tx.go @@ -40,6 +40,7 @@ type editDelegationsBody struct { Password string `json:"password"` ChainID string `json:"chain_id"` Sequence int64 `json:"sequence"` + Gas int64 `json:"gas"` Delegate []msgDelegateInput `json:"delegate"` Unbond []msgUnbondInput `json:"unbond"` } @@ -121,6 +122,9 @@ func editDelegationsRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx conte i++ } + // add gas to context + ctx = ctx.WithGas(m.Gas) + // sign messages signedTxs := make([][]byte, len(messages[:])) for i, msg := range messages { From 161cb474d4e224f158d7fee62cc6b76f759c43ed Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Mon, 11 Jun 2018 19:30:54 -0700 Subject: [PATCH 233/548] Account Numbers for Replay Protection with Account Pruning (#1077) * in progress * passes current tests * added tests and got working * changelog and docs * removed prints * oops * works! * issue in test_cli * number 9 number 9 number 9 * at least it does only the 9 issue now * hallelujah it works! * removed print statement * rebased * gah --- CHANGELOG.md | 1 + client/context/helpers.go | 48 +++++++-- client/context/types.go | 7 ++ client/context/viper.go | 20 ++++ client/flags.go | 18 ++-- client/lcd/lcd_test.go | 18 +++- cmd/gaia/app/app.go | 1 + cmd/gaia/app/app_test.go | 40 -------- docs/sdk/overview.rst | 10 +- examples/basecoin/app/app.go | 1 + examples/democoin/x/cool/app_test.go | 16 +-- examples/democoin/x/pow/app_test.go | 6 +- x/auth/account.go | 23 ++++- x/auth/ante.go | 17 +++- x/auth/ante_test.go | 139 +++++++++++++++++++-------- x/auth/client/cli/account.go | 2 +- x/auth/client/rest/query.go | 2 +- x/auth/mapper.go | 40 +++++++- x/auth/mock/app.go | 4 +- x/auth/mock/auth_app_test.go | 8 +- x/auth/mock/simulate_block.go | 13 +-- x/auth/stdtx.go | 36 ++++--- x/bank/app_test.go | 16 +-- x/bank/client/rest/sendtx.go | 2 + x/ibc/app_test.go | 10 +- x/ibc/client/rest/transfer.go | 2 + x/stake/app_test.go | 8 +- x/stake/client/rest/tx.go | 2 + 28 files changed, 337 insertions(+), 173 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2485093891..d1ce2cb720 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ BREAKING CHANGES * [lcd] REST end-points now include gas FEATURES +* [x/auth] Added AccountNumbers to BaseAccount and StdTxs to allow for replay protection with account pruning IMPROVEMENTS * export command now writes current validator set for Tendermint diff --git a/client/context/helpers.go b/client/context/helpers.go index 880c4adb37..0229827fe7 100644 --- a/client/context/helpers.go +++ b/client/context/helpers.go @@ -109,12 +109,15 @@ func (ctx CoreContext) SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *w if chainID == "" { return nil, errors.Errorf("Chain ID required but not specified") } + accnum := ctx.AccountNumber sequence := ctx.Sequence + signMsg := auth.StdSignMsg{ - ChainID: chainID, - Sequences: []int64{sequence}, - Msg: msg, - Fee: auth.NewStdFee(ctx.Gas, sdk.Coin{}), // TODO run simulate to estimate gas? + ChainID: chainID, + AccountNumbers: []int64{accnum}, + Sequences: []int64{sequence}, + Msg: msg, + Fee: auth.NewStdFee(ctx.Gas, sdk.Coin{}), // TODO run simulate to estimate gas? } keybase, err := keys.GetKeyBase() @@ -130,9 +133,10 @@ func (ctx CoreContext) SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *w return nil, err } sigs := []auth.StdSignature{{ - PubKey: pubkey, - Signature: sig, - Sequence: sequence, + PubKey: pubkey, + Signature: sig, + AccountNumber: accnum, + Sequence: sequence, }} // marshal bytes @@ -144,6 +148,10 @@ func (ctx CoreContext) SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *w // sign and build the transaction from the msg func (ctx CoreContext) EnsureSignBuildBroadcast(name string, msg sdk.Msg, cdc *wire.Codec) (res *ctypes.ResultBroadcastTxCommit, err error) { + ctx, err = EnsureAccountNumber(ctx) + if err != nil { + return nil, err + } // default to next sequence number if none provided ctx, err = EnsureSequence(ctx) if err != nil { @@ -163,13 +171,37 @@ func (ctx CoreContext) EnsureSignBuildBroadcast(name string, msg sdk.Msg, cdc *w return ctx.BroadcastTx(txBytes) } +// get the next sequence for the account address +func (ctx CoreContext) GetAccountNumber(address []byte) (int64, error) { + if ctx.Decoder == nil { + return 0, errors.New("AccountDecoder required but not provided") + } + + res, err := ctx.Query(auth.AddressStoreKey(address), ctx.AccountStore) + if err != nil { + return 0, err + } + + if len(res) == 0 { + fmt.Printf("No account found. Returning 0.\n") + return 0, err + } + + account, err := ctx.Decoder(res) + if err != nil { + panic(err) + } + + return account.GetAccountNumber(), nil +} + // get the next sequence for the account address func (ctx CoreContext) NextSequence(address []byte) (int64, error) { if ctx.Decoder == nil { return 0, errors.New("AccountDecoder required but not provided") } - res, err := ctx.Query(address, ctx.AccountStore) + res, err := ctx.Query(auth.AddressStoreKey(address), ctx.AccountStore) if err != nil { return 0, err } diff --git a/client/context/types.go b/client/context/types.go index e9c97ffbc7..791ffb23a2 100644 --- a/client/context/types.go +++ b/client/context/types.go @@ -14,6 +14,7 @@ type CoreContext struct { TrustNode bool NodeURI string FromAddressName string + AccountNumber int64 Sequence int64 Client rpcclient.Client Decoder auth.AccountDecoder @@ -57,6 +58,12 @@ func (c CoreContext) WithFromAddressName(fromAddressName string) CoreContext { return c } +// WithSequence - return a copy of the context with an account number +func (c CoreContext) WithAccountNumber(accnum int64) CoreContext { + c.AccountNumber = accnum + return c +} + // WithSequence - return a copy of the context with an updated sequence number func (c CoreContext) WithSequence(sequence int64) CoreContext { c.Sequence = sequence diff --git a/client/context/viper.go b/client/context/viper.go index 081c9f5c28..5f262d56f6 100644 --- a/client/context/viper.go +++ b/client/context/viper.go @@ -34,6 +34,7 @@ func NewCoreContextFromViper() CoreContext { TrustNode: viper.GetBool(client.FlagTrustNode), FromAddressName: viper.GetString(client.FlagName), NodeURI: nodeURI, + AccountNumber: viper.GetInt64(client.FlagAccountNumber), Sequence: viper.GetInt64(client.FlagSequence), Client: rpc, Decoder: nil, @@ -54,6 +55,25 @@ func defaultChainID() (string, error) { return doc.ChainID, nil } +// EnsureSequence - automatically set sequence number if none provided +func EnsureAccountNumber(ctx CoreContext) (CoreContext, error) { + // Should be viper.IsSet, but this does not work - https://github.com/spf13/viper/pull/331 + if viper.GetInt64(client.FlagAccountNumber) != 0 { + return ctx, nil + } + from, err := ctx.GetFromAddress() + if err != nil { + return ctx, err + } + accnum, err := ctx.GetAccountNumber(from) + if err != nil { + return ctx, err + } + fmt.Printf("Defaulting to account number: %d\n", accnum) + ctx = ctx.WithAccountNumber(accnum) + return ctx, nil +} + // EnsureSequence - automatically set sequence number if none provided func EnsureSequence(ctx CoreContext) (CoreContext, error) { // Should be viper.IsSet, but this does not work - https://github.com/spf13/viper/pull/331 diff --git a/client/flags.go b/client/flags.go index 2d68d31462..4991b9a776 100644 --- a/client/flags.go +++ b/client/flags.go @@ -4,14 +4,15 @@ import "github.com/spf13/cobra" // nolint const ( - FlagChainID = "chain-id" - FlagNode = "node" - FlagHeight = "height" - FlagGas = "gas" - FlagTrustNode = "trust-node" - FlagName = "name" - FlagSequence = "sequence" - FlagFee = "fee" + FlagChainID = "chain-id" + FlagNode = "node" + FlagHeight = "height" + FlagGas = "gas" + FlagTrustNode = "trust-node" + FlagName = "name" + FlagAccountNumber = "account-number" + FlagSequence = "sequence" + FlagFee = "fee" ) // LineBreak can be included in a command list to provide a blank line @@ -34,6 +35,7 @@ func GetCommands(cmds ...*cobra.Command) []*cobra.Command { func PostCommands(cmds ...*cobra.Command) []*cobra.Command { for _, c := range cmds { c.Flags().String(FlagName, "", "Name of private key with which to sign") + c.Flags().Int64(FlagAccountNumber, 0, "AccountNumber number to sign the tx") c.Flags().Int64(FlagSequence, 0, "Sequence number to sign the tx") c.Flags().String(FlagFee, "", "Fee to pay along with transaction") c.Flags().String(FlagChainID, "", "Chain ID of tendermint node") diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 48e2ad0a2d..946f70bbcb 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -423,12 +423,14 @@ func doSend(t *testing.T, port, seed, name, password string, addr sdk.Address) ( receiveAddrBech := sdk.MustBech32ifyAcc(receiveAddr) acc := getAccount(t, port, addr) + accnum := acc.GetAccountNumber() sequence := acc.GetSequence() // send jsonStr := []byte(fmt.Sprintf(`{ "name":"%s", - "password":"%s", + "password":"%s", + "account_number":%d, "sequence":%d, "gas": 10000, "amount":[ @@ -437,7 +439,7 @@ func doSend(t *testing.T, port, seed, name, password string, addr sdk.Address) ( "amount": 1 } ] - }`, name, password, sequence, "steak")) + }`, name, password, accnum, sequence, "steak")) res, body := Request(t, port, "POST", "/accounts/"+receiveAddrBech+"/send", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) @@ -457,12 +459,14 @@ func doIBCTransfer(t *testing.T, port, seed, name, password string, addr sdk.Add // get the account to get the sequence acc := getAccount(t, port, addr) + accnum := acc.GetAccountNumber() sequence := acc.GetSequence() // send jsonStr := []byte(fmt.Sprintf(`{ "name":"%s", "password": "%s", + "account_number":%d, "sequence": %d, "gas": 100000, "amount":[ @@ -471,7 +475,7 @@ func doIBCTransfer(t *testing.T, port, seed, name, password string, addr sdk.Add "amount": 1 } ] - }`, name, password, sequence, "steak")) + }`, name, password, accnum, sequence, "steak")) res, body := Request(t, port, "POST", "/ibc/testchain/"+receiveAddrBech+"/send", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) @@ -498,6 +502,7 @@ func getDelegation(t *testing.T, port string, delegatorAddr, validatorAddr sdk.A func doBond(t *testing.T, port, seed, name, password string, delegatorAddr, validatorAddr sdk.Address) (resultTx ctypes.ResultBroadcastTxCommit) { // get the account to get the sequence acc := getAccount(t, port, delegatorAddr) + accnum := acc.GetAccountNumber() sequence := acc.GetSequence() delegatorAddrBech := sdk.MustBech32ifyAcc(delegatorAddr) @@ -507,6 +512,7 @@ func doBond(t *testing.T, port, seed, name, password string, delegatorAddr, vali jsonStr := []byte(fmt.Sprintf(`{ "name": "%s", "password": "%s", + "account_number": %d, "sequence": %d, "gas": 10000, "delegate": [ @@ -517,7 +523,7 @@ func doBond(t *testing.T, port, seed, name, password string, delegatorAddr, vali } ], "unbond": [] - }`, name, password, sequence, delegatorAddrBech, validatorAddrBech, "steak")) + }`, name, password, accnum, sequence, delegatorAddrBech, validatorAddrBech, "steak")) res, body := Request(t, port, "POST", "/stake/delegations", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) @@ -531,6 +537,7 @@ func doBond(t *testing.T, port, seed, name, password string, delegatorAddr, vali func doUnbond(t *testing.T, port, seed, name, password string, delegatorAddr, validatorAddr sdk.Address) (resultTx ctypes.ResultBroadcastTxCommit) { // get the account to get the sequence acc := getAccount(t, port, delegatorAddr) + accnum := acc.GetAccountNumber() sequence := acc.GetSequence() delegatorAddrBech := sdk.MustBech32ifyAcc(delegatorAddr) @@ -540,6 +547,7 @@ func doUnbond(t *testing.T, port, seed, name, password string, delegatorAddr, va jsonStr := []byte(fmt.Sprintf(`{ "name": "%s", "password": "%s", + "account_number": %d, "sequence": %d, "gas": 10000, "delegate": [], @@ -550,7 +558,7 @@ func doUnbond(t *testing.T, port, seed, name, password string, delegatorAddr, va "shares": "30" } ] - }`, name, password, sequence, delegatorAddrBech, validatorAddrBech)) + }`, name, password, accnum, sequence, delegatorAddrBech, validatorAddrBech)) res, body := Request(t, port, "POST", "/stake/delegations", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index f06ed2be30..fb614f372a 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -144,6 +144,7 @@ func (app *GaiaApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci // load the accounts for _, gacc := range genesisState.Accounts { acc := gacc.ToAccount() + acc.AccountNumber = app.accountMapper.GetNextAccountNumber(ctx) app.accountMapper.SetAccount(ctx, acc) } diff --git a/cmd/gaia/app/app_test.go b/cmd/gaia/app/app_test.go index f79703fefe..0523c54998 100644 --- a/cmd/gaia/app/app_test.go +++ b/cmd/gaia/app/app_test.go @@ -1,21 +1,11 @@ package app import ( - "os" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/stake" abci "github.com/tendermint/abci/types" - crypto "github.com/tendermint/go-crypto" - dbm "github.com/tendermint/tmlibs/db" - "github.com/tendermint/tmlibs/log" ) func setGenesis(gapp *GaiaApp, accs ...*auth.BaseAccount) error { @@ -41,33 +31,3 @@ func setGenesis(gapp *GaiaApp, accs ...*auth.BaseAccount) error { return nil } - -func TestGenesis(t *testing.T) { - logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") - db := dbm.NewMemDB() - gapp := NewGaiaApp(logger, db) - - // Construct some genesis bytes to reflect GaiaAccount - pk := crypto.GenPrivKeyEd25519().PubKey() - addr := pk.Address() - coins, err := sdk.ParseCoins("77foocoin,99barcoin") - require.Nil(t, err) - baseAcc := &auth.BaseAccount{ - Address: addr, - Coins: coins, - } - - err = setGenesis(gapp, baseAcc) - require.Nil(t, err) - - // A checkTx context - ctx := gapp.BaseApp.NewContext(true, abci.Header{}) - res1 := gapp.accountMapper.GetAccount(ctx, baseAcc.Address) - assert.Equal(t, baseAcc, res1) - - // reload app and ensure the account is still there - gapp = NewGaiaApp(logger, db) - ctx = gapp.BaseApp.NewContext(true, abci.Header{}) - res1 = gapp.accountMapper.GetAccount(ctx, baseAcc.Address) - assert.Equal(t, baseAcc, res1) -} diff --git a/docs/sdk/overview.rst b/docs/sdk/overview.rst index 8a13509063..0cb7e73042 100644 --- a/docs/sdk/overview.rst +++ b/docs/sdk/overview.rst @@ -232,12 +232,14 @@ a standard form: type StdSignature struct { crypto.PubKey // optional crypto.Signature - Sequence int64 + AccountNumber int64 + Sequence int64 } -It contains the signature itself, as well as the corresponding account's -sequence number. The sequence number is expected to increment every time a -message is signed by a given account. This prevents "replay attacks", where +It contains the signature itself, as well as the corresponding account's account and +sequence numbers. The sequence number is expected to increment every time a +message is signed by a given account. The account number stays the same and is assigned +when the account is first generated. These prevent "replay attacks", where the same message could be executed over and over again. The ``StdSignature`` can also optionally include the public key for verifying the diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index fdb0638b69..f654ba05ea 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -146,6 +146,7 @@ func (app *BasecoinApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) panic(err) // TODO https://github.com/cosmos/cosmos-sdk/issues/468 // return sdk.ErrGenesisParse("").TraceCause(err, "") } + acc.AccountNumber = app.accountMapper.GetNextAccountNumber(ctx) app.accountMapper.SetAccount(ctx, acc) } diff --git a/examples/democoin/x/cool/app_test.go b/examples/democoin/x/cool/app_test.go index d41c8ea824..8d3f347b35 100644 --- a/examples/democoin/x/cool/app_test.go +++ b/examples/democoin/x/cool/app_test.go @@ -89,17 +89,17 @@ func TestMsgQuiz(t *testing.T) { assert.Equal(t, acc1, res1) // Set the trend, submit a really cool quiz and check for reward - mock.SignCheckDeliver(t, mapp.BaseApp, setTrendMsg1, []int64{0}, true, priv1) - mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg1, []int64{1}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, setTrendMsg1, []int64{0}, []int64{0}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg1, []int64{0}, []int64{1}, true, priv1) mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"icecold", 69}}) - mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg2, []int64{2}, false, priv1) // result without reward + mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg2, []int64{0}, []int64{2}, false, priv1) // result without reward mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"icecold", 69}}) - mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg1, []int64{3}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg1, []int64{0}, []int64{3}, true, priv1) mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"icecold", 138}}) - mock.SignCheckDeliver(t, mapp.BaseApp, setTrendMsg2, []int64{4}, true, priv1) // reset the trend - mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg1, []int64{5}, false, priv1) // the same answer will nolonger do! + mock.SignCheckDeliver(t, mapp.BaseApp, setTrendMsg2, []int64{0}, []int64{4}, true, priv1) // reset the trend + mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg1, []int64{0}, []int64{5}, false, priv1) // the same answer will nolonger do! mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"icecold", 138}}) - mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg2, []int64{6}, true, priv1) // earlier answer now relavent again + mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg2, []int64{0}, []int64{6}, true, priv1) // earlier answer now relavent again mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"badvibesonly", 69}, {"icecold", 138}}) - mock.SignCheckDeliver(t, mapp.BaseApp, setTrendMsg3, []int64{7}, false, priv1) // expect to fail to set the trend to something which is not cool + mock.SignCheckDeliver(t, mapp.BaseApp, setTrendMsg3, []int64{0}, []int64{7}, false, priv1) // expect to fail to set the trend to something which is not cool } diff --git a/examples/democoin/x/pow/app_test.go b/examples/democoin/x/pow/app_test.go index 0539df5560..aa71fb080b 100644 --- a/examples/democoin/x/pow/app_test.go +++ b/examples/democoin/x/pow/app_test.go @@ -71,13 +71,13 @@ func TestMsgMine(t *testing.T) { // Mine and check for reward mineMsg1 := GenerateMsgMine(addr1, 1, 2) - mock.SignCheckDeliver(t, mapp.BaseApp, mineMsg1, []int64{0}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, mineMsg1, []int64{0}, []int64{0}, true, priv1) mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"pow", 1}}) // Mine again and check for reward mineMsg2 := GenerateMsgMine(addr1, 2, 3) - mock.SignCheckDeliver(t, mapp.BaseApp, mineMsg2, []int64{1}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, mineMsg2, []int64{0}, []int64{1}, true, priv1) mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"pow", 2}}) // Mine again - should be invalid - mock.SignCheckDeliver(t, mapp.BaseApp, mineMsg2, []int64{1}, false, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, mineMsg2, []int64{0}, []int64{1}, false, priv1) mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"pow", 2}}) } diff --git a/x/auth/account.go b/x/auth/account.go index 0ae72a8a64..77966b8e74 100644 --- a/x/auth/account.go +++ b/x/auth/account.go @@ -17,6 +17,9 @@ type Account interface { GetPubKey() crypto.PubKey // can return nil. SetPubKey(crypto.PubKey) error + GetAccountNumber() int64 + SetAccountNumber(int64) error + GetSequence() int64 SetSequence(int64) error @@ -36,10 +39,11 @@ var _ Account = (*BaseAccount)(nil) // Extend this by embedding this in your AppAccount. // See the examples/basecoin/types/account.go for an example. type BaseAccount struct { - Address sdk.Address `json:"address"` - Coins sdk.Coins `json:"coins"` - PubKey crypto.PubKey `json:"public_key"` - Sequence int64 `json:"sequence"` + Address sdk.Address `json:"address"` + Coins sdk.Coins `json:"coins"` + PubKey crypto.PubKey `json:"public_key"` + AccountNumber int64 `json:"account_number"` + Sequence int64 `json:"sequence"` } func NewBaseAccountWithAddress(addr sdk.Address) BaseAccount { @@ -84,6 +88,17 @@ func (acc *BaseAccount) SetCoins(coins sdk.Coins) error { return nil } +// Implements Account +func (acc *BaseAccount) GetAccountNumber() int64 { + return acc.AccountNumber +} + +// Implements Account +func (acc *BaseAccount) SetAccountNumber(accNumber int64) error { + acc.AccountNumber = accNumber + return nil +} + // Implements sdk.Account. func (acc *BaseAccount) GetSequence() int64 { return acc.Sequence diff --git a/x/auth/ante.go b/x/auth/ante.go index 9663bcfe45..c50da0c32a 100644 --- a/x/auth/ante.go +++ b/x/auth/ante.go @@ -14,7 +14,7 @@ const ( ) // NewAnteHandler returns an AnteHandler that checks -// and increments sequence numbers, checks signatures, +// and increments sequence numbers, checks signatures & account numbers, // and deducts fees from the first signer. func NewAnteHandler(am AccountMapper, fck FeeCollectionKeeper) sdk.AnteHandler { @@ -46,11 +46,15 @@ func NewAnteHandler(am AccountMapper, fck FeeCollectionKeeper) sdk.AnteHandler { true } - // Get the sign bytes (requires all sequence numbers and the fee) + // Get the sign bytes (requires all account & sequence numbers and the fee) sequences := make([]int64, len(signerAddrs)) for i := 0; i < len(signerAddrs); i++ { sequences[i] = sigs[i].Sequence } + accNums := make([]int64, len(signerAddrs)) + for i := 0; i < len(signerAddrs); i++ { + accNums[i] = sigs[i].AccountNumber + } fee := stdTx.Fee chainID := ctx.ChainID() // XXX: major hack; need to get ChainID @@ -58,7 +62,7 @@ func NewAnteHandler(am AccountMapper, fck FeeCollectionKeeper) sdk.AnteHandler { if chainID == "" { chainID = viper.GetString("chain-id") } - signBytes := StdSignBytes(ctx.ChainID(), sequences, fee, msg) + signBytes := StdSignBytes(ctx.ChainID(), accNums, sequences, fee, msg) // Check sig and nonce and collect signer accounts. var signerAccs = make([]Account, len(signerAddrs)) @@ -117,6 +121,13 @@ func processSig( return nil, sdk.ErrUnknownAddress(addr.String()).Result() } + // Check account number. + accnum := acc.GetAccountNumber() + if accnum != sig.AccountNumber { + return nil, sdk.ErrInvalidSequence( + fmt.Sprintf("Invalid account number. Got %d, expected %d", sig.AccountNumber, accnum)).Result() + } + // Check and increment sequence number. seq := acc.GetSequence() if seq != sig.Sequence { diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index b7f22e5d54..aff80cb59a 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -52,15 +52,15 @@ func checkInvalidTx(t *testing.T, anteHandler sdk.AnteHandler, ctx sdk.Context, assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, code), result.Code) } -func newTestTx(ctx sdk.Context, msg sdk.Msg, privs []crypto.PrivKey, seqs []int64, fee StdFee) sdk.Tx { - signBytes := StdSignBytes(ctx.ChainID(), seqs, fee, msg) - return newTestTxWithSignBytes(msg, privs, seqs, fee, signBytes) +func newTestTx(ctx sdk.Context, msg sdk.Msg, privs []crypto.PrivKey, accNums []int64, seqs []int64, fee StdFee) sdk.Tx { + signBytes := StdSignBytes(ctx.ChainID(), accNums, seqs, fee, msg) + return newTestTxWithSignBytes(msg, privs, accNums, seqs, fee, signBytes) } -func newTestTxWithSignBytes(msg sdk.Msg, privs []crypto.PrivKey, seqs []int64, fee StdFee, signBytes []byte) sdk.Tx { +func newTestTxWithSignBytes(msg sdk.Msg, privs []crypto.PrivKey, accNums []int64, seqs []int64, fee StdFee, signBytes []byte) sdk.Tx { sigs := make([]StdSignature, len(privs)) for i, priv := range privs { - sigs[i] = StdSignature{PubKey: priv.PubKey(), Signature: priv.Sign(signBytes), Sequence: seqs[i]} + sigs[i] = StdSignature{PubKey: priv.PubKey(), Signature: priv.Sign(signBytes), AccountNumber: accNums[i], Sequence: seqs[i]} } tx := NewStdTx(msg, fee, sigs) return tx @@ -87,18 +87,18 @@ func TestAnteHandlerSigErrors(t *testing.T) { fee := newStdFee() // test no signatures - privs, seqs := []crypto.PrivKey{}, []int64{} - tx = newTestTx(ctx, msg, privs, seqs, fee) + privs, accNums, seqs := []crypto.PrivKey{}, []int64{}, []int64{} + tx = newTestTx(ctx, msg, privs, accNums, seqs, fee) checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeUnauthorized) // test num sigs dont match GetSigners - privs, seqs = []crypto.PrivKey{priv1}, []int64{0} - tx = newTestTx(ctx, msg, privs, seqs, fee) + privs, accNums, seqs = []crypto.PrivKey{priv1}, []int64{0}, []int64{0} + tx = newTestTx(ctx, msg, privs, accNums, seqs, fee) checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeUnauthorized) // test an unrecognized account - privs, seqs = []crypto.PrivKey{priv1, priv2}, []int64{0, 0} - tx = newTestTx(ctx, msg, privs, seqs, fee) + privs, accNums, seqs = []crypto.PrivKey{priv1, priv2}, []int64{0, 1}, []int64{0, 0} + tx = newTestTx(ctx, msg, privs, accNums, seqs, fee) checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeUnknownAddress) // save the first account, but second is still unrecognized @@ -108,6 +108,61 @@ func TestAnteHandlerSigErrors(t *testing.T) { checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeUnknownAddress) } +// Test logic around account number checking with one signer and many signers. +func TestAnteHandlerAccountNumbers(t *testing.T) { + // setup + ms, capKey, capKey2 := setupMultiStore() + cdc := wire.NewCodec() + RegisterBaseAccount(cdc) + mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) + feeCollector := NewFeeCollectionKeeper(cdc, capKey2) + anteHandler := NewAnteHandler(mapper, feeCollector) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) + + // keys and addresses + priv1, addr1 := privAndAddr() + priv2, addr2 := privAndAddr() + + // set the accounts + acc1 := mapper.NewAccountWithAddress(ctx, addr1) + acc1.SetCoins(newCoins()) + mapper.SetAccount(ctx, acc1) + acc2 := mapper.NewAccountWithAddress(ctx, addr2) + acc2.SetCoins(newCoins()) + mapper.SetAccount(ctx, acc2) + + // msg and signatures + var tx sdk.Tx + msg := newTestMsg(addr1) + fee := newStdFee() + + // test good tx from one signer + privs, accnums, seqs := []crypto.PrivKey{priv1}, []int64{0}, []int64{0} + tx = newTestTx(ctx, msg, privs, accnums, seqs, fee) + checkValidTx(t, anteHandler, ctx, tx) + + // new tx from wrong account number + seqs = []int64{1} + tx = newTestTx(ctx, msg, privs, []int64{1}, seqs, fee) + checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeInvalidSequence) + + // from correct account number + seqs = []int64{1} + tx = newTestTx(ctx, msg, privs, []int64{0}, seqs, fee) + checkValidTx(t, anteHandler, ctx, tx) + + // new tx with another signer and incorrect account numbers + msg = newTestMsg(addr1, addr2) + privs, accnums, seqs = []crypto.PrivKey{priv1, priv2}, []int64{1, 0}, []int64{2, 0} + tx = newTestTx(ctx, msg, privs, accnums, seqs, fee) + checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeInvalidSequence) + + // correct account numbers + privs, accnums, seqs = []crypto.PrivKey{priv1, priv2}, []int64{0, 1}, []int64{2, 0} + tx = newTestTx(ctx, msg, privs, accnums, seqs, fee) + checkValidTx(t, anteHandler, ctx, tx) +} + // Test logic around sequence checking with one signer and many signers. func TestAnteHandlerSequences(t *testing.T) { // setup @@ -137,8 +192,8 @@ func TestAnteHandlerSequences(t *testing.T) { fee := newStdFee() // test good tx from one signer - privs, seqs := []crypto.PrivKey{priv1}, []int64{0} - tx = newTestTx(ctx, msg, privs, seqs, fee) + privs, accnums, seqs := []crypto.PrivKey{priv1}, []int64{0}, []int64{0} + tx = newTestTx(ctx, msg, privs, accnums, seqs, fee) checkValidTx(t, anteHandler, ctx, tx) // test sending it again fails (replay protection) @@ -146,13 +201,13 @@ func TestAnteHandlerSequences(t *testing.T) { // fix sequence, should pass seqs = []int64{1} - tx = newTestTx(ctx, msg, privs, seqs, fee) + tx = newTestTx(ctx, msg, privs, accnums, seqs, fee) checkValidTx(t, anteHandler, ctx, tx) // new tx with another signer and correct sequences msg = newTestMsg(addr1, addr2) - privs, seqs = []crypto.PrivKey{priv1, priv2}, []int64{2, 0} - tx = newTestTx(ctx, msg, privs, seqs, fee) + privs, accnums, seqs = []crypto.PrivKey{priv1, priv2}, []int64{0, 1}, []int64{2, 0} + tx = newTestTx(ctx, msg, privs, accnums, seqs, fee) checkValidTx(t, anteHandler, ctx, tx) // replay fails @@ -160,18 +215,18 @@ func TestAnteHandlerSequences(t *testing.T) { // tx from just second signer with incorrect sequence fails msg = newTestMsg(addr2) - privs, seqs = []crypto.PrivKey{priv2}, []int64{0} - tx = newTestTx(ctx, msg, privs, seqs, fee) + privs, accnums, seqs = []crypto.PrivKey{priv2}, []int64{1}, []int64{0} + tx = newTestTx(ctx, msg, privs, accnums, seqs, fee) checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeInvalidSequence) // fix the sequence and it passes - tx = newTestTx(ctx, msg, []crypto.PrivKey{priv2}, []int64{1}, fee) + tx = newTestTx(ctx, msg, []crypto.PrivKey{priv2}, []int64{1}, []int64{1}, fee) checkValidTx(t, anteHandler, ctx, tx) // another tx from both of them that passes msg = newTestMsg(addr1, addr2) - privs, seqs = []crypto.PrivKey{priv1, priv2}, []int64{3, 2} - tx = newTestTx(ctx, msg, privs, seqs, fee) + privs, accnums, seqs = []crypto.PrivKey{priv1, priv2}, []int64{0, 1}, []int64{3, 2} + tx = newTestTx(ctx, msg, privs, accnums, seqs, fee) checkValidTx(t, anteHandler, ctx, tx) } @@ -196,13 +251,13 @@ func TestAnteHandlerFees(t *testing.T) { // msg and signatures var tx sdk.Tx msg := newTestMsg(addr1) - privs, seqs := []crypto.PrivKey{priv1}, []int64{0} + privs, accnums, seqs := []crypto.PrivKey{priv1}, []int64{0}, []int64{0} fee := NewStdFee(100, sdk.Coin{"atom", 150}, ) // signer does not have enough funds to pay the fee - tx = newTestTx(ctx, msg, privs, seqs, fee) + tx = newTestTx(ctx, msg, privs, accnums, seqs, fee) checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeInsufficientFunds) acc1.SetCoins(sdk.Coins{{"atom", 149}}) @@ -249,8 +304,8 @@ func TestAnteHandlerBadSignBytes(t *testing.T) { fee3.Amount[0].Amount += 100 // test good tx and signBytes - privs, seqs := []crypto.PrivKey{priv1}, []int64{0} - tx = newTestTx(ctx, msg, privs, seqs, fee) + privs, accnums, seqs := []crypto.PrivKey{priv1}, []int64{0}, []int64{0} + tx = newTestTx(ctx, msg, privs, accnums, seqs, fee) checkValidTx(t, anteHandler, ctx, tx) chainID := ctx.ChainID() @@ -259,37 +314,39 @@ func TestAnteHandlerBadSignBytes(t *testing.T) { cases := []struct { chainID string + accnums []int64 seqs []int64 fee StdFee msg sdk.Msg code sdk.CodeType }{ - {chainID2, []int64{1}, fee, msg, codeUnauth}, // test wrong chain_id - {chainID, []int64{2}, fee, msg, codeUnauth}, // test wrong seqs - {chainID, []int64{1, 2}, fee, msg, codeUnauth}, // test wrong seqs - {chainID, []int64{1}, fee, newTestMsg(addr2), codeUnauth}, // test wrong msg - {chainID, []int64{1}, fee2, newTestMsg(addr2), codeUnauth}, // test wrong fee - {chainID, []int64{1}, fee3, newTestMsg(addr2), codeUnauth}, // test wrong fee + {chainID2, []int64{0}, []int64{1}, fee, msg, codeUnauth}, // test wrong chain_id + {chainID, []int64{0}, []int64{2}, fee, msg, codeUnauth}, // test wrong seqs + {chainID, []int64{0}, []int64{1, 2}, fee, msg, codeUnauth}, // test wrong seqs + {chainID, []int64{1}, []int64{1}, fee, msg, codeUnauth}, // test wrong accnum + {chainID, []int64{0}, []int64{1}, fee, newTestMsg(addr2), codeUnauth}, // test wrong msg + {chainID, []int64{0}, []int64{1}, fee2, msg, codeUnauth}, // test wrong fee + {chainID, []int64{0}, []int64{1}, fee3, msg, codeUnauth}, // test wrong fee } privs, seqs = []crypto.PrivKey{priv1}, []int64{1} for _, cs := range cases { tx := newTestTxWithSignBytes( - msg, privs, seqs, fee, - StdSignBytes(cs.chainID, cs.seqs, cs.fee, cs.msg), + msg, privs, accnums, seqs, fee, + StdSignBytes(cs.chainID, cs.accnums, cs.seqs, cs.fee, cs.msg), ) checkInvalidTx(t, anteHandler, ctx, tx, cs.code) } // test wrong signer if public key exist - privs, seqs = []crypto.PrivKey{priv2}, []int64{1} - tx = newTestTx(ctx, msg, privs, seqs, fee) + privs, accnums, seqs = []crypto.PrivKey{priv2}, []int64{0}, []int64{1} + tx = newTestTx(ctx, msg, privs, accnums, seqs, fee) checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeUnauthorized) // test wrong signer if public doesn't exist msg = newTestMsg(addr2) - privs, seqs = []crypto.PrivKey{priv1}, []int64{0} - tx = newTestTx(ctx, msg, privs, seqs, fee) + privs, accnums, seqs = []crypto.PrivKey{priv1}, []int64{1}, []int64{0} + tx = newTestTx(ctx, msg, privs, accnums, seqs, fee) checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeInvalidPubKey) } @@ -320,9 +377,9 @@ func TestAnteHandlerSetPubKey(t *testing.T) { // test good tx and set public key msg := newTestMsg(addr1) - privs, seqs := []crypto.PrivKey{priv1}, []int64{0} + privs, accnums, seqs := []crypto.PrivKey{priv1}, []int64{0}, []int64{0} fee := newStdFee() - tx = newTestTx(ctx, msg, privs, seqs, fee) + tx = newTestTx(ctx, msg, privs, accnums, seqs, fee) checkValidTx(t, anteHandler, ctx, tx) acc1 = mapper.GetAccount(ctx, addr1) @@ -330,7 +387,7 @@ func TestAnteHandlerSetPubKey(t *testing.T) { // test public key not found msg = newTestMsg(addr2) - tx = newTestTx(ctx, msg, privs, seqs, fee) + tx = newTestTx(ctx, msg, privs, []int64{1}, seqs, fee) sigs := tx.(StdTx).GetSignatures() sigs[0].PubKey = nil checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeInvalidPubKey) @@ -339,7 +396,7 @@ func TestAnteHandlerSetPubKey(t *testing.T) { assert.Nil(t, acc2.GetPubKey()) // test invalid signature and public key - tx = newTestTx(ctx, msg, privs, seqs, fee) + tx = newTestTx(ctx, msg, privs, []int64{1}, seqs, fee) checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeInvalidPubKey) acc2 = mapper.GetAccount(ctx, addr2) diff --git a/x/auth/client/cli/account.go b/x/auth/client/cli/account.go index e82b074148..a3265a78cd 100644 --- a/x/auth/client/cli/account.go +++ b/x/auth/client/cli/account.go @@ -47,7 +47,7 @@ func GetAccountCmd(storeName string, cdc *wire.Codec, decoder auth.AccountDecode // perform query ctx := context.NewCoreContextFromViper() - res, err := ctx.Query(key, storeName) + res, err := ctx.Query(auth.AddressStoreKey(key), storeName) if err != nil { return err } diff --git a/x/auth/client/rest/query.go b/x/auth/client/rest/query.go index bcae59c203..9ccbe8e142 100644 --- a/x/auth/client/rest/query.go +++ b/x/auth/client/rest/query.go @@ -34,7 +34,7 @@ func QueryAccountRequestHandlerFn(storeName string, cdc *wire.Codec, decoder aut return } - res, err := ctx.Query(addr, storeName) + res, err := ctx.Query(auth.AddressStoreKey(addr), storeName) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(fmt.Sprintf("Could't query account. Error: %s", err.Error()))) diff --git a/x/auth/mapper.go b/x/auth/mapper.go index cdab2480e3..b4364f7683 100644 --- a/x/auth/mapper.go +++ b/x/auth/mapper.go @@ -9,6 +9,8 @@ import ( crypto "github.com/tendermint/go-crypto" ) +var globalAccountNumberKey = []byte("globalAccountNumber") + // This AccountMapper encodes/decodes accounts using the // go-amino (binary) encoding/decoding library. type AccountMapper struct { @@ -38,13 +40,25 @@ func NewAccountMapper(cdc *wire.Codec, key sdk.StoreKey, proto Account) AccountM func (am AccountMapper) NewAccountWithAddress(ctx sdk.Context, addr sdk.Address) Account { acc := am.clonePrototype() acc.SetAddress(addr) + acc.SetAccountNumber(am.GetNextAccountNumber(ctx)) return acc } +// New Account +func (am AccountMapper) NewAccount(ctx sdk.Context, acc Account) Account { + acc.SetAccountNumber(am.GetNextAccountNumber(ctx)) + return acc +} + +// Turn an address to key used to get it from the account store +func AddressStoreKey(addr sdk.Address) []byte { + return append([]byte("account:"), addr.Bytes()...) +} + // Implements sdk.AccountMapper. func (am AccountMapper) GetAccount(ctx sdk.Context, addr sdk.Address) Account { store := ctx.KVStore(am.key) - bz := store.Get(addr) + bz := store.Get(AddressStoreKey(addr)) if bz == nil { return nil } @@ -57,13 +71,13 @@ func (am AccountMapper) SetAccount(ctx sdk.Context, acc Account) { addr := acc.GetAddress() store := ctx.KVStore(am.key) bz := am.encodeAccount(acc) - store.Set(addr, bz) + store.Set(AddressStoreKey(addr), bz) } // Implements sdk.AccountMapper. func (am AccountMapper) IterateAccounts(ctx sdk.Context, process func(Account) (stop bool)) { store := ctx.KVStore(am.key) - iter := store.Iterator(nil, nil) + iter := sdk.KVStorePrefixIterator(store, []byte("account:")) for { if !iter.Valid() { return @@ -116,6 +130,26 @@ func (am AccountMapper) setSequence(ctx sdk.Context, addr sdk.Address, newSequen return nil } +// Returns and increments the global account number counter +func (am AccountMapper) GetNextAccountNumber(ctx sdk.Context) int64 { + var accNumber int64 + store := ctx.KVStore(am.key) + bz := store.Get(globalAccountNumberKey) + if bz == nil { + accNumber = 0 + } else { + err := am.cdc.UnmarshalBinary(bz, &accNumber) + if err != nil { + panic(err) + } + } + + bz = am.cdc.MustMarshalBinary(accNumber + 1) + store.Set(globalAccountNumberKey, bz) + + return accNumber +} + //---------------------------------------- // misc. diff --git a/x/auth/mock/app.go b/x/auth/mock/app.go index fcd130b44b..9530088076 100644 --- a/x/auth/mock/app.go +++ b/x/auth/mock/app.go @@ -78,7 +78,9 @@ func (app *App) CompleteSetup(t *testing.T, newKeys []*sdk.KVStoreKey) { func (app *App) InitChainer(ctx sdk.Context, _ abci.RequestInitChain) abci.ResponseInitChain { // load the accounts - for _, acc := range app.GenesisAccounts { + for _, genacc := range app.GenesisAccounts { + acc := app.AccountMapper.NewAccountWithAddress(ctx, genacc.GetAddress()) + acc.SetCoins(genacc.GetCoins()) app.AccountMapper.SetAccount(ctx, acc) } diff --git a/x/auth/mock/auth_app_test.go b/x/auth/mock/auth_app_test.go index 716037d600..bb4d7007b0 100644 --- a/x/auth/mock/auth_app_test.go +++ b/x/auth/mock/auth_app_test.go @@ -61,7 +61,7 @@ func TestMsgChangePubKey(t *testing.T) { assert.Equal(t, acc1, res1.(*auth.BaseAccount)) // Run a CheckDeliver - SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, true, priv1) + SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, []int64{0}, true, priv1) // Check balances CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 67}}) @@ -77,19 +77,19 @@ func TestMsgChangePubKey(t *testing.T) { acc2 := mapp.AccountMapper.GetAccount(ctxDeliver, addr1) // send a MsgChangePubKey - SignCheckDeliver(t, mapp.BaseApp, changePubKeyMsg, []int64{1}, true, priv1) + SignCheckDeliver(t, mapp.BaseApp, changePubKeyMsg, []int64{0}, []int64{1}, true, priv1) acc2 = mapp.AccountMapper.GetAccount(ctxDeliver, addr1) assert.True(t, priv2.PubKey().Equals(acc2.GetPubKey())) // signing a SendMsg with the old privKey should be an auth error mapp.BeginBlock(abci.RequestBeginBlock{}) - tx := GenTx(sendMsg1, []int64{2}, priv1) + tx := GenTx(sendMsg1, []int64{0}, []int64{2}, priv1) res := mapp.Deliver(tx) assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), res.Code, res.Log) // resigning the tx with the new correct priv key should work - SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{2}, true, priv2) + SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, []int64{2}, true, priv2) // Check balances CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 57}}) diff --git a/x/auth/mock/simulate_block.go b/x/auth/mock/simulate_block.go index 72ec8411fa..b8e9e94f83 100644 --- a/x/auth/mock/simulate_block.go +++ b/x/auth/mock/simulate_block.go @@ -33,7 +33,7 @@ func CheckBalance(t *testing.T, app *App, addr sdk.Address, exp sdk.Coins) { } // generate a signed transaction -func GenTx(msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) auth.StdTx { +func GenTx(msg sdk.Msg, accnums []int64, seq []int64, priv ...crypto.PrivKeyEd25519) auth.StdTx { // make the transaction free fee := auth.StdFee{ @@ -44,19 +44,20 @@ func GenTx(msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) auth.StdTx { sigs := make([]auth.StdSignature, len(priv)) for i, p := range priv { sigs[i] = auth.StdSignature{ - PubKey: p.PubKey(), - Signature: p.Sign(auth.StdSignBytes(chainID, seq, fee, msg)), - Sequence: seq[i], + PubKey: p.PubKey(), + Signature: p.Sign(auth.StdSignBytes(chainID, accnums, seq, fee, msg)), + AccountNumber: accnums[i], + Sequence: seq[i], } } return auth.NewStdTx(msg, fee, sigs) } // simulate a block -func SignCheckDeliver(t *testing.T, app *baseapp.BaseApp, msg sdk.Msg, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { +func SignCheckDeliver(t *testing.T, app *baseapp.BaseApp, msg sdk.Msg, accnums []int64, seq []int64, expPass bool, priv ...crypto.PrivKeyEd25519) { // Sign the tx - tx := GenTx(msg, seq, priv...) + tx := GenTx(msg, accnums, seq, priv...) // Run a Check res := app.Check(tx) diff --git a/x/auth/stdtx.go b/x/auth/stdtx.go index e08f77ee48..5c43a37177 100644 --- a/x/auth/stdtx.go +++ b/x/auth/stdtx.go @@ -85,21 +85,23 @@ func (fee StdFee) Bytes() []byte { // and the Sequence numbers for each signature (prevent // inchain replay and enforce tx ordering per account). type StdSignDoc struct { - ChainID string `json:"chain_id"` - Sequences []int64 `json:"sequences"` - FeeBytes json.RawMessage `json:"fee_bytes"` - MsgBytes json.RawMessage `json:"msg_bytes"` - AltBytes json.RawMessage `json:"alt_bytes"` + ChainID string `json:"chain_id"` + AccountNumbers []int64 `json:"account_numbers"` + Sequences []int64 `json:"sequences"` + FeeBytes []byte `json:"fee_bytes"` + MsgBytes []byte `json:"msg_bytes"` + AltBytes []byte `json:"alt_bytes"` } // StdSignBytes returns the bytes to sign for a transaction. // TODO: change the API to just take a chainID and StdTx ? -func StdSignBytes(chainID string, sequences []int64, fee StdFee, msg sdk.Msg) []byte { - bz, err := msgCdc.MarshalJSON(StdSignDoc{ - ChainID: chainID, - Sequences: sequences, - FeeBytes: json.RawMessage(fee.Bytes()), - MsgBytes: json.RawMessage(msg.GetSignBytes()), +func StdSignBytes(chainID string, accnums []int64, sequences []int64, fee StdFee, msg sdk.Msg) []byte { + bz, err := json.Marshal(StdSignDoc{ + ChainID: chainID, + AccountNumbers: accnums, + Sequences: sequences, + FeeBytes: fee.Bytes(), + MsgBytes: msg.GetSignBytes(), }) if err != nil { panic(err) @@ -111,21 +113,23 @@ func StdSignBytes(chainID string, sequences []int64, fee StdFee, msg sdk.Msg) [] // a Msg with the other requirements for a StdSignDoc before // it is signed. For use in the CLI. type StdSignMsg struct { - ChainID string - Sequences []int64 - Fee StdFee - Msg sdk.Msg + ChainID string + AccountNumbers []int64 + Sequences []int64 + Fee StdFee + Msg sdk.Msg // XXX: Alt } // get message bytes func (msg StdSignMsg) Bytes() []byte { - return StdSignBytes(msg.ChainID, msg.Sequences, msg.Fee, msg.Msg) + return StdSignBytes(msg.ChainID, msg.AccountNumbers, msg.Sequences, msg.Fee, msg.Msg) } // Standard Signature type StdSignature struct { crypto.PubKey `json:"pub_key"` // optional crypto.Signature `json:"signature"` + AccountNumber int64 `json:"account_number"` Sequence int64 `json:"sequence"` } diff --git a/x/bank/app_test.go b/x/bank/app_test.go index 21d7d03a03..d0c112b3da 100644 --- a/x/bank/app_test.go +++ b/x/bank/app_test.go @@ -107,25 +107,25 @@ func TestMsgSendWithAccounts(t *testing.T) { assert.Equal(t, acc, res1.(*auth.BaseAccount)) // Run a CheckDeliver - mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, []int64{0}, true, priv1) // Check balances mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 57}}) mock.CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 10}}) // Delivering again should cause replay error - mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, false, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, []int64{0}, false, priv1) // bumping the txnonce number without resigning should be an auth error mapp.BeginBlock(abci.RequestBeginBlock{}) - tx := mock.GenTx(sendMsg1, []int64{0}, priv1) + tx := mock.GenTx(sendMsg1, []int64{0}, []int64{0}, priv1) tx.Signatures[0].Sequence = 1 res := mapp.Deliver(tx) assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeUnauthorized), res.Code, res.Log) // resigning the tx with the bumped sequence should work - mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{1}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, []int64{1}, true, priv1) } func TestMsgSendMultipleOut(t *testing.T) { @@ -145,7 +145,7 @@ func TestMsgSendMultipleOut(t *testing.T) { mock.SetGenesis(mapp, accs) // Simulate a Block - mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg2, []int64{0}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg2, []int64{0}, []int64{0}, true, priv1) // Check balances mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 32}}) @@ -173,7 +173,7 @@ func TestSengMsgMultipleInOut(t *testing.T) { mock.SetGenesis(mapp, accs) // CheckDeliver - mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg3, []int64{0, 0}, true, priv1, priv4) + mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg3, []int64{0, 2}, []int64{0, 0}, true, priv1, priv4) // Check balances mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 32}}) @@ -194,14 +194,14 @@ func TestMsgSendDependent(t *testing.T) { mock.SetGenesis(mapp, accs) // CheckDeliver - mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, []int64{0}, true, priv1) // Check balances mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 32}}) mock.CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 10}}) // Simulate a Block - mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg4, []int64{0}, true, priv2) + mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg4, []int64{1}, []int64{0}, true, priv2) // Check balances mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 42}}) diff --git a/x/bank/client/rest/sendtx.go b/x/bank/client/rest/sendtx.go index 28a2946179..2639d27887 100644 --- a/x/bank/client/rest/sendtx.go +++ b/x/bank/client/rest/sendtx.go @@ -27,6 +27,7 @@ type sendBody struct { LocalAccountName string `json:"name"` Password string `json:"password"` ChainID string `json:"chain_id"` + AccountNumber int64 `json:"account_number"` Sequence int64 `json:"sequence"` Gas int64 `json:"gas"` } @@ -91,6 +92,7 @@ func SendRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx context.CoreCont ctx = ctx.WithGas(m.Gas) // sign + ctx = ctx.WithAccountNumber(m.AccountNumber) ctx = ctx.WithSequence(m.Sequence) txBytes, err := ctx.SignAndBuild(m.LocalAccountName, m.Password, msg, cdc) if err != nil { diff --git a/x/ibc/app_test.go b/x/ibc/app_test.go index 9e4b4bf56d..90d426882f 100644 --- a/x/ibc/app_test.go +++ b/x/ibc/app_test.go @@ -5,9 +5,9 @@ import ( "github.com/stretchr/testify/assert" - "github.com/cosmos/cosmos-sdk/x/auth/mock" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/auth/mock" "github.com/cosmos/cosmos-sdk/x/bank" abci "github.com/tendermint/abci/types" @@ -70,10 +70,10 @@ func TestIBCMsgs(t *testing.T) { Sequence: 0, } - mock.SignCheckDeliver(t, mapp.BaseApp, transferMsg, []int64{0}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, transferMsg, []int64{0},[]int64{0}, true, priv1) mock.CheckBalance(t, mapp, addr1, emptyCoins) - mock.SignCheckDeliver(t, mapp.BaseApp, transferMsg, []int64{1}, false, priv1) - mock.SignCheckDeliver(t, mapp.BaseApp, receiveMsg, []int64{2}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, transferMsg, []int64{0}, []int64{1}, false, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, receiveMsg, []int64{0}, []int64{2}, true, priv1) mock.CheckBalance(t, mapp, addr1, coins) - mock.SignCheckDeliver(t, mapp.BaseApp, receiveMsg, []int64{3}, false, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, receiveMsg, []int64{0}, []int64{3}, false, priv1) } diff --git a/x/ibc/client/rest/transfer.go b/x/ibc/client/rest/transfer.go index 2b26b9f01c..b77a6f5eb7 100644 --- a/x/ibc/client/rest/transfer.go +++ b/x/ibc/client/rest/transfer.go @@ -25,6 +25,7 @@ type transferBody struct { LocalAccountName string `json:"name"` Password string `json:"password"` SrcChainID string `json:"src_chain_id"` + AccountNumber int64 `json:"account_number"` Sequence int64 `json:"sequence"` Gas int64 `json:"gas"` } @@ -82,6 +83,7 @@ func TransferRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx context.Core ctx = ctx.WithGas(m.Gas) // sign + ctx = ctx.WithAccountNumber(m.AccountNumber) ctx = ctx.WithSequence(m.Sequence) txBytes, err := ctx.SignAndBuild(m.LocalAccountName, m.Password, msg, cdc) if err != nil { diff --git a/x/stake/app_test.go b/x/stake/app_test.go index 8e20633a02..940d4db2be 100644 --- a/x/stake/app_test.go +++ b/x/stake/app_test.go @@ -117,7 +117,7 @@ func TestStakeMsgs(t *testing.T) { createValidatorMsg := NewMsgCreateValidator( addr1, priv1.PubKey(), bondCoin, description, ) - mock.SignCheckDeliver(t, mapp.BaseApp, createValidatorMsg, []int64{0}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, createValidatorMsg, []int64{0}, []int64{0}, true, priv1) mock.CheckBalance(t, mapp, addr1, sdk.Coins{genCoin.Minus(bondCoin)}) mapp.BeginBlock(abci.RequestBeginBlock{}) @@ -134,7 +134,7 @@ func TestStakeMsgs(t *testing.T) { description = NewDescription("bar_moniker", "", "", "") editValidatorMsg := NewMsgEditValidator(addr1, description) - mock.SignCheckDeliver(t, mapp.BaseApp, editValidatorMsg, []int64{1}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, editValidatorMsg, []int64{0}, []int64{1}, true, priv1) validator = checkValidator(t, mapp, keeper, addr1, true) require.Equal(t, description, validator.Description) @@ -143,7 +143,7 @@ func TestStakeMsgs(t *testing.T) { mock.CheckBalance(t, mapp, addr2, sdk.Coins{genCoin}) delegateMsg := NewMsgDelegate(addr2, addr1, bondCoin) - mock.SignCheckDeliver(t, mapp.BaseApp, delegateMsg, []int64{0}, true, priv2) + mock.SignCheckDeliver(t, mapp.BaseApp, delegateMsg, []int64{1}, []int64{0}, true, priv2) mock.CheckBalance(t, mapp, addr2, sdk.Coins{genCoin.Minus(bondCoin)}) checkDelegation(t, mapp, keeper, addr2, addr1, true, sdk.NewRat(10)) @@ -151,7 +151,7 @@ func TestStakeMsgs(t *testing.T) { // Unbond unbondMsg := NewMsgUnbond(addr2, addr1, "MAX") - mock.SignCheckDeliver(t, mapp.BaseApp, unbondMsg, []int64{1}, true, priv2) + mock.SignCheckDeliver(t, mapp.BaseApp, unbondMsg, []int64{1}, []int64{1}, true, priv2) mock.CheckBalance(t, mapp, addr2, sdk.Coins{genCoin}) checkDelegation(t, mapp, keeper, addr2, addr1, false, sdk.Rat{}) } diff --git a/x/stake/client/rest/tx.go b/x/stake/client/rest/tx.go index 19eca4c447..77a6540eec 100644 --- a/x/stake/client/rest/tx.go +++ b/x/stake/client/rest/tx.go @@ -39,6 +39,7 @@ type editDelegationsBody struct { LocalAccountName string `json:"name"` Password string `json:"password"` ChainID string `json:"chain_id"` + AccountNumber int64 `json:"account_number"` Sequence int64 `json:"sequence"` Gas int64 `json:"gas"` Delegate []msgDelegateInput `json:"delegate"` @@ -129,6 +130,7 @@ func editDelegationsRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx conte signedTxs := make([][]byte, len(messages[:])) for i, msg := range messages { // increment sequence for each message + ctx = ctx.WithAccountNumber(m.AccountNumber) ctx = ctx.WithSequence(m.Sequence) m.Sequence++ From 5bf58ee444a6bd3ff8a4254bca322a9e03d7af15 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 12 Jun 2018 09:47:59 +0200 Subject: [PATCH 234/548] Merge PR #1210: Fix testcases (another fast-forward merge issue) --- Gopkg.lock | 14 +++++++------- x/auth/mock/simulate_block.go | 4 ++-- x/slashing/app_test.go | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 612e8e3b32..07a3c6d5b9 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -197,8 +197,8 @@ ".", "mem" ] - revision = "63644898a8da0bc22138abf860edaf5277b6102e" - version = "v1.1.0" + revision = "787d034dfe70e44075ccc060d346146ef53270ad" + version = "v1.1.1" [[projects]] name = "github.com/spf13/cast" @@ -236,8 +236,8 @@ "assert", "require" ] - revision = "12b6f73e6084dad08a7c6e575284b177ecafbc71" - version = "v1.2.1" + revision = "f35b8ab0b5a2cef36673838d662e249dd9c94686" + version = "v1.2.2" [[projects]] branch = "master" @@ -366,7 +366,7 @@ "merkle", "merkle/tmhash" ] - revision = "640af0205d98d1f45fb2f912f9c35c8bf816adc9" + revision = "0c98d10b4ffbd87978d79c160e835b3d3df241ec" [[projects]] branch = "master" @@ -396,13 +396,13 @@ "internal/timeseries", "trace" ] - revision = "1e491301e022f8f977054da4c2d852decd59571f" + revision = "db08ff08e8622530d9ed3a0e8ac279f6d4c02196" [[projects]] branch = "master" name = "golang.org/x/sys" packages = ["unix"] - revision = "9527bec2660bd847c050fda93a0f0c6dee0800bb" + revision = "bff228c7b664c5fce602223a05fb708fd8654986" [[projects]] name = "golang.org/x/text" diff --git a/x/auth/mock/simulate_block.go b/x/auth/mock/simulate_block.go index e93ac3ceae..7a77e0f09a 100644 --- a/x/auth/mock/simulate_block.go +++ b/x/auth/mock/simulate_block.go @@ -54,8 +54,8 @@ func GenTx(msg sdk.Msg, accnums []int64, seq []int64, priv ...crypto.PrivKeyEd25 } // check a transaction result -func SignCheck(t *testing.T, app *baseapp.BaseApp, msg sdk.Msg, seq []int64, priv ...crypto.PrivKeyEd25519) sdk.Result { - tx := GenTx(msg, seq, priv...) +func SignCheck(t *testing.T, app *baseapp.BaseApp, msg sdk.Msg, accnums []int64, seq []int64, priv ...crypto.PrivKeyEd25519) sdk.Result { + tx := GenTx(msg, accnums, seq, priv...) res := app.Check(tx) return res } diff --git a/x/slashing/app_test.go b/x/slashing/app_test.go index 3d33f53e73..2a99795c6b 100644 --- a/x/slashing/app_test.go +++ b/x/slashing/app_test.go @@ -92,7 +92,7 @@ func TestSlashingMsgs(t *testing.T) { createValidatorMsg := stake.NewMsgCreateValidator( addr1, priv1.PubKey(), bondCoin, description, ) - mock.SignCheckDeliver(t, mapp.BaseApp, createValidatorMsg, []int64{0}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, createValidatorMsg, []int64{0}, []int64{0}, true, priv1) mock.CheckBalance(t, mapp, addr1, sdk.Coins{genCoin.Minus(bondCoin)}) mapp.BeginBlock(abci.RequestBeginBlock{}) @@ -106,6 +106,6 @@ func TestSlashingMsgs(t *testing.T) { checkValidatorSigningInfo(t, mapp, keeper, addr1, false) // unrevoke should fail with unknown validator - res := mock.SignCheck(t, mapp.BaseApp, unrevokeMsg, []int64{1}, priv1) + res := mock.SignCheck(t, mapp.BaseApp, unrevokeMsg, []int64{0}, []int64{1}, priv1) require.Equal(t, sdk.ToABCICode(DefaultCodespace, CodeInvalidValidator), res.Code) } From 3b9cb4949782f21dc28eedd6858aaaf2d2e60ed1 Mon Sep 17 00:00:00 2001 From: Peng Zhong <172531+nylira@users.noreply.github.com> Date: Tue, 12 Jun 2018 13:50:49 +0800 Subject: [PATCH 235/548] readme improvements add link to official faucet, remove sequence from cmds readme improvements wording improvements and simplifications add link to cosmos explorer remove instances of candidate add apostrophe small fixes improve the installing software section fixes based on feedback add note about querying an empty account remove panic note update introduction add full cp path for copying genesis.json update moniker warning remove redundant sections add error message when querying empty account don't need a link to golang.org link to sections, better section names fix section link reorganize sections add h3s remove & symbol add whitespace update h3 to h2 add note about explorer not connecting to every node --- cmd/gaia/testnets/README.md | 247 +++++++++++++++--------------------- 1 file changed, 99 insertions(+), 148 deletions(-) diff --git a/cmd/gaia/testnets/README.md b/cmd/gaia/testnets/README.md index 42484c5990..8ea2d43fca 100644 --- a/cmd/gaia/testnets/README.md +++ b/cmd/gaia/testnets/README.md @@ -1,228 +1,185 @@ -# Connect to a Testnet +# Connect to the `gaia-6001` Testnet -This document explains how to connect to the Testnet of a [Cosmos-SDK](https://github.com/cosmos/cosmos-sdk/) based blockchain. It can be used to connect to the latest Testnet for the Cosmos Hub. - -NOTE: We are aware this documentation is sub-par and are actively working to -improve both the tooling and the documentation to make this as painless as +Note: We are aware this documentation is sub-par. We are working to +improve the tooling and the documentation to make this process as painless as possible. In the meantime, join the -[chat](https://riot.im/app/#/room/#cosmos_validators:matrix.org) for technical support. Thanks very -much for your patience :) +[Validator Chat](https://riot.im/app/#/room/#cosmos_validators:matrix.org) +for technical support. Thanks very much for your patience. :) -## Software Setup (Manual Installation) +## Setting Up a New Node -Follow these instructions to install the Cosmos-SDK and connect to the latest Testnet. This instructions work for both a local machine and a VM in a cloud server. +These instructions are for setting up a brand new full node from scratch. If you ran a full node on a previous testnet, please skip to [Upgrading From Previous Testnet](#upgrading-from-previous-testnet). -If you want to run a non-validator full-node, installing the SDK on a Cloud server is a good option. However, if you are want to become a validator for the Hub's `mainnet` you should look at more complex setups, including [Sentry Node Architecture](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#how-can-validators-protect-themselves-from-denial-of-service-attacks), to protect your node from DDOS and ensure high-availability (see the [technical requirements](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#technical-requirements)). You can find more information on validators in our [website](https://cosmos.network/validators), in the [Validator FAQ](https://cosmos.network/resources/validator-faq) and in the [Validator Chat](https://riot.im/app/#/room/#cosmos_validators:matrix.org). +### Install Go -### Install [Go](https://golang.org/) +Install `go` by following the [official docs](https://golang.org/doc/install). +**Go 1.10+** is required for the Cosmos SDK. -Install `go` following the [instructions](https://golang.org/doc/install) in the official golang website. -You will require **Go 1.10+** for this tutorial. +### Install Cosmos SDK -#### Set GOPATH - -First, you will need to set up your `GOPATH`. Make sure that the location `$HOME` is something like `/Users/`, you can corroborate it by typing `echo $HOME` in your terminal. - -Go to `$HOME` with the command `cd $HOME` and open the the hidden file `.bashrc` with a code editor and paste the following lines \(or `.bash_profile` if your're using OS X\). +Next, let's install the testnet's version of the Cosmos SDK. ``` -export GOPATH=$HOME/go -export PATH=$PATH:$GOROOT/bin:$GOPATH/bin +go get github.com/cosmos/cosmos-sdk +cd $GOPATH/src/github.com/cosmos/cosmos-sdk && git checkout v0.18.0 +make get_tools && make get_vendor_deps && make install ``` -Save and restart the terminal. - -_Note_: If you can't see the hidden file, use the shortcut `Command + Shift + .` in Finder. - - -### Install [GNU Wget](https://www.gnu.org/software/wget/) - -**MacOS** - -``` -brew install wget -``` - -**Linux** - -``` -sudo apt-get install wget -``` - -Note: You can check other available options for downloading `wget` [here](https://www.gnu.org/software/wget/faq.html#download). - -### Install Gaia - -Now we can fetch the correct versions of each dependency by running: - -``` -mkdir -p $GOPATH/src/github.com/cosmos/cosmos-sdk -git clone https://github.com/cosmos/cosmos-sdk.git -git checkout v0.18.0 -make get_tools // run $ make update_tools if already installed -make get_vendor_deps -make install -``` - -This will install the `gaiad` and `gaiacli` binaries. Verify that everything is OK by running: +That will install the `gaiad` and `gaiacli` binaries. Verify that everything is OK: ``` gaiad version -``` - -You should see: - -``` 0.18.0-eceb56b7 ``` -And also: +### Node Setup + +Create the required configuration files: ``` -gaiacli version +gaiad init ``` -You should see: - -``` -0.18.0-eceb56b7 -``` - -## Full Node Setup - -Copy the testnet initialization files to a new data directory: - -``` -mkdir -p $HOME/.gaiad/config -cp -a cmd/gaia/testnets/gaia-6001/genesis.json $HOME/.gaiad/config/genesis.json -gaiad unsafe_reset_all -``` - -Add a seed node by changing `seeds = ""` in `$HOME/.gaiad/config/config.toml` to - -``` -seeds = "38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6001.coinculture.net:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@seed.cosmos.cryptium.ch:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@35.198.166.171:46656,032fa56301de335d835057fb6ad9f7ce2242a66d@165.227.236.213:46656" -``` - -Lastly change the `moniker` string in the `$HOME/.gaiad/config/config.toml`to identify your node. +Name your node by editing the `moniker` in `$HOME/.gaiad/config/config.toml`. Note that only ASCII characters are supported. Using Unicode renders your node unconnectable. ``` # A custom human readable name for this node moniker = "" ``` -## Upgrading from a previous network +Your full node has been initialized! Please skip to [Genesis & Seeds](#genesis--seeds). -These instructions are for anyone that ran a previous network and would like to upgrade to a newer version. +## Upgrading From Previous Testnet + +These instructions are for full nodes that have ran on previous testnets and would like to upgrade to the latest testnet. + +### Reset Data + +First, remove the outdated files and reset the data. -Remove the ephemeral files and reset the data. ``` rm $HOME/.gaiad/config/addrbook.json $HOME/.gaiad/config/genesis.json gaiad unsafe_reset_all ``` -Now your node is in a prestine state without changing your validator key. If you had any -sentry nodes or full nodes setup correctly previously they should work. +Your node is now in a pristine state while keeping the original `priv_validator.json`. If you had any sentry nodes or full nodes setup before, they should continue to work. -**Make sure that every node has a unique `priv_validator.json`. Do not copy the `priv_validator.json` from an old node to multiple new nodes. Running two nodes with the same `priv_validator.json` will cause you to double sign.**\ +**WARNING:** Make sure that every node has a unique `priv_validator.json`. Do not copy the `priv_validator.json` from an old node to multiple new nodes. Running two nodes with the same `priv_validator.json` will cause you to double sign. +### Software Upgrade + +Now it is time to upgrade the software: -Now it is time to upgrade the software. ``` cd $GOPATH/src/github.com/cosmos/cosmos-sdk -git fetch --all -git checkout v0.18.0 -make update_tools -make get_vendor_deps -make install +git fetch --all && git checkout v0.18.0 +make update_tools && make get_vendor_deps && make install ``` -The next step is to copy the new genesis file: +Your full node has been cleanly upgraded! + +## Genesis & Seeds + +### Copy the Genesis File + +Copy the testnet's `genesis.json` file and place it in `gaiad`'s config directory. ``` -cp -a cmd/gaia/testnets/gaia-6001/genesis.json $HOME/.gaiad/config/genesis.json +mkdir -p $HOME/.gaiad/config +cp -a $GOPATH/src/github.com/cosmos/cosmos-sdk/cmd/gaia/testnets/gaia-6001/genesis.json $HOME/.gaiad/config/genesis.json ``` -The last step is the adjust the `$HOME/.gaiad/config/config.toml`. Make sure that you are connected to healthy peers or seed nodes. -These are some seeds nodes and they can be put into the config under the `seeds` key. Alternatively you can also -ask user validators directly for a persistent peer and add it under the `persisent_peers` key. +### Add Seed Nodes + +Your node needs to know how to find peers. You'll need to add healthy seed nodes to `$HOME/.gaiad/config/config.toml`. Here are some seed nodes you can use: ``` -38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6001.coinculture.net:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@seed.cosmos.cryptium.ch:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@35.198.166.171:46656,032fa56301de335d835057fb6ad9f7ce2242a66d@165.227.236.213:46656 +# Comma separated list of seed nodes to connect to +seeds = "38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6001.coinculture.net:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@seed.cosmos.cryptium.ch:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@35.198.166.171:46656,032fa56301de335d835057fb6ad9f7ce2242a66d@165.227.236.213:46656" ``` +You can also [ask other validators](https://riot.im/app/#/room/#cosmos_validators:matrix.org) for a persistent peer and add it under the `persistent_peers` key. For more information on seeds and peers, [read this](https://github.com/tendermint/tendermint/blob/develop/docs/using-tendermint.md#peers). + ## Run a Full Node -Start the full node: +Start the full node with this command: ``` gaiad start ``` -Check the everything is running smoothly: +Check that everything is running smoothly: ``` gaiacli status ``` -## Generate keys +View the status of the network with the [Cosmos Explorer](https://explorecosmos.network). Once your full node syncs up to the current block height, you should see it appear on the [list of full nodes](https://explorecosmos.network/validators). If it doesn't show up, that's ok--the Explorer does not connect to every node. + +## Generate Keys You'll need a private and public key pair \(a.k.a. `sk, pk` respectively\) to be able to receive funds, send txs, bond tx, etc. -To generate your a new key \(default _ed25519_ elliptic curve\): +To generate a new key \(default _ed25519_ elliptic curve\): ``` gaiacli keys add ``` -Next, you will have to enter a passphrase for your key twice. Save the _seed_ _phrase_ in a safe place in case you forget the password. +Next, you will have to create a passphrase. Save the _seed_ _phrase_ in a safe place in case you forget the password. -Now if you check your private keys you will see the `` key among them: +If you check your private keys, you'll now see ``: ``` gaiacli keys show ``` -You can see all your other available keys by typing: +You can see all your available keys by typing: ``` gaiacli keys list ``` -The validator pubkey from your node should be the same as the one printed with the command: +View the validator pubkey for your node by typing: ``` gaiad tendermint show_validator ``` -Finally, save your address and pubkey into a variable to use them afterwards. +Save your address and pubkey to environment variables for later use: ``` MYADDR= MYPUBKEY= ``` -**IMPORTANT:** We strongly recommend to **NOT** use the same passphrase for your different keys. The Tendermint team and the Interchain Foundation will not be responsible for the lost of funds. +**WARNING:** We strongly recommend NOT using the same passphrase for multiple keys. The Tendermint team and the Interchain Foundation will not be responsible for the loss of funds. -### Get coins +## Get Tokens -The best way to get coins at the moment is to ask in Riot chat. We plan to have a reliable faucet in future testnets. +The best way to get tokens is from the [Cosmos Testnet Faucet](https://faucetcosmos.network). If the faucet is not working for you, try asking [#cosmos-validators](https://riot.im/app/#/room/#cosmos-validators:matrix.org). -## Send tokens +After receiving tokens to your address, you can view your account's balance by typing: ``` -gaiacli send --amount=1000fermion --chain-id= --sequence=0 --name= --to= +gaiacli account ``` -The `--amount` flag defines the corresponding amount of the coin in the format `--amount=` +Note: When you query an account balance with zero tokens, you will get this error: `No account with address was found in the state.` This is expected! We're working on improving our error messages. -The `--sequence` flag corresponds to the sequence number to sign the tx. - -Now check the destination account and your own account to check the updated balances \(by default the latest block\): +## Send Tokens ``` +gaiacli send --amount=10faucetToken --chain-id= --name= --to= +``` + +Note: The `--amount` flag accepts the format `--amount=`. + +Now, view the updated balances of the origin and destination accounts: + +``` +gaiacli account gaiacli account -gaiacli account ``` You can also check your balance at a given block by using the `--block` flag: @@ -233,71 +190,65 @@ gaiacli account --block= ## Run a Validator Node -[Validators](https://cosmos.network/validators) are actors from the network that are responsible from committing new blocks to the blockchain by submitting their votes. In terms of security, validators' stake is slashed in all the zones they belong if they become unavailable, double sign a transaction, or don't cast their votes. We strongly recommend entities intending to run validators in the Cosmos Hub's `mainnet` to check the [technical requirements](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#technical-requirements) and take the necessary precautions to ensure high-availability, such as setting a Sentry Node architecture. If you have any question about validators, read the [Validator FAQ](https://cosmos.network/resources/validator-faq) and join the [Validator Chat](https://riot.im/app/#/room/#cosmos_validators:matrix.org). +[Validators](https://cosmos.network/validators) are responsible for committing new blocks to the blockchain through voting. A validator's stake is slashed if they become unavailable, double sign a transaction, or don't cast their votes. If you only want to run a full node, a VM in the cloud is fine. However, if you are want to become a validator for the Hub's `mainnet`, you should research hardened setups. Please read [Sentry Node Architecture](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#how-can-validators-protect-themselves-from-denial-of-service-attacks) to protect your node from DDOS and ensure high-availability. Also see the [technical requirements](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#technical-requirements)). There's also more info on our [website](https://cosmos.network/validators). -This section covers the instructions necessary to stake tokens to become a testnet validator candidate. +Your `pubkey` can be used to create a new validator by staking tokens. You can find your validator pubkey by running: -Your `pubkey` can be used to create a new validator candidate by staking some tokens: - -You can find your node pubkey by running ``` gaiad tendermint show_validator ``` -and this returns your public key for the declare-candidate command - +Next, craft your `gaiacli stake create-validator` command: ``` -gaiacli stake create-validator --amount=500steak --pubkey= --address-candidate= --moniker=satoshi --chain-id= --sequence=1 --name= +gaiacli stake create-validator --amount=5steak --pubkey= --address-validator= --moniker=satoshi --chain-id= --name= ``` -You can add more information of the validator candidate such as`--website`, `--keybase-sig `or additional `--details`. If you want to edit the candidate info: +You can add more information to the validator, such as`--website`, `--keybase-sig`, or `--details`. Here's how: ``` gaiacli stake edit-validator --details="To the cosmos !" --website="https://cosmos.network" ``` -Finally, you can check all the candidate information by typing: +View the validator's information with this command: ``` -gaiacli stake validator --address-candidate= --chain-id= +gaiacli stake validator --address-validator= --chain-id= ``` -To check that the validator is active you can find it on the validator set list: +To check that the validator is active, look for it here: ``` gaiacli advanced tendermint validator-set ``` -**Note:** Remember that to be in the validator set you need to have more total power than the Xnd validator, where X is the assigned size for the validator set \(by default _`X = 100`_\). +**Note:** To be in the validator set, you need to have more total voting power than the 100th validator. -## Delegate your tokens +## Delegating to a Validator -You can delegate \(_i.e._ bind\) **Atoms** to a validator to become a [delegator](https://cosmos.network/resources/delegators) and obtain a part of its fee revenue in **Photons**. For more information about the Cosmos Token Model, refer to our [whitepaper](https://github.com/cosmos/cosmos/raw/master/Cosmos_Token_Model.pdf). +On the upcoming mainnet, you can delegate `atom` to a validator. These [delegators](https://cosmos.network/resources/delegators) can receive part of the validator's fee revenue in `photon`. Read more more about the [Cosmos Token Model](https://github.com/cosmos/cosmos/raw/master/Cosmos_Token_Model.pdf). -### Bond your tokens +### Bond Tokens -Bond your tokens to a validator candidate with the following command: +On the testnet, we delegate `steak` instead of `atom`. Here's how you can bond tokens to a testnet validator: ``` -gaiacli stake delegate --amount=10steak --address-delegator= --address-candidate= --name= --chain-id= --sequence=2 +gaiacli stake delegate --amount=10steak --address-delegator= --address-validator= --name= --chain-id= ``` -When tokens are bonded, they are pooled with all the other bonded tokens in the network. Validators and delegators obtain shares that represent their stake in this pool. +While tokens are bonded, they are pooled with all the other bonded tokens in the network. Validators and delegators obtain a percentage of shares that equal their stake in this pool. -### Unbond +### Unbond Tokens -If for any reason the validator misbehaves or you just want to unbond a certain amount of the bonded tokens: +If for any reason the validator misbehaves, or you want to unbond a certain amount of tokens, use this following command. You can unbond a specific amount of`shares`\(eg:`12.1`\) or all of them \(`MAX`\). ``` -gaiacli stake unbond --address-delegator= --address-candidate= --shares=MAX --name= --chain-id= --sequence=3 +gaiacli stake unbond --address-delegator= --address-validator= --shares=MAX --name= --chain-id= ``` -You can unbond a specific amount of`shares`\(eg:`12.1`\) or all of them \(`MAX`\). - -You should now see the unbonded tokens reflected in your balance and in your delegator bond: +You can check your balance and your stake delegation to see that the unbonding went through successfully. ``` gaiacli account -gaiacli stake delegation --address-delegator= --address-candidate= --chain-id= +gaiacli stake delegation --address-delegator= --address-validator= --chain-id= ``` From 4c5e536b31c184d38b2edf820efcc8bccea041ae Mon Sep 17 00:00:00 2001 From: Greg Szabo Date: Tue, 5 Jun 2018 15:17:04 -0400 Subject: [PATCH 236/548] Added testnet command and localnet targets Finished testnet command and introduced localnet targets in Makefile, together with gaiadnode Docker image Fixed function parameter list - now starts with ctx Separated GenTxConfig into a server/config package so both the server package and the mock package can use it Adding server/config to app package gaiadnode Docker image Separated GenTxConfig into a server/config package so both the server package and the mock package can use it Adding server/config to app package Fixes requested by Rigel Removed commented code Global flag fixes --- .gitignore | 2 + CHANGELOG.md | 93 ++++------ Makefile | 19 ++- cmd/gaia/app/genesis.go | 42 ++--- docker-compose.yml | 68 ++++++++ networks/local/Makefile | 7 + networks/local/README.md | 79 +++++++++ networks/local/gaiadnode/Dockerfile | 16 ++ networks/local/gaiadnode/wrapper.sh | 35 ++++ server/config/config.go | 14 ++ server/init.go | 253 +++++++++++++++++----------- server/init_test.go | 4 + server/mock/app.go | 3 +- server/testnet.go | 177 +++++++++++++++++++ server/util.go | 1 + 15 files changed, 632 insertions(+), 181 deletions(-) create mode 100644 docker-compose.yml create mode 100644 networks/local/Makefile create mode 100644 networks/local/README.md create mode 100644 networks/local/gaiadnode/Dockerfile create mode 100755 networks/local/gaiadnode/wrapper.sh create mode 100644 server/config/config.go create mode 100644 server/testnet.go diff --git a/.gitignore b/.gitignore index da467c151f..f528ccc8fe 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ *.swp *.swo .vscode +.idea # Build vendor @@ -15,6 +16,7 @@ docs/_build examples/basecoin/app/data baseapp/data/* client/lcd/keys/* +mytestnet # Testing coverage.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 2485093891..8fa2ca3b2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,25 +1,50 @@ # Changelog +## Pending + BREAKING CHANGES -* msg.GetSignBytes() now returns bech32-encoded addresses in all cases -* [lcd] REST end-points now include gas +* [cli] rearranged commands under subcommands +* [stake] remove Tick and add EndBlocker FEATURES IMPROVEMENTS -* export command now writes current validator set for Tendermint -* [tests] Application module tests now use a mock application -* [gaiacli] Fix error message when account isn't found when running gaiacli account -* [lcd] refactored to eliminate use of global variables, and interdependent tests +* bank module uses go-wire codec instead of 'encoding/json' +* auth module uses go-wire codec instead of 'encoding/json' +* revised use of endblock and beginblock +* added testnet command +* added localnet commands to Makefile (docker-based local testnet) FIXES -* [lcd] Switch to bech32 for addresses on all human readable inputs and outputs -* [lcd] fixed tx indexing/querying -* [cli] Added `--gas` flag to specify transaction gas limit +* [cli] fixed cli-bash tests +* [ci] added cli-bash tests +* [basecoin] updated basecoin for stake and slashing + +## 0.18.1 + +BREAKING CHANGES + +* [x/auth] move stuff specific to auth anteHandler to the auth module rather than the types folder. This includes: + * StdTx (and its related stuff i.e. StdSignDoc, etc) + * StdFee + * StdSignature + * Account interface + * Related to this organization, I also: +* [x/auth] got rid of AccountMapper interface (in favor of the struct already in auth module) +* [x/auth] removed the FeeHandler function from the AnteHandler, Replaced with FeeKeeper +* [x/auth] Removed GetSignatures() from Tx interface (as different Tx styles might use something different than StdSignature) +* [store] Removed SubspaceIterator and ReverseSubspaceIterator from KVStore interface and replaced them with helper functions in /types +* Switch to bech32cosmos on all human readable inputs and outputs + +BUG FIXES + +* auto-sequencing transactions correctly +* query sequence via account store +* fixed duplicate pub_key in stake.Validator ## 0.18.0 -_2018-06-05_ +_TBD_ BREAKING CHANGES @@ -38,20 +63,6 @@ BREAKING CHANGES * Introduction of Unbonding fields, lowlevel logic throughout (not fully implemented with queue) * Introduction of PoolShares type within validators, replaces three rational fields (BondedShares, UnbondingShares, UnbondedShares -* [x/auth] move stuff specific to auth anteHandler to the auth module rather than the types folder. This includes: - * StdTx (and its related stuff i.e. StdSignDoc, etc) - * StdFee - * StdSignature - * Account interface - * Related to this organization, I also: -* [x/auth] got rid of AccountMapper interface (in favor of the struct already in auth module) -* [x/auth] removed the FeeHandler function from the AnteHandler, Replaced with FeeKeeper -* [x/auth] Removed GetSignatures() from Tx interface (as different Tx styles might use something different than StdSignature) -* [store] Removed SubspaceIterator and ReverseSubspaceIterator from KVStore interface and replaced them with helper functions in /types -* [cli] rearranged commands under subcommands -* [stake] remove Tick and add EndBlocker -* Switch to bech32cosmos on all human readable inputs and outputs - FEATURES @@ -68,41 +79,12 @@ FEATURES * [stake] Added REST API * [Makefile] Added terraform/ansible playbooks to easily create remote testnets on Digital Ocean - BUG FIXES +* Auto-sequencing now works correctly * [stake] staking delegator shares exchange rate now relative to equivalent-bonded-tokens the validator has instead of bonded tokens ^ this is important for unbonded validators in the power store! -* [cli] fixed cli-bash tests -* [ci] added cli-bash tests -* [basecoin] updated basecoin for stake and slashing -* [docs] fixed references to old cli commands * [docs] Downgraded Swagger to v2 for downstream compatibility -* auto-sequencing transactions correctly -* query sequence via account store -* fixed duplicate pub_key in stake.Validator -* Auto-sequencing now works correctly - - - -## 0.17.5 - -*June 5, 2018* - -Update to Tendermint v0.19.9 (Fix evidence reactor, mempool deadlock, WAL panic, -memory leak) - -## 0.17.4 - -*May 31, 2018* - -Update to Tendermint v0.19.7 (WAL fixes and more) - -## 0.17.3 - -*May 29, 2018* - -Update to Tendermint v0.19.6 (fix fast-sync halt) ## 0.17.2 @@ -142,7 +124,6 @@ BUG FIXES * Auto-sequencing now works correctly - ## 0.16.0 (May 14th, 2018) BREAKING CHANGES @@ -177,14 +158,12 @@ BUG FIXES * Gaia now uses stake, ported from github.com/cosmos/gaia - ## 0.15.1 (April 29, 2018) IMPROVEMENTS: * Update Tendermint to v0.19.1 (includes many rpc fixes) - ## 0.15.0 (April 29, 2018) NOTE: v0.15.0 is a large breaking change that updates the encoding scheme to use diff --git a/Makefile b/Makefile index d6444b0b62..fbcadfcabc 100644 --- a/Makefile +++ b/Makefile @@ -130,12 +130,27 @@ devdoc_update: ######################################## -### Remote validator nodes using terraform and ansible +### Local validator nodes using docker and docker-compose # Build linux binary build-linux: GOOS=linux GOARCH=amd64 $(MAKE) build +build-docker-gaiadnode: + $(MAKE) -C networks/local + +# Run a 4-node testnet locally +localnet-start: localnet-stop + @if ! [ -f build/node0/gaiad/config/genesis.json ]; then docker run --rm -v $(CURDIR)/build:/gaiad:Z tendermint/gaiadnode testnet --v 4 --o . --starting-ip-address 192.168.10.2 ; fi + docker-compose up + +# Stop testnet +localnet-stop: + docker-compose down + +######################################## +### Remote validator nodes using terraform and ansible + TESTNET_NAME?=remotenet SERVERS?=4 BINARY=$(CURDIR)/build/gaiad @@ -157,4 +172,4 @@ remotenet-status: # To avoid unintended conflicts with file names, always add to .PHONY # unless there is a reason not to. # https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html -.PHONY: build build_examples install install_examples dist check_tools get_tools get_vendor_deps draw_deps test test_cli test_unit test_cover test_lint benchmark devdoc_init devdoc devdoc_save devdoc_update remotenet-start remotenet-stop remotenet-status +.PHONY: build build_examples install install_examples dist check_tools get_tools get_vendor_deps draw_deps test test_cli test_unit test_cover test_lint benchmark devdoc_init devdoc devdoc_save devdoc_update build-linux build-docker-gaiadnode localnet-start localnet-stop remotenet-start remotenet-stop remotenet-status diff --git a/cmd/gaia/app/genesis.go b/cmd/gaia/app/genesis.go index 813796c0d8..3f44a71874 100644 --- a/cmd/gaia/app/genesis.go +++ b/cmd/gaia/app/genesis.go @@ -3,13 +3,12 @@ package app import ( "encoding/json" "errors" - "github.com/spf13/pflag" - "github.com/spf13/viper" crypto "github.com/tendermint/go-crypto" tmtypes "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/server" + gc "github.com/cosmos/cosmos-sdk/server/config" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" @@ -50,25 +49,15 @@ func (ga *GenesisAccount) ToAccount() (acc *auth.BaseAccount) { } } -var ( - flagName = "name" - flagClientHome = "home-client" - flagOWK = "owk" - - // bonded tokens given to genesis validators/accounts - freeFermionVal = int64(100) - freeFermionsAcc = int64(50) -) - // get app init parameters for server init command func GaiaAppInit() server.AppInit { fsAppGenState := pflag.NewFlagSet("", pflag.ContinueOnError) fsAppGenTx := pflag.NewFlagSet("", pflag.ContinueOnError) - fsAppGenTx.String(flagName, "", "validator moniker, required") - fsAppGenTx.String(flagClientHome, DefaultCLIHome, + fsAppGenTx.String(server.FlagName, "", "validator moniker, required") + fsAppGenTx.String(server.FlagClientHome, DefaultCLIHome, "home directory for the client, used for key generation") - fsAppGenTx.Bool(flagOWK, false, "overwrite the accounts created") + fsAppGenTx.Bool(server.FlagOWK, false, "overwrite the accounts created") return server.AppInit{ FlagsAppGenState: fsAppGenState, @@ -86,18 +75,15 @@ type GaiaGenTx struct { } // Generate a gaia genesis transaction with flags -func GaiaAppGenTx(cdc *wire.Codec, pk crypto.PubKey) ( +func GaiaAppGenTx(cdc *wire.Codec, pk crypto.PubKey, genTxConfig gc.GenTxConfig) ( appGenTx, cliPrint json.RawMessage, validator tmtypes.GenesisValidator, err error) { - clientRoot := viper.GetString(flagClientHome) - overwrite := viper.GetBool(flagOWK) - name := viper.GetString(flagName) - if name == "" { + if genTxConfig.Name == "" { return nil, nil, tmtypes.GenesisValidator{}, errors.New("Must specify --name (validator moniker)") } var addr sdk.Address var secret string - addr, secret, err = server.GenerateSaveCoinKey(clientRoot, name, "1234567890", overwrite) + addr, secret, err = server.GenerateSaveCoinKey(genTxConfig.CliRoot, genTxConfig.Name, "1234567890", genTxConfig.Overwrite) if err != nil { return } @@ -107,8 +93,10 @@ func GaiaAppGenTx(cdc *wire.Codec, pk crypto.PubKey) ( if err != nil { return } + cliPrint = json.RawMessage(bz) - return GaiaAppGenTxNF(cdc, pk, addr, name, overwrite) + appGenTx, _, validator, err = GaiaAppGenTxNF(cdc, pk, addr, genTxConfig.Name, genTxConfig.Overwrite) + return } // Generate a gaia genesis transaction without flags @@ -129,7 +117,7 @@ func GaiaAppGenTxNF(cdc *wire.Codec, pk crypto.PubKey, addr sdk.Address, name st validator = tmtypes.GenesisValidator{ PubKey: pk, - Power: freeFermionVal, + Power: server.FreeFermionVal, } return } @@ -160,21 +148,21 @@ func GaiaAppGenState(cdc *wire.Codec, appGenTxs []json.RawMessage) (genesisState accAuth := auth.NewBaseAccountWithAddress(genTx.Address) accAuth.Coins = sdk.Coins{ {genTx.Name + "Token", 1000}, - {"steak", freeFermionsAcc}, + {"steak", server.FreeFermionsAcc}, } acc := NewGenesisAccount(&accAuth) genaccs[i] = acc - stakeData.Pool.LooseUnbondedTokens += freeFermionsAcc // increase the supply + stakeData.Pool.LooseUnbondedTokens += server.FreeFermionsAcc // increase the supply // add the validator if len(genTx.Name) > 0 { desc := stake.NewDescription(genTx.Name, "", "", "") validator := stake.NewValidator(genTx.Address, genTx.PubKey, desc) - validator.PoolShares = stake.NewBondedShares(sdk.NewRat(freeFermionVal)) + validator.PoolShares = stake.NewBondedShares(sdk.NewRat(server.FreeFermionVal)) stakeData.Validators = append(stakeData.Validators, validator) // pool logic - stakeData.Pool.BondedTokens += freeFermionVal + stakeData.Pool.BondedTokens += server.FreeFermionVal stakeData.Pool.BondedShares = sdk.NewRat(stakeData.Pool.BondedTokens) } } diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000..83e473a7db --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,68 @@ +version: '3' + +services: + node0: + container_name: node0 + image: "tendermint/gaiadnode" + ports: + - "46656-46657:46656-46657" + environment: + - ID=0 + - LOG=$${LOG:-gaiad.log} + volumes: + - ./build:/gaiad:Z + networks: + localnet: + ipv4_address: 192.168.10.2 + + node1: + container_name: node1 + image: "tendermint/gaiadnode" + ports: + - "46659-46660:46656-46657" + environment: + - ID=1 + - LOG=$${LOG:-gaiad.log} + volumes: + - ./build:/gaiad:Z + networks: + localnet: + ipv4_address: 192.168.10.3 + + node2: + container_name: node2 + image: "tendermint/gaiadnode" + environment: + - ID=2 + - LOG=$${LOG:-gaiad.log} + ports: + - "46661-46662:46656-46657" + volumes: + - ./build:/gaiad:Z + networks: + localnet: + ipv4_address: 192.168.10.4 + + node3: + container_name: node3 + image: "tendermint/gaiadnode" + environment: + - ID=3 + - LOG=$${LOG:-gaiad.log} + ports: + - "46663-46664:46656-46657" + volumes: + - ./build:/gaiad:Z + networks: + localnet: + ipv4_address: 192.168.10.5 + +networks: + localnet: + driver: bridge + ipam: + driver: default + config: + - + subnet: 192.168.10.0/16 + diff --git a/networks/local/Makefile b/networks/local/Makefile new file mode 100644 index 0000000000..c707a168ee --- /dev/null +++ b/networks/local/Makefile @@ -0,0 +1,7 @@ +# Makefile for the "gaiadnode" docker image. + +all: + docker build --tag tendermint/gaiadnode gaiadnode + +.PHONY: all + diff --git a/networks/local/README.md b/networks/local/README.md new file mode 100644 index 0000000000..e16d947ab1 --- /dev/null +++ b/networks/local/README.md @@ -0,0 +1,79 @@ +# Local Cluster with Docker Compose + +## Requirements + +- [Install gaia](/docs/index.rst) +- [Install docker](https://docs.docker.com/engine/installation/) +- [Install docker-compose](https://docs.docker.com/compose/install/) + +## Build + +Build the `gaiad` binary and the `tendermint/gaiadnode` docker image. + +Note the binary will be mounted into the container so it can be updated without +rebuilding the image. + +``` +cd $GOPATH/src/github.com/cosmos/cosmos-sdk + +# Build the linux binary in ./build +make build-linux + +# Build tendermint/gaiadnode image +make build-docker-gaiadnode +``` + + +## Run a testnet + +To start a 4 node testnet run: + +``` +make localnet-start +``` + +The nodes bind their RPC servers to ports 46657, 46660, 46662, and 46664 on the host. +This file creates a 4-node network using the gaiadnode image. +The nodes of the network expose their P2P and RPC endpoints to the host machine on ports 46656-46657, 46659-46660, 46661-46662, and 46663-46664 respectively. + +To update the binary, just rebuild it and restart the nodes: + +``` +make build-linux +make localnet-stop +make localnet-start +``` + +## Configuration + +The `make localnet-start` creates files for a 4-node testnet in `./build` by calling the `gaiad testnet` command. + +The `./build` directory is mounted to the `/gaiad` mount point to attach the binary and config files to the container. + +For instance, to create a single node testnet: + +``` +cd $GOPATH/src/github.com/cosmos/cosmos-sdk + +# Clear the build folder +rm -rf ./build + +# Build binary +make build-linux + +# Create configuration +docker run -v `pwd`/build:/gaiad tendermint/gaiadnode testnet --o . --v 1 + +#Run the node +docker run -v `pwd`/build:/gaiad tendermint/gaiadnode + +``` + +## Logging + +Log is saved under the attached volume, in the `gaiad.log` file and written on the screen. + +## Special binaries + +If you have multiple binaries with different names, you can specify which one to run with the BINARY environment variable. The path of the binary is relative to the attached volume. + diff --git a/networks/local/gaiadnode/Dockerfile b/networks/local/gaiadnode/Dockerfile new file mode 100644 index 0000000000..fc2c0d4a0c --- /dev/null +++ b/networks/local/gaiadnode/Dockerfile @@ -0,0 +1,16 @@ +FROM alpine:3.7 +MAINTAINER Greg Szabo + +RUN apk update && \ + apk upgrade && \ + apk --no-cache add curl jq file + +VOLUME [ /gaiad ] +WORKDIR /gaiad +EXPOSE 46656 46657 +ENTRYPOINT ["/usr/bin/wrapper.sh"] +CMD ["start"] +STOPSIGNAL SIGTERM + +COPY wrapper.sh /usr/bin/wrapper.sh + diff --git a/networks/local/gaiadnode/wrapper.sh b/networks/local/gaiadnode/wrapper.sh new file mode 100755 index 0000000000..b3e90a2a0c --- /dev/null +++ b/networks/local/gaiadnode/wrapper.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env sh + +## +## Input parameters +## +BINARY=/gaiad/${BINARY:-gaiad} +ID=${ID:-0} +LOG=${LOG:-gaiad.log} + +## +## Assert linux binary +## +if ! [ -f "${BINARY}" ]; then + echo "The binary $(basename "${BINARY}") cannot be found. Please add the binary to the shared folder. Please use the BINARY environment variable if the name of the binary is not 'gaiad' E.g.: -e BINARY=gaiad_my_test_version" + exit 1 +fi +BINARY_CHECK="$(file "$BINARY" | grep 'ELF 64-bit LSB executable, x86-64')" +if [ -z "${BINARY_CHECK}" ]; then + echo "Binary needs to be OS linux, ARCH amd64" + exit 1 +fi + +## +## Run binary with all parameters +## +export GAIADHOME="/gaiad/node${ID}/gaiad" + +if [ -d "`dirname ${GAIADHOME}/${LOG}`" ]; then + "$BINARY" --home "$GAIADHOME" "$@" | tee "${GAIADHOME}/${LOG}" +else + "$BINARY" --home "$GAIADHOME" "$@" +fi + +chmod 777 -R /gaiad + diff --git a/server/config/config.go b/server/config/config.go new file mode 100644 index 0000000000..26d038f475 --- /dev/null +++ b/server/config/config.go @@ -0,0 +1,14 @@ +package config + +//_____________________________________________________________________ + +// Configuration structure for command functions that share configuration. +// For example: init, init gen-tx and testnet commands need similar input and run the same code + +// Storage for init gen-tx command input parameters +type GenTxConfig struct { + Name string + CliRoot string + Overwrite bool + IP string +} diff --git a/server/init.go b/server/init.go index 512751bed0..9eefda94c5 100644 --- a/server/init.go +++ b/server/init.go @@ -19,13 +19,14 @@ import ( "github.com/tendermint/go-crypto/keys/words" cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/p2p" - tmtypes "github.com/tendermint/tendermint/types" pvm "github.com/tendermint/tendermint/privval" + tmtypes "github.com/tendermint/tendermint/types" tmcli "github.com/tendermint/tmlibs/cli" cmn "github.com/tendermint/tmlibs/common" dbm "github.com/tendermint/tmlibs/db" clkeys "github.com/cosmos/cosmos-sdk/client/keys" + gc "github.com/cosmos/cosmos-sdk/server/config" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" ) @@ -39,10 +40,36 @@ type GenesisTx struct { } var ( - flagOverwrite = "overwrite" - flagGenTxs = "gen-txs" - flagIP = "ip" - flagChainID = "chain-id" + //--name parameter name, init gen-tx command + FlagName = "name" + //--home-client parameter name, init gen-tx command + FlagClientHome = "home-client" + //--owk parameter name, init gen-tx command + FlagOWK = "owk" + + // bonded tokens given to genesis validators/accounts + FreeFermionVal = int64(100) + // ... + FreeFermionsAcc = int64(50) +) + +// Storage for init command input parameters +type InitConfig struct { + ChainID string + GenTxs bool + GenTxsDir string + Overwrite bool +} + +var ( + //--overwrite parameter name, init command + FlagOverwrite = "overwrite" + //--gen-txs parameter name, init command + FlagGenTxs = "gen-txs" + //--ip parameter name, init command + FlagIP = "ip" + //--chain-id parameter name, init command + FlagChainID = "chain-id" ) // get cmd to initialize all files for tendermint and application @@ -54,50 +81,27 @@ func GenTxCmd(ctx *Context, cdc *wire.Codec, appInit AppInit) *cobra.Command { RunE: func(_ *cobra.Command, args []string) error { config := ctx.Config - nodeKey, err := p2p.LoadOrGenNodeKey(config.NodeKeyFile()) - if err != nil { - return err - } - nodeID := string(nodeKey.ID()) - pubKey := readOrCreatePrivValidator(config) + config.SetRoot(viper.GetString(tmcli.HomeFlag)) - appGenTx, cliPrint, validator, err := appInit.AppGenTx(cdc, pubKey) - if err != nil { - return err - } - - ip := viper.GetString(flagIP) + ip := viper.GetString(FlagIP) if len(ip) == 0 { - ip, err = externalIP() + eip, err := externalIP() if err != nil { return err } + ip = eip } - tx := GenesisTx{ - NodeID: nodeID, - IP: ip, - Validator: validator, - AppGenTx: appGenTx, + genTxConfig := gc.GenTxConfig{ + viper.GetString(FlagName), + viper.GetString(FlagClientHome), + viper.GetBool(FlagOWK), + ip, } - bz, err := wire.MarshalJSONIndent(cdc, tx) + cliPrint, genTxFile, err := gentxWithConfig(ctx, cdc, appInit, config, genTxConfig) if err != nil { return err } - genTxFile := json.RawMessage(bz) - name := fmt.Sprintf("gentx-%v.json", nodeID) - writePath := filepath.Join(viper.GetString(tmcli.HomeFlag), "config", "gentx") - file := filepath.Join(writePath, name) - err = cmn.EnsureDir(writePath, 0700) - if err != nil { - return err - } - err = cmn.WriteFile(file, bz, 0644) - if err != nil { - return err - } - - // print out some key information toPrint := struct { AppMessage json.RawMessage `json:"app_message"` GenTxFile json.RawMessage `json:"gen_tx_file"` @@ -113,11 +117,51 @@ func GenTxCmd(ctx *Context, cdc *wire.Codec, appInit AppInit) *cobra.Command { return nil }, } - cmd.Flags().String(flagIP, "", "external facing IP to use if left blank IP will be retrieved from this machine") + cmd.Flags().String(FlagIP, "", "external facing IP to use if left blank IP will be retrieved from this machine") cmd.Flags().AddFlagSet(appInit.FlagsAppGenTx) return cmd } +func gentxWithConfig(ctx *Context, cdc *wire.Codec, appInit AppInit, config *cfg.Config, genTxConfig gc.GenTxConfig) ( + cliPrint json.RawMessage, genTxFile json.RawMessage, err error) { + nodeKey, err := p2p.LoadOrGenNodeKey(config.NodeKeyFile()) + if err != nil { + return + } + nodeID := string(nodeKey.ID()) + pubKey := readOrCreatePrivValidator(config) + + appGenTx, cliPrint, validator, err := appInit.AppGenTx(cdc, pubKey, genTxConfig) + if err != nil { + return + } + + tx := GenesisTx{ + NodeID: nodeID, + IP: genTxConfig.IP, + Validator: validator, + AppGenTx: appGenTx, + } + bz, err := wire.MarshalJSONIndent(cdc, tx) + if err != nil { + return + } + genTxFile = json.RawMessage(bz) + name := fmt.Sprintf("gentx-%v.json", nodeID) + writePath := filepath.Join(config.RootDir, "config", "gentx") + file := filepath.Join(writePath, name) + err = cmn.EnsureDir(writePath, 0700) + if err != nil { + return + } + err = cmn.WriteFile(file, bz, 0644) + if err != nil { + return + } + + return +} + // get cmd to initialize all files for tendermint and application func InitCmd(ctx *Context, cdc *wire.Codec, appInit AppInit) *cobra.Command { cmd := &cobra.Command{ @@ -127,58 +171,18 @@ func InitCmd(ctx *Context, cdc *wire.Codec, appInit AppInit) *cobra.Command { RunE: func(_ *cobra.Command, _ []string) error { config := ctx.Config - nodeKey, err := p2p.LoadOrGenNodeKey(config.NodeKeyFile()) + config.SetRoot(viper.GetString(tmcli.HomeFlag)) + initConfig := InitConfig{ + viper.GetString(FlagChainID), + viper.GetBool(FlagGenTxs), + filepath.Join(config.RootDir, "config", "gentx"), + viper.GetBool(FlagOverwrite), + } + + chainID, nodeID, appMessage, err := initWithConfig(ctx, cdc, appInit, config, initConfig) if err != nil { return err } - nodeID := string(nodeKey.ID()) - pubKey := readOrCreatePrivValidator(config) - - chainID := viper.GetString(flagChainID) - if chainID == "" { - chainID = cmn.Fmt("test-chain-%v", cmn.RandStr(6)) - } - - genFile := config.GenesisFile() - if !viper.GetBool(flagOverwrite) && cmn.FileExists(genFile) { - return fmt.Errorf("genesis.json file already exists: %v", genFile) - } - - // process genesis transactions, or otherwise create one for defaults - var appMessage json.RawMessage - var appGenTxs []json.RawMessage - var validators []tmtypes.GenesisValidator - var persistentPeers string - - if viper.GetBool(flagGenTxs) { - genTxsDir := filepath.Join(viper.GetString(tmcli.HomeFlag), "config", "gentx") - validators, appGenTxs, persistentPeers, err = processGenTxs(genTxsDir, cdc, appInit) - if err != nil { - return err - } - config.P2P.PersistentPeers = persistentPeers - configFilePath := filepath.Join(viper.GetString(tmcli.HomeFlag), "config", "config.toml") - cfg.WriteConfigFile(configFilePath, config) - } else { - appGenTx, am, validator, err := appInit.AppGenTx(cdc, pubKey) - appMessage = am - if err != nil { - return err - } - validators = []tmtypes.GenesisValidator{validator} - appGenTxs = []json.RawMessage{appGenTx} - } - - appState, err := appInit.AppGenState(cdc, appGenTxs) - if err != nil { - return err - } - - err = writeGenesisFile(cdc, genFile, chainID, validators, appState) - if err != nil { - return err - } - // print out some key information toPrint := struct { ChainID string `json:"chain_id"` @@ -194,19 +198,80 @@ func InitCmd(ctx *Context, cdc *wire.Codec, appInit AppInit) *cobra.Command { return err } fmt.Println(string(out)) - return nil }, } - cmd.Flags().BoolP(flagOverwrite, "o", false, "overwrite the genesis.json file") - cmd.Flags().String(flagChainID, "", "genesis file chain-id, if left blank will be randomly created") - cmd.Flags().Bool(flagGenTxs, false, "apply genesis transactions from [--home]/config/gentx/") + cmd.Flags().BoolP(FlagOverwrite, "o", false, "overwrite the genesis.json file") + cmd.Flags().String(FlagChainID, "", "genesis file chain-id, if left blank will be randomly created") + cmd.Flags().Bool(FlagGenTxs, false, "apply genesis transactions from [--home]/config/gentx/") cmd.Flags().AddFlagSet(appInit.FlagsAppGenState) cmd.Flags().AddFlagSet(appInit.FlagsAppGenTx) // need to add this flagset for when no GenTx's provided cmd.AddCommand(GenTxCmd(ctx, cdc, appInit)) return cmd } +func initWithConfig(ctx *Context, cdc *wire.Codec, appInit AppInit, config *cfg.Config, initConfig InitConfig) ( + chainID string, nodeID string, appMessage json.RawMessage, err error) { + nodeKey, err := p2p.LoadOrGenNodeKey(config.NodeKeyFile()) + if err != nil { + return + } + nodeID = string(nodeKey.ID()) + pubKey := readOrCreatePrivValidator(config) + + if initConfig.ChainID == "" { + initConfig.ChainID = fmt.Sprintf("test-chain-%v", cmn.RandStr(6)) + } + chainID = initConfig.ChainID + + genFile := config.GenesisFile() + if !initConfig.Overwrite && cmn.FileExists(genFile) { + err = fmt.Errorf("genesis.json file already exists: %v", genFile) + return + } + + // process genesis transactions, or otherwise create one for defaults + var appGenTxs []json.RawMessage + var validators []tmtypes.GenesisValidator + var persistentPeers string + + if initConfig.GenTxs { + validators, appGenTxs, persistentPeers, err = processGenTxs(initConfig.GenTxsDir, cdc, appInit) + if err != nil { + return + } + config.P2P.PersistentPeers = persistentPeers + configFilePath := filepath.Join(config.RootDir, "config", "config.toml") + cfg.WriteConfigFile(configFilePath, config) + } else { + genTxConfig := gc.GenTxConfig{ + viper.GetString(FlagName), + viper.GetString(FlagClientHome), + viper.GetBool(FlagOWK), + "127.0.0.1", + } + appGenTx, am, validator, err := appInit.AppGenTx(cdc, pubKey, genTxConfig) + appMessage = am + if err != nil { + return "", "", nil, err + } + validators = []tmtypes.GenesisValidator{validator} + appGenTxs = []json.RawMessage{appGenTx} + } + + appState, err := appInit.AppGenState(cdc, appGenTxs) + if err != nil { + return + } + + err = writeGenesisFile(cdc, genFile, initConfig.ChainID, validators, appState) + if err != nil { + return + } + + return +} + // append a genesis-piece func processGenTxs(genTxsDir string, cdc *wire.Codec, appInit AppInit) ( validators []tmtypes.GenesisValidator, appGenTxs []json.RawMessage, persistentPeers string, err error) { @@ -315,7 +380,7 @@ type AppInit struct { FlagsAppGenTx *pflag.FlagSet // create the application genesis tx - AppGenTx func(cdc *wire.Codec, pk crypto.PubKey) ( + AppGenTx func(cdc *wire.Codec, pk crypto.PubKey, genTxConfig gc.GenTxConfig) ( appGenTx, cliPrint json.RawMessage, validator tmtypes.GenesisValidator, err error) // AppGenState creates the core parameters initialization. It takes in a @@ -337,7 +402,7 @@ type SimpleGenTx struct { } // Generate a genesis transaction -func SimpleAppGenTx(cdc *wire.Codec, pk crypto.PubKey) ( +func SimpleAppGenTx(cdc *wire.Codec, pk crypto.PubKey, genTxConfig gc.GenTxConfig) ( appGenTx, cliPrint json.RawMessage, validator tmtypes.GenesisValidator, err error) { var addr sdk.Address diff --git a/server/init_test.go b/server/init_test.go index 300decf334..f05bcb54a1 100644 --- a/server/init_test.go +++ b/server/init_test.go @@ -34,6 +34,10 @@ func TestGenTxCmd(t *testing.T) { // TODO } +func TestTestnetFilesCmd(t *testing.T) { + // TODO +} + func TestSimpleAppGenTx(t *testing.T) { // TODO } diff --git a/server/mock/app.go b/server/mock/app.go index ab1a8447a5..6c553e2be4 100644 --- a/server/mock/app.go +++ b/server/mock/app.go @@ -12,6 +12,7 @@ import ( "github.com/tendermint/tmlibs/log" bam "github.com/cosmos/cosmos-sdk/baseapp" + gc "github.com/cosmos/cosmos-sdk/server/config" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" ) @@ -124,7 +125,7 @@ func AppGenState(_ *wire.Codec, _ []json.RawMessage) (appState json.RawMessage, } // Return a validator, not much else -func AppGenTx(_ *wire.Codec, pk crypto.PubKey) ( +func AppGenTx(_ *wire.Codec, pk crypto.PubKey, genTxConfig gc.GenTxConfig) ( appGenTx, cliPrint json.RawMessage, validator tmtypes.GenesisValidator, err error) { validator = tmtypes.GenesisValidator{ diff --git a/server/testnet.go b/server/testnet.go new file mode 100644 index 0000000000..2ddf31d980 --- /dev/null +++ b/server/testnet.go @@ -0,0 +1,177 @@ +package server + +import ( + "fmt" + "net" + "path/filepath" + + "github.com/spf13/cobra" + + gc "github.com/cosmos/cosmos-sdk/server/config" + + "github.com/cosmos/cosmos-sdk/wire" + "github.com/spf13/viper" + cfg "github.com/tendermint/tendermint/config" + cmn "github.com/tendermint/tmlibs/common" + "os" +) + +var ( + nodeDirPrefix = "node-dir-prefix" + nValidators = "v" + outputDir = "o" + + startingIPAddress = "starting-ip-address" +) + +const nodeDirPerm = 0755 + +// get cmd to initialize all files for tendermint testnet and application +func TestnetFilesCmd(ctx *Context, cdc *wire.Codec, appInit AppInit) *cobra.Command { + cmd := &cobra.Command{ + Use: "testnet", + Short: "Initialize files for a Gaiad 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: + + gaiad testnet --v 4 --output-dir ./output --starting-ip-address 192.168.10.2 + `, + RunE: func(_ *cobra.Command, _ []string) error { + config := ctx.Config + err := testnetWithConfig(config, ctx, cdc, appInit) + return err + }, + } + cmd.Flags().Int(nValidators, 4, + "Number of validators to initialize the testnet with") + cmd.Flags().String(outputDir, "./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(startingIPAddress, "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, ctx *Context, cdc *wire.Codec, appInit AppInit) error { + + outDir := viper.GetString(outputDir) + // Generate private key, node ID, initial transaction + for i := 0; i < viper.GetInt(nValidators); i++ { + nodeDirName := fmt.Sprintf("%s%d", viper.GetString(nodeDirPrefix), i) + nodeDir := filepath.Join(outDir, nodeDirName, "gaiad") + clientDir := filepath.Join(outDir, nodeDirName, "gaiacli") + gentxsDir := filepath.Join(outDir, "gentxs") + config.SetRoot(nodeDir) + + err := os.MkdirAll(filepath.Join(nodeDir, "config"), nodeDirPerm) + if err != nil { + _ = os.RemoveAll(outDir) + return err + } + + err = os.MkdirAll(clientDir, nodeDirPerm) + if err != nil { + _ = os.RemoveAll(outDir) + return err + } + + config.Moniker = nodeDirName + + ip := viper.GetString(startingIPAddress) + if len(ip) == 0 { + ip, err = externalIP() + if err != nil { + return err + } + } else { + ip, err = calculateIP(ip, i) + if err != nil { + return err + } + } + + genTxConfig := gc.GenTxConfig{ + nodeDirName, + clientDir, + true, + ip, + } + + // Run `init gen-tx` and generate initial transactions + cliPrint, genTxFile, err := gentxWithConfig(ctx, cdc, appInit, config, genTxConfig) + if err != nil { + return err + } + + // Save private key seed words + name := fmt.Sprintf("%v.json", "key_seed") + writePath := filepath.Join(clientDir) + file := filepath.Join(writePath, name) + err = cmn.EnsureDir(writePath, 0700) + if err != nil { + return err + } + err = cmn.WriteFile(file, cliPrint, 0600) + if err != nil { + return err + } + + // Gather gentxs folder + name = fmt.Sprintf("%v.json", nodeDirName) + writePath = filepath.Join(gentxsDir) + file = filepath.Join(writePath, name) + err = cmn.EnsureDir(writePath, 0700) + if err != nil { + return err + } + err = cmn.WriteFile(file, genTxFile, 0644) + if err != nil { + return err + } + + } + + // Generate genesis.json and config.toml + chainID := "chain-" + cmn.RandStr(6) + for i := 0; i < viper.GetInt(nValidators); i++ { + + nodeDirName := fmt.Sprintf("%s%d", viper.GetString(nodeDirPrefix), i) + nodeDir := filepath.Join(outDir, nodeDirName, "gaiad") + gentxsDir := filepath.Join(outDir, "gentxs") + initConfig := InitConfig{ + chainID, + true, + gentxsDir, + true, + } + config.Moniker = nodeDirName + config.SetRoot(nodeDir) + + // Run `init` and generate genesis.json and config.toml + _, _, _, err := initWithConfig(ctx, cdc, appInit, config, initConfig) + if err != nil { + return err + } + } + + fmt.Printf("Successfully initialized %v node directories\n", viper.GetInt(nValidators)) + return nil +} + +func calculateIP(ip string, i int) (string, error) { + ipv4 := net.ParseIP(ip).To4() + if ipv4 == nil { + return "", fmt.Errorf("%v: non ipv4 address", ip) + } + + for j := 0; j < i; j++ { + ipv4[3]++ + } + return ipv4.String(), nil +} diff --git a/server/util.go b/server/util.go index 9e705f8792..4bf29cd7df 100644 --- a/server/util.go +++ b/server/util.go @@ -85,6 +85,7 @@ func AddCommands( rootCmd.AddCommand( InitCmd(ctx, cdc, appInit), + TestnetFilesCmd(ctx, cdc, appInit), StartCmd(ctx, appCreator), UnsafeResetAllCmd(ctx), client.LineBreak, From a03770d73d2a0035f49a7fc5d575be5d7edfdad9 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 12 Jun 2018 21:13:28 -0700 Subject: [PATCH 237/548] testnets: minor readme update --- cmd/gaia/testnets/README.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/cmd/gaia/testnets/README.md b/cmd/gaia/testnets/README.md index 8ea2d43fca..b34926aede 100644 --- a/cmd/gaia/testnets/README.md +++ b/cmd/gaia/testnets/README.md @@ -20,8 +20,10 @@ Install `go` by following the [official docs](https://golang.org/doc/install). Next, let's install the testnet's version of the Cosmos SDK. ``` -go get github.com/cosmos/cosmos-sdk -cd $GOPATH/src/github.com/cosmos/cosmos-sdk && git checkout v0.18.0 +mkdir -p $GOPATH/src/github.com/cosmos +cd $GOPATH/src/github.com/cosmos +git clone https://github.com/cosmos/cosmos-sdk +cd cosmos-sdk && git checkout v0.18.0 make get_tools && make get_vendor_deps && make install ``` @@ -62,7 +64,9 @@ rm $HOME/.gaiad/config/addrbook.json $HOME/.gaiad/config/genesis.json gaiad unsafe_reset_all ``` -Your node is now in a pristine state while keeping the original `priv_validator.json`. If you had any sentry nodes or full nodes setup before, they should continue to work. +Your node is now in a pristine state while keeping the original `priv_validator.json` and `config.toml`. If you had any sentry nodes or full nodes setup before, +your node will still try to connect to them, but may fail if they haven't also +been upgraded. **WARNING:** Make sure that every node has a unique `priv_validator.json`. Do not copy the `priv_validator.json` from an old node to multiple new nodes. Running two nodes with the same `priv_validator.json` will cause you to double sign. @@ -226,7 +230,7 @@ gaiacli advanced tendermint validator-set ## Delegating to a Validator -On the upcoming mainnet, you can delegate `atom` to a validator. These [delegators](https://cosmos.network/resources/delegators) can receive part of the validator's fee revenue in `photon`. Read more more about the [Cosmos Token Model](https://github.com/cosmos/cosmos/raw/master/Cosmos_Token_Model.pdf). +On the upcoming mainnet, you can delegate `atom` to a validator. These [delegators](https://cosmos.network/resources/delegators) can receive part of the validator's fee revenue. Read more about the [Cosmos Token Model](https://github.com/cosmos/cosmos/raw/master/Cosmos_Token_Model.pdf). ### Bond Tokens From 61dc65e3cf9822acd04298a0a6a89824295b5ac1 Mon Sep 17 00:00:00 2001 From: Greg Szabo Date: Tue, 12 Jun 2018 11:51:04 -0700 Subject: [PATCH 238/548] Changelog fix --- CHANGELOG.md | 97 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 61 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95449b5915..a12067bda5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,51 +1,30 @@ # Changelog -## Pending - BREAKING CHANGES -* [cli] rearranged commands under subcommands -* [stake] remove Tick and add EndBlocker +* msg.GetSignBytes() now returns bech32-encoded addresses in all cases +* [lcd] REST end-points now include gas FEATURES * [x/auth] Added AccountNumbers to BaseAccount and StdTxs to allow for replay protection with account pruning IMPROVEMENTS -* bank module uses go-wire codec instead of 'encoding/json' -* auth module uses go-wire codec instead of 'encoding/json' -* revised use of endblock and beginblock -* added testnet command -* added localnet commands to Makefile (docker-based local testnet) +* export command now writes current validator set for Tendermint +* [tests] Application module tests now use a mock application +* [gaiacli] Fix error message when account isn't found when running gaiacli account +* [lcd] refactored to eliminate use of global variables, and interdependent tests +* Added testnet command to gaiad +* Added localnet targets to Makefile FIXES -* [cli] fixed cli-bash tests -* [ci] added cli-bash tests -* [basecoin] updated basecoin for stake and slashing - -## 0.18.1 - -BREAKING CHANGES - -* [x/auth] move stuff specific to auth anteHandler to the auth module rather than the types folder. This includes: - * StdTx (and its related stuff i.e. StdSignDoc, etc) - * StdFee - * StdSignature - * Account interface - * Related to this organization, I also: -* [x/auth] got rid of AccountMapper interface (in favor of the struct already in auth module) -* [x/auth] removed the FeeHandler function from the AnteHandler, Replaced with FeeKeeper -* [x/auth] Removed GetSignatures() from Tx interface (as different Tx styles might use something different than StdSignature) -* [store] Removed SubspaceIterator and ReverseSubspaceIterator from KVStore interface and replaced them with helper functions in /types -* Switch to bech32cosmos on all human readable inputs and outputs - -BUG FIXES - -* auto-sequencing transactions correctly -* query sequence via account store -* fixed duplicate pub_key in stake.Validator +* [lcd] Switch to bech32 for addresses on all human readable inputs and outputs +* [lcd] fixed tx indexing/querying +* [cli] Added `--gas` flag to specify transaction gas limit +* [gaia] Registered slashing message handler +* [x/slashing] Set signInfo.StartHeight correctly for newly bonded validators ## 0.18.0 -_TBD_ +_2018-06-05_ BREAKING CHANGES @@ -64,6 +43,20 @@ BREAKING CHANGES * Introduction of Unbonding fields, lowlevel logic throughout (not fully implemented with queue) * Introduction of PoolShares type within validators, replaces three rational fields (BondedShares, UnbondingShares, UnbondedShares +* [x/auth] move stuff specific to auth anteHandler to the auth module rather than the types folder. This includes: + * StdTx (and its related stuff i.e. StdSignDoc, etc) + * StdFee + * StdSignature + * Account interface + * Related to this organization, I also: +* [x/auth] got rid of AccountMapper interface (in favor of the struct already in auth module) +* [x/auth] removed the FeeHandler function from the AnteHandler, Replaced with FeeKeeper +* [x/auth] Removed GetSignatures() from Tx interface (as different Tx styles might use something different than StdSignature) +* [store] Removed SubspaceIterator and ReverseSubspaceIterator from KVStore interface and replaced them with helper functions in /types +* [cli] rearranged commands under subcommands +* [stake] remove Tick and add EndBlocker +* Switch to bech32cosmos on all human readable inputs and outputs + FEATURES @@ -80,12 +73,41 @@ FEATURES * [stake] Added REST API * [Makefile] Added terraform/ansible playbooks to easily create remote testnets on Digital Ocean + BUG FIXES -* Auto-sequencing now works correctly * [stake] staking delegator shares exchange rate now relative to equivalent-bonded-tokens the validator has instead of bonded tokens ^ this is important for unbonded validators in the power store! +* [cli] fixed cli-bash tests +* [ci] added cli-bash tests +* [basecoin] updated basecoin for stake and slashing +* [docs] fixed references to old cli commands * [docs] Downgraded Swagger to v2 for downstream compatibility +* auto-sequencing transactions correctly +* query sequence via account store +* fixed duplicate pub_key in stake.Validator +* Auto-sequencing now works correctly + + + +## 0.17.5 + +*June 5, 2018* + +Update to Tendermint v0.19.9 (Fix evidence reactor, mempool deadlock, WAL panic, +memory leak) + +## 0.17.4 + +*May 31, 2018* + +Update to Tendermint v0.19.7 (WAL fixes and more) + +## 0.17.3 + +*May 29, 2018* + +Update to Tendermint v0.19.6 (fix fast-sync halt) ## 0.17.2 @@ -125,6 +147,7 @@ BUG FIXES * Auto-sequencing now works correctly + ## 0.16.0 (May 14th, 2018) BREAKING CHANGES @@ -159,12 +182,14 @@ BUG FIXES * Gaia now uses stake, ported from github.com/cosmos/gaia + ## 0.15.1 (April 29, 2018) IMPROVEMENTS: * Update Tendermint to v0.19.1 (includes many rpc fixes) + ## 0.15.0 (April 29, 2018) NOTE: v0.15.0 is a large breaking change that updates the encoding scheme to use From 1c8dbd1087fbc6e93332ec8dd25f4277d57a0b92 Mon Sep 17 00:00:00 2001 From: Dev Ojha Date: Tue, 12 Jun 2018 21:42:52 -0700 Subject: [PATCH 239/548] Merge PR #1228: Update to Tendermint develop --- Gopkg.lock | 9 ++++----- Gopkg.toml | 4 ++-- server/tm_cmds.go | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 07a3c6d5b9..515c4dc4f2 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -267,8 +267,8 @@ "server", "types" ] - revision = "ebee2fe114020aa49c70bbbae50b7079fc7e7b90" - version = "v0.11.0" + revision = "198dccf0ddfd1bb176f87657e3286a05a6ed9540" + version = "v0.12.0" [[projects]] branch = "master" @@ -347,8 +347,7 @@ "types", "version" ] - revision = "27bd1deabe4ba6a2d9b463b8f3e3f1e31b993e61" - version = "v0.20.0" + revision = "fa32dc51819c5eb85a51a239b785c930ac8ad5f0" [[projects]] branch = "develop" @@ -463,6 +462,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "31f69b235b2d8f879a215c9e8ca0919adc62d21f6830b17931a3a0efb058721f" + inputs-digest = "4f488b27a585db0df82292eb72740bee8b6c1e50e7d593bf1e45785195d09938" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 77de1b78de..5428e74214 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -54,7 +54,7 @@ [[constraint]] name = "github.com/tendermint/abci" - version = "=0.11.0" + version = "=0.12.0" [[constraint]] name = "github.com/tendermint/go-crypto" @@ -70,7 +70,7 @@ [[constraint]] name = "github.com/tendermint/tendermint" - version = "=0.20.0" + revision = "fa32dc51819c5eb85a51a239b785c930ac8ad5f0" [[override]] name = "github.com/tendermint/tmlibs" diff --git a/server/tm_cmds.go b/server/tm_cmds.go index 7dccaf5319..25d417a666 100644 --- a/server/tm_cmds.go +++ b/server/tm_cmds.go @@ -72,7 +72,7 @@ func UnsafeResetAllCmd(ctx *Context) *cobra.Command { Short: "Reset blockchain database, priv_validator.json file, and the logger", RunE: func(cmd *cobra.Command, args []string) error { cfg := ctx.Config - tcmd.ResetAll(cfg.DBDir(), cfg.PrivValidatorFile(), ctx.Logger) + tcmd.ResetAll(cfg.DBDir(), cfg.P2P.AddrBookFile(), cfg.PrivValidatorFile(), ctx.Logger) return nil }, } From 8753d6d59a569e1d8949a5e068d4b6dfc555b429 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 13 Jun 2018 07:25:14 +0200 Subject: [PATCH 240/548] Revert "Merge PR #1228: Update to Tendermint develop" (#1231) This reverts commit 1c8dbd1087fbc6e93332ec8dd25f4277d57a0b92. --- Gopkg.lock | 9 +++++---- Gopkg.toml | 4 ++-- server/tm_cmds.go | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 515c4dc4f2..07a3c6d5b9 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -267,8 +267,8 @@ "server", "types" ] - revision = "198dccf0ddfd1bb176f87657e3286a05a6ed9540" - version = "v0.12.0" + revision = "ebee2fe114020aa49c70bbbae50b7079fc7e7b90" + version = "v0.11.0" [[projects]] branch = "master" @@ -347,7 +347,8 @@ "types", "version" ] - revision = "fa32dc51819c5eb85a51a239b785c930ac8ad5f0" + revision = "27bd1deabe4ba6a2d9b463b8f3e3f1e31b993e61" + version = "v0.20.0" [[projects]] branch = "develop" @@ -462,6 +463,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "4f488b27a585db0df82292eb72740bee8b6c1e50e7d593bf1e45785195d09938" + inputs-digest = "31f69b235b2d8f879a215c9e8ca0919adc62d21f6830b17931a3a0efb058721f" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 5428e74214..77de1b78de 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -54,7 +54,7 @@ [[constraint]] name = "github.com/tendermint/abci" - version = "=0.12.0" + version = "=0.11.0" [[constraint]] name = "github.com/tendermint/go-crypto" @@ -70,7 +70,7 @@ [[constraint]] name = "github.com/tendermint/tendermint" - revision = "fa32dc51819c5eb85a51a239b785c930ac8ad5f0" + version = "=0.20.0" [[override]] name = "github.com/tendermint/tmlibs" diff --git a/server/tm_cmds.go b/server/tm_cmds.go index 25d417a666..7dccaf5319 100644 --- a/server/tm_cmds.go +++ b/server/tm_cmds.go @@ -72,7 +72,7 @@ func UnsafeResetAllCmd(ctx *Context) *cobra.Command { Short: "Reset blockchain database, priv_validator.json file, and the logger", RunE: func(cmd *cobra.Command, args []string) error { cfg := ctx.Config - tcmd.ResetAll(cfg.DBDir(), cfg.P2P.AddrBookFile(), cfg.PrivValidatorFile(), ctx.Logger) + tcmd.ResetAll(cfg.DBDir(), cfg.PrivValidatorFile(), ctx.Logger) return nil }, } From ef2e7a5129d0848e99daa14357b6be8f3f9907c3 Mon Sep 17 00:00:00 2001 From: suyuhuang Date: Wed, 13 Jun 2018 13:27:24 +0800 Subject: [PATCH 241/548] Merge PR #1229: Fix 'gaiad init gen-tx' not showing seed --- cmd/gaia/app/genesis.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/gaia/app/genesis.go b/cmd/gaia/app/genesis.go index 813796c0d8..558bca38ab 100644 --- a/cmd/gaia/app/genesis.go +++ b/cmd/gaia/app/genesis.go @@ -108,7 +108,8 @@ func GaiaAppGenTx(cdc *wire.Codec, pk crypto.PubKey) ( return } cliPrint = json.RawMessage(bz) - return GaiaAppGenTxNF(cdc, pk, addr, name, overwrite) + appGenTx,_,validator,err = GaiaAppGenTxNF(cdc, pk, addr, name, overwrite) + return } // Generate a gaia genesis transaction without flags From 522042fd1200fbdbf49c76e55b4bceeebb80a0f9 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 12 Jun 2018 22:17:11 -0700 Subject: [PATCH 242/548] gaiadebug tool --- Makefile | 5 +- cmd/gaia/cmd/gaiadebug/main.go | 122 +++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 cmd/gaia/cmd/gaiadebug/main.go diff --git a/Makefile b/Makefile index d6444b0b62..c0d18c4a39 100644 --- a/Makefile +++ b/Makefile @@ -46,6 +46,9 @@ install_examples: go install $(BUILD_FLAGS) ./examples/democoin/cmd/democoind go install $(BUILD_FLAGS) ./examples/democoin/cmd/democli +install_debug: + go install $(BUILD_FLAGS) ./cmd/gaia/cmd/gaiadebug + dist: @bash publish/dist.sh @bash publish/publish.sh @@ -157,4 +160,4 @@ remotenet-status: # To avoid unintended conflicts with file names, always add to .PHONY # unless there is a reason not to. # https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html -.PHONY: build build_examples install install_examples dist check_tools get_tools get_vendor_deps draw_deps test test_cli test_unit test_cover test_lint benchmark devdoc_init devdoc devdoc_save devdoc_update remotenet-start remotenet-stop remotenet-status +.PHONY: build build_examples install install_examples install_debug dist check_tools get_tools get_vendor_deps draw_deps test test_cli test_unit test_cover test_lint benchmark devdoc_init devdoc devdoc_save devdoc_update remotenet-start remotenet-stop remotenet-status diff --git a/cmd/gaia/cmd/gaiadebug/main.go b/cmd/gaia/cmd/gaiadebug/main.go new file mode 100644 index 0000000000..ed5344bdd0 --- /dev/null +++ b/cmd/gaia/cmd/gaiadebug/main.go @@ -0,0 +1,122 @@ +package main + +import ( + "bytes" + "encoding/base64" + "encoding/hex" + "encoding/json" + "fmt" + "os" + + gaia "github.com/cosmos/cosmos-sdk/cmd/gaia/app" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/spf13/cobra" + crypto "github.com/tendermint/go-crypto" +) + +func init() { + rootCmd.AddCommand(txCmd) + rootCmd.AddCommand(pubkeyCmd) +} + +var rootCmd = &cobra.Command{ + Use: "gaiadebug", + Short: "Gaia debug tool", + SilenceUsage: true, +} + +var txCmd = &cobra.Command{ + Use: "tx", + Short: "Decode a gaia tx from hex or base64", + RunE: runTxCmd, +} + +var pubkeyCmd = &cobra.Command{ + Use: "pubkey", + Short: "Decode a pubkey from hex or base64", + RunE: runPubKeyCmd, +} + +func runPubKeyCmd(cmd *cobra.Command, args []string) error { + if len(args) != 1 { + return fmt.Errorf("Expected single arg") + } + + pubkeyString := args[0] + + // try hex, then base64 + pubkeyBytes, err := hex.DecodeString(pubkeyString) + if err != nil { + var err2 error + pubkeyBytes, err2 = base64.StdEncoding.DecodeString(pubkeyString) + if err2 != nil { + return fmt.Errorf(`Expected hex or base64. Got errors: + hex: %v, + base64: %v + `, err, err2) + } + } + + cdc := gaia.MakeCodec() + var pubKey crypto.PubKeyEd25519 + copy(pubKey[:], pubkeyBytes) + pubKeyJSONBytes, err := cdc.MarshalJSON(pubKey) + if err != nil { + return err + } + fmt.Println("Address:", pubKey.Address()) + fmt.Printf("Hex: %X\n", pubkeyBytes) + fmt.Println("JSON (base64):", string(pubKeyJSONBytes)) + return nil +} + +func runTxCmd(cmd *cobra.Command, args []string) error { + if len(args) != 1 { + return fmt.Errorf("Expected single arg") + } + + txString := args[0] + + // try hex, then base64 + txBytes, err := hex.DecodeString(txString) + if err != nil { + var err2 error + txBytes, err2 = base64.StdEncoding.DecodeString(txString) + if err2 != nil { + return fmt.Errorf(`Expected hex or base64. Got errors: + hex: %v, + base64: %v + `, err, err2) + } + } + + var tx = auth.StdTx{} + cdc := gaia.MakeCodec() + + err = cdc.UnmarshalBinary(txBytes, &tx) + if err != nil { + return err + } + + bz, err := cdc.MarshalJSON(tx) + if err != nil { + return err + } + + buf := bytes.NewBuffer([]byte{}) + err = json.Indent(buf, bz, "", " ") + if err != nil { + return err + } + + fmt.Println(buf.String()) + return nil +} + +func main() { + err := rootCmd.Execute() + if err != nil { + os.Exit(1) + } + os.Exit(0) +} From cb93cbee3d138bb7199f84d226fd850967a19126 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 12 Jun 2018 22:27:13 -0700 Subject: [PATCH 243/548] gaiadebug: add hack command --- cmd/gaia/cmd/gaiadebug/hack.go | 243 +++++++++++++++++++++++++++++++++ cmd/gaia/cmd/gaiadebug/main.go | 7 + 2 files changed, 250 insertions(+) create mode 100644 cmd/gaia/cmd/gaiadebug/hack.go diff --git a/cmd/gaia/cmd/gaiadebug/hack.go b/cmd/gaia/cmd/gaiadebug/hack.go new file mode 100644 index 0000000000..2c84184bf7 --- /dev/null +++ b/cmd/gaia/cmd/gaiadebug/hack.go @@ -0,0 +1,243 @@ +package main + +import ( + "encoding/base64" + "encoding/hex" + "fmt" + "os" + "path" + + "github.com/spf13/cobra" + abci "github.com/tendermint/abci/types" + crypto "github.com/tendermint/go-crypto" + cmn "github.com/tendermint/tmlibs/common" + dbm "github.com/tendermint/tmlibs/db" + "github.com/tendermint/tmlibs/log" + + bam "github.com/cosmos/cosmos-sdk/baseapp" + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/cosmos/cosmos-sdk/x/ibc" + "github.com/cosmos/cosmos-sdk/x/slashing" + "github.com/cosmos/cosmos-sdk/x/stake" + + gaia "github.com/cosmos/cosmos-sdk/cmd/gaia/app" +) + +func runHackCmd(cmd *cobra.Command, args []string) error { + + if len(args) != 1 { + return fmt.Errorf("Expected 1 arg") + } + + // ".gaiad" + dataDir := args[0] + dataDir = path.Join(dataDir, "data") + + // load the app + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) + db, err := dbm.NewGoLevelDB("gaia", dataDir) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + app := NewGaiaApp(logger, db) + + // print some info + id := app.LastCommitID() + lastBlockHeight := app.LastBlockHeight() + fmt.Println("ID", id) + fmt.Println("LastBlockHeight", lastBlockHeight) + + //---------------------------------------------------- + // XXX: start hacking! + //---------------------------------------------------- + // eg. gaia-6001 testnet bug + // We paniced when iterating through the "bypower" keys. + // The following powerKey was there, but the corresponding "trouble" validator did not exist. + // So here we do a binary search on the past states to find when the powerKey first showed up ... + + // owner of the validator the bonds, gets revoked, later unbonds, and then later is still found in the bypower store + trouble := hexToBytes("D3DC0FF59F7C3B548B7AFA365561B87FD0208AF8") + // this is his "bypower" key + powerKey := hexToBytes("05303030303030303030303033FFFFFFFFFFFF4C0C0000FFFED3DC0FF59F7C3B548B7AFA365561B87FD0208AF8") + + topHeight := lastBlockHeight + bottomHeight := int64(0) + checkHeight := topHeight + for { + // load the given version of the state + err = app.LoadVersion(checkHeight, app.keyMain) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + ctx := app.NewContext(true, abci.Header{}) + + // check for the powerkey and the validator from the store + store := ctx.KVStore(app.keyStake) + res := store.Get(powerKey) + val, _ := app.stakeKeeper.GetValidator(ctx, trouble) + fmt.Println("checking height", checkHeight, res, val) + if res == nil { + bottomHeight = checkHeight + } else { + topHeight = checkHeight + } + checkHeight = (topHeight + bottomHeight) / 2 + } +} + +func base64ToPub(b64 string) crypto.PubKeyEd25519 { + data, _ := base64.StdEncoding.DecodeString(b64) + var pubKey crypto.PubKeyEd25519 + copy(pubKey[:], data) + return pubKey + +} + +func hexToBytes(h string) []byte { + trouble, _ := hex.DecodeString(h) + return trouble + +} + +//-------------------------------------------------------------------------------- +// NOTE: This is all copied from gaia/app/app.go +// so we can access internal fields! + +const ( + appName = "GaiaApp" +) + +// default home directories for expected binaries +var ( + DefaultCLIHome = os.ExpandEnv("$HOME/.gaiacli") + DefaultNodeHome = os.ExpandEnv("$HOME/.gaiad") +) + +// Extended ABCI application +type GaiaApp struct { + *bam.BaseApp + cdc *wire.Codec + + // keys to access the substores + keyMain *sdk.KVStoreKey + keyAccount *sdk.KVStoreKey + keyIBC *sdk.KVStoreKey + keyStake *sdk.KVStoreKey + keySlashing *sdk.KVStoreKey + + // Manage getting and setting accounts + accountMapper auth.AccountMapper + feeCollectionKeeper auth.FeeCollectionKeeper + coinKeeper bank.Keeper + ibcMapper ibc.Mapper + stakeKeeper stake.Keeper + slashingKeeper slashing.Keeper +} + +func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { + cdc := MakeCodec() + + // create your application object + var app = &GaiaApp{ + BaseApp: bam.NewBaseApp(appName, cdc, logger, db), + cdc: cdc, + keyMain: sdk.NewKVStoreKey("main"), + keyAccount: sdk.NewKVStoreKey("acc"), + keyIBC: sdk.NewKVStoreKey("ibc"), + keyStake: sdk.NewKVStoreKey("stake"), + keySlashing: sdk.NewKVStoreKey("slashing"), + } + + // define the accountMapper + app.accountMapper = auth.NewAccountMapper( + app.cdc, + app.keyAccount, // target store + &auth.BaseAccount{}, // prototype + ) + + // add handlers + app.coinKeeper = bank.NewKeeper(app.accountMapper) + app.ibcMapper = ibc.NewMapper(app.cdc, app.keyIBC, app.RegisterCodespace(ibc.DefaultCodespace)) + app.stakeKeeper = stake.NewKeeper(app.cdc, app.keyStake, app.coinKeeper, app.RegisterCodespace(stake.DefaultCodespace)) + app.slashingKeeper = slashing.NewKeeper(app.cdc, app.keySlashing, app.stakeKeeper, app.RegisterCodespace(slashing.DefaultCodespace)) + + // register message routes + app.Router(). + AddRoute("bank", bank.NewHandler(app.coinKeeper)). + AddRoute("ibc", ibc.NewHandler(app.ibcMapper, app.coinKeeper)). + AddRoute("stake", stake.NewHandler(app.stakeKeeper)) + + // initialize BaseApp + app.SetInitChainer(app.initChainer) + app.SetBeginBlocker(app.BeginBlocker) + app.SetEndBlocker(app.EndBlocker) + app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, app.feeCollectionKeeper)) + app.MountStoresIAVL(app.keyMain, app.keyAccount, app.keyIBC, app.keyStake, app.keySlashing) + err := app.LoadLatestVersion(app.keyMain) + if err != nil { + cmn.Exit(err.Error()) + } + + return app +} + +// custom tx codec +func MakeCodec() *wire.Codec { + var cdc = wire.NewCodec() + ibc.RegisterWire(cdc) + bank.RegisterWire(cdc) + stake.RegisterWire(cdc) + slashing.RegisterWire(cdc) + auth.RegisterWire(cdc) + sdk.RegisterWire(cdc) + wire.RegisterCrypto(cdc) + return cdc +} + +// application updates every end block +func (app *GaiaApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { + tags := slashing.BeginBlocker(ctx, req, app.slashingKeeper) + + return abci.ResponseBeginBlock{ + Tags: tags.ToKVPairs(), + } +} + +// application updates every end block +func (app *GaiaApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { + validatorUpdates := stake.EndBlocker(ctx, app.stakeKeeper) + + return abci.ResponseEndBlock{ + ValidatorUpdates: validatorUpdates, + } +} + +// custom logic for gaia initialization +func (app *GaiaApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { + stateJSON := req.AppStateBytes + // TODO is this now the whole genesis file? + + var genesisState gaia.GenesisState + err := app.cdc.UnmarshalJSON(stateJSON, &genesisState) + if err != nil { + panic(err) // TODO https://github.com/cosmos/cosmos-sdk/issues/468 + // return sdk.ErrGenesisParse("").TraceCause(err, "") + } + + // load the accounts + for _, gacc := range genesisState.Accounts { + acc := gacc.ToAccount() + app.accountMapper.SetAccount(ctx, acc) + } + + // load the initial stake information + stake.InitGenesis(ctx, app.stakeKeeper, genesisState.StakeData) + return abci.ResponseInitChain{} + +} diff --git a/cmd/gaia/cmd/gaiadebug/main.go b/cmd/gaia/cmd/gaiadebug/main.go index ed5344bdd0..914746dbd8 100644 --- a/cmd/gaia/cmd/gaiadebug/main.go +++ b/cmd/gaia/cmd/gaiadebug/main.go @@ -17,6 +17,7 @@ import ( func init() { rootCmd.AddCommand(txCmd) rootCmd.AddCommand(pubkeyCmd) + rootCmd.AddCommand(hackCmd) } var rootCmd = &cobra.Command{ @@ -37,6 +38,12 @@ var pubkeyCmd = &cobra.Command{ RunE: runPubKeyCmd, } +var hackCmd = &cobra.Command{ + Use: "hack", + Short: "Boilerplate to Hack on an existing state by scripting some Go...", + RunE: runHackCmd, +} + func runPubKeyCmd(cmd *cobra.Command, args []string) error { if len(args) != 1 { return fmt.Errorf("Expected single arg") From 2219548d0e538cd5652e83253bf6102f1b5f96a5 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 12 Jun 2018 22:45:51 -0700 Subject: [PATCH 244/548] fix from merge --- client/lcd/lcd_test.go | 186 +---------------------------------------- 1 file changed, 3 insertions(+), 183 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index f0d5d80e81..ba2937e050 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -1,44 +1,26 @@ package lcd import ( - "bytes" "encoding/hex" "encoding/json" "fmt" - "io/ioutil" - "net" "net/http" - "os" "regexp" "testing" - "github.com/spf13/viper" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" abci "github.com/tendermint/abci/types" - crypto "github.com/tendermint/go-crypto" cryptoKeys "github.com/tendermint/go-crypto/keys" - tmcfg "github.com/tendermint/tendermint/config" - nm "github.com/tendermint/tendermint/node" p2p "github.com/tendermint/tendermint/p2p" - pvm "github.com/tendermint/tendermint/privval" - "github.com/tendermint/tendermint/proxy" ctypes "github.com/tendermint/tendermint/rpc/core/types" - tmrpc "github.com/tendermint/tendermint/rpc/lib/server" - tmtypes "github.com/tendermint/tendermint/types" - "github.com/tendermint/tmlibs/cli" - dbm "github.com/tendermint/tmlibs/db" - "github.com/tendermint/tmlibs/log" client "github.com/cosmos/cosmos-sdk/client" keys "github.com/cosmos/cosmos-sdk/client/keys" rpc "github.com/cosmos/cosmos-sdk/client/rpc" - gapp "github.com/cosmos/cosmos-sdk/cmd/gaia/app" - "github.com/cosmos/cosmos-sdk/server" tests "github.com/cosmos/cosmos-sdk/tests" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/stake" stakerest "github.com/cosmos/cosmos-sdk/x/stake/client/rest" @@ -414,172 +396,10 @@ func TestBonding(t *testing.T) { // TODO fix shares fn in staking // query sender - acc := getAccount(t, sendAddr) - coins := acc.GetCoins() - assert.Equal(t, int64(98), coins.AmountOf(coinDenom)) + //acc := getAccount(t, sendAddr) + //coins := acc.GetCoins() + //assert.Equal(t, int64(98), coins.AmountOf(coinDenom)) - // query candidate - bond := getDelegation(t, sendAddr, validatorAddr1) - assert.Equal(t, "9/1", bond.Shares.String()) -} - -//__________________________________________________________ -// helpers - -// strt TM and the LCD in process, listening on their respective sockets -func startTMAndLCD() (*nm.Node, net.Listener, error) { - - dir, err := ioutil.TempDir("", "lcd_test") - if err != nil { - return nil, nil, err - } - viper.Set(cli.HomeFlag, dir) - viper.Set(client.FlagGas, 200000) - kb, err := keys.GetKeyBase() // dbm.NewMemDB()) // :( - if err != nil { - return nil, nil, err - } - - config := GetConfig() - config.Consensus.TimeoutCommit = 1000 - config.Consensus.SkipTimeoutCommit = false - - logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) - logger = log.NewFilter(logger, log.AllowError()) - privValidatorFile := config.PrivValidatorFile() - privVal := pvm.LoadOrGenFilePV(privValidatorFile) - db := dbm.NewMemDB() - app := gapp.NewGaiaApp(logger, db) - cdc = gapp.MakeCodec() // XXX - - genesisFile := config.GenesisFile() - genDoc, err := tmtypes.GenesisDocFromFile(genesisFile) - if err != nil { - return nil, nil, err - } - - genDoc.Validators = append(genDoc.Validators, - tmtypes.GenesisValidator{ - PubKey: crypto.GenPrivKeyEd25519().PubKey(), - Power: 1, - Name: "val", - }, - ) - - pk1 := genDoc.Validators[0].PubKey - pk2 := genDoc.Validators[1].PubKey - validatorAddr1 = hex.EncodeToString(pk1.Address()) - validatorAddr2 = hex.EncodeToString(pk2.Address()) - - // NOTE it's bad practice to reuse pk address for the owner address but doing in the - // test for simplicity - var appGenTxs [2]json.RawMessage - appGenTxs[0], _, _, err = gapp.GaiaAppGenTxNF(cdc, pk1, pk1.Address(), "test_val1", true) - if err != nil { - return nil, nil, err - } - appGenTxs[1], _, _, err = gapp.GaiaAppGenTxNF(cdc, pk2, pk2.Address(), "test_val2", true) - if err != nil { - return nil, nil, err - } - - genesisState, err := gapp.GaiaAppGenState(cdc, appGenTxs[:]) - if err != nil { - return nil, nil, err - } - - // add the sendAddr to genesis - var info cryptoKeys.Info - info, seed, err = kb.Create(name, password, cryptoKeys.AlgoEd25519) // XXX global seed - if err != nil { - return nil, nil, err - } - sendAddr = info.PubKey.Address().String() // XXX global - accAuth := auth.NewBaseAccountWithAddress(info.PubKey.Address()) - accAuth.Coins = sdk.Coins{{"steak", 100}} - acc := gapp.NewGenesisAccount(&accAuth) - genesisState.Accounts = append(genesisState.Accounts, acc) - - appState, err := wire.MarshalJSONIndent(cdc, genesisState) - if err != nil { - return nil, nil, err - } - genDoc.AppStateJSON = appState - - // LCD listen address - var listenAddr string - listenAddr, port, err = server.FreeTCPAddr() - if err != nil { - return nil, nil, err - } - - // XXX: need to set this so LCD knows the tendermint node address! - viper.Set(client.FlagNode, config.RPC.ListenAddress) - viper.Set(client.FlagChainID, genDoc.ChainID) - - node, err := startTM(config, logger, genDoc, privVal, app) - if err != nil { - return nil, nil, err - } - lcd, err := startLCD(logger, listenAddr, cdc) - if err != nil { - return nil, nil, err - } - - tests.WaitForStart(port) - - return node, lcd, nil -} - -// Create & start in-process tendermint node with memdb -// and in-process abci application. -// TODO: need to clean up the WAL dir or enable it to be not persistent -func startTM(cfg *tmcfg.Config, logger log.Logger, genDoc *tmtypes.GenesisDoc, privVal tmtypes.PrivValidator, app abci.Application) (*nm.Node, error) { - genDocProvider := func() (*tmtypes.GenesisDoc, error) { return genDoc, nil } - dbProvider := func(*nm.DBContext) (dbm.DB, error) { return dbm.NewMemDB(), nil } - n, err := nm.NewNode(cfg, - privVal, - proxy.NewLocalClientCreator(app), - genDocProvider, - dbProvider, - logger.With("module", "node")) - if err != nil { - return nil, err - } - - err = n.Start() - if err != nil { - return nil, err - } - - // wait for rpc - tests.WaitForRPC(GetConfig().RPC.ListenAddress) - - logger.Info("Tendermint running!") - return n, err -} - -// start the LCD. note this blocks! -func startLCD(logger log.Logger, listenAddr string, cdc *wire.Codec) (net.Listener, error) { - handler := createHandler(cdc) - return tmrpc.StartHTTPServer(listenAddr, handler, logger) -} - -func request(t *testing.T, port, method, path string, payload []byte) (*http.Response, string) { - var res *http.Response - var err error - url := fmt.Sprintf("http://localhost:%v%v", port, path) - req, err := http.NewRequest(method, url, bytes.NewBuffer(payload)) - require.Nil(t, err) - res, err = http.DefaultClient.Do(req) - // res, err = http.Post(url, "application/json", bytes.NewBuffer(payload)) - require.Nil(t, err) - - output, err := ioutil.ReadAll(res.Body) - res.Body.Close() - require.Nil(t, err) - - return res, string(output) } //_____________________________________________________________________________ From 47cc91e8e5f3ad5b4eb1983fae7bf3acd09a131d Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 12 Jun 2018 22:59:33 -0700 Subject: [PATCH 245/548] gaiadebug: raw-bytes command --- cmd/gaia/cmd/gaiadebug/main.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/cmd/gaia/cmd/gaiadebug/main.go b/cmd/gaia/cmd/gaiadebug/main.go index 914746dbd8..79045c07bb 100644 --- a/cmd/gaia/cmd/gaiadebug/main.go +++ b/cmd/gaia/cmd/gaiadebug/main.go @@ -7,6 +7,8 @@ import ( "encoding/json" "fmt" "os" + "strconv" + "strings" gaia "github.com/cosmos/cosmos-sdk/cmd/gaia/app" "github.com/cosmos/cosmos-sdk/x/auth" @@ -18,6 +20,7 @@ func init() { rootCmd.AddCommand(txCmd) rootCmd.AddCommand(pubkeyCmd) rootCmd.AddCommand(hackCmd) + rootCmd.AddCommand(rawBytesCmd) } var rootCmd = &cobra.Command{ @@ -44,6 +47,33 @@ var hackCmd = &cobra.Command{ RunE: runHackCmd, } +var rawBytesCmd = &cobra.Command{ + Use: "raw-bytes", + Short: "Convert raw bytes output (eg. [10 21 13 255]) to hex", + RunE: runRawBytesCmd, +} + +func runRawBytesCmd(cmd *cobra.Command, args []string) error { + if len(args) != 1 { + return fmt.Errorf("Expected single arg") + } + stringBytes := args[0] + stringBytes = strings.Trim(stringBytes, "[") + stringBytes = strings.Trim(stringBytes, "]") + spl := strings.Split(stringBytes, " ") + + byteArray := []byte{} + for _, s := range spl { + b, err := strconv.Atoi(s) + if err != nil { + return err + } + byteArray = append(byteArray, byte(b)) + } + fmt.Printf("%X\n", byteArray) + return nil +} + func runPubKeyCmd(cmd *cobra.Command, args []string) error { if len(args) != 1 { return fmt.Errorf("Expected single arg") From 1cd3a6255a863b4c83c72f14f30293592360c461 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 12 Jun 2018 23:12:55 -0700 Subject: [PATCH 246/548] fix from merge --- client/flags.go | 1 - 1 file changed, 1 deletion(-) diff --git a/client/flags.go b/client/flags.go index 96ea5efd5a..4991b9a776 100644 --- a/client/flags.go +++ b/client/flags.go @@ -27,7 +27,6 @@ func GetCommands(cmds ...*cobra.Command) []*cobra.Command { c.Flags().String(FlagChainID, "", "Chain ID of tendermint node") c.Flags().String(FlagNode, "tcp://localhost:46657", ": to tendermint rpc interface for this chain") c.Flags().Int64(FlagHeight, 0, "block height to query, omit to get most recent provable block") - c.Flags().Int64(FlagGas, 200000, "gas limit to set per-transaction") } return cmds } From 35a3c1491875a6f4731c93d6e4cd6a7f627a356f Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 12 Jun 2018 23:18:37 -0700 Subject: [PATCH 247/548] update status.md --- cmd/gaia/testnets/STATUS.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmd/gaia/testnets/STATUS.md b/cmd/gaia/testnets/STATUS.md index d53c49e092..6f2140c264 100644 --- a/cmd/gaia/testnets/STATUS.md +++ b/cmd/gaia/testnets/STATUS.md @@ -1,5 +1,11 @@ # TESTNET STATUS +## *June 13, 2018, 2:30 EST* - Published Postmortem of Gaia-6001 failure + +- A bug in the design of the staking data model caused a sanity check to fail +- Full writeup + [here](https://github.com/cosmos/cosmos-sdk/issues/1197#issuecomment-396823021) + ## *June 10, 2018, 8:30 EST* - Gaia-6001 consensus failure - Validator unbonding and revocation activity caused a consensus failure From 83c1183e25a8bccc980a158be750c8e060f99f00 Mon Sep 17 00:00:00 2001 From: Rigel Date: Wed, 13 Jun 2018 00:12:57 -0700 Subject: [PATCH 248/548] Merge PR #1233: Inflation now unbonded working debug fix add broken test fix testnet bug updated provision test changelog cwgoes comments --- CHANGELOG.md | 2 ++ x/stake/handler_test.go | 73 +++++++++++++++++++++++++++++++++++++++ x/stake/inflation.go | 4 ++- x/stake/inflation_test.go | 59 ++++++------------------------- x/stake/keeper.go | 6 ++++ x/stake/keeper_test.go | 41 ++++++++++++++++++++++ x/stake/shares.go | 5 +-- 7 files changed, 138 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3123bef82a..300b71fb6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,8 +12,10 @@ IMPROVEMENTS * [tests] Application module tests now use a mock application * [gaiacli] Fix error message when account isn't found when running gaiacli account * [lcd] refactored to eliminate use of global variables, and interdependent tests +* [x/stake] More stake tests added to test ByPower index FIXES +* [x/stake] bonded inflation removed, non-bonded inflation partially implemented * [lcd] Switch to bech32 for addresses on all human readable inputs and outputs * [lcd] fixed tx indexing/querying * [cli] Added `--gas` flag to specify transaction gas limit diff --git a/x/stake/handler_test.go b/x/stake/handler_test.go index 0c086f06db..6dcf3e66d8 100644 --- a/x/stake/handler_test.go +++ b/x/stake/handler_test.go @@ -33,6 +33,78 @@ func newTestMsgDelegate(delegatorAddr, validatorAddr sdk.Address, amt int64) Msg //______________________________________________________________________ +func TestValidatorByPowerIndex(t *testing.T) { + validatorAddr, validatorAddr3 := addrs[0], addrs[1] + + initBond := int64(1000000) + initBondStr := "1000" + ctx, _, keeper := createTestInput(t, false, initBond) + + // create validator + msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pks[0], initBond) + got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) + assert.True(t, got.IsOK(), "expected create-validator to be ok, got %v", got) + + // verify the self-delegation exists + bond, found := keeper.GetDelegation(ctx, validatorAddr, validatorAddr) + require.True(t, found) + gotBond := bond.Shares.Evaluate() + require.Equal(t, initBond, gotBond, + "initBond: %v\ngotBond: %v\nbond: %v\n", + initBond, gotBond, bond) + + // verify that the by power index exists + validator, found := keeper.GetValidator(ctx, validatorAddr) + require.True(t, found) + pool := keeper.GetPool(ctx) + power := GetValidatorsByPowerKey(validator, pool) + require.True(t, keeper.validatorByPowerIndexExists(ctx, power)) + + // create a second validator keep it bonded + msgCreateValidator = newTestMsgCreateValidator(validatorAddr3, pks[2], int64(1000000)) + got = handleMsgCreateValidator(ctx, msgCreateValidator, keeper) + assert.True(t, got.IsOK(), "expected create-validator to be ok, got %v", got) + + // slash and revoke the first validator + keeper.Slash(ctx, pks[0], 0, sdk.NewRat(1, 2)) + keeper.Revoke(ctx, pks[0]) + validator, found = keeper.GetValidator(ctx, validatorAddr) + require.True(t, found) + require.Equal(t, sdk.Unbonded, validator.PoolShares.Status) // ensure is unbonded + require.Equal(t, int64(500000), validator.PoolShares.Amount.Evaluate()) // ensure is unbonded + + // the old power record should have been deleted as the power changed + assert.False(t, keeper.validatorByPowerIndexExists(ctx, power)) + + // but the new power record should have been created + validator, found = keeper.GetValidator(ctx, validatorAddr) + require.True(t, found) + pool = keeper.GetPool(ctx) + power2 := GetValidatorsByPowerKey(validator, pool) + require.True(t, keeper.validatorByPowerIndexExists(ctx, power2)) + + // inflate a bunch + for i := 0; i < 20000; i++ { + pool = keeper.processProvisions(ctx) + keeper.setPool(ctx, pool) + } + + // now the new record power index should be the same as the original record + power3 := GetValidatorsByPowerKey(validator, pool) + assert.Equal(t, power2, power3) + + // unbond self-delegation + msgUnbond := NewMsgUnbond(validatorAddr, validatorAddr, "MAX") + got = handleMsgUnbond(ctx, msgUnbond, keeper) + assert.True(t, got.IsOK(), + "got: %v\nmsgUnbond: %v\ninitBondStr: %v\n", got, msgUnbond, initBondStr) + + // verify that by power key nolonger exists + _, found = keeper.GetValidator(ctx, validatorAddr) + require.False(t, found) + assert.False(t, keeper.validatorByPowerIndexExists(ctx, power3)) +} + func TestDuplicatesMsgCreateValidator(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 1000) @@ -42,6 +114,7 @@ func TestDuplicatesMsgCreateValidator(t *testing.T) { got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) assert.True(t, got.IsOK(), "%v", got) validator, found := keeper.GetValidator(ctx, validatorAddr) + require.True(t, found) assert.Equal(t, sdk.Bonded, validator.Status()) assert.Equal(t, validatorAddr, validator.Owner) diff --git a/x/stake/inflation.go b/x/stake/inflation.go index d613a478ae..fe3f59435b 100644 --- a/x/stake/inflation.go +++ b/x/stake/inflation.go @@ -22,7 +22,9 @@ func (k Keeper) processProvisions(ctx sdk.Context) Pool { // which needs to be updated is the `BondedPool`. So for each previsions cycle: provisions := pool.Inflation.Mul(sdk.NewRat(pool.TokenSupply())).Quo(hrsPerYrRat).Evaluate() - pool.BondedTokens += provisions + + // TODO add to the fees provisions + pool.LooseUnbondedTokens += provisions return pool } diff --git a/x/stake/inflation_test.go b/x/stake/inflation_test.go index 7fa393edc8..0d5183f4cf 100644 --- a/x/stake/inflation_test.go +++ b/x/stake/inflation_test.go @@ -74,8 +74,6 @@ func TestProcessProvisions(t *testing.T) { initialBondedTokens int64 = 250000000 initialUnbondedTokens int64 = 300000000 cumulativeExpProvs int64 - initialBondedShares = sdk.NewRat(250000000, 1) - initialUnbondedShares = sdk.NewRat(300000000, 1) validatorTokens = []int64{150000000, 100000000, 100000000, 100000000, 100000000} bondedValidators uint16 = 2 ) @@ -93,9 +91,7 @@ func TestProcessProvisions(t *testing.T) { //get the pool and do the final value checks from checkFinalPoolValues pool = keeper.GetPool(ctx) - checkFinalPoolValues(t, pool, initialTotalTokens, - initialUnbondedTokens, cumulativeExpProvs, - 0, 0, initialBondedShares, initialUnbondedShares) + checkFinalPoolValues(t, pool, initialTotalTokens, cumulativeExpProvs) } // Tests that the hourly rate of change of inflation will be positive, negative, or zero, depending on bonded ratio and inflation rate @@ -109,8 +105,6 @@ func TestHourlyInflationRateOfChange(t *testing.T) { initialBondedTokens int64 = 150000000 initialUnbondedTokens int64 = 400000000 cumulativeExpProvs int64 - bondedShares = sdk.NewRat(150000000, 1) - unbondedShares = sdk.NewRat(400000000, 1) validatorTokens = []int64{150000000, 100000000, 100000000, 100000000, 100000000} bondedValidators uint16 = 1 ) @@ -131,9 +125,7 @@ func TestHourlyInflationRateOfChange(t *testing.T) { // Final check that the pool equals initial values + cumulative provisions and adjustments we recorded pool = keeper.GetPool(ctx) - checkFinalPoolValues(t, pool, initialTotalTokens, - initialUnbondedTokens, cumulativeExpProvs, - 0, 0, bondedShares, unbondedShares) + checkFinalPoolValues(t, pool, initialTotalTokens, cumulativeExpProvs) } //Test that a large unbonding will significantly lower the bonded ratio @@ -181,9 +173,7 @@ func TestLargeUnbond(t *testing.T) { // Final check that the pool equals initial values + provisions and adjustments we recorded pool = keeper.GetPool(ctx) - checkFinalPoolValues(t, pool, initialTotalTokens, - initialUnbondedTokens, expProvisionsAfter, - -val0UnbondedTokens, val0UnbondedTokens, bondedShares, unbondedShares) + checkFinalPoolValues(t, pool, initialTotalTokens, expProvisionsAfter) } //Test that a large bonding will significantly increase the bonded ratio @@ -192,12 +182,9 @@ func TestLargeBond(t *testing.T) { pool := keeper.GetPool(ctx) var ( - initialTotalTokens int64 = 1600000000 - initialBondedTokens int64 = 400000000 - initialUnbondedTokens int64 = 1200000000 - val9UnbondedTokens int64 = 400000000 - val9BondedTokens int64 - bondedShares = sdk.NewRat(400000000, 1) + initialTotalTokens int64 = 1600000000 + initialBondedTokens int64 = 400000000 + initialUnbondedTokens int64 = 1200000000 unbondedShares = sdk.NewRat(1200000000, 1) unbondedSharesVal9 = sdk.NewRat(400000000, 1) validatorTokens = []int64{400000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 400000000} @@ -225,10 +212,6 @@ func TestLargeBond(t *testing.T) { // process provisions after the bonding, to compare the difference in expProvisions and expInflation _, expProvisionsAfter, pool := updateProvisions(t, keeper, pool, ctx, 0) unbondedShares = unbondedShares.Sub(unbondedSharesVal9) - val9BondedTokens = val9UnbondedTokens - val9UnbondedTokens = 0 - bondedTokens := initialBondedTokens + val9BondedTokens + expProvisionsAfter - bondedShares = sdk.NewRat(bondedTokens, 1).Quo(pool.bondedShareExRate()) // unbonded shares should decrease assert.True(t, unbondedShares.LT(sdk.NewRat(1200000000, 1))) @@ -237,9 +220,7 @@ func TestLargeBond(t *testing.T) { // Final check that the pool equals initial values + provisions and adjustments we recorded pool = keeper.GetPool(ctx) - checkFinalPoolValues(t, pool, initialTotalTokens, - initialUnbondedTokens, expProvisionsAfter, - val9BondedTokens, -val9BondedTokens, bondedShares, unbondedShares) + checkFinalPoolValues(t, pool, initialTotalTokens, expProvisionsAfter) } // Tests that inflation increases or decreases as expected when we do a random operation on 20 different validators @@ -296,30 +277,13 @@ func TestInflationWithRandomOperations(t *testing.T) { } } +//_________________________________________________________________________________________ ////////////////////////////////HELPER FUNCTIONS BELOW///////////////////////////////////// -// Final check on the global pool values for what the total tokens accumulated from each hour of provisions and other functions -// bondedAdjustment and unbondedAdjustment are the accumulated changes for the operations of the test -// (i.e. if three unbond operations happened, their total value would be passed as unbondedAdjustment) -func checkFinalPoolValues(t *testing.T, pool Pool, initialTotalTokens, initialUnbondedTokens, - cumulativeExpProvs, bondedAdjustment, unbondedAdjustment int64, bondedShares, unbondedShares sdk.Rat) { - - initialBonded := initialTotalTokens - initialUnbondedTokens +// Final check on the global pool values for what the total tokens accumulated from each hour of provisions +func checkFinalPoolValues(t *testing.T, pool Pool, initialTotalTokens, cumulativeExpProvs int64) { calculatedTotalTokens := initialTotalTokens + cumulativeExpProvs - calculatedBondedTokens := initialBonded + cumulativeExpProvs + bondedAdjustment - calculatedUnbondedTokens := initialUnbondedTokens + unbondedAdjustment - - // test that the bonded ratio the pool has is equal to what we calculated for tokens - assert.True(t, pool.bondedRatio().Equal(sdk.NewRat(calculatedBondedTokens, calculatedTotalTokens)), "%v", pool.bondedRatio()) - - // test global supply assert.Equal(t, calculatedTotalTokens, pool.TokenSupply()) - assert.Equal(t, calculatedBondedTokens, pool.BondedTokens) - assert.Equal(t, calculatedUnbondedTokens, pool.UnbondedTokens) - - // test the value of validator shares - assert.True(t, pool.bondedShareExRate().Mul(bondedShares).Equal(sdk.NewRat(calculatedBondedTokens)), "%v", pool.bondedShareExRate()) - assert.True(t, pool.unbondedShareExRate().Mul(unbondedShares).Equal(sdk.NewRat(calculatedUnbondedTokens)), "%v", pool.unbondedShareExRate()) } // Processes provisions are added to the pool correctly every hour @@ -327,13 +291,11 @@ func checkFinalPoolValues(t *testing.T, pool Pool, initialTotalTokens, initialUn func updateProvisions(t *testing.T, keeper Keeper, pool Pool, ctx sdk.Context, hr int) (sdk.Rat, int64, Pool) { expInflation := keeper.nextInflation(ctx) expProvisions := (expInflation.Mul(sdk.NewRat(pool.TokenSupply())).Quo(hrsPerYrRat)).Evaluate() - startBondedPool := pool.BondedTokens startTotalSupply := pool.TokenSupply() pool = keeper.processProvisions(ctx) keeper.setPool(ctx, pool) //check provisions were added to pool - require.Equal(t, startBondedPool+expProvisions, pool.BondedTokens, "hr %v", hr) require.Equal(t, startTotalSupply+expProvisions, pool.TokenSupply()) return expInflation, expProvisions, pool @@ -405,5 +367,4 @@ func checkInflation(t *testing.T, pool Pool, previousInflation, updatedInflation assert.Equal(t, true, inflationChange.LT(sdk.ZeroRat()), msg) } } - } diff --git a/x/stake/keeper.go b/x/stake/keeper.go index fad1f86ef1..4a2e6ff4be 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -78,6 +78,12 @@ func (k Keeper) setValidatorByPowerIndex(ctx sdk.Context, validator Validator, p store.Set(GetValidatorsByPowerKey(validator, pool), validator.Owner) } +// used in testing +func (k Keeper) validatorByPowerIndexExists(ctx sdk.Context, power []byte) bool { + store := ctx.KVStore(k.storeKey) + return store.Get(power) != nil +} + // Get the set of all validators with no limits, used during genesis dump func (k Keeper) getAllValidators(ctx sdk.Context) (validators Validators) { store := ctx.KVStore(k.storeKey) diff --git a/x/stake/keeper_test.go b/x/stake/keeper_test.go index 2868853e00..76bfc507a4 100644 --- a/x/stake/keeper_test.go +++ b/x/stake/keeper_test.go @@ -24,6 +24,47 @@ var ( } ) +func TestUpdateValidatorByPowerIndex(t *testing.T) { + ctx, _, keeper := createTestInput(t, false, 0) + pool := keeper.GetPool(ctx) + + // create a random pool + pool.BondedTokens = 1234 + pool.BondedShares = sdk.NewRat(124) + pool.UnbondingTokens = 13934 + pool.UnbondingShares = sdk.NewRat(145) + pool.UnbondedTokens = 154 + pool.UnbondedShares = sdk.NewRat(1333) + keeper.setPool(ctx, pool) + + // add a validator + validator := NewValidator(addrVals[0], pks[0], Description{}) + validator, pool, delSharesCreated := validator.addTokensFromDel(pool, 100) + require.Equal(t, sdk.Unbonded, validator.Status()) + assert.Equal(t, int64(100), validator.PoolShares.Tokens(pool).Evaluate()) + keeper.setPool(ctx, pool) + keeper.updateValidator(ctx, validator) + validator, found := keeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + assert.Equal(t, int64(100), validator.PoolShares.Tokens(pool).Evaluate(), "\nvalidator %v\npool %v", validator, pool) + + pool = keeper.GetPool(ctx) + power := GetValidatorsByPowerKey(validator, pool) + assert.True(t, keeper.validatorByPowerIndexExists(ctx, power)) + + // burn half the delegator shares + validator, pool, burned := validator.removeDelShares(pool, delSharesCreated.Quo(sdk.NewRat(2))) + assert.Equal(t, int64(50), burned) + keeper.setPool(ctx, pool) // update the pool + keeper.updateValidator(ctx, validator) // update the validator, possibly kicking it out + assert.False(t, keeper.validatorByPowerIndexExists(ctx, power)) + + pool = keeper.GetPool(ctx) + validator, found = keeper.GetValidator(ctx, addrVals[0]) + power = GetValidatorsByPowerKey(validator, pool) + assert.True(t, keeper.validatorByPowerIndexExists(ctx, power)) +} + func TestSetValidator(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 0) pool := keeper.GetPool(ctx) diff --git a/x/stake/shares.go b/x/stake/shares.go index d5fe93844d..e30fa3738e 100644 --- a/x/stake/shares.go +++ b/x/stake/shares.go @@ -118,13 +118,14 @@ func (s PoolShares) ToBonded(p Pool) PoolShares { //_________________________________________________________________________________________________________ +// TODO better tests // get the equivalent amount of tokens contained by the shares func (s PoolShares) Tokens(p Pool) sdk.Rat { switch s.Status { case sdk.Bonded: - return p.unbondedShareExRate().Mul(s.Amount) // (tokens/shares) * shares + return p.bondedShareExRate().Mul(s.Amount) // (tokens/shares) * shares case sdk.Unbonding: - return p.unbondedShareExRate().Mul(s.Amount) + return p.unbondingShareExRate().Mul(s.Amount) case sdk.Unbonded: return p.unbondedShareExRate().Mul(s.Amount) default: From 37bba35c91e7ade8f7a160ceb2c37b322fed42f1 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Wed, 13 Jun 2018 00:44:46 -0700 Subject: [PATCH 249/548] Merge PR #1232: Bucky/gaiadebug * update to tm v0.19.6 * update tm to 0.17.4 * update for tm v0.19.9 * update godep * Merge PR #1195: gaiacli - Add error message for when account isn't found * Add --gas flag to specify gas limit for a transaction * lawl viper * version and changelog * add cmd/gaia/testnets folder to deprecate cosmos/testnets repo * cmd/gaia/testnets: update status.md with recent history * cmd/gaia/testnets: update versions, use a working seed * readme points to testnet folder * add fixes from billy * fix status.md * seed->seeds * readme improvements add link to official faucet, remove sequence from cmds readme improvements wording improvements and simplifications add link to cosmos explorer remove instances of candidate add apostrophe small fixes improve the installing software section fixes based on feedback add note about querying an empty account remove panic note update introduction add full cp path for copying genesis.json update moniker warning remove redundant sections add error message when querying empty account don't need a link to golang.org link to sections, better section names fix section link reorganize sections add h3s remove & symbol add whitespace update h3 to h2 add note about explorer not connecting to every node * testnets: minor readme update * gaiadebug tool * gaiadebug: add hack command * fix from merge * gaiadebug: raw-bytes command * fix from merge --- CHANGELOG.md | 21 +- Makefile | 5 +- README.md | 8 + client/lcd/lcd_test.go | 7 +- cmd/gaia/cmd/gaiadebug/hack.go | 243 ++++ cmd/gaia/cmd/gaiadebug/main.go | 159 +++ cmd/gaia/testnets/README.md | 258 ++++ cmd/gaia/testnets/STATUS.md | 74 ++ cmd/gaia/testnets/gaia-5001/adrian.json | 20 + cmd/gaia/testnets/gaia-5001/anton.json | 20 + cmd/gaia/testnets/gaia-5001/aurel.json | 20 + cmd/gaia/testnets/gaia-5001/bucky.json | 20 + cmd/gaia/testnets/gaia-5001/cwgoes.json | 20 + cmd/gaia/testnets/gaia-5001/iris.json | 20 + cmd/gaia/testnets/gaia-5001/lino.json | 20 + cmd/gaia/testnets/gaia-5001/pbostrom.json | 20 + cmd/gaia/testnets/gaia-5001/poldsam.json | 20 + cmd/gaia/testnets/gaia-5001/staked.json | 20 + cmd/gaia/testnets/gaia-5001/zach.json | 20 + cmd/gaia/testnets/gaia-5001/zaki.json | 20 + cmd/gaia/testnets/gaia-6000/genesis.json | 1459 +++++++++++++++++++++ cmd/gaia/testnets/gaia-6001/genesis.json | 1459 +++++++++++++++++++++ version/version.go | 2 +- 23 files changed, 3929 insertions(+), 6 deletions(-) create mode 100644 cmd/gaia/cmd/gaiadebug/hack.go create mode 100644 cmd/gaia/cmd/gaiadebug/main.go create mode 100644 cmd/gaia/testnets/README.md create mode 100644 cmd/gaia/testnets/STATUS.md create mode 100644 cmd/gaia/testnets/gaia-5001/adrian.json create mode 100644 cmd/gaia/testnets/gaia-5001/anton.json create mode 100644 cmd/gaia/testnets/gaia-5001/aurel.json create mode 100644 cmd/gaia/testnets/gaia-5001/bucky.json create mode 100644 cmd/gaia/testnets/gaia-5001/cwgoes.json create mode 100644 cmd/gaia/testnets/gaia-5001/iris.json create mode 100644 cmd/gaia/testnets/gaia-5001/lino.json create mode 100644 cmd/gaia/testnets/gaia-5001/pbostrom.json create mode 100644 cmd/gaia/testnets/gaia-5001/poldsam.json create mode 100644 cmd/gaia/testnets/gaia-5001/staked.json create mode 100644 cmd/gaia/testnets/gaia-5001/zach.json create mode 100644 cmd/gaia/testnets/gaia-5001/zaki.json create mode 100644 cmd/gaia/testnets/gaia-6000/genesis.json create mode 100644 cmd/gaia/testnets/gaia-6001/genesis.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 300b71fb6c..f40117f82d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,7 +24,7 @@ FIXES ## 0.18.0 -_2018-06-05_ +*June 9, 2018* BREAKING CHANGES @@ -87,8 +87,27 @@ BUG FIXES * query sequence via account store * fixed duplicate pub_key in stake.Validator * Auto-sequencing now works correctly +* [gaiacli] Fix error message when account isn't found when running gaiacli account +## 0.17.5 + +*June 5, 2018* + +Update to Tendermint v0.19.9 (Fix evidence reactor, mempool deadlock, WAL panic, +memory leak) + +## 0.17.4 + +*May 31, 2018* + +Update to Tendermint v0.19.7 (WAL fixes and more) + +## 0.17.3 + +*May 29, 2018* + +Update to Tendermint v0.19.6 (fix fast-sync halt) ## 0.17.5 diff --git a/Makefile b/Makefile index d6444b0b62..c0d18c4a39 100644 --- a/Makefile +++ b/Makefile @@ -46,6 +46,9 @@ install_examples: go install $(BUILD_FLAGS) ./examples/democoin/cmd/democoind go install $(BUILD_FLAGS) ./examples/democoin/cmd/democli +install_debug: + go install $(BUILD_FLAGS) ./cmd/gaia/cmd/gaiadebug + dist: @bash publish/dist.sh @bash publish/publish.sh @@ -157,4 +160,4 @@ remotenet-status: # To avoid unintended conflicts with file names, always add to .PHONY # unless there is a reason not to. # https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html -.PHONY: build build_examples install install_examples dist check_tools get_tools get_vendor_deps draw_deps test test_cli test_unit test_cover test_lint benchmark devdoc_init devdoc devdoc_save devdoc_update remotenet-start remotenet-stop remotenet-status +.PHONY: build build_examples install install_examples install_debug dist check_tools get_tools get_vendor_deps draw_deps test test_cli test_unit test_cover test_lint benchmark devdoc_init devdoc devdoc_save devdoc_update remotenet-start remotenet-stop remotenet-status diff --git a/README.md b/README.md index 3faf2c8afd..3af98fb4f2 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,14 @@ master | [![CircleCI](https://circleci.com/gh/cosmos/cosmos-sdk/tree/master.s **Note**: Requires [Go 1.10+](https://golang.org/dl/) +## Testnet + +For more information on connecting to the testnet, see +[cmd/gaia/testnets](/cmd/gaia/testnets) + +For the latest status of the testnet, see the [status +file](/cmd/gaia/testnets/STATUS.md). + ## Overview diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 946f70bbcb..ba2937e050 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -396,9 +396,10 @@ func TestBonding(t *testing.T) { // TODO fix shares fn in staking // query sender - //acc = getAccount(t, port, addr) - //coins = acc.GetCoins() - //assert.Equal(t, int64(70), coins.AmountOf(denom)) + //acc := getAccount(t, sendAddr) + //coins := acc.GetCoins() + //assert.Equal(t, int64(98), coins.AmountOf(coinDenom)) + } //_____________________________________________________________________________ diff --git a/cmd/gaia/cmd/gaiadebug/hack.go b/cmd/gaia/cmd/gaiadebug/hack.go new file mode 100644 index 0000000000..2c84184bf7 --- /dev/null +++ b/cmd/gaia/cmd/gaiadebug/hack.go @@ -0,0 +1,243 @@ +package main + +import ( + "encoding/base64" + "encoding/hex" + "fmt" + "os" + "path" + + "github.com/spf13/cobra" + abci "github.com/tendermint/abci/types" + crypto "github.com/tendermint/go-crypto" + cmn "github.com/tendermint/tmlibs/common" + dbm "github.com/tendermint/tmlibs/db" + "github.com/tendermint/tmlibs/log" + + bam "github.com/cosmos/cosmos-sdk/baseapp" + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/cosmos/cosmos-sdk/x/ibc" + "github.com/cosmos/cosmos-sdk/x/slashing" + "github.com/cosmos/cosmos-sdk/x/stake" + + gaia "github.com/cosmos/cosmos-sdk/cmd/gaia/app" +) + +func runHackCmd(cmd *cobra.Command, args []string) error { + + if len(args) != 1 { + return fmt.Errorf("Expected 1 arg") + } + + // ".gaiad" + dataDir := args[0] + dataDir = path.Join(dataDir, "data") + + // load the app + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) + db, err := dbm.NewGoLevelDB("gaia", dataDir) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + app := NewGaiaApp(logger, db) + + // print some info + id := app.LastCommitID() + lastBlockHeight := app.LastBlockHeight() + fmt.Println("ID", id) + fmt.Println("LastBlockHeight", lastBlockHeight) + + //---------------------------------------------------- + // XXX: start hacking! + //---------------------------------------------------- + // eg. gaia-6001 testnet bug + // We paniced when iterating through the "bypower" keys. + // The following powerKey was there, but the corresponding "trouble" validator did not exist. + // So here we do a binary search on the past states to find when the powerKey first showed up ... + + // owner of the validator the bonds, gets revoked, later unbonds, and then later is still found in the bypower store + trouble := hexToBytes("D3DC0FF59F7C3B548B7AFA365561B87FD0208AF8") + // this is his "bypower" key + powerKey := hexToBytes("05303030303030303030303033FFFFFFFFFFFF4C0C0000FFFED3DC0FF59F7C3B548B7AFA365561B87FD0208AF8") + + topHeight := lastBlockHeight + bottomHeight := int64(0) + checkHeight := topHeight + for { + // load the given version of the state + err = app.LoadVersion(checkHeight, app.keyMain) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + ctx := app.NewContext(true, abci.Header{}) + + // check for the powerkey and the validator from the store + store := ctx.KVStore(app.keyStake) + res := store.Get(powerKey) + val, _ := app.stakeKeeper.GetValidator(ctx, trouble) + fmt.Println("checking height", checkHeight, res, val) + if res == nil { + bottomHeight = checkHeight + } else { + topHeight = checkHeight + } + checkHeight = (topHeight + bottomHeight) / 2 + } +} + +func base64ToPub(b64 string) crypto.PubKeyEd25519 { + data, _ := base64.StdEncoding.DecodeString(b64) + var pubKey crypto.PubKeyEd25519 + copy(pubKey[:], data) + return pubKey + +} + +func hexToBytes(h string) []byte { + trouble, _ := hex.DecodeString(h) + return trouble + +} + +//-------------------------------------------------------------------------------- +// NOTE: This is all copied from gaia/app/app.go +// so we can access internal fields! + +const ( + appName = "GaiaApp" +) + +// default home directories for expected binaries +var ( + DefaultCLIHome = os.ExpandEnv("$HOME/.gaiacli") + DefaultNodeHome = os.ExpandEnv("$HOME/.gaiad") +) + +// Extended ABCI application +type GaiaApp struct { + *bam.BaseApp + cdc *wire.Codec + + // keys to access the substores + keyMain *sdk.KVStoreKey + keyAccount *sdk.KVStoreKey + keyIBC *sdk.KVStoreKey + keyStake *sdk.KVStoreKey + keySlashing *sdk.KVStoreKey + + // Manage getting and setting accounts + accountMapper auth.AccountMapper + feeCollectionKeeper auth.FeeCollectionKeeper + coinKeeper bank.Keeper + ibcMapper ibc.Mapper + stakeKeeper stake.Keeper + slashingKeeper slashing.Keeper +} + +func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { + cdc := MakeCodec() + + // create your application object + var app = &GaiaApp{ + BaseApp: bam.NewBaseApp(appName, cdc, logger, db), + cdc: cdc, + keyMain: sdk.NewKVStoreKey("main"), + keyAccount: sdk.NewKVStoreKey("acc"), + keyIBC: sdk.NewKVStoreKey("ibc"), + keyStake: sdk.NewKVStoreKey("stake"), + keySlashing: sdk.NewKVStoreKey("slashing"), + } + + // define the accountMapper + app.accountMapper = auth.NewAccountMapper( + app.cdc, + app.keyAccount, // target store + &auth.BaseAccount{}, // prototype + ) + + // add handlers + app.coinKeeper = bank.NewKeeper(app.accountMapper) + app.ibcMapper = ibc.NewMapper(app.cdc, app.keyIBC, app.RegisterCodespace(ibc.DefaultCodespace)) + app.stakeKeeper = stake.NewKeeper(app.cdc, app.keyStake, app.coinKeeper, app.RegisterCodespace(stake.DefaultCodespace)) + app.slashingKeeper = slashing.NewKeeper(app.cdc, app.keySlashing, app.stakeKeeper, app.RegisterCodespace(slashing.DefaultCodespace)) + + // register message routes + app.Router(). + AddRoute("bank", bank.NewHandler(app.coinKeeper)). + AddRoute("ibc", ibc.NewHandler(app.ibcMapper, app.coinKeeper)). + AddRoute("stake", stake.NewHandler(app.stakeKeeper)) + + // initialize BaseApp + app.SetInitChainer(app.initChainer) + app.SetBeginBlocker(app.BeginBlocker) + app.SetEndBlocker(app.EndBlocker) + app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, app.feeCollectionKeeper)) + app.MountStoresIAVL(app.keyMain, app.keyAccount, app.keyIBC, app.keyStake, app.keySlashing) + err := app.LoadLatestVersion(app.keyMain) + if err != nil { + cmn.Exit(err.Error()) + } + + return app +} + +// custom tx codec +func MakeCodec() *wire.Codec { + var cdc = wire.NewCodec() + ibc.RegisterWire(cdc) + bank.RegisterWire(cdc) + stake.RegisterWire(cdc) + slashing.RegisterWire(cdc) + auth.RegisterWire(cdc) + sdk.RegisterWire(cdc) + wire.RegisterCrypto(cdc) + return cdc +} + +// application updates every end block +func (app *GaiaApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { + tags := slashing.BeginBlocker(ctx, req, app.slashingKeeper) + + return abci.ResponseBeginBlock{ + Tags: tags.ToKVPairs(), + } +} + +// application updates every end block +func (app *GaiaApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { + validatorUpdates := stake.EndBlocker(ctx, app.stakeKeeper) + + return abci.ResponseEndBlock{ + ValidatorUpdates: validatorUpdates, + } +} + +// custom logic for gaia initialization +func (app *GaiaApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { + stateJSON := req.AppStateBytes + // TODO is this now the whole genesis file? + + var genesisState gaia.GenesisState + err := app.cdc.UnmarshalJSON(stateJSON, &genesisState) + if err != nil { + panic(err) // TODO https://github.com/cosmos/cosmos-sdk/issues/468 + // return sdk.ErrGenesisParse("").TraceCause(err, "") + } + + // load the accounts + for _, gacc := range genesisState.Accounts { + acc := gacc.ToAccount() + app.accountMapper.SetAccount(ctx, acc) + } + + // load the initial stake information + stake.InitGenesis(ctx, app.stakeKeeper, genesisState.StakeData) + return abci.ResponseInitChain{} + +} diff --git a/cmd/gaia/cmd/gaiadebug/main.go b/cmd/gaia/cmd/gaiadebug/main.go new file mode 100644 index 0000000000..79045c07bb --- /dev/null +++ b/cmd/gaia/cmd/gaiadebug/main.go @@ -0,0 +1,159 @@ +package main + +import ( + "bytes" + "encoding/base64" + "encoding/hex" + "encoding/json" + "fmt" + "os" + "strconv" + "strings" + + gaia "github.com/cosmos/cosmos-sdk/cmd/gaia/app" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/spf13/cobra" + crypto "github.com/tendermint/go-crypto" +) + +func init() { + rootCmd.AddCommand(txCmd) + rootCmd.AddCommand(pubkeyCmd) + rootCmd.AddCommand(hackCmd) + rootCmd.AddCommand(rawBytesCmd) +} + +var rootCmd = &cobra.Command{ + Use: "gaiadebug", + Short: "Gaia debug tool", + SilenceUsage: true, +} + +var txCmd = &cobra.Command{ + Use: "tx", + Short: "Decode a gaia tx from hex or base64", + RunE: runTxCmd, +} + +var pubkeyCmd = &cobra.Command{ + Use: "pubkey", + Short: "Decode a pubkey from hex or base64", + RunE: runPubKeyCmd, +} + +var hackCmd = &cobra.Command{ + Use: "hack", + Short: "Boilerplate to Hack on an existing state by scripting some Go...", + RunE: runHackCmd, +} + +var rawBytesCmd = &cobra.Command{ + Use: "raw-bytes", + Short: "Convert raw bytes output (eg. [10 21 13 255]) to hex", + RunE: runRawBytesCmd, +} + +func runRawBytesCmd(cmd *cobra.Command, args []string) error { + if len(args) != 1 { + return fmt.Errorf("Expected single arg") + } + stringBytes := args[0] + stringBytes = strings.Trim(stringBytes, "[") + stringBytes = strings.Trim(stringBytes, "]") + spl := strings.Split(stringBytes, " ") + + byteArray := []byte{} + for _, s := range spl { + b, err := strconv.Atoi(s) + if err != nil { + return err + } + byteArray = append(byteArray, byte(b)) + } + fmt.Printf("%X\n", byteArray) + return nil +} + +func runPubKeyCmd(cmd *cobra.Command, args []string) error { + if len(args) != 1 { + return fmt.Errorf("Expected single arg") + } + + pubkeyString := args[0] + + // try hex, then base64 + pubkeyBytes, err := hex.DecodeString(pubkeyString) + if err != nil { + var err2 error + pubkeyBytes, err2 = base64.StdEncoding.DecodeString(pubkeyString) + if err2 != nil { + return fmt.Errorf(`Expected hex or base64. Got errors: + hex: %v, + base64: %v + `, err, err2) + } + } + + cdc := gaia.MakeCodec() + var pubKey crypto.PubKeyEd25519 + copy(pubKey[:], pubkeyBytes) + pubKeyJSONBytes, err := cdc.MarshalJSON(pubKey) + if err != nil { + return err + } + fmt.Println("Address:", pubKey.Address()) + fmt.Printf("Hex: %X\n", pubkeyBytes) + fmt.Println("JSON (base64):", string(pubKeyJSONBytes)) + return nil +} + +func runTxCmd(cmd *cobra.Command, args []string) error { + if len(args) != 1 { + return fmt.Errorf("Expected single arg") + } + + txString := args[0] + + // try hex, then base64 + txBytes, err := hex.DecodeString(txString) + if err != nil { + var err2 error + txBytes, err2 = base64.StdEncoding.DecodeString(txString) + if err2 != nil { + return fmt.Errorf(`Expected hex or base64. Got errors: + hex: %v, + base64: %v + `, err, err2) + } + } + + var tx = auth.StdTx{} + cdc := gaia.MakeCodec() + + err = cdc.UnmarshalBinary(txBytes, &tx) + if err != nil { + return err + } + + bz, err := cdc.MarshalJSON(tx) + if err != nil { + return err + } + + buf := bytes.NewBuffer([]byte{}) + err = json.Indent(buf, bz, "", " ") + if err != nil { + return err + } + + fmt.Println(buf.String()) + return nil +} + +func main() { + err := rootCmd.Execute() + if err != nil { + os.Exit(1) + } + os.Exit(0) +} diff --git a/cmd/gaia/testnets/README.md b/cmd/gaia/testnets/README.md new file mode 100644 index 0000000000..b34926aede --- /dev/null +++ b/cmd/gaia/testnets/README.md @@ -0,0 +1,258 @@ +# Connect to the `gaia-6001` Testnet + +Note: We are aware this documentation is sub-par. We are working to +improve the tooling and the documentation to make this process as painless as +possible. In the meantime, join the +[Validator Chat](https://riot.im/app/#/room/#cosmos_validators:matrix.org) +for technical support. Thanks very much for your patience. :) + +## Setting Up a New Node + +These instructions are for setting up a brand new full node from scratch. If you ran a full node on a previous testnet, please skip to [Upgrading From Previous Testnet](#upgrading-from-previous-testnet). + +### Install Go + +Install `go` by following the [official docs](https://golang.org/doc/install). +**Go 1.10+** is required for the Cosmos SDK. + +### Install Cosmos SDK + +Next, let's install the testnet's version of the Cosmos SDK. + +``` +mkdir -p $GOPATH/src/github.com/cosmos +cd $GOPATH/src/github.com/cosmos +git clone https://github.com/cosmos/cosmos-sdk +cd cosmos-sdk && git checkout v0.18.0 +make get_tools && make get_vendor_deps && make install +``` + +That will install the `gaiad` and `gaiacli` binaries. Verify that everything is OK: + +``` +gaiad version +0.18.0-eceb56b7 +``` + +### Node Setup + +Create the required configuration files: + +``` +gaiad init +``` + +Name your node by editing the `moniker` in `$HOME/.gaiad/config/config.toml`. Note that only ASCII characters are supported. Using Unicode renders your node unconnectable. + +``` +# A custom human readable name for this node +moniker = "" +``` + +Your full node has been initialized! Please skip to [Genesis & Seeds](#genesis--seeds). + +## Upgrading From Previous Testnet + +These instructions are for full nodes that have ran on previous testnets and would like to upgrade to the latest testnet. + +### Reset Data + +First, remove the outdated files and reset the data. + +``` +rm $HOME/.gaiad/config/addrbook.json $HOME/.gaiad/config/genesis.json +gaiad unsafe_reset_all +``` + +Your node is now in a pristine state while keeping the original `priv_validator.json` and `config.toml`. If you had any sentry nodes or full nodes setup before, +your node will still try to connect to them, but may fail if they haven't also +been upgraded. + +**WARNING:** Make sure that every node has a unique `priv_validator.json`. Do not copy the `priv_validator.json` from an old node to multiple new nodes. Running two nodes with the same `priv_validator.json` will cause you to double sign. + +### Software Upgrade + +Now it is time to upgrade the software: + +``` +cd $GOPATH/src/github.com/cosmos/cosmos-sdk +git fetch --all && git checkout v0.18.0 +make update_tools && make get_vendor_deps && make install +``` + +Your full node has been cleanly upgraded! + +## Genesis & Seeds + +### Copy the Genesis File + +Copy the testnet's `genesis.json` file and place it in `gaiad`'s config directory. + +``` +mkdir -p $HOME/.gaiad/config +cp -a $GOPATH/src/github.com/cosmos/cosmos-sdk/cmd/gaia/testnets/gaia-6001/genesis.json $HOME/.gaiad/config/genesis.json +``` + +### Add Seed Nodes + +Your node needs to know how to find peers. You'll need to add healthy seed nodes to `$HOME/.gaiad/config/config.toml`. Here are some seed nodes you can use: + +``` +# Comma separated list of seed nodes to connect to +seeds = "38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6001.coinculture.net:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@seed.cosmos.cryptium.ch:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@35.198.166.171:46656,032fa56301de335d835057fb6ad9f7ce2242a66d@165.227.236.213:46656" +``` + +You can also [ask other validators](https://riot.im/app/#/room/#cosmos_validators:matrix.org) for a persistent peer and add it under the `persistent_peers` key. For more information on seeds and peers, [read this](https://github.com/tendermint/tendermint/blob/develop/docs/using-tendermint.md#peers). + +## Run a Full Node + +Start the full node with this command: + +``` +gaiad start +``` + +Check that everything is running smoothly: + +``` +gaiacli status +``` + +View the status of the network with the [Cosmos Explorer](https://explorecosmos.network). Once your full node syncs up to the current block height, you should see it appear on the [list of full nodes](https://explorecosmos.network/validators). If it doesn't show up, that's ok--the Explorer does not connect to every node. + +## Generate Keys + +You'll need a private and public key pair \(a.k.a. `sk, pk` respectively\) to be able to receive funds, send txs, bond tx, etc. + +To generate a new key \(default _ed25519_ elliptic curve\): + +``` +gaiacli keys add +``` + +Next, you will have to create a passphrase. Save the _seed_ _phrase_ in a safe place in case you forget the password. + +If you check your private keys, you'll now see ``: + +``` +gaiacli keys show +``` + +You can see all your available keys by typing: + +``` +gaiacli keys list +``` + +View the validator pubkey for your node by typing: + +``` +gaiad tendermint show_validator +``` + +Save your address and pubkey to environment variables for later use: + +``` +MYADDR= +MYPUBKEY= +``` + +**WARNING:** We strongly recommend NOT using the same passphrase for multiple keys. The Tendermint team and the Interchain Foundation will not be responsible for the loss of funds. + +## Get Tokens + +The best way to get tokens is from the [Cosmos Testnet Faucet](https://faucetcosmos.network). If the faucet is not working for you, try asking [#cosmos-validators](https://riot.im/app/#/room/#cosmos-validators:matrix.org). + +After receiving tokens to your address, you can view your account's balance by typing: + +``` +gaiacli account +``` + +Note: When you query an account balance with zero tokens, you will get this error: `No account with address was found in the state.` This is expected! We're working on improving our error messages. + +## Send Tokens + +``` +gaiacli send --amount=10faucetToken --chain-id= --name= --to= +``` + +Note: The `--amount` flag accepts the format `--amount=`. + +Now, view the updated balances of the origin and destination accounts: + +``` +gaiacli account +gaiacli account +``` + +You can also check your balance at a given block by using the `--block` flag: + +``` +gaiacli account --block= +``` + +## Run a Validator Node + +[Validators](https://cosmos.network/validators) are responsible for committing new blocks to the blockchain through voting. A validator's stake is slashed if they become unavailable, double sign a transaction, or don't cast their votes. If you only want to run a full node, a VM in the cloud is fine. However, if you are want to become a validator for the Hub's `mainnet`, you should research hardened setups. Please read [Sentry Node Architecture](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#how-can-validators-protect-themselves-from-denial-of-service-attacks) to protect your node from DDOS and ensure high-availability. Also see the [technical requirements](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#technical-requirements)). There's also more info on our [website](https://cosmos.network/validators). + +Your `pubkey` can be used to create a new validator by staking tokens. You can find your validator pubkey by running: + +``` +gaiad tendermint show_validator +``` + +Next, craft your `gaiacli stake create-validator` command: + +``` +gaiacli stake create-validator --amount=5steak --pubkey= --address-validator= --moniker=satoshi --chain-id= --name= +``` + +You can add more information to the validator, such as`--website`, `--keybase-sig`, or `--details`. Here's how: + +``` +gaiacli stake edit-validator --details="To the cosmos !" --website="https://cosmos.network" +``` + +View the validator's information with this command: + +``` +gaiacli stake validator --address-validator= --chain-id= +``` + +To check that the validator is active, look for it here: + +``` +gaiacli advanced tendermint validator-set +``` + +**Note:** To be in the validator set, you need to have more total voting power than the 100th validator. + +## Delegating to a Validator + +On the upcoming mainnet, you can delegate `atom` to a validator. These [delegators](https://cosmos.network/resources/delegators) can receive part of the validator's fee revenue. Read more about the [Cosmos Token Model](https://github.com/cosmos/cosmos/raw/master/Cosmos_Token_Model.pdf). + +### Bond Tokens + +On the testnet, we delegate `steak` instead of `atom`. Here's how you can bond tokens to a testnet validator: + +``` +gaiacli stake delegate --amount=10steak --address-delegator= --address-validator= --name= --chain-id= +``` + +While tokens are bonded, they are pooled with all the other bonded tokens in the network. Validators and delegators obtain a percentage of shares that equal their stake in this pool. + +### Unbond Tokens + +If for any reason the validator misbehaves, or you want to unbond a certain amount of tokens, use this following command. You can unbond a specific amount of`shares`\(eg:`12.1`\) or all of them \(`MAX`\). + +``` +gaiacli stake unbond --address-delegator= --address-validator= --shares=MAX --name= --chain-id= +``` + +You can check your balance and your stake delegation to see that the unbonding went through successfully. + +``` +gaiacli account +gaiacli stake delegation --address-delegator= --address-validator= --chain-id= +``` diff --git a/cmd/gaia/testnets/STATUS.md b/cmd/gaia/testnets/STATUS.md new file mode 100644 index 0000000000..d53c49e092 --- /dev/null +++ b/cmd/gaia/testnets/STATUS.md @@ -0,0 +1,74 @@ +# TESTNET STATUS + +## *June 10, 2018, 8:30 EST* - Gaia-6001 consensus failure + +- Validator unbonding and revocation activity caused a consensus failure +- There is a bug in the staking module that must be fixed +- The team is taking its time to look into this and release a fix following a + proper protocol for hotfix upgrades to the testnet +- Please stay tuned! + +## *June 9, 2018, 14:00 EST* - New Release + +- Released gaia + [v0.18.0](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.18.0) with + update for Tendermint + [v0.20.0](https://github.com/tendermint/tendermint/releases/tag/v0.20.0) +- Includes bug fix for declaring candidacy from the command line + +## *June 8, 2018, 23:30 EST* - Gaia-6001 is making blocks + +- +2/3 of the voting power is finally online for Gaia-6001 and it is making + blocks! +- This is a momentous achievement - a successful asynchronous decentralized + testnet launch +- Congrats everyone! + +## *June 8, 2018, 12:00 EST* - New Testnet Gaia-6001 + +- After some confusion around testnet deployment and a contention testnet + hardfork, a new genesis file and network was released for `gaia-6001` + +## *June 7, 2018, 9:00 EST* - New Testnet Gaia-6000 + +- Released a new `genesis.json` file for `gaia-6000` +- Initial validators include those that were most active in + the gaia-5001 testnet +- Join the network via gaia `v0.18.0-rc0` + +## *June 5, 2018, 21:00 EST* - New Release + +- Released gaia + [v0.17.5](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.17.5) + with update for Tendermint + [v0.19.9](https://github.com/tendermint/tendermint/releases/tag/v0.19.9) +- Fixes many bugs! + - evidence gossipping + - mempool deadlock + - WAL panic + - memory leak +- Please update to this to put a stop to the rampant invalid evidence gossiping + :) + +## *May 31, 2018, 14:00 EST* - New Release + +- Released gaia + [v0.17.4](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.17.4) with update for Tendermint v0.19.7 +- Fixes a WAL bug and some more +- Please update to this if you have trouble restarting a node + +## *May 31, 2018, 2:00 EST* - Testnet Halt + +- A validator equivocated last week and Evidence is being rampantly gossipped +- Peers that can't process the evidence (either too far behind or too far ahead) are disconnecting from the peers that + sent it, causing high peer turn-over +- The high peer turn-over may be causing a memory-leak, resulting in some nodes + crashing and the testnet halting +- We need to fix some issues in the EvidenceReactor to address this and also + investigate the possible memory-leak + +## *May 29, 2018* - New Release + +- Released v0.17.3 with update for Tendermint v0.19.6 +- Fixes fast-sync bug +- Please update to this to sync with the testnet diff --git a/cmd/gaia/testnets/gaia-5001/adrian.json b/cmd/gaia/testnets/gaia-5001/adrian.json new file mode 100644 index 0000000000..7ca99cb1e9 --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/adrian.json @@ -0,0 +1,20 @@ +{ + "node_id": "1ebc5ca705b3ae1c06a0888ff1287ada82149dc3", + "ip": "138.68.77.24", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" + }, + "power": 100, + "name": "adrian" + }, + "app_gen_tx": { + "name": "default", + "address": "D9C12CB5186FE0018179742FD3110EE534C63460", + "pub_key": { + "type": "AC26791624DE60", + "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/anton.json b/cmd/gaia/testnets/gaia-5001/anton.json new file mode 100644 index 0000000000..701e858874 --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/anton.json @@ -0,0 +1,20 @@ +{ + "node_id": "c272ae3cff7558db2c6195eea38fd43fd08406dc", + "ip": "206.189.31.178", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "tJlZJWjOpYvRitYFTWNPTaUtvQVf+hoNjlfI84VPqvI=" + }, + "power": 100, + "name": "anton" + }, + "app_gen_tx": { + "name": "default", + "address": "E766088FD171906289617F60BF0014C46F0F85EC", + "pub_key": { + "type": "AC26791624DE60", + "value": "tJlZJWjOpYvRitYFTWNPTaUtvQVf+hoNjlfI84VPqvI=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/aurel.json b/cmd/gaia/testnets/gaia-5001/aurel.json new file mode 100644 index 0000000000..0c2ea81668 --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/aurel.json @@ -0,0 +1,20 @@ +{ + "node_id": "aef085c4bfed0c1ffc6705f2e1e3bf85e5164600", + "ip": "45.77.53.208", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" + }, + "power": 100, + "name": "aurel" + }, + "app_gen_tx": { + "name": "aurel", + "address": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "pub_key": { + "type": "AC26791624DE60", + "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/bucky.json b/cmd/gaia/testnets/gaia-5001/bucky.json new file mode 100644 index 0000000000..fc4bb51cde --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/bucky.json @@ -0,0 +1,20 @@ +{ + "node_id": "b0dd378c3fbc4c156cd6d302a799f0d2e4227201", + "ip": "159.89.121.174", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" + }, + "power": 100, + "name": "bucky" + }, + "app_gen_tx": { + "name": "bucky", + "address": "935E48ED79F1006ED135553768E1D9A768747CF6", + "pub_key": { + "type": "AC26791624DE60", + "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/cwgoes.json b/cmd/gaia/testnets/gaia-5001/cwgoes.json new file mode 100644 index 0000000000..dce7e20c9f --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/cwgoes.json @@ -0,0 +1,20 @@ +{ + "node_id": "e25603602d8cf8542570ad0e311d50f55f497f85", + "ip": "158.69.63.13", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" + }, + "power": 100, + "name": "cwgoes" + }, + "app_gen_tx": { + "name": "cwgoes", + "address": "328FBB8EA315D070DF908982A5F91A3618001D20", + "pub_key": { + "type": "AC26791624DE60", + "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/iris.json b/cmd/gaia/testnets/gaia-5001/iris.json new file mode 100644 index 0000000000..1a1019672c --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/iris.json @@ -0,0 +1,20 @@ +{ + "node_id": "aabf05a67b2f399807dc602d05bf97b0ed283ac2", + "ip": "116.62.62.39", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" + }, + "power": 100, + "name": "iris" + }, + "app_gen_tx": { + "name": "=suyu", + "address": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "pub_key": { + "type": "AC26791624DE60", + "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" + } + } +} \ No newline at end of file diff --git a/cmd/gaia/testnets/gaia-5001/lino.json b/cmd/gaia/testnets/gaia-5001/lino.json new file mode 100644 index 0000000000..5bc98bb6ed --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/lino.json @@ -0,0 +1,20 @@ +{ + "node_id": "79466a03e9d4b4648a7dd8cead1fa7121ce76ee3", + "ip": "34.235.130.1", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" + }, + "power": 100, + "name": "lino" + }, + "app_gen_tx": { + "name": "lino", + "address": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "pub_key": { + "type": "AC26791624DE60", + "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/pbostrom.json b/cmd/gaia/testnets/gaia-5001/pbostrom.json new file mode 100644 index 0000000000..59cd469504 --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/pbostrom.json @@ -0,0 +1,20 @@ +{ + "node_id": "adb290585a2753bf1a520c76802b0dab3dffa895", + "ip": "34.201.21.179", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" + }, + "power": 100, + "name": "pbostrom" + }, + "app_gen_tx": { + "name": "default", + "address": "109720515B4F8C0858DA3521E448262334534FFD", + "pub_key": { + "type": "AC26791624DE60", + "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/poldsam.json b/cmd/gaia/testnets/gaia-5001/poldsam.json new file mode 100644 index 0000000000..8149a92592 --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/poldsam.json @@ -0,0 +1,20 @@ +{ + "node_id": "678503e6c8f50db7279c7da3cb9b072aac4bc0d5", + "ip": "35.193.188.125", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" + }, + "power": 100, + "name": "polsdam" + }, + "app_gen_tx": { + "name": "poldsam", + "address": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "pub_key": { + "type": "AC26791624DE60", + "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/staked.json b/cmd/gaia/testnets/gaia-5001/staked.json new file mode 100644 index 0000000000..f39cced6b8 --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/staked.json @@ -0,0 +1,20 @@ +{ + "node_id": "3519f05985394107e0b2e285361b7e012adb1113", + "ip": "54.209.118.64", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "vq0V0BjpmIh6WyNnFpMaO5LyUK2FamkNt65eJYa5AaQ=" + }, + "power": 100, + "name": "staked" + }, + "app_gen_tx": { + "name": "default", + "address": "935E04662697134905706A4CCDB822AC6FC11C2E", + "pub_key": { + "type": "AC26791624DE60", + "value": "vq0V0BjpmIh6WyNnFpMaO5LyUK2FamkNt65eJYa5AaQ=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/zach.json b/cmd/gaia/testnets/gaia-5001/zach.json new file mode 100644 index 0000000000..76a08cc925 --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/zach.json @@ -0,0 +1,20 @@ +{ + "node_id": "8a2802fb25d352f3e7e277559a4f683780c3ef22", + "ip": "167.99.191.184", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" + }, + "power": 100, + "name": "" + }, + "app_gen_tx": { + "name": "zach", + "address": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "pub_key": { + "type": "AC26791624DE60", + "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-5001/zaki.json b/cmd/gaia/testnets/gaia-5001/zaki.json new file mode 100644 index 0000000000..956f2bf8ce --- /dev/null +++ b/cmd/gaia/testnets/gaia-5001/zaki.json @@ -0,0 +1,20 @@ +{ + "node_id": "30b45459e4881680c0ef1750fde136fefa6c3b98", + "ip": "35.184.182.143", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" + }, + "power": 100, + "name": "zaki" + }, + "app_gen_tx": { + "name": "zaki", + "address": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "pub_key": { + "type": "AC26791624DE60", + "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" + } + } +} diff --git a/cmd/gaia/testnets/gaia-6000/genesis.json b/cmd/gaia/testnets/gaia-6000/genesis.json new file mode 100644 index 0000000000..aefab92869 --- /dev/null +++ b/cmd/gaia/testnets/gaia-6000/genesis.json @@ -0,0 +1,1459 @@ +{ + "genesis_time": "2018-05-15T18:29:12.38288148Z", + "chain_id": "gaia-6000", + "consensus_params": { + "block_size_params": { + "max_bytes": 22020096, + "max_txs": 100000, + "max_gas": -1 + }, + "tx_size_params": { + "max_bytes": 10240, + "max_gas": -1 + }, + "block_gossip_params": { + "block_part_size_bytes": 65536 + }, + "evidence_params": { + "max_age": 100000 + } + }, + "validators": [ + { + "pub_key": { + "type": "AC26791624DE60", + "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" + }, + "power": 1000, + "name": "adrian" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" + }, + "power": 1000, + "name": "zaki" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "bIvXwf0qlOy0rO0SY/h8FfsqyW/AMpGL2yUhUNOY7hs=" + }, + "power": 100, + "name": "staked" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" + }, + "power": 1000, + "name": "polsdam" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" + }, + "power": 1000, + "name": "lino" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" + }, + "power": 100, + "name": "" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" + }, + "power": 1000, + "name": "iris" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" + }, + "power": 1000, + "name": "pbostrom" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" + }, + "power": 1000, + "name": "aurel" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" + }, + "power": 1000, + "name": "bucky" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" + }, + "power": 100, + "name": "cwgoes" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "TNPLvN6f6QoSLJqGHzIfbraBoSw3emr9Sk2Us94M4gM=" + }, + "power": 1000, + "name": "bdnet" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "cvGYknYP9XMUzqlXZde7lRpvAp/kZiSRYHg66krJNxQ=" + }, + "power": 1000, + "name": "melea-trust" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" + }, + "power": 1000, + "name": "naruemon" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "rcl+kuM69Un/a7e+fQsQrCEtT1g04tFviOeq2GygSIw=" + }, + "power": 1000, + "name": "idoor" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "S9urD5q7je21qp5vEobiURdWrtJwvqMsfZGQhb8GOBQ=" + }, + "power": 1000, + "name": "ATEAM1" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "vSr94aI+zfF3D8Cr2VtCXPpfgj7t2ck8SlZxRsfn7gk=" + }, + "power": 1000, + "name": "figmatt" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "p5ijoVwp2zmA7RkXXvPl+yqdnlaWMwoV2pYIN8bDyFs=" + }, + "power": 1000, + "name": "jla-bsd" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "KOdWpo4aQFrLxVlkyc66p7m6mBNnPLmGuO4Z4L+CI1Y=" + }, + "power": 1000, + "name": "Gold" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "VfOsmcON77auerRc9zKwOR+CvL0sj1nA45hS2WqX1xE=" + }, + "power": 1000, + "name": "nylira" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "QYONAknaJqx3OKPSKraDrOPkx6xssezYtXVS84nZvZE=" + }, + "power": 1000, + "name": "BKCM" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "PyFJmNrUres3QOkj2BjxplCxrOF+HDFGohi3tRKsToY=" + }, + "power": 1000, + "name": "Dev's Validator" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "s4ER09+WeX10euzGyK7xDW7+myQVXt3Plup8IHUE4nk=" + }, + "power": 1000, + "name": "Staking Facilities" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "OPxj9edXgufNEjYNhZKqLgmYnK4A3nGw3rxaFQrHn24=" + }, + "power": 1000, + "name": "nuevax" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "Hi2rtbdJdQtOe3Kq4OoD/xkWJbIjIsUI9qgLQ6TlhiM=" + }, + "power": 1000, + "name": "vultr.guest" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "ah3JtmBA7gbxSiimPsLqQlV85gpNOUBJMvnxGx8eVlo=" + }, + "power": 1000, + "name": "forebole" + } + ], + "app_hash": "", + "app_state": { + "accounts": [ + { + "address": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "coins": [ + { + "denom": "devToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "coins": [ + { + "denom": "adrianToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "109720515B4F8C0858DA3521E448262334534FFD", + "coins": [ + { + "denom": "defaultToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "coins": [ + { + "denom": "aurelToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "328FBB8EA315D070DF908982A5F91A3618001D20", + "coins": [ + { + "denom": "cwgoesToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "coins": [ + { + "denom": "BKCMToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "coins": [ + { + "denom": "BDToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "coins": [ + { + "denom": "suyuToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "coins": [ + { + "denom": "linoToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "coins": [ + { + "denom": "stakingToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "935E04662697134905706A4CCDB822AC6FC11C2E", + "coins": [ + { + "denom": "defaultToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "935E48ED79F1006ED135553768E1D9A768747CF6", + "coins": [ + { + "denom": "buckyToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "99FFAEE5BF6040EADA2F26548C4A702619797C9F", + "coins": [ + { + "denom": "kwunyeungToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "zachToken", + "amount": 1000 + } + ] + }, + { + "address": "A323EC45243D600204BA3D298E3C20322D08C84C", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "nuevaxToken", + "amount": 1000 + } + ] + }, + { + "address": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "dokiaToken", + "amount": 1000 + } + ] + }, + { + "address": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "forboleToken", + "amount": 1000 + } + ] + }, + { + "address": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "coins": [ + { + "denom": "steak", + "amount": 100 + }, + { + "denom": "pengToken", + "amount": 1000 + } + ] + }, + { + "address": "FD30D5C983FFEDEC069C3DDFCF270E41A556A86E", + "coins": [ + { + "denom": "steak", + "amount": 900 + }, + { + "denom": "faucetToken", + "amount": 10000000 + } + ] + }, + { + "address": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "goldToken", + "amount": 100 + } + ] + }, + { + "address": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "jlaToken", + "amount": 100 + } + ] + }, + { + "address": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "figmattToken", + "amount": 100 + } + ] + }, + { + "address": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "ATEAM1Token", + "amount": 100 + } + ] + }, + { + "address": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "idoorToken", + "amount": 100 + } + ] + }, + { + "address": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "naruemonToken", + "amount": 100 + } + ] + }, + { + "address": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "zakiToken", + "amount": 1000 + } + ] + }, + { + "address": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "trustToken", + "amount": 1000 + } + ] + }, + { + "address": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "coins": [ + { + "denom": "poldsamToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + } + ], + "stake": { + "pool": { + "loose_unbonded_tokens": 2350, + "unbonded_tokens": 0, + "unbonding_tokens": 0, + "bonded_tokens": 25200, + "unbonded_shares": "0", + "unbonding_shares": "0", + "bonded_shares": "25200", + "inflation_last_time": 0, + "inflation": "9012837/100000000", + "date_last_commission_reset": 0, + "prev_bonded_shares": "0" + }, + "params": { + "inflation_rate_change": "13/100", + "inflation_max": "1/5", + "inflation_min": "7/100", + "goal_bonded": "67/100", + "max_validators": 100, + "bond_denom": "steak" + }, + "bonds": [ + { + "delegator_addr": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "validator_addr": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "109720515B4F8C0858DA3521E448262334534FFD", + "validator_addr": "109720515B4F8C0858DA3521E448262334534FFD", + "shares": "100", + "height": 0 + }, + { + "delegator_addr": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "validator_addr": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "328FBB8EA315D070DF908982A5F91A3618001D20", + "validator_addr": "328FBB8EA315D070DF908982A5F91A3618001D20", + "shares": "100", + "height": 0 + }, + { + "delegator_addr": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "validator_addr": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "validator_addr": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "validator_addr": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "validator_addr": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "validator_addr": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "935E04662697134905706A4CCDB822AC6FC11C2E", + "validator_addr": "935E04662697134905706A4CCDB822AC6FC11C2E", + "shares": "100", + "height": 0 + }, + { + "delegator_addr": "935E48ED79F1006ED135553768E1D9A768747CF6", + "validator_addr": "935E48ED79F1006ED135553768E1D9A768747CF6", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "validator_addr": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "shares": "100", + "height": 0 + }, + { + "delegator_addr": "A323EC45243D600204BA3D298E3C20322D08C84C", + "validator_addr": "A323EC45243D600204BA3D298E3C20322D08C84C", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "validator_addr": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "validator_addr": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "validator_addr": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "validator_addr": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "validator_addr": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "validator_addr": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "validator_addr": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "validator_addr": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "validator_addr": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "validator_addr": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "validator_addr": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "validator_addr": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "validator_addr": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "shares": "1000", + "height": 0 + } + ], + "validators": [ + { + "owner": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "pub_key": { + "type": "AC26791624DE60", + "value": "PyFJmNrUres3QOkj2BjxplCxrOF+HDFGohi3tRKsToY=" + }, + "description": { + "moniker": "Dev's Validator", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "109720515B4F8C0858DA3521E448262334534FFD", + "pub_key": { + "type": "AC26791624DE60", + "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" + }, + "description": { + "moniker": "", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "100" + }, + "delegator_shares": "100", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "pub_key": { + "type": "AC26791624DE60", + "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" + }, + "description": { + "moniker": "aurel", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "328FBB8EA315D070DF908982A5F91A3618001D20", + "pub_key": { + "type": "AC26791624DE60", + "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" + }, + "description": { + "moniker": "cwgoes", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "100" + }, + "delegator_shares": "100", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "pub_key": { + "type": "AC26791624DE60", + "value": "QYONAknaJqx3OKPSKraDrOPkx6xssezYtXVS84nZvZE=" + }, + "description": { + "moniker": "BKCM", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "pub_key": { + "type": "AC26791624DE60", + "value": "TNPLvN6f6QoSLJqGHzIfbraBoSw3emr9Sk2Us94M4gM=" + }, + "description": { + "moniker": "bdnet", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "pub_key": { + "type": "AC26791624DE60", + "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" + }, + "description": { + "moniker": "suyu", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "pub_key": { + "type": "AC26791624DE60", + "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" + }, + "description": { + "moniker": "lino", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "pub_key": { + "type": "AC26791624DE60", + "value": "s4ER09+WeX10euzGyK7xDW7+myQVXt3Plup8IHUE4nk=" + }, + "description": { + "moniker": "Staking Facilities", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "935E04662697134905706A4CCDB822AC6FC11C2E", + "pub_key": { + "type": "AC26791624DE60", + "value": "bIvXwf0qlOy0rO0SY/h8FfsqyW/AMpGL2yUhUNOY7hs=" + }, + "description": { + "moniker": "default", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "100" + }, + "delegator_shares": "100", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "935E48ED79F1006ED135553768E1D9A768747CF6", + "pub_key": { + "type": "AC26791624DE60", + "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" + }, + "description": { + "moniker": "bucky", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "pub_key": { + "type": "AC26791624DE60", + "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" + }, + "description": { + "moniker": "zach", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "100" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "A323EC45243D600204BA3D298E3C20322D08C84C", + "pub_key": { + "type": "AC26791624DE60", + "value": "OPxj9edXgufNEjYNhZKqLgmYnK4A3nGw3rxaFQrHn24=" + }, + "description": { + "moniker": "nuevax", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "pub_key": { + "type": "AC26791624DE60", + "value": "Hi2rtbdJdQtOe3Kq4OoD/xkWJbIjIsUI9qgLQ6TlhiM=" + }, + "description": { + "moniker": "vultr.guest", + "identity": "", + "website": "https://ion.dokia.capital/", + "details": "DokiaValidator" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "pub_key": { + "type": "AC26791624DE60", + "value": "ah3JtmBA7gbxSiimPsLqQlV85gpNOUBJMvnxGx8eVlo=" + }, + "description": { + "moniker": "forbole", + "identity": "", + "website": "https://www.forbole.com", + "details": "Recommend. Refer. Reward" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "pub_key": { + "type": "AC26791624DE60", + "value": "VfOsmcON77auerRc9zKwOR+CvL0sj1nA45hS2WqX1xE=" + }, + "description": { + "moniker": "nylira", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "pub_key": { + "type": "AC26791624DE60", + "value": "KOdWpo4aQFrLxVlkyc66p7m6mBNnPLmGuO4Z4L+CI1Y=" + }, + "description": { + "moniker": "Gold", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "pub_key": { + "type": "AC26791624DE60", + "value": "p5ijoVwp2zmA7RkXXvPl+yqdnlaWMwoV2pYIN8bDyFs=" + }, + "description": { + "moniker": "jla-bsd", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "pub_key": { + "type": "AC26791624DE60", + "value": "vSr94aI+zfF3D8Cr2VtCXPpfgj7t2ck8SlZxRsfn7gk=" + }, + "description": { + "moniker": "figmatt", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "pub_key": { + "type": "AC26791624DE60", + "value": "S9urD5q7je21qp5vEobiURdWrtJwvqMsfZGQhb8GOBQ=" + }, + "description": { + "moniker": "ATEAM1", + "identity": "", + "website": "", + "details": "ATEAM1" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "pub_key": { + "type": "AC26791624DE60", + "value": "rcl+kuM69Un/a7e+fQsQrCEtT1g04tFviOeq2GygSIw=" + }, + "description": { + "moniker": "idoor", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "pub_key": { + "type": "AC26791624DE60", + "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" + }, + "description": { + "moniker": "naruemon", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "pub_key": { + "type": "AC26791624DE60", + "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" + }, + "description": { + "moniker": "Adrian Brink - Cryptium Labs", + "identity": "", + "website": "https://cryptium.ch", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "pub_key": { + "type": "AC26791624DE60", + "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" + }, + "description": { + "moniker": "zaki", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "pub_key": { + "type": "AC26791624DE60", + "value": "cvGYknYP9XMUzqlXZde7lRpvAp/kZiSRYHg66krJNxQ=" + }, + "description": { + "moniker": "trust", + "identity": "", + "website": "http://cosmos-trust.com", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "pub_key": { + "type": "AC26791624DE60", + "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" + }, + "description": { + "moniker": "proof-of-audit", + "identity": "", + "website": "https://proof-of-audit.com", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + } + ] + } + } +} diff --git a/cmd/gaia/testnets/gaia-6001/genesis.json b/cmd/gaia/testnets/gaia-6001/genesis.json new file mode 100644 index 0000000000..512d761bed --- /dev/null +++ b/cmd/gaia/testnets/gaia-6001/genesis.json @@ -0,0 +1,1459 @@ +{ + "genesis_time": "2018-05-15T18:29:12.38288148Z", + "chain_id": "gaia-6001", + "consensus_params": { + "block_size_params": { + "max_bytes": 22020096, + "max_txs": 100000, + "max_gas": -1 + }, + "tx_size_params": { + "max_bytes": 10240, + "max_gas": -1 + }, + "block_gossip_params": { + "block_part_size_bytes": 65536 + }, + "evidence_params": { + "max_age": 100000 + } + }, + "validators": [ + { + "pub_key": { + "type": "AC26791624DE60", + "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" + }, + "power": 1000, + "name": "adrian" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" + }, + "power": 1000, + "name": "zaki" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "bIvXwf0qlOy0rO0SY/h8FfsqyW/AMpGL2yUhUNOY7hs=" + }, + "power": 100, + "name": "staked" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" + }, + "power": 1000, + "name": "polsdam" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" + }, + "power": 1000, + "name": "lino" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" + }, + "power": 100, + "name": "" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" + }, + "power": 1000, + "name": "iris" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" + }, + "power": 1000, + "name": "pbostrom" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" + }, + "power": 1000, + "name": "aurel" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" + }, + "power": 1000, + "name": "bucky" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" + }, + "power": 100, + "name": "cwgoes" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "TNPLvN6f6QoSLJqGHzIfbraBoSw3emr9Sk2Us94M4gM=" + }, + "power": 1000, + "name": "bdnet" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "cvGYknYP9XMUzqlXZde7lRpvAp/kZiSRYHg66krJNxQ=" + }, + "power": 1000, + "name": "melea-trust" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" + }, + "power": 1000, + "name": "naruemon" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "rcl+kuM69Un/a7e+fQsQrCEtT1g04tFviOeq2GygSIw=" + }, + "power": 1000, + "name": "idoor" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "S9urD5q7je21qp5vEobiURdWrtJwvqMsfZGQhb8GOBQ=" + }, + "power": 1000, + "name": "ATEAM1" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "vSr94aI+zfF3D8Cr2VtCXPpfgj7t2ck8SlZxRsfn7gk=" + }, + "power": 1000, + "name": "figmatt" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "p5ijoVwp2zmA7RkXXvPl+yqdnlaWMwoV2pYIN8bDyFs=" + }, + "power": 1000, + "name": "jla-bsd" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "KOdWpo4aQFrLxVlkyc66p7m6mBNnPLmGuO4Z4L+CI1Y=" + }, + "power": 1000, + "name": "Gold" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "VfOsmcON77auerRc9zKwOR+CvL0sj1nA45hS2WqX1xE=" + }, + "power": 1000, + "name": "nylira" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "QYONAknaJqx3OKPSKraDrOPkx6xssezYtXVS84nZvZE=" + }, + "power": 1000, + "name": "BKCM" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "PyFJmNrUres3QOkj2BjxplCxrOF+HDFGohi3tRKsToY=" + }, + "power": 1000, + "name": "Dev's Validator" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "s4ER09+WeX10euzGyK7xDW7+myQVXt3Plup8IHUE4nk=" + }, + "power": 1000, + "name": "Staking Facilities" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "OPxj9edXgufNEjYNhZKqLgmYnK4A3nGw3rxaFQrHn24=" + }, + "power": 1000, + "name": "nuevax" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "Hi2rtbdJdQtOe3Kq4OoD/xkWJbIjIsUI9qgLQ6TlhiM=" + }, + "power": 1000, + "name": "vultr.guest" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "ah3JtmBA7gbxSiimPsLqQlV85gpNOUBJMvnxGx8eVlo=" + }, + "power": 1000, + "name": "forebole" + } + ], + "app_hash": "", + "app_state": { + "accounts": [ + { + "address": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "coins": [ + { + "denom": "devToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "coins": [ + { + "denom": "adrianToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "109720515B4F8C0858DA3521E448262334534FFD", + "coins": [ + { + "denom": "defaultToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "coins": [ + { + "denom": "aurelToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "328FBB8EA315D070DF908982A5F91A3618001D20", + "coins": [ + { + "denom": "cwgoesToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "coins": [ + { + "denom": "BKCMToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "coins": [ + { + "denom": "BDToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "coins": [ + { + "denom": "suyuToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "coins": [ + { + "denom": "linoToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "coins": [ + { + "denom": "stakingToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "935E04662697134905706A4CCDB822AC6FC11C2E", + "coins": [ + { + "denom": "defaultToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "935E48ED79F1006ED135553768E1D9A768747CF6", + "coins": [ + { + "denom": "buckyToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "99FFAEE5BF6040EADA2F26548C4A702619797C9F", + "coins": [ + { + "denom": "kwunyeungToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "zachToken", + "amount": 1000 + } + ] + }, + { + "address": "A323EC45243D600204BA3D298E3C20322D08C84C", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "nuevaxToken", + "amount": 1000 + } + ] + }, + { + "address": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "dokiaToken", + "amount": 1000 + } + ] + }, + { + "address": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "forboleToken", + "amount": 1000 + } + ] + }, + { + "address": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "coins": [ + { + "denom": "steak", + "amount": 100 + }, + { + "denom": "pengToken", + "amount": 1000 + } + ] + }, + { + "address": "FD30D5C983FFEDEC069C3DDFCF270E41A556A86E", + "coins": [ + { + "denom": "steak", + "amount": 900 + }, + { + "denom": "faucetToken", + "amount": 10000000 + } + ] + }, + { + "address": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "goldToken", + "amount": 100 + } + ] + }, + { + "address": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "jlaToken", + "amount": 100 + } + ] + }, + { + "address": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "figmattToken", + "amount": 100 + } + ] + }, + { + "address": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "ATEAM1Token", + "amount": 100 + } + ] + }, + { + "address": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "idoorToken", + "amount": 100 + } + ] + }, + { + "address": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "naruemonToken", + "amount": 100 + } + ] + }, + { + "address": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "zakiToken", + "amount": 1000 + } + ] + }, + { + "address": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "trustToken", + "amount": 1000 + } + ] + }, + { + "address": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "coins": [ + { + "denom": "poldsamToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + } + ], + "stake": { + "pool": { + "loose_unbonded_tokens": 2300, + "unbonded_tokens": 0, + "unbonding_tokens": 0, + "bonded_tokens": 23300, + "unbonded_shares": "0", + "unbonding_shares": "0", + "bonded_shares": "23300", + "inflation_last_time": 0, + "inflation": "9012837/100000000", + "date_last_commission_reset": 0, + "prev_bonded_shares": "0" + }, + "params": { + "inflation_rate_change": "13/100", + "inflation_max": "1/5", + "inflation_min": "7/100", + "goal_bonded": "67/100", + "max_validators": 100, + "bond_denom": "steak" + }, + "bonds": [ + { + "delegator_addr": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "validator_addr": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "109720515B4F8C0858DA3521E448262334534FFD", + "validator_addr": "109720515B4F8C0858DA3521E448262334534FFD", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "validator_addr": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "328FBB8EA315D070DF908982A5F91A3618001D20", + "validator_addr": "328FBB8EA315D070DF908982A5F91A3618001D20", + "shares": "100", + "height": 0 + }, + { + "delegator_addr": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "validator_addr": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "validator_addr": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "validator_addr": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "validator_addr": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "validator_addr": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "935E04662697134905706A4CCDB822AC6FC11C2E", + "validator_addr": "935E04662697134905706A4CCDB822AC6FC11C2E", + "shares": "100", + "height": 0 + }, + { + "delegator_addr": "935E48ED79F1006ED135553768E1D9A768747CF6", + "validator_addr": "935E48ED79F1006ED135553768E1D9A768747CF6", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "validator_addr": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "shares": "100", + "height": 0 + }, + { + "delegator_addr": "A323EC45243D600204BA3D298E3C20322D08C84C", + "validator_addr": "A323EC45243D600204BA3D298E3C20322D08C84C", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "validator_addr": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "validator_addr": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "validator_addr": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "validator_addr": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "validator_addr": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "validator_addr": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "validator_addr": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "validator_addr": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "validator_addr": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "validator_addr": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "validator_addr": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "validator_addr": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "validator_addr": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "shares": "1000", + "height": 0 + } + ], + "validators": [ + { + "owner": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "pub_key": { + "type": "AC26791624DE60", + "value": "PyFJmNrUres3QOkj2BjxplCxrOF+HDFGohi3tRKsToY=" + }, + "description": { + "moniker": "Dev's Validator", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "109720515B4F8C0858DA3521E448262334534FFD", + "pub_key": { + "type": "AC26791624DE60", + "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" + }, + "description": { + "moniker": "", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "pub_key": { + "type": "AC26791624DE60", + "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" + }, + "description": { + "moniker": "aurel", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "328FBB8EA315D070DF908982A5F91A3618001D20", + "pub_key": { + "type": "AC26791624DE60", + "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" + }, + "description": { + "moniker": "cwgoes", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "100" + }, + "delegator_shares": "100", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "pub_key": { + "type": "AC26791624DE60", + "value": "QYONAknaJqx3OKPSKraDrOPkx6xssezYtXVS84nZvZE=" + }, + "description": { + "moniker": "BKCM", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "pub_key": { + "type": "AC26791624DE60", + "value": "TNPLvN6f6QoSLJqGHzIfbraBoSw3emr9Sk2Us94M4gM=" + }, + "description": { + "moniker": "bdnet", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "pub_key": { + "type": "AC26791624DE60", + "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" + }, + "description": { + "moniker": "suyu", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "pub_key": { + "type": "AC26791624DE60", + "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" + }, + "description": { + "moniker": "lino", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "pub_key": { + "type": "AC26791624DE60", + "value": "s4ER09+WeX10euzGyK7xDW7+myQVXt3Plup8IHUE4nk=" + }, + "description": { + "moniker": "Staking Facilities", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "935E04662697134905706A4CCDB822AC6FC11C2E", + "pub_key": { + "type": "AC26791624DE60", + "value": "bIvXwf0qlOy0rO0SY/h8FfsqyW/AMpGL2yUhUNOY7hs=" + }, + "description": { + "moniker": "default", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "100" + }, + "delegator_shares": "100", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "935E48ED79F1006ED135553768E1D9A768747CF6", + "pub_key": { + "type": "AC26791624DE60", + "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" + }, + "description": { + "moniker": "bucky", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "pub_key": { + "type": "AC26791624DE60", + "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" + }, + "description": { + "moniker": "zach", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "100" + }, + "delegator_shares": "100", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "A323EC45243D600204BA3D298E3C20322D08C84C", + "pub_key": { + "type": "AC26791624DE60", + "value": "OPxj9edXgufNEjYNhZKqLgmYnK4A3nGw3rxaFQrHn24=" + }, + "description": { + "moniker": "nuevax", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "pub_key": { + "type": "AC26791624DE60", + "value": "Hi2rtbdJdQtOe3Kq4OoD/xkWJbIjIsUI9qgLQ6TlhiM=" + }, + "description": { + "moniker": "vultr.guest", + "identity": "", + "website": "https://ion.dokia.capital/", + "details": "DokiaValidator" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "pub_key": { + "type": "AC26791624DE60", + "value": "ah3JtmBA7gbxSiimPsLqQlV85gpNOUBJMvnxGx8eVlo=" + }, + "description": { + "moniker": "forbole", + "identity": "", + "website": "https://www.forbole.com", + "details": "Recommend. Refer. Reward" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "pub_key": { + "type": "AC26791624DE60", + "value": "VfOsmcON77auerRc9zKwOR+CvL0sj1nA45hS2WqX1xE=" + }, + "description": { + "moniker": "nylira", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "pub_key": { + "type": "AC26791624DE60", + "value": "KOdWpo4aQFrLxVlkyc66p7m6mBNnPLmGuO4Z4L+CI1Y=" + }, + "description": { + "moniker": "Gold", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "pub_key": { + "type": "AC26791624DE60", + "value": "p5ijoVwp2zmA7RkXXvPl+yqdnlaWMwoV2pYIN8bDyFs=" + }, + "description": { + "moniker": "jla-bsd", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "pub_key": { + "type": "AC26791624DE60", + "value": "vSr94aI+zfF3D8Cr2VtCXPpfgj7t2ck8SlZxRsfn7gk=" + }, + "description": { + "moniker": "figmatt", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "pub_key": { + "type": "AC26791624DE60", + "value": "S9urD5q7je21qp5vEobiURdWrtJwvqMsfZGQhb8GOBQ=" + }, + "description": { + "moniker": "ATEAM1", + "identity": "", + "website": "", + "details": "ATEAM1" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "pub_key": { + "type": "AC26791624DE60", + "value": "rcl+kuM69Un/a7e+fQsQrCEtT1g04tFviOeq2GygSIw=" + }, + "description": { + "moniker": "idoor", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "pub_key": { + "type": "AC26791624DE60", + "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" + }, + "description": { + "moniker": "naruemon", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "pub_key": { + "type": "AC26791624DE60", + "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" + }, + "description": { + "moniker": "Adrian Brink - Cryptium Labs", + "identity": "", + "website": "https://cryptium.ch", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "pub_key": { + "type": "AC26791624DE60", + "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" + }, + "description": { + "moniker": "zaki", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "pub_key": { + "type": "AC26791624DE60", + "value": "cvGYknYP9XMUzqlXZde7lRpvAp/kZiSRYHg66krJNxQ=" + }, + "description": { + "moniker": "trust", + "identity": "", + "website": "http://cosmos-trust.com", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "pub_key": { + "type": "AC26791624DE60", + "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" + }, + "description": { + "moniker": "proof-of-audit", + "identity": "", + "website": "https://proof-of-audit.com", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + } + ] + } + } +} diff --git a/version/version.go b/version/version.go index 116f1ff287..20074c7bcd 100644 --- a/version/version.go +++ b/version/version.go @@ -9,7 +9,7 @@ const Maj = "0" const Min = "18" const Fix = "0" -const Version = "0.18.0-dev" +const Version = "0.18.0" // GitCommit set by build flags var GitCommit = "" From 219a16c6de8641c59785688fdb9099acd4437bd6 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 13 Jun 2018 09:57:54 +0200 Subject: [PATCH 250/548] Revert "Merge PR #1232: Bucky/gaiadebug" This reverts commit 37bba35c91e7ade8f7a160ceb2c37b322fed42f1. --- CHANGELOG.md | 21 +- Makefile | 5 +- README.md | 8 - client/lcd/lcd_test.go | 7 +- cmd/gaia/cmd/gaiadebug/hack.go | 243 ---- cmd/gaia/cmd/gaiadebug/main.go | 159 --- cmd/gaia/testnets/README.md | 258 ---- cmd/gaia/testnets/STATUS.md | 74 -- cmd/gaia/testnets/gaia-5001/adrian.json | 20 - cmd/gaia/testnets/gaia-5001/anton.json | 20 - cmd/gaia/testnets/gaia-5001/aurel.json | 20 - cmd/gaia/testnets/gaia-5001/bucky.json | 20 - cmd/gaia/testnets/gaia-5001/cwgoes.json | 20 - cmd/gaia/testnets/gaia-5001/iris.json | 20 - cmd/gaia/testnets/gaia-5001/lino.json | 20 - cmd/gaia/testnets/gaia-5001/pbostrom.json | 20 - cmd/gaia/testnets/gaia-5001/poldsam.json | 20 - cmd/gaia/testnets/gaia-5001/staked.json | 20 - cmd/gaia/testnets/gaia-5001/zach.json | 20 - cmd/gaia/testnets/gaia-5001/zaki.json | 20 - cmd/gaia/testnets/gaia-6000/genesis.json | 1459 --------------------- cmd/gaia/testnets/gaia-6001/genesis.json | 1459 --------------------- version/version.go | 2 +- 23 files changed, 6 insertions(+), 3929 deletions(-) delete mode 100644 cmd/gaia/cmd/gaiadebug/hack.go delete mode 100644 cmd/gaia/cmd/gaiadebug/main.go delete mode 100644 cmd/gaia/testnets/README.md delete mode 100644 cmd/gaia/testnets/STATUS.md delete mode 100644 cmd/gaia/testnets/gaia-5001/adrian.json delete mode 100644 cmd/gaia/testnets/gaia-5001/anton.json delete mode 100644 cmd/gaia/testnets/gaia-5001/aurel.json delete mode 100644 cmd/gaia/testnets/gaia-5001/bucky.json delete mode 100644 cmd/gaia/testnets/gaia-5001/cwgoes.json delete mode 100644 cmd/gaia/testnets/gaia-5001/iris.json delete mode 100644 cmd/gaia/testnets/gaia-5001/lino.json delete mode 100644 cmd/gaia/testnets/gaia-5001/pbostrom.json delete mode 100644 cmd/gaia/testnets/gaia-5001/poldsam.json delete mode 100644 cmd/gaia/testnets/gaia-5001/staked.json delete mode 100644 cmd/gaia/testnets/gaia-5001/zach.json delete mode 100644 cmd/gaia/testnets/gaia-5001/zaki.json delete mode 100644 cmd/gaia/testnets/gaia-6000/genesis.json delete mode 100644 cmd/gaia/testnets/gaia-6001/genesis.json diff --git a/CHANGELOG.md b/CHANGELOG.md index f40117f82d..300b71fb6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,7 +24,7 @@ FIXES ## 0.18.0 -*June 9, 2018* +_2018-06-05_ BREAKING CHANGES @@ -87,27 +87,8 @@ BUG FIXES * query sequence via account store * fixed duplicate pub_key in stake.Validator * Auto-sequencing now works correctly -* [gaiacli] Fix error message when account isn't found when running gaiacli account -## 0.17.5 - -*June 5, 2018* - -Update to Tendermint v0.19.9 (Fix evidence reactor, mempool deadlock, WAL panic, -memory leak) - -## 0.17.4 - -*May 31, 2018* - -Update to Tendermint v0.19.7 (WAL fixes and more) - -## 0.17.3 - -*May 29, 2018* - -Update to Tendermint v0.19.6 (fix fast-sync halt) ## 0.17.5 diff --git a/Makefile b/Makefile index c0d18c4a39..d6444b0b62 100644 --- a/Makefile +++ b/Makefile @@ -46,9 +46,6 @@ install_examples: go install $(BUILD_FLAGS) ./examples/democoin/cmd/democoind go install $(BUILD_FLAGS) ./examples/democoin/cmd/democli -install_debug: - go install $(BUILD_FLAGS) ./cmd/gaia/cmd/gaiadebug - dist: @bash publish/dist.sh @bash publish/publish.sh @@ -160,4 +157,4 @@ remotenet-status: # To avoid unintended conflicts with file names, always add to .PHONY # unless there is a reason not to. # https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html -.PHONY: build build_examples install install_examples install_debug dist check_tools get_tools get_vendor_deps draw_deps test test_cli test_unit test_cover test_lint benchmark devdoc_init devdoc devdoc_save devdoc_update remotenet-start remotenet-stop remotenet-status +.PHONY: build build_examples install install_examples dist check_tools get_tools get_vendor_deps draw_deps test test_cli test_unit test_cover test_lint benchmark devdoc_init devdoc devdoc_save devdoc_update remotenet-start remotenet-stop remotenet-status diff --git a/README.md b/README.md index 3af98fb4f2..3faf2c8afd 100644 --- a/README.md +++ b/README.md @@ -18,14 +18,6 @@ master | [![CircleCI](https://circleci.com/gh/cosmos/cosmos-sdk/tree/master.s **Note**: Requires [Go 1.10+](https://golang.org/dl/) -## Testnet - -For more information on connecting to the testnet, see -[cmd/gaia/testnets](/cmd/gaia/testnets) - -For the latest status of the testnet, see the [status -file](/cmd/gaia/testnets/STATUS.md). - ## Overview diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index ba2937e050..946f70bbcb 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -396,10 +396,9 @@ func TestBonding(t *testing.T) { // TODO fix shares fn in staking // query sender - //acc := getAccount(t, sendAddr) - //coins := acc.GetCoins() - //assert.Equal(t, int64(98), coins.AmountOf(coinDenom)) - + //acc = getAccount(t, port, addr) + //coins = acc.GetCoins() + //assert.Equal(t, int64(70), coins.AmountOf(denom)) } //_____________________________________________________________________________ diff --git a/cmd/gaia/cmd/gaiadebug/hack.go b/cmd/gaia/cmd/gaiadebug/hack.go deleted file mode 100644 index 2c84184bf7..0000000000 --- a/cmd/gaia/cmd/gaiadebug/hack.go +++ /dev/null @@ -1,243 +0,0 @@ -package main - -import ( - "encoding/base64" - "encoding/hex" - "fmt" - "os" - "path" - - "github.com/spf13/cobra" - abci "github.com/tendermint/abci/types" - crypto "github.com/tendermint/go-crypto" - cmn "github.com/tendermint/tmlibs/common" - dbm "github.com/tendermint/tmlibs/db" - "github.com/tendermint/tmlibs/log" - - bam "github.com/cosmos/cosmos-sdk/baseapp" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/cosmos/cosmos-sdk/wire" - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/ibc" - "github.com/cosmos/cosmos-sdk/x/slashing" - "github.com/cosmos/cosmos-sdk/x/stake" - - gaia "github.com/cosmos/cosmos-sdk/cmd/gaia/app" -) - -func runHackCmd(cmd *cobra.Command, args []string) error { - - if len(args) != 1 { - return fmt.Errorf("Expected 1 arg") - } - - // ".gaiad" - dataDir := args[0] - dataDir = path.Join(dataDir, "data") - - // load the app - logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) - db, err := dbm.NewGoLevelDB("gaia", dataDir) - if err != nil { - fmt.Println(err) - os.Exit(1) - } - app := NewGaiaApp(logger, db) - - // print some info - id := app.LastCommitID() - lastBlockHeight := app.LastBlockHeight() - fmt.Println("ID", id) - fmt.Println("LastBlockHeight", lastBlockHeight) - - //---------------------------------------------------- - // XXX: start hacking! - //---------------------------------------------------- - // eg. gaia-6001 testnet bug - // We paniced when iterating through the "bypower" keys. - // The following powerKey was there, but the corresponding "trouble" validator did not exist. - // So here we do a binary search on the past states to find when the powerKey first showed up ... - - // owner of the validator the bonds, gets revoked, later unbonds, and then later is still found in the bypower store - trouble := hexToBytes("D3DC0FF59F7C3B548B7AFA365561B87FD0208AF8") - // this is his "bypower" key - powerKey := hexToBytes("05303030303030303030303033FFFFFFFFFFFF4C0C0000FFFED3DC0FF59F7C3B548B7AFA365561B87FD0208AF8") - - topHeight := lastBlockHeight - bottomHeight := int64(0) - checkHeight := topHeight - for { - // load the given version of the state - err = app.LoadVersion(checkHeight, app.keyMain) - if err != nil { - fmt.Println(err) - os.Exit(1) - } - ctx := app.NewContext(true, abci.Header{}) - - // check for the powerkey and the validator from the store - store := ctx.KVStore(app.keyStake) - res := store.Get(powerKey) - val, _ := app.stakeKeeper.GetValidator(ctx, trouble) - fmt.Println("checking height", checkHeight, res, val) - if res == nil { - bottomHeight = checkHeight - } else { - topHeight = checkHeight - } - checkHeight = (topHeight + bottomHeight) / 2 - } -} - -func base64ToPub(b64 string) crypto.PubKeyEd25519 { - data, _ := base64.StdEncoding.DecodeString(b64) - var pubKey crypto.PubKeyEd25519 - copy(pubKey[:], data) - return pubKey - -} - -func hexToBytes(h string) []byte { - trouble, _ := hex.DecodeString(h) - return trouble - -} - -//-------------------------------------------------------------------------------- -// NOTE: This is all copied from gaia/app/app.go -// so we can access internal fields! - -const ( - appName = "GaiaApp" -) - -// default home directories for expected binaries -var ( - DefaultCLIHome = os.ExpandEnv("$HOME/.gaiacli") - DefaultNodeHome = os.ExpandEnv("$HOME/.gaiad") -) - -// Extended ABCI application -type GaiaApp struct { - *bam.BaseApp - cdc *wire.Codec - - // keys to access the substores - keyMain *sdk.KVStoreKey - keyAccount *sdk.KVStoreKey - keyIBC *sdk.KVStoreKey - keyStake *sdk.KVStoreKey - keySlashing *sdk.KVStoreKey - - // Manage getting and setting accounts - accountMapper auth.AccountMapper - feeCollectionKeeper auth.FeeCollectionKeeper - coinKeeper bank.Keeper - ibcMapper ibc.Mapper - stakeKeeper stake.Keeper - slashingKeeper slashing.Keeper -} - -func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { - cdc := MakeCodec() - - // create your application object - var app = &GaiaApp{ - BaseApp: bam.NewBaseApp(appName, cdc, logger, db), - cdc: cdc, - keyMain: sdk.NewKVStoreKey("main"), - keyAccount: sdk.NewKVStoreKey("acc"), - keyIBC: sdk.NewKVStoreKey("ibc"), - keyStake: sdk.NewKVStoreKey("stake"), - keySlashing: sdk.NewKVStoreKey("slashing"), - } - - // define the accountMapper - app.accountMapper = auth.NewAccountMapper( - app.cdc, - app.keyAccount, // target store - &auth.BaseAccount{}, // prototype - ) - - // add handlers - app.coinKeeper = bank.NewKeeper(app.accountMapper) - app.ibcMapper = ibc.NewMapper(app.cdc, app.keyIBC, app.RegisterCodespace(ibc.DefaultCodespace)) - app.stakeKeeper = stake.NewKeeper(app.cdc, app.keyStake, app.coinKeeper, app.RegisterCodespace(stake.DefaultCodespace)) - app.slashingKeeper = slashing.NewKeeper(app.cdc, app.keySlashing, app.stakeKeeper, app.RegisterCodespace(slashing.DefaultCodespace)) - - // register message routes - app.Router(). - AddRoute("bank", bank.NewHandler(app.coinKeeper)). - AddRoute("ibc", ibc.NewHandler(app.ibcMapper, app.coinKeeper)). - AddRoute("stake", stake.NewHandler(app.stakeKeeper)) - - // initialize BaseApp - app.SetInitChainer(app.initChainer) - app.SetBeginBlocker(app.BeginBlocker) - app.SetEndBlocker(app.EndBlocker) - app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, app.feeCollectionKeeper)) - app.MountStoresIAVL(app.keyMain, app.keyAccount, app.keyIBC, app.keyStake, app.keySlashing) - err := app.LoadLatestVersion(app.keyMain) - if err != nil { - cmn.Exit(err.Error()) - } - - return app -} - -// custom tx codec -func MakeCodec() *wire.Codec { - var cdc = wire.NewCodec() - ibc.RegisterWire(cdc) - bank.RegisterWire(cdc) - stake.RegisterWire(cdc) - slashing.RegisterWire(cdc) - auth.RegisterWire(cdc) - sdk.RegisterWire(cdc) - wire.RegisterCrypto(cdc) - return cdc -} - -// application updates every end block -func (app *GaiaApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { - tags := slashing.BeginBlocker(ctx, req, app.slashingKeeper) - - return abci.ResponseBeginBlock{ - Tags: tags.ToKVPairs(), - } -} - -// application updates every end block -func (app *GaiaApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { - validatorUpdates := stake.EndBlocker(ctx, app.stakeKeeper) - - return abci.ResponseEndBlock{ - ValidatorUpdates: validatorUpdates, - } -} - -// custom logic for gaia initialization -func (app *GaiaApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { - stateJSON := req.AppStateBytes - // TODO is this now the whole genesis file? - - var genesisState gaia.GenesisState - err := app.cdc.UnmarshalJSON(stateJSON, &genesisState) - if err != nil { - panic(err) // TODO https://github.com/cosmos/cosmos-sdk/issues/468 - // return sdk.ErrGenesisParse("").TraceCause(err, "") - } - - // load the accounts - for _, gacc := range genesisState.Accounts { - acc := gacc.ToAccount() - app.accountMapper.SetAccount(ctx, acc) - } - - // load the initial stake information - stake.InitGenesis(ctx, app.stakeKeeper, genesisState.StakeData) - return abci.ResponseInitChain{} - -} diff --git a/cmd/gaia/cmd/gaiadebug/main.go b/cmd/gaia/cmd/gaiadebug/main.go deleted file mode 100644 index 79045c07bb..0000000000 --- a/cmd/gaia/cmd/gaiadebug/main.go +++ /dev/null @@ -1,159 +0,0 @@ -package main - -import ( - "bytes" - "encoding/base64" - "encoding/hex" - "encoding/json" - "fmt" - "os" - "strconv" - "strings" - - gaia "github.com/cosmos/cosmos-sdk/cmd/gaia/app" - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/spf13/cobra" - crypto "github.com/tendermint/go-crypto" -) - -func init() { - rootCmd.AddCommand(txCmd) - rootCmd.AddCommand(pubkeyCmd) - rootCmd.AddCommand(hackCmd) - rootCmd.AddCommand(rawBytesCmd) -} - -var rootCmd = &cobra.Command{ - Use: "gaiadebug", - Short: "Gaia debug tool", - SilenceUsage: true, -} - -var txCmd = &cobra.Command{ - Use: "tx", - Short: "Decode a gaia tx from hex or base64", - RunE: runTxCmd, -} - -var pubkeyCmd = &cobra.Command{ - Use: "pubkey", - Short: "Decode a pubkey from hex or base64", - RunE: runPubKeyCmd, -} - -var hackCmd = &cobra.Command{ - Use: "hack", - Short: "Boilerplate to Hack on an existing state by scripting some Go...", - RunE: runHackCmd, -} - -var rawBytesCmd = &cobra.Command{ - Use: "raw-bytes", - Short: "Convert raw bytes output (eg. [10 21 13 255]) to hex", - RunE: runRawBytesCmd, -} - -func runRawBytesCmd(cmd *cobra.Command, args []string) error { - if len(args) != 1 { - return fmt.Errorf("Expected single arg") - } - stringBytes := args[0] - stringBytes = strings.Trim(stringBytes, "[") - stringBytes = strings.Trim(stringBytes, "]") - spl := strings.Split(stringBytes, " ") - - byteArray := []byte{} - for _, s := range spl { - b, err := strconv.Atoi(s) - if err != nil { - return err - } - byteArray = append(byteArray, byte(b)) - } - fmt.Printf("%X\n", byteArray) - return nil -} - -func runPubKeyCmd(cmd *cobra.Command, args []string) error { - if len(args) != 1 { - return fmt.Errorf("Expected single arg") - } - - pubkeyString := args[0] - - // try hex, then base64 - pubkeyBytes, err := hex.DecodeString(pubkeyString) - if err != nil { - var err2 error - pubkeyBytes, err2 = base64.StdEncoding.DecodeString(pubkeyString) - if err2 != nil { - return fmt.Errorf(`Expected hex or base64. Got errors: - hex: %v, - base64: %v - `, err, err2) - } - } - - cdc := gaia.MakeCodec() - var pubKey crypto.PubKeyEd25519 - copy(pubKey[:], pubkeyBytes) - pubKeyJSONBytes, err := cdc.MarshalJSON(pubKey) - if err != nil { - return err - } - fmt.Println("Address:", pubKey.Address()) - fmt.Printf("Hex: %X\n", pubkeyBytes) - fmt.Println("JSON (base64):", string(pubKeyJSONBytes)) - return nil -} - -func runTxCmd(cmd *cobra.Command, args []string) error { - if len(args) != 1 { - return fmt.Errorf("Expected single arg") - } - - txString := args[0] - - // try hex, then base64 - txBytes, err := hex.DecodeString(txString) - if err != nil { - var err2 error - txBytes, err2 = base64.StdEncoding.DecodeString(txString) - if err2 != nil { - return fmt.Errorf(`Expected hex or base64. Got errors: - hex: %v, - base64: %v - `, err, err2) - } - } - - var tx = auth.StdTx{} - cdc := gaia.MakeCodec() - - err = cdc.UnmarshalBinary(txBytes, &tx) - if err != nil { - return err - } - - bz, err := cdc.MarshalJSON(tx) - if err != nil { - return err - } - - buf := bytes.NewBuffer([]byte{}) - err = json.Indent(buf, bz, "", " ") - if err != nil { - return err - } - - fmt.Println(buf.String()) - return nil -} - -func main() { - err := rootCmd.Execute() - if err != nil { - os.Exit(1) - } - os.Exit(0) -} diff --git a/cmd/gaia/testnets/README.md b/cmd/gaia/testnets/README.md deleted file mode 100644 index b34926aede..0000000000 --- a/cmd/gaia/testnets/README.md +++ /dev/null @@ -1,258 +0,0 @@ -# Connect to the `gaia-6001` Testnet - -Note: We are aware this documentation is sub-par. We are working to -improve the tooling and the documentation to make this process as painless as -possible. In the meantime, join the -[Validator Chat](https://riot.im/app/#/room/#cosmos_validators:matrix.org) -for technical support. Thanks very much for your patience. :) - -## Setting Up a New Node - -These instructions are for setting up a brand new full node from scratch. If you ran a full node on a previous testnet, please skip to [Upgrading From Previous Testnet](#upgrading-from-previous-testnet). - -### Install Go - -Install `go` by following the [official docs](https://golang.org/doc/install). -**Go 1.10+** is required for the Cosmos SDK. - -### Install Cosmos SDK - -Next, let's install the testnet's version of the Cosmos SDK. - -``` -mkdir -p $GOPATH/src/github.com/cosmos -cd $GOPATH/src/github.com/cosmos -git clone https://github.com/cosmos/cosmos-sdk -cd cosmos-sdk && git checkout v0.18.0 -make get_tools && make get_vendor_deps && make install -``` - -That will install the `gaiad` and `gaiacli` binaries. Verify that everything is OK: - -``` -gaiad version -0.18.0-eceb56b7 -``` - -### Node Setup - -Create the required configuration files: - -``` -gaiad init -``` - -Name your node by editing the `moniker` in `$HOME/.gaiad/config/config.toml`. Note that only ASCII characters are supported. Using Unicode renders your node unconnectable. - -``` -# A custom human readable name for this node -moniker = "" -``` - -Your full node has been initialized! Please skip to [Genesis & Seeds](#genesis--seeds). - -## Upgrading From Previous Testnet - -These instructions are for full nodes that have ran on previous testnets and would like to upgrade to the latest testnet. - -### Reset Data - -First, remove the outdated files and reset the data. - -``` -rm $HOME/.gaiad/config/addrbook.json $HOME/.gaiad/config/genesis.json -gaiad unsafe_reset_all -``` - -Your node is now in a pristine state while keeping the original `priv_validator.json` and `config.toml`. If you had any sentry nodes or full nodes setup before, -your node will still try to connect to them, but may fail if they haven't also -been upgraded. - -**WARNING:** Make sure that every node has a unique `priv_validator.json`. Do not copy the `priv_validator.json` from an old node to multiple new nodes. Running two nodes with the same `priv_validator.json` will cause you to double sign. - -### Software Upgrade - -Now it is time to upgrade the software: - -``` -cd $GOPATH/src/github.com/cosmos/cosmos-sdk -git fetch --all && git checkout v0.18.0 -make update_tools && make get_vendor_deps && make install -``` - -Your full node has been cleanly upgraded! - -## Genesis & Seeds - -### Copy the Genesis File - -Copy the testnet's `genesis.json` file and place it in `gaiad`'s config directory. - -``` -mkdir -p $HOME/.gaiad/config -cp -a $GOPATH/src/github.com/cosmos/cosmos-sdk/cmd/gaia/testnets/gaia-6001/genesis.json $HOME/.gaiad/config/genesis.json -``` - -### Add Seed Nodes - -Your node needs to know how to find peers. You'll need to add healthy seed nodes to `$HOME/.gaiad/config/config.toml`. Here are some seed nodes you can use: - -``` -# Comma separated list of seed nodes to connect to -seeds = "38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6001.coinculture.net:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@seed.cosmos.cryptium.ch:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@35.198.166.171:46656,032fa56301de335d835057fb6ad9f7ce2242a66d@165.227.236.213:46656" -``` - -You can also [ask other validators](https://riot.im/app/#/room/#cosmos_validators:matrix.org) for a persistent peer and add it under the `persistent_peers` key. For more information on seeds and peers, [read this](https://github.com/tendermint/tendermint/blob/develop/docs/using-tendermint.md#peers). - -## Run a Full Node - -Start the full node with this command: - -``` -gaiad start -``` - -Check that everything is running smoothly: - -``` -gaiacli status -``` - -View the status of the network with the [Cosmos Explorer](https://explorecosmos.network). Once your full node syncs up to the current block height, you should see it appear on the [list of full nodes](https://explorecosmos.network/validators). If it doesn't show up, that's ok--the Explorer does not connect to every node. - -## Generate Keys - -You'll need a private and public key pair \(a.k.a. `sk, pk` respectively\) to be able to receive funds, send txs, bond tx, etc. - -To generate a new key \(default _ed25519_ elliptic curve\): - -``` -gaiacli keys add -``` - -Next, you will have to create a passphrase. Save the _seed_ _phrase_ in a safe place in case you forget the password. - -If you check your private keys, you'll now see ``: - -``` -gaiacli keys show -``` - -You can see all your available keys by typing: - -``` -gaiacli keys list -``` - -View the validator pubkey for your node by typing: - -``` -gaiad tendermint show_validator -``` - -Save your address and pubkey to environment variables for later use: - -``` -MYADDR= -MYPUBKEY= -``` - -**WARNING:** We strongly recommend NOT using the same passphrase for multiple keys. The Tendermint team and the Interchain Foundation will not be responsible for the loss of funds. - -## Get Tokens - -The best way to get tokens is from the [Cosmos Testnet Faucet](https://faucetcosmos.network). If the faucet is not working for you, try asking [#cosmos-validators](https://riot.im/app/#/room/#cosmos-validators:matrix.org). - -After receiving tokens to your address, you can view your account's balance by typing: - -``` -gaiacli account -``` - -Note: When you query an account balance with zero tokens, you will get this error: `No account with address was found in the state.` This is expected! We're working on improving our error messages. - -## Send Tokens - -``` -gaiacli send --amount=10faucetToken --chain-id= --name= --to= -``` - -Note: The `--amount` flag accepts the format `--amount=`. - -Now, view the updated balances of the origin and destination accounts: - -``` -gaiacli account -gaiacli account -``` - -You can also check your balance at a given block by using the `--block` flag: - -``` -gaiacli account --block= -``` - -## Run a Validator Node - -[Validators](https://cosmos.network/validators) are responsible for committing new blocks to the blockchain through voting. A validator's stake is slashed if they become unavailable, double sign a transaction, or don't cast their votes. If you only want to run a full node, a VM in the cloud is fine. However, if you are want to become a validator for the Hub's `mainnet`, you should research hardened setups. Please read [Sentry Node Architecture](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#how-can-validators-protect-themselves-from-denial-of-service-attacks) to protect your node from DDOS and ensure high-availability. Also see the [technical requirements](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#technical-requirements)). There's also more info on our [website](https://cosmos.network/validators). - -Your `pubkey` can be used to create a new validator by staking tokens. You can find your validator pubkey by running: - -``` -gaiad tendermint show_validator -``` - -Next, craft your `gaiacli stake create-validator` command: - -``` -gaiacli stake create-validator --amount=5steak --pubkey= --address-validator= --moniker=satoshi --chain-id= --name= -``` - -You can add more information to the validator, such as`--website`, `--keybase-sig`, or `--details`. Here's how: - -``` -gaiacli stake edit-validator --details="To the cosmos !" --website="https://cosmos.network" -``` - -View the validator's information with this command: - -``` -gaiacli stake validator --address-validator= --chain-id= -``` - -To check that the validator is active, look for it here: - -``` -gaiacli advanced tendermint validator-set -``` - -**Note:** To be in the validator set, you need to have more total voting power than the 100th validator. - -## Delegating to a Validator - -On the upcoming mainnet, you can delegate `atom` to a validator. These [delegators](https://cosmos.network/resources/delegators) can receive part of the validator's fee revenue. Read more about the [Cosmos Token Model](https://github.com/cosmos/cosmos/raw/master/Cosmos_Token_Model.pdf). - -### Bond Tokens - -On the testnet, we delegate `steak` instead of `atom`. Here's how you can bond tokens to a testnet validator: - -``` -gaiacli stake delegate --amount=10steak --address-delegator= --address-validator= --name= --chain-id= -``` - -While tokens are bonded, they are pooled with all the other bonded tokens in the network. Validators and delegators obtain a percentage of shares that equal their stake in this pool. - -### Unbond Tokens - -If for any reason the validator misbehaves, or you want to unbond a certain amount of tokens, use this following command. You can unbond a specific amount of`shares`\(eg:`12.1`\) or all of them \(`MAX`\). - -``` -gaiacli stake unbond --address-delegator= --address-validator= --shares=MAX --name= --chain-id= -``` - -You can check your balance and your stake delegation to see that the unbonding went through successfully. - -``` -gaiacli account -gaiacli stake delegation --address-delegator= --address-validator= --chain-id= -``` diff --git a/cmd/gaia/testnets/STATUS.md b/cmd/gaia/testnets/STATUS.md deleted file mode 100644 index d53c49e092..0000000000 --- a/cmd/gaia/testnets/STATUS.md +++ /dev/null @@ -1,74 +0,0 @@ -# TESTNET STATUS - -## *June 10, 2018, 8:30 EST* - Gaia-6001 consensus failure - -- Validator unbonding and revocation activity caused a consensus failure -- There is a bug in the staking module that must be fixed -- The team is taking its time to look into this and release a fix following a - proper protocol for hotfix upgrades to the testnet -- Please stay tuned! - -## *June 9, 2018, 14:00 EST* - New Release - -- Released gaia - [v0.18.0](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.18.0) with - update for Tendermint - [v0.20.0](https://github.com/tendermint/tendermint/releases/tag/v0.20.0) -- Includes bug fix for declaring candidacy from the command line - -## *June 8, 2018, 23:30 EST* - Gaia-6001 is making blocks - -- +2/3 of the voting power is finally online for Gaia-6001 and it is making - blocks! -- This is a momentous achievement - a successful asynchronous decentralized - testnet launch -- Congrats everyone! - -## *June 8, 2018, 12:00 EST* - New Testnet Gaia-6001 - -- After some confusion around testnet deployment and a contention testnet - hardfork, a new genesis file and network was released for `gaia-6001` - -## *June 7, 2018, 9:00 EST* - New Testnet Gaia-6000 - -- Released a new `genesis.json` file for `gaia-6000` -- Initial validators include those that were most active in - the gaia-5001 testnet -- Join the network via gaia `v0.18.0-rc0` - -## *June 5, 2018, 21:00 EST* - New Release - -- Released gaia - [v0.17.5](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.17.5) - with update for Tendermint - [v0.19.9](https://github.com/tendermint/tendermint/releases/tag/v0.19.9) -- Fixes many bugs! - - evidence gossipping - - mempool deadlock - - WAL panic - - memory leak -- Please update to this to put a stop to the rampant invalid evidence gossiping - :) - -## *May 31, 2018, 14:00 EST* - New Release - -- Released gaia - [v0.17.4](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.17.4) with update for Tendermint v0.19.7 -- Fixes a WAL bug and some more -- Please update to this if you have trouble restarting a node - -## *May 31, 2018, 2:00 EST* - Testnet Halt - -- A validator equivocated last week and Evidence is being rampantly gossipped -- Peers that can't process the evidence (either too far behind or too far ahead) are disconnecting from the peers that - sent it, causing high peer turn-over -- The high peer turn-over may be causing a memory-leak, resulting in some nodes - crashing and the testnet halting -- We need to fix some issues in the EvidenceReactor to address this and also - investigate the possible memory-leak - -## *May 29, 2018* - New Release - -- Released v0.17.3 with update for Tendermint v0.19.6 -- Fixes fast-sync bug -- Please update to this to sync with the testnet diff --git a/cmd/gaia/testnets/gaia-5001/adrian.json b/cmd/gaia/testnets/gaia-5001/adrian.json deleted file mode 100644 index 7ca99cb1e9..0000000000 --- a/cmd/gaia/testnets/gaia-5001/adrian.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "node_id": "1ebc5ca705b3ae1c06a0888ff1287ada82149dc3", - "ip": "138.68.77.24", - "validator": { - "pub_key": { - "type": "AC26791624DE60", - "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" - }, - "power": 100, - "name": "adrian" - }, - "app_gen_tx": { - "name": "default", - "address": "D9C12CB5186FE0018179742FD3110EE534C63460", - "pub_key": { - "type": "AC26791624DE60", - "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" - } - } -} diff --git a/cmd/gaia/testnets/gaia-5001/anton.json b/cmd/gaia/testnets/gaia-5001/anton.json deleted file mode 100644 index 701e858874..0000000000 --- a/cmd/gaia/testnets/gaia-5001/anton.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "node_id": "c272ae3cff7558db2c6195eea38fd43fd08406dc", - "ip": "206.189.31.178", - "validator": { - "pub_key": { - "type": "AC26791624DE60", - "value": "tJlZJWjOpYvRitYFTWNPTaUtvQVf+hoNjlfI84VPqvI=" - }, - "power": 100, - "name": "anton" - }, - "app_gen_tx": { - "name": "default", - "address": "E766088FD171906289617F60BF0014C46F0F85EC", - "pub_key": { - "type": "AC26791624DE60", - "value": "tJlZJWjOpYvRitYFTWNPTaUtvQVf+hoNjlfI84VPqvI=" - } - } -} diff --git a/cmd/gaia/testnets/gaia-5001/aurel.json b/cmd/gaia/testnets/gaia-5001/aurel.json deleted file mode 100644 index 0c2ea81668..0000000000 --- a/cmd/gaia/testnets/gaia-5001/aurel.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "node_id": "aef085c4bfed0c1ffc6705f2e1e3bf85e5164600", - "ip": "45.77.53.208", - "validator": { - "pub_key": { - "type": "AC26791624DE60", - "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" - }, - "power": 100, - "name": "aurel" - }, - "app_gen_tx": { - "name": "aurel", - "address": "10B0899E05A486AE4E5589C39587DF7E9A185872", - "pub_key": { - "type": "AC26791624DE60", - "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" - } - } -} diff --git a/cmd/gaia/testnets/gaia-5001/bucky.json b/cmd/gaia/testnets/gaia-5001/bucky.json deleted file mode 100644 index fc4bb51cde..0000000000 --- a/cmd/gaia/testnets/gaia-5001/bucky.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "node_id": "b0dd378c3fbc4c156cd6d302a799f0d2e4227201", - "ip": "159.89.121.174", - "validator": { - "pub_key": { - "type": "AC26791624DE60", - "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" - }, - "power": 100, - "name": "bucky" - }, - "app_gen_tx": { - "name": "bucky", - "address": "935E48ED79F1006ED135553768E1D9A768747CF6", - "pub_key": { - "type": "AC26791624DE60", - "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" - } - } -} diff --git a/cmd/gaia/testnets/gaia-5001/cwgoes.json b/cmd/gaia/testnets/gaia-5001/cwgoes.json deleted file mode 100644 index dce7e20c9f..0000000000 --- a/cmd/gaia/testnets/gaia-5001/cwgoes.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "node_id": "e25603602d8cf8542570ad0e311d50f55f497f85", - "ip": "158.69.63.13", - "validator": { - "pub_key": { - "type": "AC26791624DE60", - "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" - }, - "power": 100, - "name": "cwgoes" - }, - "app_gen_tx": { - "name": "cwgoes", - "address": "328FBB8EA315D070DF908982A5F91A3618001D20", - "pub_key": { - "type": "AC26791624DE60", - "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" - } - } -} diff --git a/cmd/gaia/testnets/gaia-5001/iris.json b/cmd/gaia/testnets/gaia-5001/iris.json deleted file mode 100644 index 1a1019672c..0000000000 --- a/cmd/gaia/testnets/gaia-5001/iris.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "node_id": "aabf05a67b2f399807dc602d05bf97b0ed283ac2", - "ip": "116.62.62.39", - "validator": { - "pub_key": { - "type": "AC26791624DE60", - "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" - }, - "power": 100, - "name": "iris" - }, - "app_gen_tx": { - "name": "=suyu", - "address": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", - "pub_key": { - "type": "AC26791624DE60", - "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" - } - } -} \ No newline at end of file diff --git a/cmd/gaia/testnets/gaia-5001/lino.json b/cmd/gaia/testnets/gaia-5001/lino.json deleted file mode 100644 index 5bc98bb6ed..0000000000 --- a/cmd/gaia/testnets/gaia-5001/lino.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "node_id": "79466a03e9d4b4648a7dd8cead1fa7121ce76ee3", - "ip": "34.235.130.1", - "validator": { - "pub_key": { - "type": "AC26791624DE60", - "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" - }, - "power": 100, - "name": "lino" - }, - "app_gen_tx": { - "name": "lino", - "address": "5A007B81A25AF34B829B79DA508A26E12180BCDB", - "pub_key": { - "type": "AC26791624DE60", - "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" - } - } -} diff --git a/cmd/gaia/testnets/gaia-5001/pbostrom.json b/cmd/gaia/testnets/gaia-5001/pbostrom.json deleted file mode 100644 index 59cd469504..0000000000 --- a/cmd/gaia/testnets/gaia-5001/pbostrom.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "node_id": "adb290585a2753bf1a520c76802b0dab3dffa895", - "ip": "34.201.21.179", - "validator": { - "pub_key": { - "type": "AC26791624DE60", - "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" - }, - "power": 100, - "name": "pbostrom" - }, - "app_gen_tx": { - "name": "default", - "address": "109720515B4F8C0858DA3521E448262334534FFD", - "pub_key": { - "type": "AC26791624DE60", - "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" - } - } -} diff --git a/cmd/gaia/testnets/gaia-5001/poldsam.json b/cmd/gaia/testnets/gaia-5001/poldsam.json deleted file mode 100644 index 8149a92592..0000000000 --- a/cmd/gaia/testnets/gaia-5001/poldsam.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "node_id": "678503e6c8f50db7279c7da3cb9b072aac4bc0d5", - "ip": "35.193.188.125", - "validator": { - "pub_key": { - "type": "AC26791624DE60", - "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" - }, - "power": 100, - "name": "polsdam" - }, - "app_gen_tx": { - "name": "poldsam", - "address": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", - "pub_key": { - "type": "AC26791624DE60", - "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" - } - } -} diff --git a/cmd/gaia/testnets/gaia-5001/staked.json b/cmd/gaia/testnets/gaia-5001/staked.json deleted file mode 100644 index f39cced6b8..0000000000 --- a/cmd/gaia/testnets/gaia-5001/staked.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "node_id": "3519f05985394107e0b2e285361b7e012adb1113", - "ip": "54.209.118.64", - "validator": { - "pub_key": { - "type": "AC26791624DE60", - "value": "vq0V0BjpmIh6WyNnFpMaO5LyUK2FamkNt65eJYa5AaQ=" - }, - "power": 100, - "name": "staked" - }, - "app_gen_tx": { - "name": "default", - "address": "935E04662697134905706A4CCDB822AC6FC11C2E", - "pub_key": { - "type": "AC26791624DE60", - "value": "vq0V0BjpmIh6WyNnFpMaO5LyUK2FamkNt65eJYa5AaQ=" - } - } -} diff --git a/cmd/gaia/testnets/gaia-5001/zach.json b/cmd/gaia/testnets/gaia-5001/zach.json deleted file mode 100644 index 76a08cc925..0000000000 --- a/cmd/gaia/testnets/gaia-5001/zach.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "node_id": "8a2802fb25d352f3e7e277559a4f683780c3ef22", - "ip": "167.99.191.184", - "validator": { - "pub_key": { - "type": "AC26791624DE60", - "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" - }, - "power": 100, - "name": "" - }, - "app_gen_tx": { - "name": "zach", - "address": "9D5723057702E2090405AB5D3B48C45B9ABF4377", - "pub_key": { - "type": "AC26791624DE60", - "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" - } - } -} diff --git a/cmd/gaia/testnets/gaia-5001/zaki.json b/cmd/gaia/testnets/gaia-5001/zaki.json deleted file mode 100644 index 956f2bf8ce..0000000000 --- a/cmd/gaia/testnets/gaia-5001/zaki.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "node_id": "30b45459e4881680c0ef1750fde136fefa6c3b98", - "ip": "35.184.182.143", - "validator": { - "pub_key": { - "type": "AC26791624DE60", - "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" - }, - "power": 100, - "name": "zaki" - }, - "app_gen_tx": { - "name": "zaki", - "address": "ECE57661F0CDCF28EED257B72F86240E57F4A612", - "pub_key": { - "type": "AC26791624DE60", - "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" - } - } -} diff --git a/cmd/gaia/testnets/gaia-6000/genesis.json b/cmd/gaia/testnets/gaia-6000/genesis.json deleted file mode 100644 index aefab92869..0000000000 --- a/cmd/gaia/testnets/gaia-6000/genesis.json +++ /dev/null @@ -1,1459 +0,0 @@ -{ - "genesis_time": "2018-05-15T18:29:12.38288148Z", - "chain_id": "gaia-6000", - "consensus_params": { - "block_size_params": { - "max_bytes": 22020096, - "max_txs": 100000, - "max_gas": -1 - }, - "tx_size_params": { - "max_bytes": 10240, - "max_gas": -1 - }, - "block_gossip_params": { - "block_part_size_bytes": 65536 - }, - "evidence_params": { - "max_age": 100000 - } - }, - "validators": [ - { - "pub_key": { - "type": "AC26791624DE60", - "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" - }, - "power": 1000, - "name": "adrian" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" - }, - "power": 1000, - "name": "zaki" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "bIvXwf0qlOy0rO0SY/h8FfsqyW/AMpGL2yUhUNOY7hs=" - }, - "power": 100, - "name": "staked" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" - }, - "power": 1000, - "name": "polsdam" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" - }, - "power": 1000, - "name": "lino" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" - }, - "power": 100, - "name": "" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" - }, - "power": 1000, - "name": "iris" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" - }, - "power": 1000, - "name": "pbostrom" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" - }, - "power": 1000, - "name": "aurel" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" - }, - "power": 1000, - "name": "bucky" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" - }, - "power": 100, - "name": "cwgoes" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "TNPLvN6f6QoSLJqGHzIfbraBoSw3emr9Sk2Us94M4gM=" - }, - "power": 1000, - "name": "bdnet" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "cvGYknYP9XMUzqlXZde7lRpvAp/kZiSRYHg66krJNxQ=" - }, - "power": 1000, - "name": "melea-trust" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" - }, - "power": 1000, - "name": "naruemon" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "rcl+kuM69Un/a7e+fQsQrCEtT1g04tFviOeq2GygSIw=" - }, - "power": 1000, - "name": "idoor" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "S9urD5q7je21qp5vEobiURdWrtJwvqMsfZGQhb8GOBQ=" - }, - "power": 1000, - "name": "ATEAM1" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "vSr94aI+zfF3D8Cr2VtCXPpfgj7t2ck8SlZxRsfn7gk=" - }, - "power": 1000, - "name": "figmatt" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "p5ijoVwp2zmA7RkXXvPl+yqdnlaWMwoV2pYIN8bDyFs=" - }, - "power": 1000, - "name": "jla-bsd" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "KOdWpo4aQFrLxVlkyc66p7m6mBNnPLmGuO4Z4L+CI1Y=" - }, - "power": 1000, - "name": "Gold" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "VfOsmcON77auerRc9zKwOR+CvL0sj1nA45hS2WqX1xE=" - }, - "power": 1000, - "name": "nylira" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "QYONAknaJqx3OKPSKraDrOPkx6xssezYtXVS84nZvZE=" - }, - "power": 1000, - "name": "BKCM" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "PyFJmNrUres3QOkj2BjxplCxrOF+HDFGohi3tRKsToY=" - }, - "power": 1000, - "name": "Dev's Validator" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "s4ER09+WeX10euzGyK7xDW7+myQVXt3Plup8IHUE4nk=" - }, - "power": 1000, - "name": "Staking Facilities" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "OPxj9edXgufNEjYNhZKqLgmYnK4A3nGw3rxaFQrHn24=" - }, - "power": 1000, - "name": "nuevax" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "Hi2rtbdJdQtOe3Kq4OoD/xkWJbIjIsUI9qgLQ6TlhiM=" - }, - "power": 1000, - "name": "vultr.guest" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "ah3JtmBA7gbxSiimPsLqQlV85gpNOUBJMvnxGx8eVlo=" - }, - "power": 1000, - "name": "forebole" - } - ], - "app_hash": "", - "app_state": { - "accounts": [ - { - "address": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", - "coins": [ - { - "denom": "devToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", - "coins": [ - { - "denom": "adrianToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "109720515B4F8C0858DA3521E448262334534FFD", - "coins": [ - { - "denom": "defaultToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "10B0899E05A486AE4E5589C39587DF7E9A185872", - "coins": [ - { - "denom": "aurelToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "328FBB8EA315D070DF908982A5F91A3618001D20", - "coins": [ - { - "denom": "cwgoesToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", - "coins": [ - { - "denom": "BKCMToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", - "coins": [ - { - "denom": "BDToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", - "coins": [ - { - "denom": "suyuToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "5A007B81A25AF34B829B79DA508A26E12180BCDB", - "coins": [ - { - "denom": "linoToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", - "coins": [ - { - "denom": "stakingToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "935E04662697134905706A4CCDB822AC6FC11C2E", - "coins": [ - { - "denom": "defaultToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "935E48ED79F1006ED135553768E1D9A768747CF6", - "coins": [ - { - "denom": "buckyToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "99FFAEE5BF6040EADA2F26548C4A702619797C9F", - "coins": [ - { - "denom": "kwunyeungToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "9D5723057702E2090405AB5D3B48C45B9ABF4377", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "zachToken", - "amount": 1000 - } - ] - }, - { - "address": "A323EC45243D600204BA3D298E3C20322D08C84C", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "nuevaxToken", - "amount": 1000 - } - ] - }, - { - "address": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "dokiaToken", - "amount": 1000 - } - ] - }, - { - "address": "B6834D914FE50F0C743E6A012AB20438CFADFB95", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "forboleToken", - "amount": 1000 - } - ] - }, - { - "address": "B75C2C4309475C91E8DE271BC52CBAC408365B83", - "coins": [ - { - "denom": "steak", - "amount": 100 - }, - { - "denom": "pengToken", - "amount": 1000 - } - ] - }, - { - "address": "FD30D5C983FFEDEC069C3DDFCF270E41A556A86E", - "coins": [ - { - "denom": "steak", - "amount": 900 - }, - { - "denom": "faucetToken", - "amount": 10000000 - } - ] - }, - { - "address": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "goldToken", - "amount": 100 - } - ] - }, - { - "address": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "jlaToken", - "amount": 100 - } - ] - }, - { - "address": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "figmattToken", - "amount": 100 - } - ] - }, - { - "address": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "ATEAM1Token", - "amount": 100 - } - ] - }, - { - "address": "D6545CB14FCA7840A295FB0566C27E4B9D526993", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "idoorToken", - "amount": 100 - } - ] - }, - { - "address": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "naruemonToken", - "amount": 100 - } - ] - }, - { - "address": "ECE57661F0CDCF28EED257B72F86240E57F4A612", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "zakiToken", - "amount": 1000 - } - ] - }, - { - "address": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "trustToken", - "amount": 1000 - } - ] - }, - { - "address": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", - "coins": [ - { - "denom": "poldsamToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - } - ], - "stake": { - "pool": { - "loose_unbonded_tokens": 2350, - "unbonded_tokens": 0, - "unbonding_tokens": 0, - "bonded_tokens": 25200, - "unbonded_shares": "0", - "unbonding_shares": "0", - "bonded_shares": "25200", - "inflation_last_time": 0, - "inflation": "9012837/100000000", - "date_last_commission_reset": 0, - "prev_bonded_shares": "0" - }, - "params": { - "inflation_rate_change": "13/100", - "inflation_max": "1/5", - "inflation_min": "7/100", - "goal_bonded": "67/100", - "max_validators": 100, - "bond_denom": "steak" - }, - "bonds": [ - { - "delegator_addr": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", - "validator_addr": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "109720515B4F8C0858DA3521E448262334534FFD", - "validator_addr": "109720515B4F8C0858DA3521E448262334534FFD", - "shares": "100", - "height": 0 - }, - { - "delegator_addr": "10B0899E05A486AE4E5589C39587DF7E9A185872", - "validator_addr": "10B0899E05A486AE4E5589C39587DF7E9A185872", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "328FBB8EA315D070DF908982A5F91A3618001D20", - "validator_addr": "328FBB8EA315D070DF908982A5F91A3618001D20", - "shares": "100", - "height": 0 - }, - { - "delegator_addr": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", - "validator_addr": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", - "validator_addr": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", - "validator_addr": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "5A007B81A25AF34B829B79DA508A26E12180BCDB", - "validator_addr": "5A007B81A25AF34B829B79DA508A26E12180BCDB", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", - "validator_addr": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "935E04662697134905706A4CCDB822AC6FC11C2E", - "validator_addr": "935E04662697134905706A4CCDB822AC6FC11C2E", - "shares": "100", - "height": 0 - }, - { - "delegator_addr": "935E48ED79F1006ED135553768E1D9A768747CF6", - "validator_addr": "935E48ED79F1006ED135553768E1D9A768747CF6", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "9D5723057702E2090405AB5D3B48C45B9ABF4377", - "validator_addr": "9D5723057702E2090405AB5D3B48C45B9ABF4377", - "shares": "100", - "height": 0 - }, - { - "delegator_addr": "A323EC45243D600204BA3D298E3C20322D08C84C", - "validator_addr": "A323EC45243D600204BA3D298E3C20322D08C84C", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", - "validator_addr": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "B6834D914FE50F0C743E6A012AB20438CFADFB95", - "validator_addr": "B6834D914FE50F0C743E6A012AB20438CFADFB95", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "B75C2C4309475C91E8DE271BC52CBAC408365B83", - "validator_addr": "B75C2C4309475C91E8DE271BC52CBAC408365B83", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", - "validator_addr": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", - "validator_addr": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", - "validator_addr": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", - "validator_addr": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "D6545CB14FCA7840A295FB0566C27E4B9D526993", - "validator_addr": "D6545CB14FCA7840A295FB0566C27E4B9D526993", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", - "validator_addr": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", - "validator_addr": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "ECE57661F0CDCF28EED257B72F86240E57F4A612", - "validator_addr": "ECE57661F0CDCF28EED257B72F86240E57F4A612", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", - "validator_addr": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", - "validator_addr": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", - "shares": "1000", - "height": 0 - } - ], - "validators": [ - { - "owner": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", - "pub_key": { - "type": "AC26791624DE60", - "value": "PyFJmNrUres3QOkj2BjxplCxrOF+HDFGohi3tRKsToY=" - }, - "description": { - "moniker": "Dev's Validator", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "109720515B4F8C0858DA3521E448262334534FFD", - "pub_key": { - "type": "AC26791624DE60", - "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" - }, - "description": { - "moniker": "", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "100" - }, - "delegator_shares": "100", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "10B0899E05A486AE4E5589C39587DF7E9A185872", - "pub_key": { - "type": "AC26791624DE60", - "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" - }, - "description": { - "moniker": "aurel", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "328FBB8EA315D070DF908982A5F91A3618001D20", - "pub_key": { - "type": "AC26791624DE60", - "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" - }, - "description": { - "moniker": "cwgoes", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "100" - }, - "delegator_shares": "100", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", - "pub_key": { - "type": "AC26791624DE60", - "value": "QYONAknaJqx3OKPSKraDrOPkx6xssezYtXVS84nZvZE=" - }, - "description": { - "moniker": "BKCM", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", - "pub_key": { - "type": "AC26791624DE60", - "value": "TNPLvN6f6QoSLJqGHzIfbraBoSw3emr9Sk2Us94M4gM=" - }, - "description": { - "moniker": "bdnet", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", - "pub_key": { - "type": "AC26791624DE60", - "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" - }, - "description": { - "moniker": "suyu", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "5A007B81A25AF34B829B79DA508A26E12180BCDB", - "pub_key": { - "type": "AC26791624DE60", - "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" - }, - "description": { - "moniker": "lino", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", - "pub_key": { - "type": "AC26791624DE60", - "value": "s4ER09+WeX10euzGyK7xDW7+myQVXt3Plup8IHUE4nk=" - }, - "description": { - "moniker": "Staking Facilities", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "935E04662697134905706A4CCDB822AC6FC11C2E", - "pub_key": { - "type": "AC26791624DE60", - "value": "bIvXwf0qlOy0rO0SY/h8FfsqyW/AMpGL2yUhUNOY7hs=" - }, - "description": { - "moniker": "default", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "100" - }, - "delegator_shares": "100", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "935E48ED79F1006ED135553768E1D9A768747CF6", - "pub_key": { - "type": "AC26791624DE60", - "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" - }, - "description": { - "moniker": "bucky", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "9D5723057702E2090405AB5D3B48C45B9ABF4377", - "pub_key": { - "type": "AC26791624DE60", - "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" - }, - "description": { - "moniker": "zach", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "100" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "A323EC45243D600204BA3D298E3C20322D08C84C", - "pub_key": { - "type": "AC26791624DE60", - "value": "OPxj9edXgufNEjYNhZKqLgmYnK4A3nGw3rxaFQrHn24=" - }, - "description": { - "moniker": "nuevax", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", - "pub_key": { - "type": "AC26791624DE60", - "value": "Hi2rtbdJdQtOe3Kq4OoD/xkWJbIjIsUI9qgLQ6TlhiM=" - }, - "description": { - "moniker": "vultr.guest", - "identity": "", - "website": "https://ion.dokia.capital/", - "details": "DokiaValidator" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "B6834D914FE50F0C743E6A012AB20438CFADFB95", - "pub_key": { - "type": "AC26791624DE60", - "value": "ah3JtmBA7gbxSiimPsLqQlV85gpNOUBJMvnxGx8eVlo=" - }, - "description": { - "moniker": "forbole", - "identity": "", - "website": "https://www.forbole.com", - "details": "Recommend. Refer. Reward" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "B75C2C4309475C91E8DE271BC52CBAC408365B83", - "pub_key": { - "type": "AC26791624DE60", - "value": "VfOsmcON77auerRc9zKwOR+CvL0sj1nA45hS2WqX1xE=" - }, - "description": { - "moniker": "nylira", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", - "pub_key": { - "type": "AC26791624DE60", - "value": "KOdWpo4aQFrLxVlkyc66p7m6mBNnPLmGuO4Z4L+CI1Y=" - }, - "description": { - "moniker": "Gold", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", - "pub_key": { - "type": "AC26791624DE60", - "value": "p5ijoVwp2zmA7RkXXvPl+yqdnlaWMwoV2pYIN8bDyFs=" - }, - "description": { - "moniker": "jla-bsd", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", - "pub_key": { - "type": "AC26791624DE60", - "value": "vSr94aI+zfF3D8Cr2VtCXPpfgj7t2ck8SlZxRsfn7gk=" - }, - "description": { - "moniker": "figmatt", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", - "pub_key": { - "type": "AC26791624DE60", - "value": "S9urD5q7je21qp5vEobiURdWrtJwvqMsfZGQhb8GOBQ=" - }, - "description": { - "moniker": "ATEAM1", - "identity": "", - "website": "", - "details": "ATEAM1" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "D6545CB14FCA7840A295FB0566C27E4B9D526993", - "pub_key": { - "type": "AC26791624DE60", - "value": "rcl+kuM69Un/a7e+fQsQrCEtT1g04tFviOeq2GygSIw=" - }, - "description": { - "moniker": "idoor", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", - "pub_key": { - "type": "AC26791624DE60", - "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" - }, - "description": { - "moniker": "naruemon", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", - "pub_key": { - "type": "AC26791624DE60", - "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" - }, - "description": { - "moniker": "Adrian Brink - Cryptium Labs", - "identity": "", - "website": "https://cryptium.ch", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "ECE57661F0CDCF28EED257B72F86240E57F4A612", - "pub_key": { - "type": "AC26791624DE60", - "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" - }, - "description": { - "moniker": "zaki", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", - "pub_key": { - "type": "AC26791624DE60", - "value": "cvGYknYP9XMUzqlXZde7lRpvAp/kZiSRYHg66krJNxQ=" - }, - "description": { - "moniker": "trust", - "identity": "", - "website": "http://cosmos-trust.com", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", - "pub_key": { - "type": "AC26791624DE60", - "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" - }, - "description": { - "moniker": "proof-of-audit", - "identity": "", - "website": "https://proof-of-audit.com", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - } - ] - } - } -} diff --git a/cmd/gaia/testnets/gaia-6001/genesis.json b/cmd/gaia/testnets/gaia-6001/genesis.json deleted file mode 100644 index 512d761bed..0000000000 --- a/cmd/gaia/testnets/gaia-6001/genesis.json +++ /dev/null @@ -1,1459 +0,0 @@ -{ - "genesis_time": "2018-05-15T18:29:12.38288148Z", - "chain_id": "gaia-6001", - "consensus_params": { - "block_size_params": { - "max_bytes": 22020096, - "max_txs": 100000, - "max_gas": -1 - }, - "tx_size_params": { - "max_bytes": 10240, - "max_gas": -1 - }, - "block_gossip_params": { - "block_part_size_bytes": 65536 - }, - "evidence_params": { - "max_age": 100000 - } - }, - "validators": [ - { - "pub_key": { - "type": "AC26791624DE60", - "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" - }, - "power": 1000, - "name": "adrian" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" - }, - "power": 1000, - "name": "zaki" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "bIvXwf0qlOy0rO0SY/h8FfsqyW/AMpGL2yUhUNOY7hs=" - }, - "power": 100, - "name": "staked" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" - }, - "power": 1000, - "name": "polsdam" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" - }, - "power": 1000, - "name": "lino" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" - }, - "power": 100, - "name": "" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" - }, - "power": 1000, - "name": "iris" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" - }, - "power": 1000, - "name": "pbostrom" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" - }, - "power": 1000, - "name": "aurel" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" - }, - "power": 1000, - "name": "bucky" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" - }, - "power": 100, - "name": "cwgoes" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "TNPLvN6f6QoSLJqGHzIfbraBoSw3emr9Sk2Us94M4gM=" - }, - "power": 1000, - "name": "bdnet" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "cvGYknYP9XMUzqlXZde7lRpvAp/kZiSRYHg66krJNxQ=" - }, - "power": 1000, - "name": "melea-trust" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" - }, - "power": 1000, - "name": "naruemon" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "rcl+kuM69Un/a7e+fQsQrCEtT1g04tFviOeq2GygSIw=" - }, - "power": 1000, - "name": "idoor" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "S9urD5q7je21qp5vEobiURdWrtJwvqMsfZGQhb8GOBQ=" - }, - "power": 1000, - "name": "ATEAM1" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "vSr94aI+zfF3D8Cr2VtCXPpfgj7t2ck8SlZxRsfn7gk=" - }, - "power": 1000, - "name": "figmatt" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "p5ijoVwp2zmA7RkXXvPl+yqdnlaWMwoV2pYIN8bDyFs=" - }, - "power": 1000, - "name": "jla-bsd" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "KOdWpo4aQFrLxVlkyc66p7m6mBNnPLmGuO4Z4L+CI1Y=" - }, - "power": 1000, - "name": "Gold" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "VfOsmcON77auerRc9zKwOR+CvL0sj1nA45hS2WqX1xE=" - }, - "power": 1000, - "name": "nylira" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "QYONAknaJqx3OKPSKraDrOPkx6xssezYtXVS84nZvZE=" - }, - "power": 1000, - "name": "BKCM" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "PyFJmNrUres3QOkj2BjxplCxrOF+HDFGohi3tRKsToY=" - }, - "power": 1000, - "name": "Dev's Validator" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "s4ER09+WeX10euzGyK7xDW7+myQVXt3Plup8IHUE4nk=" - }, - "power": 1000, - "name": "Staking Facilities" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "OPxj9edXgufNEjYNhZKqLgmYnK4A3nGw3rxaFQrHn24=" - }, - "power": 1000, - "name": "nuevax" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "Hi2rtbdJdQtOe3Kq4OoD/xkWJbIjIsUI9qgLQ6TlhiM=" - }, - "power": 1000, - "name": "vultr.guest" - }, - { - "pub_key": { - "type": "AC26791624DE60", - "value": "ah3JtmBA7gbxSiimPsLqQlV85gpNOUBJMvnxGx8eVlo=" - }, - "power": 1000, - "name": "forebole" - } - ], - "app_hash": "", - "app_state": { - "accounts": [ - { - "address": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", - "coins": [ - { - "denom": "devToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", - "coins": [ - { - "denom": "adrianToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "109720515B4F8C0858DA3521E448262334534FFD", - "coins": [ - { - "denom": "defaultToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "10B0899E05A486AE4E5589C39587DF7E9A185872", - "coins": [ - { - "denom": "aurelToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "328FBB8EA315D070DF908982A5F91A3618001D20", - "coins": [ - { - "denom": "cwgoesToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", - "coins": [ - { - "denom": "BKCMToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", - "coins": [ - { - "denom": "BDToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", - "coins": [ - { - "denom": "suyuToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "5A007B81A25AF34B829B79DA508A26E12180BCDB", - "coins": [ - { - "denom": "linoToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", - "coins": [ - { - "denom": "stakingToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "935E04662697134905706A4CCDB822AC6FC11C2E", - "coins": [ - { - "denom": "defaultToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "935E48ED79F1006ED135553768E1D9A768747CF6", - "coins": [ - { - "denom": "buckyToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "99FFAEE5BF6040EADA2F26548C4A702619797C9F", - "coins": [ - { - "denom": "kwunyeungToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - }, - { - "address": "9D5723057702E2090405AB5D3B48C45B9ABF4377", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "zachToken", - "amount": 1000 - } - ] - }, - { - "address": "A323EC45243D600204BA3D298E3C20322D08C84C", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "nuevaxToken", - "amount": 1000 - } - ] - }, - { - "address": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "dokiaToken", - "amount": 1000 - } - ] - }, - { - "address": "B6834D914FE50F0C743E6A012AB20438CFADFB95", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "forboleToken", - "amount": 1000 - } - ] - }, - { - "address": "B75C2C4309475C91E8DE271BC52CBAC408365B83", - "coins": [ - { - "denom": "steak", - "amount": 100 - }, - { - "denom": "pengToken", - "amount": 1000 - } - ] - }, - { - "address": "FD30D5C983FFEDEC069C3DDFCF270E41A556A86E", - "coins": [ - { - "denom": "steak", - "amount": 900 - }, - { - "denom": "faucetToken", - "amount": 10000000 - } - ] - }, - { - "address": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "goldToken", - "amount": 100 - } - ] - }, - { - "address": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "jlaToken", - "amount": 100 - } - ] - }, - { - "address": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "figmattToken", - "amount": 100 - } - ] - }, - { - "address": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "ATEAM1Token", - "amount": 100 - } - ] - }, - { - "address": "D6545CB14FCA7840A295FB0566C27E4B9D526993", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "idoorToken", - "amount": 100 - } - ] - }, - { - "address": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "naruemonToken", - "amount": 100 - } - ] - }, - { - "address": "ECE57661F0CDCF28EED257B72F86240E57F4A612", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "zakiToken", - "amount": 1000 - } - ] - }, - { - "address": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", - "coins": [ - { - "denom": "steak", - "amount": 50 - }, - { - "denom": "trustToken", - "amount": 1000 - } - ] - }, - { - "address": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", - "coins": [ - { - "denom": "poldsamToken", - "amount": 1000 - }, - { - "denom": "steak", - "amount": 50 - } - ] - } - ], - "stake": { - "pool": { - "loose_unbonded_tokens": 2300, - "unbonded_tokens": 0, - "unbonding_tokens": 0, - "bonded_tokens": 23300, - "unbonded_shares": "0", - "unbonding_shares": "0", - "bonded_shares": "23300", - "inflation_last_time": 0, - "inflation": "9012837/100000000", - "date_last_commission_reset": 0, - "prev_bonded_shares": "0" - }, - "params": { - "inflation_rate_change": "13/100", - "inflation_max": "1/5", - "inflation_min": "7/100", - "goal_bonded": "67/100", - "max_validators": 100, - "bond_denom": "steak" - }, - "bonds": [ - { - "delegator_addr": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", - "validator_addr": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "109720515B4F8C0858DA3521E448262334534FFD", - "validator_addr": "109720515B4F8C0858DA3521E448262334534FFD", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "10B0899E05A486AE4E5589C39587DF7E9A185872", - "validator_addr": "10B0899E05A486AE4E5589C39587DF7E9A185872", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "328FBB8EA315D070DF908982A5F91A3618001D20", - "validator_addr": "328FBB8EA315D070DF908982A5F91A3618001D20", - "shares": "100", - "height": 0 - }, - { - "delegator_addr": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", - "validator_addr": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", - "validator_addr": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", - "validator_addr": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "5A007B81A25AF34B829B79DA508A26E12180BCDB", - "validator_addr": "5A007B81A25AF34B829B79DA508A26E12180BCDB", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", - "validator_addr": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "935E04662697134905706A4CCDB822AC6FC11C2E", - "validator_addr": "935E04662697134905706A4CCDB822AC6FC11C2E", - "shares": "100", - "height": 0 - }, - { - "delegator_addr": "935E48ED79F1006ED135553768E1D9A768747CF6", - "validator_addr": "935E48ED79F1006ED135553768E1D9A768747CF6", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "9D5723057702E2090405AB5D3B48C45B9ABF4377", - "validator_addr": "9D5723057702E2090405AB5D3B48C45B9ABF4377", - "shares": "100", - "height": 0 - }, - { - "delegator_addr": "A323EC45243D600204BA3D298E3C20322D08C84C", - "validator_addr": "A323EC45243D600204BA3D298E3C20322D08C84C", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", - "validator_addr": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "B6834D914FE50F0C743E6A012AB20438CFADFB95", - "validator_addr": "B6834D914FE50F0C743E6A012AB20438CFADFB95", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "B75C2C4309475C91E8DE271BC52CBAC408365B83", - "validator_addr": "B75C2C4309475C91E8DE271BC52CBAC408365B83", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", - "validator_addr": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", - "validator_addr": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", - "validator_addr": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", - "validator_addr": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "D6545CB14FCA7840A295FB0566C27E4B9D526993", - "validator_addr": "D6545CB14FCA7840A295FB0566C27E4B9D526993", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", - "validator_addr": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", - "validator_addr": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "ECE57661F0CDCF28EED257B72F86240E57F4A612", - "validator_addr": "ECE57661F0CDCF28EED257B72F86240E57F4A612", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", - "validator_addr": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", - "shares": "1000", - "height": 0 - }, - { - "delegator_addr": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", - "validator_addr": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", - "shares": "1000", - "height": 0 - } - ], - "validators": [ - { - "owner": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", - "pub_key": { - "type": "AC26791624DE60", - "value": "PyFJmNrUres3QOkj2BjxplCxrOF+HDFGohi3tRKsToY=" - }, - "description": { - "moniker": "Dev's Validator", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "109720515B4F8C0858DA3521E448262334534FFD", - "pub_key": { - "type": "AC26791624DE60", - "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" - }, - "description": { - "moniker": "", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "10B0899E05A486AE4E5589C39587DF7E9A185872", - "pub_key": { - "type": "AC26791624DE60", - "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" - }, - "description": { - "moniker": "aurel", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "328FBB8EA315D070DF908982A5F91A3618001D20", - "pub_key": { - "type": "AC26791624DE60", - "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" - }, - "description": { - "moniker": "cwgoes", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "100" - }, - "delegator_shares": "100", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", - "pub_key": { - "type": "AC26791624DE60", - "value": "QYONAknaJqx3OKPSKraDrOPkx6xssezYtXVS84nZvZE=" - }, - "description": { - "moniker": "BKCM", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", - "pub_key": { - "type": "AC26791624DE60", - "value": "TNPLvN6f6QoSLJqGHzIfbraBoSw3emr9Sk2Us94M4gM=" - }, - "description": { - "moniker": "bdnet", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", - "pub_key": { - "type": "AC26791624DE60", - "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" - }, - "description": { - "moniker": "suyu", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "5A007B81A25AF34B829B79DA508A26E12180BCDB", - "pub_key": { - "type": "AC26791624DE60", - "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" - }, - "description": { - "moniker": "lino", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", - "pub_key": { - "type": "AC26791624DE60", - "value": "s4ER09+WeX10euzGyK7xDW7+myQVXt3Plup8IHUE4nk=" - }, - "description": { - "moniker": "Staking Facilities", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "935E04662697134905706A4CCDB822AC6FC11C2E", - "pub_key": { - "type": "AC26791624DE60", - "value": "bIvXwf0qlOy0rO0SY/h8FfsqyW/AMpGL2yUhUNOY7hs=" - }, - "description": { - "moniker": "default", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "100" - }, - "delegator_shares": "100", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "935E48ED79F1006ED135553768E1D9A768747CF6", - "pub_key": { - "type": "AC26791624DE60", - "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" - }, - "description": { - "moniker": "bucky", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "9D5723057702E2090405AB5D3B48C45B9ABF4377", - "pub_key": { - "type": "AC26791624DE60", - "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" - }, - "description": { - "moniker": "zach", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "100" - }, - "delegator_shares": "100", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "A323EC45243D600204BA3D298E3C20322D08C84C", - "pub_key": { - "type": "AC26791624DE60", - "value": "OPxj9edXgufNEjYNhZKqLgmYnK4A3nGw3rxaFQrHn24=" - }, - "description": { - "moniker": "nuevax", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", - "pub_key": { - "type": "AC26791624DE60", - "value": "Hi2rtbdJdQtOe3Kq4OoD/xkWJbIjIsUI9qgLQ6TlhiM=" - }, - "description": { - "moniker": "vultr.guest", - "identity": "", - "website": "https://ion.dokia.capital/", - "details": "DokiaValidator" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "B6834D914FE50F0C743E6A012AB20438CFADFB95", - "pub_key": { - "type": "AC26791624DE60", - "value": "ah3JtmBA7gbxSiimPsLqQlV85gpNOUBJMvnxGx8eVlo=" - }, - "description": { - "moniker": "forbole", - "identity": "", - "website": "https://www.forbole.com", - "details": "Recommend. Refer. Reward" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "B75C2C4309475C91E8DE271BC52CBAC408365B83", - "pub_key": { - "type": "AC26791624DE60", - "value": "VfOsmcON77auerRc9zKwOR+CvL0sj1nA45hS2WqX1xE=" - }, - "description": { - "moniker": "nylira", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", - "pub_key": { - "type": "AC26791624DE60", - "value": "KOdWpo4aQFrLxVlkyc66p7m6mBNnPLmGuO4Z4L+CI1Y=" - }, - "description": { - "moniker": "Gold", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", - "pub_key": { - "type": "AC26791624DE60", - "value": "p5ijoVwp2zmA7RkXXvPl+yqdnlaWMwoV2pYIN8bDyFs=" - }, - "description": { - "moniker": "jla-bsd", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", - "pub_key": { - "type": "AC26791624DE60", - "value": "vSr94aI+zfF3D8Cr2VtCXPpfgj7t2ck8SlZxRsfn7gk=" - }, - "description": { - "moniker": "figmatt", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", - "pub_key": { - "type": "AC26791624DE60", - "value": "S9urD5q7je21qp5vEobiURdWrtJwvqMsfZGQhb8GOBQ=" - }, - "description": { - "moniker": "ATEAM1", - "identity": "", - "website": "", - "details": "ATEAM1" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "D6545CB14FCA7840A295FB0566C27E4B9D526993", - "pub_key": { - "type": "AC26791624DE60", - "value": "rcl+kuM69Un/a7e+fQsQrCEtT1g04tFviOeq2GygSIw=" - }, - "description": { - "moniker": "idoor", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", - "pub_key": { - "type": "AC26791624DE60", - "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" - }, - "description": { - "moniker": "naruemon", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", - "pub_key": { - "type": "AC26791624DE60", - "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" - }, - "description": { - "moniker": "Adrian Brink - Cryptium Labs", - "identity": "", - "website": "https://cryptium.ch", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "ECE57661F0CDCF28EED257B72F86240E57F4A612", - "pub_key": { - "type": "AC26791624DE60", - "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" - }, - "description": { - "moniker": "zaki", - "identity": "", - "website": "", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", - "pub_key": { - "type": "AC26791624DE60", - "value": "cvGYknYP9XMUzqlXZde7lRpvAp/kZiSRYHg66krJNxQ=" - }, - "description": { - "moniker": "trust", - "identity": "", - "website": "http://cosmos-trust.com", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - }, - { - "owner": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", - "pub_key": { - "type": "AC26791624DE60", - "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" - }, - "description": { - "moniker": "proof-of-audit", - "identity": "", - "website": "https://proof-of-audit.com", - "details": "" - }, - "revoked": false, - "pool_shares": { - "status": 2, - "amount": "1000" - }, - "delegator_shares": "1000", - "bond_height": 0, - "bond_intra_tx_counter": 0, - "commision": "0/1", - "commission_max": "0/1", - "commission_change_rate": "0/1", - "commission_change_rate_today": "0/1", - "prev_bonded_shares": "0/1" - } - ] - } - } -} diff --git a/version/version.go b/version/version.go index 20074c7bcd..116f1ff287 100644 --- a/version/version.go +++ b/version/version.go @@ -9,7 +9,7 @@ const Maj = "0" const Min = "18" const Fix = "0" -const Version = "0.18.0" +const Version = "0.18.0-dev" // GitCommit set by build flags var GitCommit = "" From 65786e4578074d0a6a47f5bfbf0291fe78ba7ec3 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 13 Jun 2018 10:05:50 +0200 Subject: [PATCH 251/548] Update version.go & changelog --- CHANGELOG.md | 5 +++++ version/version.go | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f40117f82d..4428f7a4c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 0.19.0 + +*June 13, 2018* + BREAKING CHANGES * msg.GetSignBytes() now returns bech32-encoded addresses in all cases * [lcd] REST end-points now include gas @@ -15,6 +19,7 @@ IMPROVEMENTS * [x/stake] More stake tests added to test ByPower index FIXES +* Fixes consensus fault on testnet - see postmortem [here](https://github.com/cosmos/cosmos-sdk/issues/1197#issuecomment-396823021) * [x/stake] bonded inflation removed, non-bonded inflation partially implemented * [lcd] Switch to bech32 for addresses on all human readable inputs and outputs * [lcd] fixed tx indexing/querying diff --git a/version/version.go b/version/version.go index 20074c7bcd..e24ef62f18 100644 --- a/version/version.go +++ b/version/version.go @@ -6,10 +6,10 @@ package version // TODO improve const Maj = "0" -const Min = "18" +const Min = "19" const Fix = "0" -const Version = "0.18.0" +const Version = "0.19.0" // GitCommit set by build flags var GitCommit = "" From 1b7396d4872c9650eb854897e658f3d60bcc791f Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Wed, 13 Jun 2018 01:34:51 -0700 Subject: [PATCH 252/548] dev version bump --- CHANGELOG.md | 4 ++++ version/version.go | 8 ++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4428f7a4c8..fdfd1895f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 0.20.0 + +*TBD* + ## 0.19.0 *June 13, 2018* diff --git a/version/version.go b/version/version.go index e24ef62f18..4966455689 100644 --- a/version/version.go +++ b/version/version.go @@ -1,15 +1,11 @@ //nolint package version -// when updating these, -// remember to also update examples/basecoin/tests/cli/rpc.sh -// TODO improve - const Maj = "0" -const Min = "19" +const Min = "20" const Fix = "0" -const Version = "0.19.0" +const Version = "0.20.0-dev" // GitCommit set by build flags var GitCommit = "" From 8acac9089413528e43dba4f48b6975b6a1e16fde Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Wed, 13 Jun 2018 01:39:08 -0700 Subject: [PATCH 253/548] gaia 6002 --- cmd/gaia/testnets/README.md | 12 +- cmd/gaia/testnets/STATUS.md | 14 + cmd/gaia/testnets/gaia-6002/genesis.json | 1459 ++++++++++++++++++++++ 3 files changed, 1479 insertions(+), 6 deletions(-) create mode 100644 cmd/gaia/testnets/gaia-6002/genesis.json diff --git a/cmd/gaia/testnets/README.md b/cmd/gaia/testnets/README.md index b34926aede..b65feeb915 100644 --- a/cmd/gaia/testnets/README.md +++ b/cmd/gaia/testnets/README.md @@ -1,4 +1,4 @@ -# Connect to the `gaia-6001` Testnet +# Connect to the `gaia-6002` Testnet Note: We are aware this documentation is sub-par. We are working to improve the tooling and the documentation to make this process as painless as @@ -23,7 +23,7 @@ Next, let's install the testnet's version of the Cosmos SDK. mkdir -p $GOPATH/src/github.com/cosmos cd $GOPATH/src/github.com/cosmos git clone https://github.com/cosmos/cosmos-sdk -cd cosmos-sdk && git checkout v0.18.0 +cd cosmos-sdk && git checkout v0.19.0 make get_tools && make get_vendor_deps && make install ``` @@ -31,7 +31,7 @@ That will install the `gaiad` and `gaiacli` binaries. Verify that everything is ``` gaiad version -0.18.0-eceb56b7 +0.19.0- ``` ### Node Setup @@ -76,7 +76,7 @@ Now it is time to upgrade the software: ``` cd $GOPATH/src/github.com/cosmos/cosmos-sdk -git fetch --all && git checkout v0.18.0 +git fetch --all && git checkout v0.19.0 make update_tools && make get_vendor_deps && make install ``` @@ -90,7 +90,7 @@ Copy the testnet's `genesis.json` file and place it in `gaiad`'s config director ``` mkdir -p $HOME/.gaiad/config -cp -a $GOPATH/src/github.com/cosmos/cosmos-sdk/cmd/gaia/testnets/gaia-6001/genesis.json $HOME/.gaiad/config/genesis.json +cp -a $GOPATH/src/github.com/cosmos/cosmos-sdk/cmd/gaia/testnets/gaia-6002/genesis.json $HOME/.gaiad/config/genesis.json ``` ### Add Seed Nodes @@ -99,7 +99,7 @@ Your node needs to know how to find peers. You'll need to add healthy seed nodes ``` # Comma separated list of seed nodes to connect to -seeds = "38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6001.coinculture.net:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@seed.cosmos.cryptium.ch:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@35.198.166.171:46656,032fa56301de335d835057fb6ad9f7ce2242a66d@165.227.236.213:46656" +seeds = "38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6002.coinculture.net:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@seed.cosmos.cryptium.ch:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@35.198.166.171:46656,032fa56301de335d835057fb6ad9f7ce2242a66d@165.227.236.213:46656" ``` You can also [ask other validators](https://riot.im/app/#/room/#cosmos_validators:matrix.org) for a persistent peer and add it under the `persistent_peers` key. For more information on seeds and peers, [read this](https://github.com/tendermint/tendermint/blob/develop/docs/using-tendermint.md#peers). diff --git a/cmd/gaia/testnets/STATUS.md b/cmd/gaia/testnets/STATUS.md index 6f2140c264..9b3940ef2b 100644 --- a/cmd/gaia/testnets/STATUS.md +++ b/cmd/gaia/testnets/STATUS.md @@ -1,5 +1,19 @@ # TESTNET STATUS +## *June 13, 2018, 4:30 EST* - New Testnet Gaia-6002 + +- After fixing bugs from gaia-6001, especially [issue + #1197](https://github.com/cosmos/cosmos-sdk/issues/1197), we are announcing a + new testnet, Gaia-6002 +- Gaia-6002 has the same genesis file as Gaia-6001, just with the chain-id + updated + +## *June 13, 2018, 4:30 EST* - New Release + +- Released gaia + [v0.19.0](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.19.0) +- Includes various bug-fixes for staking found on Gaia-6001 + ## *June 13, 2018, 2:30 EST* - Published Postmortem of Gaia-6001 failure - A bug in the design of the staking data model caused a sanity check to fail diff --git a/cmd/gaia/testnets/gaia-6002/genesis.json b/cmd/gaia/testnets/gaia-6002/genesis.json new file mode 100644 index 0000000000..7f53893a86 --- /dev/null +++ b/cmd/gaia/testnets/gaia-6002/genesis.json @@ -0,0 +1,1459 @@ +{ + "genesis_time": "2018-06-16T18:29:12.38288148Z", + "chain_id": "gaia-6002", + "consensus_params": { + "block_size_params": { + "max_bytes": 22020096, + "max_txs": 100000, + "max_gas": -1 + }, + "tx_size_params": { + "max_bytes": 10240, + "max_gas": -1 + }, + "block_gossip_params": { + "block_part_size_bytes": 65536 + }, + "evidence_params": { + "max_age": 100000 + } + }, + "validators": [ + { + "pub_key": { + "type": "AC26791624DE60", + "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" + }, + "power": 1000, + "name": "adrian" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" + }, + "power": 1000, + "name": "zaki" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "bIvXwf0qlOy0rO0SY/h8FfsqyW/AMpGL2yUhUNOY7hs=" + }, + "power": 100, + "name": "staked" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" + }, + "power": 1000, + "name": "polsdam" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" + }, + "power": 1000, + "name": "lino" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" + }, + "power": 100, + "name": "" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" + }, + "power": 1000, + "name": "iris" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" + }, + "power": 1000, + "name": "pbostrom" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" + }, + "power": 1000, + "name": "aurel" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" + }, + "power": 1000, + "name": "bucky" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" + }, + "power": 100, + "name": "cwgoes" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "TNPLvN6f6QoSLJqGHzIfbraBoSw3emr9Sk2Us94M4gM=" + }, + "power": 1000, + "name": "bdnet" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "cvGYknYP9XMUzqlXZde7lRpvAp/kZiSRYHg66krJNxQ=" + }, + "power": 1000, + "name": "melea-trust" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" + }, + "power": 1000, + "name": "naruemon" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "rcl+kuM69Un/a7e+fQsQrCEtT1g04tFviOeq2GygSIw=" + }, + "power": 1000, + "name": "idoor" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "S9urD5q7je21qp5vEobiURdWrtJwvqMsfZGQhb8GOBQ=" + }, + "power": 1000, + "name": "ATEAM1" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "vSr94aI+zfF3D8Cr2VtCXPpfgj7t2ck8SlZxRsfn7gk=" + }, + "power": 1000, + "name": "figmatt" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "p5ijoVwp2zmA7RkXXvPl+yqdnlaWMwoV2pYIN8bDyFs=" + }, + "power": 1000, + "name": "jla-bsd" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "KOdWpo4aQFrLxVlkyc66p7m6mBNnPLmGuO4Z4L+CI1Y=" + }, + "power": 1000, + "name": "Gold" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "VfOsmcON77auerRc9zKwOR+CvL0sj1nA45hS2WqX1xE=" + }, + "power": 1000, + "name": "nylira" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "QYONAknaJqx3OKPSKraDrOPkx6xssezYtXVS84nZvZE=" + }, + "power": 1000, + "name": "BKCM" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "PyFJmNrUres3QOkj2BjxplCxrOF+HDFGohi3tRKsToY=" + }, + "power": 1000, + "name": "Dev's Validator" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "s4ER09+WeX10euzGyK7xDW7+myQVXt3Plup8IHUE4nk=" + }, + "power": 1000, + "name": "Staking Facilities" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "OPxj9edXgufNEjYNhZKqLgmYnK4A3nGw3rxaFQrHn24=" + }, + "power": 1000, + "name": "nuevax" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "Hi2rtbdJdQtOe3Kq4OoD/xkWJbIjIsUI9qgLQ6TlhiM=" + }, + "power": 1000, + "name": "vultr.guest" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "ah3JtmBA7gbxSiimPsLqQlV85gpNOUBJMvnxGx8eVlo=" + }, + "power": 1000, + "name": "forebole" + } + ], + "app_hash": "", + "app_state": { + "accounts": [ + { + "address": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "coins": [ + { + "denom": "devToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "coins": [ + { + "denom": "adrianToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "109720515B4F8C0858DA3521E448262334534FFD", + "coins": [ + { + "denom": "defaultToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "coins": [ + { + "denom": "aurelToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "328FBB8EA315D070DF908982A5F91A3618001D20", + "coins": [ + { + "denom": "cwgoesToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "coins": [ + { + "denom": "BKCMToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "coins": [ + { + "denom": "BDToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "coins": [ + { + "denom": "suyuToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "coins": [ + { + "denom": "linoToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "coins": [ + { + "denom": "stakingToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "935E04662697134905706A4CCDB822AC6FC11C2E", + "coins": [ + { + "denom": "defaultToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "935E48ED79F1006ED135553768E1D9A768747CF6", + "coins": [ + { + "denom": "buckyToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "99FFAEE5BF6040EADA2F26548C4A702619797C9F", + "coins": [ + { + "denom": "kwunyeungToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + }, + { + "address": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "zachToken", + "amount": 1000 + } + ] + }, + { + "address": "A323EC45243D600204BA3D298E3C20322D08C84C", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "nuevaxToken", + "amount": 1000 + } + ] + }, + { + "address": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "dokiaToken", + "amount": 1000 + } + ] + }, + { + "address": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "forboleToken", + "amount": 1000 + } + ] + }, + { + "address": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "coins": [ + { + "denom": "steak", + "amount": 100 + }, + { + "denom": "pengToken", + "amount": 1000 + } + ] + }, + { + "address": "FD30D5C983FFEDEC069C3DDFCF270E41A556A86E", + "coins": [ + { + "denom": "steak", + "amount": 900 + }, + { + "denom": "faucetToken", + "amount": 10000000 + } + ] + }, + { + "address": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "goldToken", + "amount": 100 + } + ] + }, + { + "address": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "jlaToken", + "amount": 100 + } + ] + }, + { + "address": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "figmattToken", + "amount": 100 + } + ] + }, + { + "address": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "ATEAM1Token", + "amount": 100 + } + ] + }, + { + "address": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "idoorToken", + "amount": 100 + } + ] + }, + { + "address": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "naruemonToken", + "amount": 100 + } + ] + }, + { + "address": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "zakiToken", + "amount": 1000 + } + ] + }, + { + "address": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "coins": [ + { + "denom": "steak", + "amount": 50 + }, + { + "denom": "trustToken", + "amount": 1000 + } + ] + }, + { + "address": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "coins": [ + { + "denom": "poldsamToken", + "amount": 1000 + }, + { + "denom": "steak", + "amount": 50 + } + ] + } + ], + "stake": { + "pool": { + "loose_unbonded_tokens": 2300, + "unbonded_tokens": 0, + "unbonding_tokens": 0, + "bonded_tokens": 23300, + "unbonded_shares": "0", + "unbonding_shares": "0", + "bonded_shares": "23300", + "inflation_last_time": 0, + "inflation": "9012837/100000000", + "date_last_commission_reset": 0, + "prev_bonded_shares": "0" + }, + "params": { + "inflation_rate_change": "13/100", + "inflation_max": "1/5", + "inflation_min": "7/100", + "goal_bonded": "67/100", + "max_validators": 100, + "bond_denom": "steak" + }, + "bonds": [ + { + "delegator_addr": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "validator_addr": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "109720515B4F8C0858DA3521E448262334534FFD", + "validator_addr": "109720515B4F8C0858DA3521E448262334534FFD", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "validator_addr": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "328FBB8EA315D070DF908982A5F91A3618001D20", + "validator_addr": "328FBB8EA315D070DF908982A5F91A3618001D20", + "shares": "100", + "height": 0 + }, + { + "delegator_addr": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "validator_addr": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "validator_addr": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "validator_addr": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "validator_addr": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "validator_addr": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "935E04662697134905706A4CCDB822AC6FC11C2E", + "validator_addr": "935E04662697134905706A4CCDB822AC6FC11C2E", + "shares": "100", + "height": 0 + }, + { + "delegator_addr": "935E48ED79F1006ED135553768E1D9A768747CF6", + "validator_addr": "935E48ED79F1006ED135553768E1D9A768747CF6", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "validator_addr": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "shares": "100", + "height": 0 + }, + { + "delegator_addr": "A323EC45243D600204BA3D298E3C20322D08C84C", + "validator_addr": "A323EC45243D600204BA3D298E3C20322D08C84C", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "validator_addr": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "validator_addr": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "validator_addr": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "validator_addr": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "validator_addr": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "validator_addr": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "validator_addr": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "validator_addr": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "validator_addr": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "validator_addr": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "validator_addr": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "validator_addr": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "shares": "1000", + "height": 0 + }, + { + "delegator_addr": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "validator_addr": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "shares": "1000", + "height": 0 + } + ], + "validators": [ + { + "owner": "04F01D5AF8DD248130BBE1D0780EA219CE479A9B", + "pub_key": { + "type": "AC26791624DE60", + "value": "PyFJmNrUres3QOkj2BjxplCxrOF+HDFGohi3tRKsToY=" + }, + "description": { + "moniker": "Dev's Validator", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "109720515B4F8C0858DA3521E448262334534FFD", + "pub_key": { + "type": "AC26791624DE60", + "value": "pY7eLF0Ez3yq495kIjag8mD67Q131np/ssagpEvlV2A=" + }, + "description": { + "moniker": "", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "10B0899E05A486AE4E5589C39587DF7E9A185872", + "pub_key": { + "type": "AC26791624DE60", + "value": "RpX+xkwnCNw5DpBelscz4//TiODyC9RDiyIuD6NEwx0=" + }, + "description": { + "moniker": "aurel", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "328FBB8EA315D070DF908982A5F91A3618001D20", + "pub_key": { + "type": "AC26791624DE60", + "value": "dcmCn+RZTBdwbCa4YqSnw/Va7xQloBw6vF87ItLwdM0=" + }, + "description": { + "moniker": "cwgoes", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "100" + }, + "delegator_shares": "100", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "4062DAFB9ACD4D91051B569CD4B19A26524B314B", + "pub_key": { + "type": "AC26791624DE60", + "value": "QYONAknaJqx3OKPSKraDrOPkx6xssezYtXVS84nZvZE=" + }, + "description": { + "moniker": "BKCM", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "42D76AF31E36EE23CA5366FBB9CE18610CCB9820", + "pub_key": { + "type": "AC26791624DE60", + "value": "TNPLvN6f6QoSLJqGHzIfbraBoSw3emr9Sk2Us94M4gM=" + }, + "description": { + "moniker": "bdnet", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "4B5BE759EB23B0D76C6A60636BD0E3111178794E", + "pub_key": { + "type": "AC26791624DE60", + "value": "7SaH/LyM+qdz9ovD/pvqIf2q7LC7tc5v0ZJxsA2CGTw=" + }, + "description": { + "moniker": "suyu", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "5A007B81A25AF34B829B79DA508A26E12180BCDB", + "pub_key": { + "type": "AC26791624DE60", + "value": "SW12+WpGKUCO9oT2CV0CD5kUclbXjJHV1MjerLWB7Oc=" + }, + "description": { + "moniker": "lino", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "83C2788B74E1A410A4E62F1040EAE15F4B6EA3F5", + "pub_key": { + "type": "AC26791624DE60", + "value": "s4ER09+WeX10euzGyK7xDW7+myQVXt3Plup8IHUE4nk=" + }, + "description": { + "moniker": "Staking Facilities", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "935E04662697134905706A4CCDB822AC6FC11C2E", + "pub_key": { + "type": "AC26791624DE60", + "value": "bIvXwf0qlOy0rO0SY/h8FfsqyW/AMpGL2yUhUNOY7hs=" + }, + "description": { + "moniker": "default", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "100" + }, + "delegator_shares": "100", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "935E48ED79F1006ED135553768E1D9A768747CF6", + "pub_key": { + "type": "AC26791624DE60", + "value": "0aNTDL49987ZNRi3FtJIi0jk93ybHuYg1FjWrfP9H2o=" + }, + "description": { + "moniker": "bucky", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "9D5723057702E2090405AB5D3B48C45B9ABF4377", + "pub_key": { + "type": "AC26791624DE60", + "value": "NjjEQKUsq8F0gWxl3BoU2Li5n7hEz9H/LX80rfMxVyE=" + }, + "description": { + "moniker": "zach", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "100" + }, + "delegator_shares": "100", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "A323EC45243D600204BA3D298E3C20322D08C84C", + "pub_key": { + "type": "AC26791624DE60", + "value": "OPxj9edXgufNEjYNhZKqLgmYnK4A3nGw3rxaFQrHn24=" + }, + "description": { + "moniker": "nuevax", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "A9A3DADDC8BFFAD52BA51C8F4F2E9F62709412DC", + "pub_key": { + "type": "AC26791624DE60", + "value": "Hi2rtbdJdQtOe3Kq4OoD/xkWJbIjIsUI9qgLQ6TlhiM=" + }, + "description": { + "moniker": "vultr.guest", + "identity": "", + "website": "https://ion.dokia.capital/", + "details": "DokiaValidator" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "B6834D914FE50F0C743E6A012AB20438CFADFB95", + "pub_key": { + "type": "AC26791624DE60", + "value": "ah3JtmBA7gbxSiimPsLqQlV85gpNOUBJMvnxGx8eVlo=" + }, + "description": { + "moniker": "forbole", + "identity": "", + "website": "https://www.forbole.com", + "details": "Recommend. Refer. Reward" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "B75C2C4309475C91E8DE271BC52CBAC408365B83", + "pub_key": { + "type": "AC26791624DE60", + "value": "VfOsmcON77auerRc9zKwOR+CvL0sj1nA45hS2WqX1xE=" + }, + "description": { + "moniker": "nylira", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "C0D0CA58C50B7B02A841E1B27D9A21D939754AC7", + "pub_key": { + "type": "AC26791624DE60", + "value": "KOdWpo4aQFrLxVlkyc66p7m6mBNnPLmGuO4Z4L+CI1Y=" + }, + "description": { + "moniker": "Gold", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "C5033FCFB67D7BD7B8546389F125710462D4FB6C", + "pub_key": { + "type": "AC26791624DE60", + "value": "p5ijoVwp2zmA7RkXXvPl+yqdnlaWMwoV2pYIN8bDyFs=" + }, + "description": { + "moniker": "jla-bsd", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "C6CB038C98026D2F17241A3B3166AE7E9488D9AD", + "pub_key": { + "type": "AC26791624DE60", + "value": "vSr94aI+zfF3D8Cr2VtCXPpfgj7t2ck8SlZxRsfn7gk=" + }, + "description": { + "moniker": "figmatt", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "D0861E3F22339C507B716102FDD5CA681EDE4F8E", + "pub_key": { + "type": "AC26791624DE60", + "value": "S9urD5q7je21qp5vEobiURdWrtJwvqMsfZGQhb8GOBQ=" + }, + "description": { + "moniker": "ATEAM1", + "identity": "", + "website": "", + "details": "ATEAM1" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "D6545CB14FCA7840A295FB0566C27E4B9D526993", + "pub_key": { + "type": "AC26791624DE60", + "value": "rcl+kuM69Un/a7e+fQsQrCEtT1g04tFviOeq2GygSIw=" + }, + "description": { + "moniker": "idoor", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "D841E0DACF3994E6A40126F023F6F32F98A5D89E", + "pub_key": { + "type": "AC26791624DE60", + "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" + }, + "description": { + "moniker": "naruemon", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "pub_key": { + "type": "AC26791624DE60", + "value": "TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4=" + }, + "description": { + "moniker": "Adrian Brink - Cryptium Labs", + "identity": "", + "website": "https://cryptium.ch", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "ECE57661F0CDCF28EED257B72F86240E57F4A612", + "pub_key": { + "type": "AC26791624DE60", + "value": "CDF/8aD8Lt+ikR3LyCg9c7DwWBA51NH+MUkH7tzxrfY=" + }, + "description": { + "moniker": "zaki", + "identity": "", + "website": "", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "EFE597F7A90D3F3E7599B25259449628E2C4AFAD", + "pub_key": { + "type": "AC26791624DE60", + "value": "cvGYknYP9XMUzqlXZde7lRpvAp/kZiSRYHg66krJNxQ=" + }, + "description": { + "moniker": "trust", + "identity": "", + "website": "http://cosmos-trust.com", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + }, + { + "owner": "FA929191B04C5DB222AFC6F15C63EF48CCC864C5", + "pub_key": { + "type": "AC26791624DE60", + "value": "RMwWTZsVdkq1heicNJb2fosy9Fls4NHxAHReiJvHl+8=" + }, + "description": { + "moniker": "proof-of-audit", + "identity": "", + "website": "https://proof-of-audit.com", + "details": "" + }, + "revoked": false, + "pool_shares": { + "status": 2, + "amount": "1000" + }, + "delegator_shares": "1000", + "bond_height": 0, + "bond_intra_tx_counter": 0, + "commision": "0/1", + "commission_max": "0/1", + "commission_change_rate": "0/1", + "commission_change_rate_today": "0/1", + "prev_bonded_shares": "0/1" + } + ] + } + } +} From 6b9f8510323b701c8bb080d383c52dc23905ca00 Mon Sep 17 00:00:00 2001 From: gamarin2 Date: Wed, 13 Jun 2018 11:11:55 +0200 Subject: [PATCH 254/548] Add update testnet guide to status --- cmd/gaia/testnets/STATUS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/gaia/testnets/STATUS.md b/cmd/gaia/testnets/STATUS.md index 9b3940ef2b..1e3a677046 100644 --- a/cmd/gaia/testnets/STATUS.md +++ b/cmd/gaia/testnets/STATUS.md @@ -7,6 +7,7 @@ new testnet, Gaia-6002 - Gaia-6002 has the same genesis file as Gaia-6001, just with the chain-id updated +- Update from previous testnet [here](https://github.com/cosmos/cosmos-sdk/tree/master/cmd/gaia/testnets#upgrading-from-previous-testnet) ## *June 13, 2018, 4:30 EST* - New Release From ec5fd99fc4381fc233dbeadf6d68ecc14b2da83e Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 13 Jun 2018 20:02:08 +0200 Subject: [PATCH 255/548] Move metalinter installation to lint step --- .circleci/config.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ceb9e78a8d..258c0b1060 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -27,12 +27,6 @@ jobs: command: | export PATH="$GOBIN:$PATH" make get_vendor_deps - - run: - name: linter - command: | - export PATH="$GOBIN:$PATH" - go get -u github.com/tendermint/lint/golint - go get -u github.com/alecthomas/gometalinter - run: name: binaries command: | @@ -63,6 +57,12 @@ jobs: key: v1-pkg-cache - restore_cache: key: v1-tree-{{ .Environment.CIRCLE_SHA1 }} + - run: + name: Get metalinter + command: | + export PATH="$GOBIN:$PATH" + go get -u github.com/tendermint/lint/golint + go get -u github.com/alecthomas/gometalinter - run: name: Lint source command: | From ec2fedd36cc361af03c2ce983ea3762614aa4059 Mon Sep 17 00:00:00 2001 From: David Kajpust Date: Wed, 13 Jun 2018 15:13:22 -0400 Subject: [PATCH 256/548] Merge PR #1227: Set all Error strings 1st letters to lowercase. Fixes issue #1154 --- baseapp/baseapp.go | 10 +++---- client/context/helpers.go | 16 +++++------ client/input.go | 4 +-- client/keys/add.go | 2 +- client/lcd/root.go | 2 +- client/rpc/root.go | 2 +- client/tx/search.go | 2 +- cmd/gaia/app/genesis.go | 2 +- examples/democoin/x/cool/errors.go | 2 +- examples/democoin/x/pow/errors.go | 16 +++++------ server/export.go | 2 +- server/start.go | 4 +-- server/start_test.go | 2 +- store/rootmultistore.go | 10 +++---- types/account.go | 2 +- types/coin.go | 4 +-- types/errors.go | 28 +++++++++---------- x/auth/client/rest/query.go | 6 ++-- x/bank/errors.go | 4 +-- x/ibc/client/cli/relay.go | 6 ++-- x/ibc/errors.go | 4 +-- x/slashing/errors.go | 10 +++---- x/slashing/tick.go | 2 +- x/stake/client/rest/query.go | 8 +++--- x/stake/client/rest/tx.go | 12 ++++---- x/stake/errors.go | 44 +++++++++++++++--------------- x/stake/keeper.go | 6 ++-- x/stake/msg.go | 2 +- 28 files changed, 107 insertions(+), 107 deletions(-) diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 4d32b92f5c..93ea6ae03a 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -193,7 +193,7 @@ func (app *BaseApp) initFromStore(mainKey sdk.StoreKey) error { // TODO: we don't actually need the main store here main := app.cms.GetKVStore(mainKey) if main == nil { - return errors.New("BaseApp expects MultiStore with 'main' KVStore") + return errors.New("baseapp expects MultiStore with 'main' KVStore") } // XXX: Do we really need the header? What does it have that we want @@ -216,11 +216,11 @@ func (app *BaseApp) initFromStore(mainKey sdk.StoreKey) error { } err := proto.Unmarshal(headerBytes, &header) if err != nil { - return errors.Wrap(err, "Failed to parse Header") + return errors.Wrap(err, "failed to parse Header") } lastVersion := lastCommitID.Version if header.Height != lastVersion { - errStr := fmt.Sprintf("Expected db://%s.Height %v but got %v", dbHeaderKey, lastVersion, header.Height) + errStr := fmt.Sprintf("expected db://%s.Height %v but got %v", dbHeaderKey, lastVersion, header.Height) return errors.New(errStr) } } @@ -468,10 +468,10 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte, tx sdk.Tx) (result sdk if r := recover(); r != nil { switch r.(type) { case sdk.ErrorOutOfGas: - log := fmt.Sprintf("Out of gas in location: %v", r.(sdk.ErrorOutOfGas).Descriptor) + log := fmt.Sprintf("out of gas in location: %v", r.(sdk.ErrorOutOfGas).Descriptor) result = sdk.ErrOutOfGas(log).Result() default: - log := fmt.Sprintf("Recovered: %v\nstack:\n%v", r, string(debug.Stack())) + log := fmt.Sprintf("recovered: %v\nstack:\n%v", r, string(debug.Stack())) result = sdk.ErrInternal(log).Result() } } diff --git a/client/context/helpers.go b/client/context/helpers.go index 0229827fe7..0e28f5fd0a 100644 --- a/client/context/helpers.go +++ b/client/context/helpers.go @@ -30,12 +30,12 @@ func (ctx CoreContext) BroadcastTx(tx []byte) (*ctypes.ResultBroadcastTxCommit, } if res.CheckTx.Code != uint32(0) { - return res, errors.Errorf("CheckTx failed: (%d) %s", + return res, errors.Errorf("checkTx failed: (%d) %s", res.CheckTx.Code, res.CheckTx.Log) } if res.DeliverTx.Code != uint32(0) { - return res, errors.Errorf("DeliverTx failed: (%d) %s", + return res, errors.Errorf("deliverTx failed: (%d) %s", res.DeliverTx.Code, res.DeliverTx.Log) } @@ -75,7 +75,7 @@ func (ctx CoreContext) query(key cmn.HexBytes, storeName, endPath string) (res [ } resp := result.Response if resp.Code != uint32(0) { - return res, errors.Errorf("Query failed: (%d) %s", resp.Code, resp.Log) + return res, errors.Errorf("query failed: (%d) %s", resp.Code, resp.Log) } return resp.Value, nil } @@ -95,7 +95,7 @@ func (ctx CoreContext) GetFromAddress() (from sdk.Address, err error) { info, err := keybase.Get(name) if err != nil { - return nil, errors.Errorf("No key for: %s", name) + return nil, errors.Errorf("no key for: %s", name) } return info.PubKey.Address(), nil @@ -107,7 +107,7 @@ func (ctx CoreContext) SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *w // build the Sign Messsage from the Standard Message chainID := ctx.ChainID if chainID == "" { - return nil, errors.Errorf("Chain ID required but not specified") + return nil, errors.Errorf("chain ID required but not specified") } accnum := ctx.AccountNumber sequence := ctx.Sequence @@ -174,7 +174,7 @@ func (ctx CoreContext) EnsureSignBuildBroadcast(name string, msg sdk.Msg, cdc *w // get the next sequence for the account address func (ctx CoreContext) GetAccountNumber(address []byte) (int64, error) { if ctx.Decoder == nil { - return 0, errors.New("AccountDecoder required but not provided") + return 0, errors.New("accountDecoder required but not provided") } res, err := ctx.Query(auth.AddressStoreKey(address), ctx.AccountStore) @@ -198,7 +198,7 @@ func (ctx CoreContext) GetAccountNumber(address []byte) (int64, error) { // get the next sequence for the account address func (ctx CoreContext) NextSequence(address []byte) (int64, error) { if ctx.Decoder == nil { - return 0, errors.New("AccountDecoder required but not provided") + return 0, errors.New("accountDecoder required but not provided") } res, err := ctx.Query(auth.AddressStoreKey(address), ctx.AccountStore) @@ -229,7 +229,7 @@ func (ctx CoreContext) GetPassphraseFromStdin(name string) (pass string, err err // GetNode prepares a simple rpc.Client func (ctx CoreContext) GetNode() (rpcclient.Client, error) { if ctx.Client == nil { - return nil, errors.New("Must define node URI") + return nil, errors.New("must define node URI") } return ctx.Client, nil } diff --git a/client/input.go b/client/input.go index 53906ca88e..03140a33c3 100644 --- a/client/input.go +++ b/client/input.go @@ -32,7 +32,7 @@ func GetPassword(prompt string, buf *bufio.Reader) (pass string, err error) { return "", err } if len(pass) < MinPassLength { - return "", errors.Errorf("Password must be at least %d characters", MinPassLength) + return "", errors.Errorf("password must be at least %d characters", MinPassLength) } return pass, nil } @@ -68,7 +68,7 @@ func GetCheckPassword(prompt, prompt2 string, buf *bufio.Reader) (string, error) return "", err } if pass != pass2 { - return "", errors.New("Passphrases don't match") + return "", errors.New("passphrases don't match") } return pass, nil } diff --git a/client/keys/add.go b/client/keys/add.go index 7ad9474cef..5210a388a6 100644 --- a/client/keys/add.go +++ b/client/keys/add.go @@ -53,7 +53,7 @@ func runAddCmd(cmd *cobra.Command, args []string) error { name = "inmemorykey" } else { if len(args) != 1 || len(args[0]) == 0 { - return errors.New("You must provide a name for the key") + return errors.New("you must provide a name for the key") } name = args[0] kb, err = GetKeyBase() diff --git a/client/lcd/root.go b/client/lcd/root.go index c3ec75c964..66491dfec1 100644 --- a/client/lcd/root.go +++ b/client/lcd/root.go @@ -49,7 +49,7 @@ func ServeCommand(cdc *wire.Codec) *cobra.Command { // Wait forever and cleanup cmn.TrapSignal(func() { err := listener.Close() - logger.Error("Error closing listener", "err", err) + logger.Error("error closing listener", "err", err) }) return nil }, diff --git a/client/rpc/root.go b/client/rpc/root.go index e89972c3c7..63ba64a18b 100644 --- a/client/rpc/root.go +++ b/client/rpc/root.go @@ -18,7 +18,7 @@ const ( // XXX: remove this when not needed func todoNotImplemented(_ *cobra.Command, _ []string) error { - return errors.New("TODO: Command not yet implemented") + return errors.New("todo: Command not yet implemented") } // AddCommands adds a number of rpc-related subcommands diff --git a/client/tx/search.go b/client/tx/search.go index 3ab3a3df1b..b3ebbf34ef 100644 --- a/client/tx/search.go +++ b/client/tx/search.go @@ -54,7 +54,7 @@ func SearchTxCmd(cdc *wire.Codec) *cobra.Command { func searchTxs(ctx context.CoreContext, cdc *wire.Codec, tags []string) ([]txInfo, error) { if len(tags) == 0 { - return nil, errors.New("Must declare at least one tag to search") + return nil, errors.New("must declare at least one tag to search") } // XXX: implement ANY query := strings.Join(tags, " AND ") diff --git a/cmd/gaia/app/genesis.go b/cmd/gaia/app/genesis.go index 558bca38ab..06fdbbcc50 100644 --- a/cmd/gaia/app/genesis.go +++ b/cmd/gaia/app/genesis.go @@ -92,7 +92,7 @@ func GaiaAppGenTx(cdc *wire.Codec, pk crypto.PubKey) ( overwrite := viper.GetBool(flagOWK) name := viper.GetString(flagName) if name == "" { - return nil, nil, tmtypes.GenesisValidator{}, errors.New("Must specify --name (validator moniker)") + return nil, nil, tmtypes.GenesisValidator{}, errors.New("must specify --name (validator moniker)") } var addr sdk.Address diff --git a/examples/democoin/x/cool/errors.go b/examples/democoin/x/cool/errors.go index 7a5e62c5d9..73df2386ef 100644 --- a/examples/democoin/x/cool/errors.go +++ b/examples/democoin/x/cool/errors.go @@ -16,5 +16,5 @@ const ( // ErrIncorrectCoolAnswer - Error returned upon an incorrect guess func ErrIncorrectCoolAnswer(codespace sdk.CodespaceType, answer string) sdk.Error { - return sdk.NewError(codespace, CodeIncorrectCoolAnswer, fmt.Sprintf("Incorrect cool answer: %v", answer)) + return sdk.NewError(codespace, CodeIncorrectCoolAnswer, fmt.Sprintf("incorrect cool answer: %v", answer)) } diff --git a/examples/democoin/x/pow/errors.go b/examples/democoin/x/pow/errors.go index a499e0d9f2..e25964da73 100644 --- a/examples/democoin/x/pow/errors.go +++ b/examples/democoin/x/pow/errors.go @@ -23,21 +23,21 @@ const ( func codeToDefaultMsg(code CodeType) string { switch code { case CodeInvalidDifficulty: - return "Insuffient difficulty" + return "insuffient difficulty" case CodeNonexistentDifficulty: - return "Nonexistent difficulty" + return "nonexistent difficulty" case CodeNonexistentReward: - return "Nonexistent reward" + return "nonexistent reward" case CodeNonexistentCount: - return "Nonexistent count" + return "nonexistent count" case CodeInvalidProof: - return "Invalid proof" + return "invalid proof" case CodeNotBelowTarget: - return "Not below target" + return "not below target" case CodeInvalidCount: - return "Invalid count" + return "invalid count" case CodeUnknownRequest: - return "Unknown request" + return "unknown request" default: return sdk.CodeToDefaultMsg(code) } diff --git a/server/export.go b/server/export.go index 794235f629..0ff7456add 100644 --- a/server/export.go +++ b/server/export.go @@ -20,7 +20,7 @@ func ExportCmd(ctx *Context, cdc *wire.Codec, appExporter AppExporter) *cobra.Co home := viper.GetString("home") appState, validators, err := appExporter(home, ctx.Logger) if err != nil { - return errors.Errorf("Error exporting state: %v\n", err) + return errors.Errorf("error exporting state: %v\n", err) } doc, err := tmtypes.GenesisDocFromFile(ctx.Config.GenesisFile()) if err != nil { diff --git a/server/start.go b/server/start.go index 9bf2d30cdb..5224ef30d2 100644 --- a/server/start.go +++ b/server/start.go @@ -9,8 +9,8 @@ import ( tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" "github.com/tendermint/tendermint/node" - "github.com/tendermint/tendermint/proxy" pvm "github.com/tendermint/tendermint/privval" + "github.com/tendermint/tendermint/proxy" cmn "github.com/tendermint/tmlibs/common" ) @@ -55,7 +55,7 @@ func startStandAlone(ctx *Context, appCreator AppCreator) error { svr, err := server.NewServer(addr, "socket", app) if err != nil { - return errors.Errorf("Error creating listener: %v\n", err) + return errors.Errorf("error creating listener: %v\n", err) } svr.SetLogger(ctx.Logger.With("module", "abci-server")) svr.Start() diff --git a/server/start_test.go b/server/start_test.go index 1c1ad671ec..046bbe19b6 100644 --- a/server/start_test.go +++ b/server/start_test.go @@ -40,7 +40,7 @@ func TestStartStandAlone(t *testing.T) { svrAddr, _, err := FreeTCPAddr() require.Nil(t, err) svr, err := server.NewServer(svrAddr, "socket", app) - require.Nil(t, err, "Error creating listener") + require.Nil(t, err, "error creating listener") svr.SetLogger(logger.With("module", "abci-server")) svr.Start() diff --git a/store/rootmultistore.go b/store/rootmultistore.go index 11cebc22ea..05a2e13fba 100644 --- a/store/rootmultistore.go +++ b/store/rootmultistore.go @@ -89,7 +89,7 @@ func (rs *rootMultiStore) LoadVersion(ver int64) error { id := CommitID{} store, err := rs.loadCommitStoreFromParams(id, storeParams) if err != nil { - return fmt.Errorf("Failed to load rootMultiStore: %v", err) + return fmt.Errorf("failed to load rootMultiStore: %v", err) } rs.stores[key] = store } @@ -112,7 +112,7 @@ func (rs *rootMultiStore) LoadVersion(ver int64) error { storeParams := rs.storesParams[key] store, err := rs.loadCommitStoreFromParams(commitID, storeParams) if err != nil { - return fmt.Errorf("Failed to load rootMultiStore: %v", err) + return fmt.Errorf("failed to load rootMultiStore: %v", err) } newStores[key] = store } @@ -120,7 +120,7 @@ func (rs *rootMultiStore) LoadVersion(ver int64) error { // If any CommitStoreLoaders were not used, return error. for key := range rs.storesParams { if _, ok := newStores[key]; !ok { - return fmt.Errorf("Unused CommitStoreLoader: %v", key) + return fmt.Errorf("unused CommitStoreLoader: %v", key) } } @@ -399,14 +399,14 @@ func getCommitInfo(db dbm.DB, ver int64) (commitInfo, error) { cInfoKey := fmt.Sprintf(commitInfoKeyFmt, ver) cInfoBytes := db.Get([]byte(cInfoKey)) if cInfoBytes == nil { - return commitInfo{}, fmt.Errorf("Failed to get rootMultiStore: no data") + return commitInfo{}, fmt.Errorf("failed to get rootMultiStore: no data") } // Parse bytes. var cInfo commitInfo err := cdc.UnmarshalBinary(cInfoBytes, &cInfo) if err != nil { - return commitInfo{}, fmt.Errorf("Failed to get rootMultiStore: %v", err) + return commitInfo{}, fmt.Errorf("failed to get rootMultiStore: %v", err) } return cInfo, nil } diff --git a/types/account.go b/types/account.go index a7dd50eadc..00f6cc5247 100644 --- a/types/account.go +++ b/types/account.go @@ -160,7 +160,7 @@ func GetFromBech32(bech32str, prefix string) ([]byte, error) { } if hrp != prefix { - return nil, fmt.Errorf("Invalid bech32 prefix. Expected %s, Got %s", prefix, hrp) + return nil, fmt.Errorf("invalid bech32 prefix. Expected %s, Got %s", prefix, hrp) } return bz, nil diff --git a/types/coin.go b/types/coin.go index 8a80bee226..ee26939646 100644 --- a/types/coin.go +++ b/types/coin.go @@ -280,7 +280,7 @@ func ParseCoin(coinStr string) (coin Coin, err error) { matches := reCoin.FindStringSubmatch(coinStr) if matches == nil { - err = fmt.Errorf("Invalid coin expression: %s", coinStr) + err = fmt.Errorf("invalid coin expression: %s", coinStr) return } denomStr, amountStr := matches[2], matches[1] @@ -316,7 +316,7 @@ func ParseCoins(coinsStr string) (coins Coins, err error) { // Validate coins before returning. if !coins.IsValid() { - return nil, fmt.Errorf("ParseCoins invalid: %#v", coins) + return nil, fmt.Errorf("parseCoins invalid: %#v", coins) } return coins, nil diff --git a/types/errors.go b/types/errors.go index 20d4524644..f979ee118c 100644 --- a/types/errors.go +++ b/types/errors.go @@ -68,31 +68,31 @@ const ( func CodeToDefaultMsg(code CodeType) string { switch code { case CodeInternal: - return "Internal error" + return "internal error" case CodeTxDecode: - return "Tx parse error" + return "tx parse error" case CodeInvalidSequence: - return "Invalid sequence" + return "invalid sequence" case CodeUnauthorized: - return "Unauthorized" + return "unauthorized" case CodeInsufficientFunds: - return "Insufficent funds" + return "insufficent funds" case CodeUnknownRequest: - return "Unknown request" + return "unknown request" case CodeInvalidAddress: - return "Invalid address" + return "invalid address" case CodeInvalidPubKey: - return "Invalid pubkey" + return "invalid pubkey" case CodeUnknownAddress: - return "Unknown address" + return "unknown address" case CodeInsufficientCoins: - return "Insufficient coins" + return "insufficient coins" case CodeInvalidCoins: - return "Invalid coins" + return "invalid coins" case CodeOutOfGas: - return "Out of gas" + return "out of gas" default: - return fmt.Sprintf("Unknown code %d", code) + return fmt.Sprintf("unknown code %d", code) } } @@ -183,7 +183,7 @@ type sdkError struct { // Implements ABCIError. func (err *sdkError) Error() string { - return fmt.Sprintf("Error{%d:%d,%#v}", err.codespace, err.code, err.err) + return fmt.Sprintf("error{%d:%d,%#v}", err.codespace, err.code, err.err) } // Implements ABCIError. diff --git a/x/auth/client/rest/query.go b/x/auth/client/rest/query.go index 9ccbe8e142..1f68a69e51 100644 --- a/x/auth/client/rest/query.go +++ b/x/auth/client/rest/query.go @@ -37,7 +37,7 @@ func QueryAccountRequestHandlerFn(storeName string, cdc *wire.Codec, decoder aut res, err := ctx.Query(auth.AddressStoreKey(addr), storeName) if err != nil { w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(fmt.Sprintf("Could't query account. Error: %s", err.Error()))) + w.Write([]byte(fmt.Sprintf("couldn't query account. Error: %s", err.Error()))) return } @@ -51,7 +51,7 @@ func QueryAccountRequestHandlerFn(storeName string, cdc *wire.Codec, decoder aut account, err := decoder(res) if err != nil { w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(fmt.Sprintf("Could't parse query result. Result: %s. Error: %s", res, err.Error()))) + w.Write([]byte(fmt.Sprintf("couldn't parse query result. Result: %s. Error: %s", res, err.Error()))) return } @@ -59,7 +59,7 @@ func QueryAccountRequestHandlerFn(storeName string, cdc *wire.Codec, decoder aut output, err := cdc.MarshalJSON(account) if err != nil { w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(fmt.Sprintf("Could't marshall query result. Error: %s", err.Error()))) + w.Write([]byte(fmt.Sprintf("couldn't marshall query result. Error: %s", err.Error()))) return } diff --git a/x/bank/errors.go b/x/bank/errors.go index bf2a3ef26b..cf11ddc22f 100644 --- a/x/bank/errors.go +++ b/x/bank/errors.go @@ -17,9 +17,9 @@ const ( func codeToDefaultMsg(code sdk.CodeType) string { switch code { case CodeInvalidInput: - return "Invalid input coins" + return "invalid input coins" case CodeInvalidOutput: - return "Invalid output coins" + return "invalid output coins" default: return sdk.CodeToDefaultMsg(code) } diff --git a/x/ibc/client/cli/relay.go b/x/ibc/client/cli/relay.go index caf96d60a4..96c5b08cc7 100644 --- a/x/ibc/client/cli/relay.go +++ b/x/ibc/client/cli/relay.go @@ -116,7 +116,7 @@ OUTER: lengthKey := ibc.EgressLengthKey(toChainID) egressLengthbz, err := query(fromChainNode, lengthKey, c.ibcStore) if err != nil { - c.logger.Error("Error querying outgoing packet list length", "err", err) + c.logger.Error("error querying outgoing packet list length", "err", err) continue OUTER //TODO replace with continue (I think it should just to the correct place where OUTER is now) } var egressLength int64 @@ -134,14 +134,14 @@ OUTER: for i := processed; i < egressLength; i++ { egressbz, err := query(fromChainNode, ibc.EgressKey(toChainID, i), c.ibcStore) if err != nil { - c.logger.Error("Error querying egress packet", "err", err) + c.logger.Error("error querying egress packet", "err", err) continue OUTER // TODO replace to break, will break first loop then send back to the beginning (aka OUTER) } err = c.broadcastTx(seq, toChainNode, c.refine(egressbz, i, passphrase)) seq++ if err != nil { - c.logger.Error("Error broadcasting ingress packet", "err", err) + c.logger.Error("error broadcasting ingress packet", "err", err) continue OUTER // TODO replace to break, will break first loop then send back to the beginning (aka OUTER) } diff --git a/x/ibc/errors.go b/x/ibc/errors.go index 60a141eba2..f7beb0e1db 100644 --- a/x/ibc/errors.go +++ b/x/ibc/errors.go @@ -17,9 +17,9 @@ const ( func codeToDefaultMsg(code sdk.CodeType) string { switch code { case CodeInvalidSequence: - return "Invalid IBC packet sequence" + return "invalid IBC packet sequence" case CodeIdenticalChains: - return "Source and destination chain cannot be identical" + return "source and destination chain cannot be identical" default: return sdk.CodeToDefaultMsg(code) } diff --git a/x/slashing/errors.go b/x/slashing/errors.go index 087dc03141..b9b152c7b4 100644 --- a/x/slashing/errors.go +++ b/x/slashing/errors.go @@ -19,21 +19,21 @@ const ( ) func ErrNoValidatorForAddress(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "That address is not associated with any known validator") + return newError(codespace, CodeInvalidValidator, "that address is not associated with any known validator") } func ErrBadValidatorAddr(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "Validator does not exist for that address") + return newError(codespace, CodeInvalidValidator, "validator does not exist for that address") } func ErrValidatorJailed(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeValidatorJailed, "Validator jailed, cannot yet be unrevoked") + return newError(codespace, CodeValidatorJailed, "validator jailed, cannot yet be unrevoked") } func codeToDefaultMsg(code CodeType) string { switch code { case CodeInvalidValidator: - return "Invalid Validator" + return "invalid Validator" case CodeValidatorJailed: - return "Validator Jailed" + return "validator Jailed" default: return sdk.CodeToDefaultMsg(code) } diff --git a/x/slashing/tick.go b/x/slashing/tick.go index 526baece08..6eb6eeb32b 100644 --- a/x/slashing/tick.go +++ b/x/slashing/tick.go @@ -26,7 +26,7 @@ func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, sk Keeper) (tags case tmtypes.ABCIEvidenceTypeDuplicateVote: sk.handleDoubleSign(ctx, evidence.Height, evidence.Time, pk) default: - ctx.Logger().With("module", "x/slashing").Error(fmt.Sprintf("Ignored unknown evidence type: %s", string(evidence.Type))) + ctx.Logger().With("module", "x/slashing").Error(fmt.Sprintf("ignored unknown evidence type: %s", string(evidence.Type))) } } diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index f8a2f00e5f..d9288fb11c 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -51,7 +51,7 @@ func bondingStatusHandlerFn(ctx context.CoreContext, storeName string, cdc *wire res, err := ctx.Query(key, storeName) if err != nil { w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(fmt.Sprintf("Couldn't query bond. Error: %s", err.Error()))) + w.Write([]byte(fmt.Sprintf("couldn't query bond. Error: %s", err.Error()))) return } @@ -65,7 +65,7 @@ func bondingStatusHandlerFn(ctx context.CoreContext, storeName string, cdc *wire err = cdc.UnmarshalBinary(res, &bond) if err != nil { w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(fmt.Sprintf("Couldn't decode bond. Error: %s", err.Error()))) + w.Write([]byte(fmt.Sprintf("couldn't decode bond. Error: %s", err.Error()))) return } @@ -142,7 +142,7 @@ func validatorsHandlerFn(ctx context.CoreContext, storeName string, cdc *wire.Co kvs, err := ctx.QuerySubspace(cdc, stake.ValidatorsKey, storeName) if err != nil { w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(fmt.Sprintf("Couldn't query validators. Error: %s", err.Error()))) + w.Write([]byte(fmt.Sprintf("couldn't query validators. Error: %s", err.Error()))) return } @@ -163,7 +163,7 @@ func validatorsHandlerFn(ctx context.CoreContext, storeName string, cdc *wire.Co } if err != nil { w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(fmt.Sprintf("Couldn't decode validator. Error: %s", err.Error()))) + w.Write([]byte(fmt.Sprintf("couldn't decode validator. Error: %s", err.Error()))) return } validators[i] = bech32Validator diff --git a/x/stake/client/rest/tx.go b/x/stake/client/rest/tx.go index 77a6540eec..669bdd39fb 100644 --- a/x/stake/client/rest/tx.go +++ b/x/stake/client/rest/tx.go @@ -76,18 +76,18 @@ func editDelegationsRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx conte delegatorAddr, err := sdk.GetAccAddressBech32(msg.DelegatorAddr) if err != nil { w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(fmt.Sprintf("Couldn't decode delegator. Error: %s", err.Error()))) + w.Write([]byte(fmt.Sprintf("couldn't decode delegator. Error: %s", err.Error()))) return } validatorAddr, err := sdk.GetValAddressBech32(msg.ValidatorAddr) if err != nil { w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(fmt.Sprintf("Couldn't decode validator. Error: %s", err.Error()))) + w.Write([]byte(fmt.Sprintf("couldn't decode validator. Error: %s", err.Error()))) return } if !bytes.Equal(info.Address(), delegatorAddr) { w.WriteHeader(http.StatusUnauthorized) - w.Write([]byte("Must use own delegator address")) + w.Write([]byte("must use own delegator address")) return } messages[i] = stake.MsgDelegate{ @@ -101,18 +101,18 @@ func editDelegationsRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx conte delegatorAddr, err := sdk.GetAccAddressBech32(msg.DelegatorAddr) if err != nil { w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(fmt.Sprintf("Couldn't decode delegator. Error: %s", err.Error()))) + w.Write([]byte(fmt.Sprintf("couldn't decode delegator. Error: %s", err.Error()))) return } validatorAddr, err := sdk.GetValAddressBech32(msg.ValidatorAddr) if err != nil { w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(fmt.Sprintf("Couldn't decode validator. Error: %s", err.Error()))) + w.Write([]byte(fmt.Sprintf("couldn't decode validator. Error: %s", err.Error()))) return } if !bytes.Equal(info.Address(), delegatorAddr) { w.WriteHeader(http.StatusUnauthorized) - w.Write([]byte("Must use own delegator address")) + w.Write([]byte("must use own delegator address")) return } messages[i] = stake.MsgUnbond{ diff --git a/x/stake/errors.go b/x/stake/errors.go index 0ae57530ad..796d638dbc 100644 --- a/x/stake/errors.go +++ b/x/stake/errors.go @@ -26,17 +26,17 @@ const ( func codeToDefaultMsg(code CodeType) string { switch code { case CodeInvalidValidator: - return "Invalid Validator" + return "invalid Validator" case CodeInvalidBond: - return "Invalid Bond" + return "invalid Bond" case CodeInvalidInput: - return "Invalid Input" + return "invalid Input" case CodeUnauthorized: - return "Unauthorized" + return "unauthorized" case CodeInternal: - return "Internal Error" + return "internal Error" case CodeUnknownRequest: - return "Unknown request" + return "unknown request" default: return sdk.CodeToDefaultMsg(code) } @@ -49,55 +49,55 @@ func ErrNotEnoughBondShares(codespace sdk.CodespaceType, shares string) sdk.Erro return newError(codespace, CodeInvalidBond, fmt.Sprintf("not enough shares only have %v", shares)) } func ErrValidatorEmpty(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "Cannot bond to an empty validator") + return newError(codespace, CodeInvalidValidator, "cannot bond to an empty validator") } func ErrBadBondingDenom(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidBond, "Invalid coin denomination") + return newError(codespace, CodeInvalidBond, "invalid coin denomination") } func ErrBadBondingAmount(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidBond, "Amount must be > 0") + return newError(codespace, CodeInvalidBond, "amount must be > 0") } func ErrNoBondingAcct(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "No bond account for this (address, validator) pair") + return newError(codespace, CodeInvalidValidator, "no bond account for this (address, validator) pair") } func ErrCommissionNegative(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "Commission must be positive") + return newError(codespace, CodeInvalidValidator, "commission must be positive") } func ErrCommissionHuge(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "Commission cannot be more than 100%") + return newError(codespace, CodeInvalidValidator, "commission cannot be more than 100%") } func ErrBadValidatorAddr(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "Validator does not exist for that address") + return newError(codespace, CodeInvalidValidator, "validator does not exist for that address") } func ErrBadDelegatorAddr(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "Delegator does not exist for that address") + return newError(codespace, CodeInvalidValidator, "delegator does not exist for that address") } func ErrValidatorExistsAddr(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "Validator already exist, cannot re-create validator") + return newError(codespace, CodeInvalidValidator, "validator already exist, cannot re-create validator") } func ErrValidatorRevoked(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "Validator for this address is currently revoked") + return newError(codespace, CodeInvalidValidator, "validator for this address is currently revoked") } func ErrMissingSignature(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "Missing signature") + return newError(codespace, CodeInvalidValidator, "missing signature") } func ErrBondNotNominated(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "Cannot bond to non-nominated account") + return newError(codespace, CodeInvalidValidator, "cannot bond to non-nominated account") } func ErrNoValidatorForAddress(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "Validator does not exist for that address") + return newError(codespace, CodeInvalidValidator, "validator does not exist for that address") } func ErrNoDelegatorForAddress(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "Delegator does not contain validator bond") + return newError(codespace, CodeInvalidValidator, "delegator does not contain validator bond") } func ErrInsufficientFunds(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidInput, "Insufficient bond shares") + return newError(codespace, CodeInvalidInput, "insufficient bond shares") } func ErrBadShares(codespace sdk.CodespaceType) sdk.Error { return newError(codespace, CodeInvalidInput, "bad shares provided as input, must be MAX or decimal") } func ErrBadRemoveValidator(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "Error removing validator") + return newError(codespace, CodeInvalidValidator, "error removing validator") } //---------------------------------------- diff --git a/x/stake/keeper.go b/x/stake/keeper.go index 4a2e6ff4be..a4a1bc01cb 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -804,7 +804,7 @@ func (k Keeper) Slash(ctx sdk.Context, pubkey crypto.PubKey, height int64, fract logger := ctx.Logger().With("module", "x/stake") val, found := k.GetValidatorByPubKey(ctx, pubkey) if !found { - panic(fmt.Errorf("Attempted to slash a nonexistent validator with address %s", pubkey.Address())) + panic(fmt.Errorf("attempted to slash a nonexistent validator with address %s", pubkey.Address())) } sharesToRemove := val.PoolShares.Amount.Mul(fraction) pool := k.GetPool(ctx) @@ -820,7 +820,7 @@ func (k Keeper) Revoke(ctx sdk.Context, pubkey crypto.PubKey) { logger := ctx.Logger().With("module", "x/stake") val, found := k.GetValidatorByPubKey(ctx, pubkey) if !found { - panic(fmt.Errorf("Validator with pubkey %s not found, cannot revoke", pubkey)) + panic(fmt.Errorf("validator with pubkey %s not found, cannot revoke", pubkey)) } val.Revoked = true k.updateValidator(ctx, val) // update the validator, now revoked @@ -833,7 +833,7 @@ func (k Keeper) Unrevoke(ctx sdk.Context, pubkey crypto.PubKey) { logger := ctx.Logger().With("module", "x/stake") val, found := k.GetValidatorByPubKey(ctx, pubkey) if !found { - panic(fmt.Errorf("Validator with pubkey %s not found, cannot unrevoke", pubkey)) + panic(fmt.Errorf("validator with pubkey %s not found, cannot unrevoke", pubkey)) } val.Revoked = false k.updateValidator(ctx, val) // update the validator, now unrevoked diff --git a/x/stake/msg.go b/x/stake/msg.go index a0922bb872..fbdd048536 100644 --- a/x/stake/msg.go +++ b/x/stake/msg.go @@ -122,7 +122,7 @@ func (msg MsgEditValidator) ValidateBasic() sdk.Error { } empty := Description{} if msg.Description == empty { - return newError(DefaultCodespace, CodeInvalidInput, "Transaction must include some information to modify") + return newError(DefaultCodespace, CodeInvalidInput, "transaction must include some information to modify") } return nil } From 0fa28cac3bae82b3c63ff8203b85aa98327e3da3 Mon Sep 17 00:00:00 2001 From: Dev Ojha Date: Wed, 13 Jun 2018 14:44:41 -0700 Subject: [PATCH 257/548] Merge PR #1248: Sync to tendermint develop's latest revision --- Gopkg.lock | 9 ++++----- Gopkg.toml | 4 ++-- server/tm_cmds.go | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 07a3c6d5b9..701f383afb 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -267,8 +267,8 @@ "server", "types" ] - revision = "ebee2fe114020aa49c70bbbae50b7079fc7e7b90" - version = "v0.11.0" + revision = "198dccf0ddfd1bb176f87657e3286a05a6ed9540" + version = "v0.12.0" [[projects]] branch = "master" @@ -347,8 +347,7 @@ "types", "version" ] - revision = "27bd1deabe4ba6a2d9b463b8f3e3f1e31b993e61" - version = "v0.20.0" + revision = "696e8c6f9e950eec15f150f314d2dd9ddf6bc601" [[projects]] branch = "develop" @@ -463,6 +462,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "31f69b235b2d8f879a215c9e8ca0919adc62d21f6830b17931a3a0efb058721f" + inputs-digest = "d02a24bcfd8bded901e1b154e19b81ff797d3921046ede19d1d11eed61e871e7" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 77de1b78de..49bbf9f792 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -54,7 +54,7 @@ [[constraint]] name = "github.com/tendermint/abci" - version = "=0.11.0" + version = "=0.12.0" [[constraint]] name = "github.com/tendermint/go-crypto" @@ -70,7 +70,7 @@ [[constraint]] name = "github.com/tendermint/tendermint" - version = "=0.20.0" + revision = "696e8c6f9e950eec15f150f314d2dd9ddf6bc601" [[override]] name = "github.com/tendermint/tmlibs" diff --git a/server/tm_cmds.go b/server/tm_cmds.go index 7dccaf5319..25d417a666 100644 --- a/server/tm_cmds.go +++ b/server/tm_cmds.go @@ -72,7 +72,7 @@ func UnsafeResetAllCmd(ctx *Context) *cobra.Command { Short: "Reset blockchain database, priv_validator.json file, and the logger", RunE: func(cmd *cobra.Command, args []string) error { cfg := ctx.Config - tcmd.ResetAll(cfg.DBDir(), cfg.PrivValidatorFile(), ctx.Logger) + tcmd.ResetAll(cfg.DBDir(), cfg.P2P.AddrBookFile(), cfg.PrivValidatorFile(), ctx.Logger) return nil }, } From 3cbb06015e88892e65ceccbcfd5c2808c5f5d34c Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Wed, 13 Jun 2018 15:17:18 -0700 Subject: [PATCH 258/548] add gaiadebug readme --- cmd/gaia/cmd/gaiadebug/README.md | 35 ++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 cmd/gaia/cmd/gaiadebug/README.md diff --git a/cmd/gaia/cmd/gaiadebug/README.md b/cmd/gaia/cmd/gaiadebug/README.md new file mode 100644 index 0000000000..c2f0b8bc06 --- /dev/null +++ b/cmd/gaia/cmd/gaiadebug/README.md @@ -0,0 +1,35 @@ +# Gaiadebug + +Simple tool for simple debugging. + +We try to accept both hex and base64 formats and provide a useful response. + +Note we often encode bytes as hex in the logs, but as base64 in the JSON. + +## Pubkeys + +The following give the same result: + +``` +gaiadebug pubkey TZTQnfqOsi89SeoXVnIw+tnFJnr4X8qVC0U8AsEmFk4= +gaiadebug pubkey 4D94D09DFA8EB22F3D49EA17567230FAD9C5267AF85FCA950B453C02C126164E +``` + +## Txs + +Pass in a hex/base64 tx and get back the full JSON + +``` +gaiadebug tx +``` + +## Hack + +This is a command with boilerplate for using Go as a scripting language to hack +on an existing Gaia state. + +Currently we have an example for the state of gaia-6001 after it +[crashed](https://github.com/cosmos/cosmos-sdk/blob/master/cmd/gaia/testnets/STATUS.md#june-13-2018-230-est---published-postmortem-of-gaia-6001-failure). +If you run `gaiadebug hack $HOME/.gaiad` on that +state, it will do a binary search on the state history to find when the state +invariant was violated. From 0180a5b48ebbae233ae0fb72e66cb77217fc0b2b Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Wed, 13 Jun 2018 15:20:54 -0700 Subject: [PATCH 259/548] testnets/status: gaia-6002 is live --- cmd/gaia/testnets/STATUS.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmd/gaia/testnets/STATUS.md b/cmd/gaia/testnets/STATUS.md index 1e3a677046..0848f27efe 100644 --- a/cmd/gaia/testnets/STATUS.md +++ b/cmd/gaia/testnets/STATUS.md @@ -1,5 +1,11 @@ # TESTNET STATUS +## *June 13, 2018, 17:00 EST* - Gaia-6002 is making blocks! + +- Gaia-6002 is live and making blocks +- Absent validators have been slashed and revoked +- Currently live with 17 validators + ## *June 13, 2018, 4:30 EST* - New Testnet Gaia-6002 - After fixing bugs from gaia-6001, especially [issue From bd362ee590f35436a02b04d8a482392dbe941713 Mon Sep 17 00:00:00 2001 From: Dev Ojha Date: Wed, 13 Jun 2018 15:13:51 -0700 Subject: [PATCH 260/548] Merge PR #1090: Switch away from ephemeral ports * Switch ports 4665x to be 2655x This is done so the default ports aren't in the linux kernel's default ephemeral port range. * Missed one doc file, change dep so gaiad works * Update changelog, fix Gopkg.lock --- CHANGELOG.md | 5 ++++- baseapp/helpers.go | 2 +- client/flags.go | 4 ++-- client/lcd/root.go | 2 +- client/rpc/block.go | 2 +- client/rpc/root.go | 2 +- client/rpc/status.go | 2 +- client/rpc/validators.go | 2 +- client/tx/query.go | 2 +- client/tx/search.go | 2 +- docs/old/basecoin/basics.rst | 2 +- docs/old/basecoin/extensions.rst | 2 +- docs/old/staking/local-testnet.rst | 12 ++++++------ docs/old/staking/public-testnet.rst | 2 +- docs/sdk/lcd-rest-api.yaml | 2 +- docs/staking/intro.rst | 2 +- docs/staking/testnet.rst | 2 +- examples/kvstore/main.go | 2 +- networks/remote/ansible/status.yml | 2 +- server/init.go | 2 +- server/start.go | 2 +- x/ibc/client/cli/README.md | 4 ++-- x/ibc/client/cli/relay.go | 2 +- 23 files changed, 33 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fdfd1895f4..b37db22926 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ *TBD* +BREAKING CHANGES +* Change default ports from 466xx to 266xx + ## 0.19.0 *June 13, 2018* @@ -24,7 +27,7 @@ IMPROVEMENTS FIXES * Fixes consensus fault on testnet - see postmortem [here](https://github.com/cosmos/cosmos-sdk/issues/1197#issuecomment-396823021) -* [x/stake] bonded inflation removed, non-bonded inflation partially implemented +* [x/stake] bonded inflation removed, non-bonded inflation partially implemented * [lcd] Switch to bech32 for addresses on all human readable inputs and outputs * [lcd] fixed tx indexing/querying * [cli] Added `--gas` flag to specify transaction gas limit diff --git a/baseapp/helpers.go b/baseapp/helpers.go index 43bd654d67..b7ac45d9aa 100644 --- a/baseapp/helpers.go +++ b/baseapp/helpers.go @@ -10,7 +10,7 @@ import ( func RunForever(app abci.Application) { // Start the ABCI server - srv, err := server.NewServer("0.0.0.0:46658", "socket", app) + srv, err := server.NewServer("0.0.0.0:26658", "socket", app) if err != nil { cmn.Exit(err.Error()) } diff --git a/client/flags.go b/client/flags.go index 4991b9a776..5af588bd44 100644 --- a/client/flags.go +++ b/client/flags.go @@ -25,7 +25,7 @@ func GetCommands(cmds ...*cobra.Command) []*cobra.Command { // TODO: make this default false when we support proofs c.Flags().Bool(FlagTrustNode, true, "Don't verify proofs for responses") c.Flags().String(FlagChainID, "", "Chain ID of tendermint node") - c.Flags().String(FlagNode, "tcp://localhost:46657", ": to tendermint rpc interface for this chain") + c.Flags().String(FlagNode, "tcp://localhost:26657", ": to tendermint rpc interface for this chain") c.Flags().Int64(FlagHeight, 0, "block height to query, omit to get most recent provable block") } return cmds @@ -39,7 +39,7 @@ func PostCommands(cmds ...*cobra.Command) []*cobra.Command { c.Flags().Int64(FlagSequence, 0, "Sequence number to sign the tx") c.Flags().String(FlagFee, "", "Fee to pay along with transaction") c.Flags().String(FlagChainID, "", "Chain ID of tendermint node") - c.Flags().String(FlagNode, "tcp://localhost:46657", ": to tendermint rpc interface for this chain") + c.Flags().String(FlagNode, "tcp://localhost:26657", ": to tendermint rpc interface for this chain") c.Flags().Int64(FlagGas, 200000, "gas limit to set per-transaction") } return cmds diff --git a/client/lcd/root.go b/client/lcd/root.go index 66491dfec1..7d819740cd 100644 --- a/client/lcd/root.go +++ b/client/lcd/root.go @@ -57,7 +57,7 @@ func ServeCommand(cdc *wire.Codec) *cobra.Command { cmd.Flags().StringP(flagListenAddr, "a", "tcp://localhost:1317", "Address for server to listen on") cmd.Flags().String(flagCORS, "", "Set to domains that can make CORS requests (* for all)") cmd.Flags().StringP(client.FlagChainID, "c", "", "ID of chain we connect to") - cmd.Flags().StringP(client.FlagNode, "n", "tcp://localhost:46657", "Node to connect to") + cmd.Flags().StringP(client.FlagNode, "n", "tcp://localhost:26657", "Node to connect to") return cmd } diff --git a/client/rpc/block.go b/client/rpc/block.go index 693298bb86..3244e8d122 100644 --- a/client/rpc/block.go +++ b/client/rpc/block.go @@ -24,7 +24,7 @@ func BlockCommand() *cobra.Command { Args: cobra.MaximumNArgs(1), RunE: printBlock, } - cmd.Flags().StringP(client.FlagNode, "n", "tcp://localhost:46657", "Node to connect to") + cmd.Flags().StringP(client.FlagNode, "n", "tcp://localhost:26657", "Node to connect to") // TODO: change this to false when we can cmd.Flags().Bool(client.FlagTrustNode, true, "Don't verify proofs for responses") cmd.Flags().StringSlice(flagSelect, []string{"header", "tx"}, "Fields to return (header|txs|results)") diff --git a/client/rpc/root.go b/client/rpc/root.go index 63ba64a18b..bb5a162a7f 100644 --- a/client/rpc/root.go +++ b/client/rpc/root.go @@ -36,7 +36,7 @@ func initClientCommand() *cobra.Command { RunE: todoNotImplemented, } cmd.Flags().StringP(client.FlagChainID, "c", "", "ID of chain we connect to") - cmd.Flags().StringP(client.FlagNode, "n", "tcp://localhost:46657", "Node to connect to") + cmd.Flags().StringP(client.FlagNode, "n", "tcp://localhost:26657", "Node to connect to") cmd.Flags().String(flagGenesis, "", "Genesis file to verify header validity") cmd.Flags().String(flagCommit, "", "File with trusted and signed header") cmd.Flags().String(flagValHash, "", "Hash of trusted validator set (hex-encoded)") diff --git a/client/rpc/status.go b/client/rpc/status.go index 70d6628e43..96517cc190 100644 --- a/client/rpc/status.go +++ b/client/rpc/status.go @@ -18,7 +18,7 @@ func statusCommand() *cobra.Command { Short: "Query remote node for status", RunE: printNodeStatus, } - cmd.Flags().StringP(client.FlagNode, "n", "tcp://localhost:46657", "Node to connect to") + cmd.Flags().StringP(client.FlagNode, "n", "tcp://localhost:26657", "Node to connect to") return cmd } diff --git a/client/rpc/validators.go b/client/rpc/validators.go index f8835d7377..d88fb73173 100644 --- a/client/rpc/validators.go +++ b/client/rpc/validators.go @@ -24,7 +24,7 @@ func ValidatorCommand() *cobra.Command { Args: cobra.MaximumNArgs(1), RunE: printValidators, } - cmd.Flags().StringP(client.FlagNode, "n", "tcp://localhost:46657", "Node to connect to") + cmd.Flags().StringP(client.FlagNode, "n", "tcp://localhost:26657", "Node to connect to") // TODO: change this to false when we can cmd.Flags().Bool(client.FlagTrustNode, true, "Don't verify proofs for responses") return cmd diff --git a/client/tx/query.go b/client/tx/query.go index 7673dd38db..86439b3177 100644 --- a/client/tx/query.go +++ b/client/tx/query.go @@ -42,7 +42,7 @@ func QueryTxCmd(cdc *wire.Codec) *cobra.Command { }, } - cmd.Flags().StringP(client.FlagNode, "n", "tcp://localhost:46657", "Node to connect to") + cmd.Flags().StringP(client.FlagNode, "n", "tcp://localhost:26657", "Node to connect to") // TODO: change this to false when we can cmd.Flags().Bool(client.FlagTrustNode, true, "Don't verify proofs for responses") diff --git a/client/tx/search.go b/client/tx/search.go index b3ebbf34ef..7c75be8f7e 100644 --- a/client/tx/search.go +++ b/client/tx/search.go @@ -43,7 +43,7 @@ func SearchTxCmd(cdc *wire.Codec) *cobra.Command { }, } - cmd.Flags().StringP(client.FlagNode, "n", "tcp://localhost:46657", "Node to connect to") + cmd.Flags().StringP(client.FlagNode, "n", "tcp://localhost:26657", "Node to connect to") // TODO: change this to false once proofs built in cmd.Flags().Bool(client.FlagTrustNode, true, "Don't verify proofs for responses") diff --git a/docs/old/basecoin/basics.rst b/docs/old/basecoin/basics.rst index d3627b2b10..3b61dd6e55 100644 --- a/docs/old/basecoin/basics.rst +++ b/docs/old/basecoin/basics.rst @@ -78,7 +78,7 @@ window. Here run: :: - basecli init --node=tcp://localhost:46657 --genesis=$HOME/.basecoin/genesis.json + basecli init --node=tcp://localhost:26657 --genesis=$HOME/.basecoin/genesis.json If you provide the genesis file to basecli, it can calculate the proper chainID and validator hash. Basecli needs to get this information from diff --git a/docs/old/basecoin/extensions.rst b/docs/old/basecoin/extensions.rst index c1db864a3c..6f31222def 100644 --- a/docs/old/basecoin/extensions.rst +++ b/docs/old/basecoin/extensions.rst @@ -49,7 +49,7 @@ initialize the light-client and send a transaction: :: - countercli init --node=tcp://localhost:46657 --genesis=$HOME/.counter/genesis.json + countercli init --node=tcp://localhost:26657 --genesis=$HOME/.counter/genesis.json YOU=$(countercli keys get friend | awk '{print $2}') countercli tx send --name=cool --amount=1000mycoin --to=$YOU --sequence=1 diff --git a/docs/old/staking/local-testnet.rst b/docs/old/staking/local-testnet.rst index e3f69bded1..b8d30d2e21 100644 --- a/docs/old/staking/local-testnet.rst +++ b/docs/old/staking/local-testnet.rst @@ -39,18 +39,18 @@ and ports. It should look like: :: - proxy_app = "tcp://127.0.0.1:46668" + proxy_app = "tcp://127.0.0.1:26668" moniker = "anonymous" fast_sync = true db_backend = "leveldb" log_level = "state:info,*:error" [rpc] - laddr = "tcp://0.0.0.0:46667" + laddr = "tcp://0.0.0.0:26667" [p2p] - laddr = "tcp://0.0.0.0:46666" - seeds = "0.0.0.0:46656" + laddr = "tcp://0.0.0.0:26666" + seeds = "0.0.0.0:26656" Start Nodes ----------- @@ -69,14 +69,14 @@ account: :: - gaia client init --chain-id=gaia-test --node=tcp://localhost:46657 + gaia client init --chain-id=gaia-test --node=tcp://localhost:26657 gaia client query account 5D93A6059B6592833CBC8FA3DA90EE0382198985 To see what tendermint considers the validator set is, use: :: - curl localhost:46657/validators + curl localhost:26657/validators and compare the information in this file: ``~/.gaia1/priv_validator.json``. The ``address`` and ``pub_key`` fields should match. diff --git a/docs/old/staking/public-testnet.rst b/docs/old/staking/public-testnet.rst index 6401636428..587c025b17 100644 --- a/docs/old/staking/public-testnet.rst +++ b/docs/old/staking/public-testnet.rst @@ -49,7 +49,7 @@ Finally, let's initialize the gaia client to interact with the testnet: :: - gaia client init --chain-id=gaia-1 --node=tcp://localhost:46657 + gaia client init --chain-id=gaia-1 --node=tcp://localhost:26657 and check our balance: diff --git a/docs/sdk/lcd-rest-api.yaml b/docs/sdk/lcd-rest-api.yaml index 3008d7f73c..6a5be2394d 100644 --- a/docs/sdk/lcd-rest-api.yaml +++ b/docs/sdk/lcd-rest-api.yaml @@ -41,7 +41,7 @@ paths: type: string listen_addr: type: string - example: 192.168.56.1:46656 + example: 192.168.56.1:26656 version: description: Tendermint version type: string diff --git a/docs/staking/intro.rst b/docs/staking/intro.rst index 00a68811a8..3ed20852b4 100644 --- a/docs/staking/intro.rst +++ b/docs/staking/intro.rst @@ -291,7 +291,7 @@ To confirm for certain the new validator is active, ask the tendermint node: :: - curl localhost:46657/validators + curl localhost:26657/validators If you now kill either node, blocks will stop streaming in, because there aren't enough validators online. Turn it back on and they will diff --git a/docs/staking/testnet.rst b/docs/staking/testnet.rst index 4fca09c4ad..0e86a952d2 100644 --- a/docs/staking/testnet.rst +++ b/docs/staking/testnet.rst @@ -66,7 +66,7 @@ To confirm for certain the new validator is active, check tendermint: :: - curl localhost:46657/validators + curl localhost:26657/validators Finally, to relinquish all your power, unbond some coins. You should see your VotingPower reduce and your account balance increase. diff --git a/examples/kvstore/main.go b/examples/kvstore/main.go index 856538f63a..6835f54071 100644 --- a/examples/kvstore/main.go +++ b/examples/kvstore/main.go @@ -50,7 +50,7 @@ func main() { } // Start the ABCI server - srv, err := server.NewServer("0.0.0.0:46658", "socket", baseApp) + srv, err := server.NewServer("0.0.0.0:26658", "socket", baseApp) if err != nil { fmt.Println(err) os.Exit(1) diff --git a/networks/remote/ansible/status.yml b/networks/remote/ansible/status.yml index fffba41fce..d0b89d13f6 100644 --- a/networks/remote/ansible/status.yml +++ b/networks/remote/ansible/status.yml @@ -9,7 +9,7 @@ - name: Gather status uri: body_format: json - url: "http://{{inventory_hostname}}:46657/status" + url: "http://{{inventory_hostname}}:26657/status" register: status - name: Print status diff --git a/server/init.go b/server/init.go index 512751bed0..5e5a73fbeb 100644 --- a/server/init.go +++ b/server/init.go @@ -255,7 +255,7 @@ func processGenTxs(genTxsDir string, cdc *wire.Codec, appInit AppInit) ( if len(persistentPeers) == 0 { comma = "" } - persistentPeers += fmt.Sprintf("%s%s@%s:46656", comma, genTx.NodeID, genTx.IP) + persistentPeers += fmt.Sprintf("%s%s@%s:26656", comma, genTx.NodeID, genTx.IP) } return diff --git a/server/start.go b/server/start.go index 5224ef30d2..77a18fffb9 100644 --- a/server/start.go +++ b/server/start.go @@ -37,7 +37,7 @@ func StartCmd(ctx *Context, appCreator AppCreator) *cobra.Command { // basic flags for abci app cmd.Flags().Bool(flagWithTendermint, true, "run abci app embedded in-process with tendermint") - cmd.Flags().String(flagAddress, "tcp://0.0.0.0:46658", "Listen address") + cmd.Flags().String(flagAddress, "tcp://0.0.0.0:26658", "Listen address") // AddNodeFlags adds support for all tendermint-specific command line options tcmd.AddNodeFlags(cmd) diff --git a/x/ibc/client/cli/README.md b/x/ibc/client/cli/README.md index ed9652fa34..e91fb55bfc 100644 --- a/x/ibc/client/cli/README.md +++ b/x/ibc/client/cli/README.md @@ -58,7 +58,7 @@ I[04-02|14:09:14.453] Generated genesis file module=main p } > ADDR2=DC26002735D3AA9573707CFA6D77C12349E49868 > ID2=test-chain-4XHTPn -> NODE2=tcp://0.0.0.0:46657 +> NODE2=tcp://0.0.0.0:26657 > basecli keys add key2 --recover Enter a passphrase for your key: Repeat the passphrase: @@ -70,7 +70,7 @@ key2 DC26002735D3AA9573707CFA6D77C12349E49868 > basecoind start --home ~/.chain1 --address tcp://0.0.0.0:36658 --rpc.laddr tcp://0.0.0.0:36657 --p2p.laddr tcp://0.0.0.0:36656 ... -> basecoind start --home ~/.chain2 # --address tcp://0.0.0.0:46658 --rpc.laddr tcp://0.0.0.0:46657 --p2p.laddr tcp://0.0.0.0:46656 +> basecoind start --home ~/.chain2 # --address tcp://0.0.0.0:26658 --rpc.laddr tcp://0.0.0.0:26657 --p2p.laddr tcp://0.0.0.0:26656 ... ``` ## Check balance diff --git a/x/ibc/client/cli/relay.go b/x/ibc/client/cli/relay.go index 96c5b08cc7..9742f83f93 100644 --- a/x/ibc/client/cli/relay.go +++ b/x/ibc/client/cli/relay.go @@ -54,7 +54,7 @@ func IBCRelayCmd(cdc *wire.Codec) *cobra.Command { } cmd.Flags().String(FlagFromChainID, "", "Chain ID for ibc node to check outgoing packets") - cmd.Flags().String(FlagFromChainNode, "tcp://localhost:46657", ": to tendermint rpc interface for this chain") + cmd.Flags().String(FlagFromChainNode, "tcp://localhost:26657", ": to tendermint rpc interface for this chain") cmd.Flags().String(FlagToChainID, "", "Chain ID for ibc node to broadcast incoming packets") cmd.Flags().String(FlagToChainNode, "tcp://localhost:36657", ": to tendermint rpc interface for this chain") From 17e88a5e0029744535ef2c17426825581e1c0f02 Mon Sep 17 00:00:00 2001 From: Greg Szabo Date: Wed, 13 Jun 2018 17:30:16 -0700 Subject: [PATCH 261/548] Fixes requested by Rigel: GenTx, config package name --- CHANGELOG.md | 4 ++-- cmd/gaia/app/genesis.go | 21 +++++++++++------ server/config/config.go | 2 +- server/init.go | 52 +++++++++++++++++------------------------ server/mock/app.go | 2 +- server/testnet.go | 2 +- 6 files changed, 40 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ca7ef88e8..7e1d20ff26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,8 +20,8 @@ IMPROVEMENTS * [tests] Application module tests now use a mock application * [gaiacli] Fix error message when account isn't found when running gaiacli account * [lcd] refactored to eliminate use of global variables, and interdependent tests -* Added testnet command to gaiad -* Added localnet targets to Makefile +* [tests] Added testnet command to gaiad +* [tests] Added localnet targets to Makefile * [x/stake] More stake tests added to test ByPower index FIXES diff --git a/cmd/gaia/app/genesis.go b/cmd/gaia/app/genesis.go index 3f44a71874..42d0f72e54 100644 --- a/cmd/gaia/app/genesis.go +++ b/cmd/gaia/app/genesis.go @@ -8,13 +8,20 @@ import ( tmtypes "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/server" - gc "github.com/cosmos/cosmos-sdk/server/config" + "github.com/cosmos/cosmos-sdk/server/config" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/stake" ) +var ( + // bonded tokens given to genesis validators/accounts + freeFermionVal = int64(100) + // ... + freeFermionsAcc = int64(50) +) + // State to Unmarshal type GenesisState struct { Accounts []GenesisAccount `json:"accounts"` @@ -75,7 +82,7 @@ type GaiaGenTx struct { } // Generate a gaia genesis transaction with flags -func GaiaAppGenTx(cdc *wire.Codec, pk crypto.PubKey, genTxConfig gc.GenTxConfig) ( +func GaiaAppGenTx(cdc *wire.Codec, pk crypto.PubKey, genTxConfig config.GenTx) ( appGenTx, cliPrint json.RawMessage, validator tmtypes.GenesisValidator, err error) { if genTxConfig.Name == "" { return nil, nil, tmtypes.GenesisValidator{}, errors.New("Must specify --name (validator moniker)") @@ -117,7 +124,7 @@ func GaiaAppGenTxNF(cdc *wire.Codec, pk crypto.PubKey, addr sdk.Address, name st validator = tmtypes.GenesisValidator{ PubKey: pk, - Power: server.FreeFermionVal, + Power: freeFermionVal, } return } @@ -148,21 +155,21 @@ func GaiaAppGenState(cdc *wire.Codec, appGenTxs []json.RawMessage) (genesisState accAuth := auth.NewBaseAccountWithAddress(genTx.Address) accAuth.Coins = sdk.Coins{ {genTx.Name + "Token", 1000}, - {"steak", server.FreeFermionsAcc}, + {"steak", freeFermionsAcc}, } acc := NewGenesisAccount(&accAuth) genaccs[i] = acc - stakeData.Pool.LooseUnbondedTokens += server.FreeFermionsAcc // increase the supply + stakeData.Pool.LooseUnbondedTokens += freeFermionsAcc // increase the supply // add the validator if len(genTx.Name) > 0 { desc := stake.NewDescription(genTx.Name, "", "", "") validator := stake.NewValidator(genTx.Address, genTx.PubKey, desc) - validator.PoolShares = stake.NewBondedShares(sdk.NewRat(server.FreeFermionVal)) + validator.PoolShares = stake.NewBondedShares(sdk.NewRat(freeFermionVal)) stakeData.Validators = append(stakeData.Validators, validator) // pool logic - stakeData.Pool.BondedTokens += server.FreeFermionVal + stakeData.Pool.BondedTokens += freeFermionVal stakeData.Pool.BondedShares = sdk.NewRat(stakeData.Pool.BondedTokens) } } diff --git a/server/config/config.go b/server/config/config.go index 26d038f475..e6fc6a4de9 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -6,7 +6,7 @@ package config // For example: init, init gen-tx and testnet commands need similar input and run the same code // Storage for init gen-tx command input parameters -type GenTxConfig struct { +type GenTx struct { Name string CliRoot string Overwrite bool diff --git a/server/init.go b/server/init.go index 9eefda94c5..39ac75934d 100644 --- a/server/init.go +++ b/server/init.go @@ -26,11 +26,26 @@ import ( dbm "github.com/tendermint/tmlibs/db" clkeys "github.com/cosmos/cosmos-sdk/client/keys" - gc "github.com/cosmos/cosmos-sdk/server/config" + serverconfig "github.com/cosmos/cosmos-sdk/server/config" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" ) +//Parameter names, for init gen-tx command +var ( + FlagName = "name" + FlagClientHome = "home-client" + FlagOWK = "owk" +) + +//parameter names, init command +var ( + FlagOverwrite = "overwrite" + FlagGenTxs = "gen-txs" + FlagIP = "ip" + FlagChainID = "chain-id" +) + // genesis piece structure for creating combined genesis type GenesisTx struct { NodeID string `json:"node_id"` @@ -39,20 +54,6 @@ type GenesisTx struct { AppGenTx json.RawMessage `json:"app_gen_tx"` } -var ( - //--name parameter name, init gen-tx command - FlagName = "name" - //--home-client parameter name, init gen-tx command - FlagClientHome = "home-client" - //--owk parameter name, init gen-tx command - FlagOWK = "owk" - - // bonded tokens given to genesis validators/accounts - FreeFermionVal = int64(100) - // ... - FreeFermionsAcc = int64(50) -) - // Storage for init command input parameters type InitConfig struct { ChainID string @@ -61,17 +62,6 @@ type InitConfig struct { Overwrite bool } -var ( - //--overwrite parameter name, init command - FlagOverwrite = "overwrite" - //--gen-txs parameter name, init command - FlagGenTxs = "gen-txs" - //--ip parameter name, init command - FlagIP = "ip" - //--chain-id parameter name, init command - FlagChainID = "chain-id" -) - // get cmd to initialize all files for tendermint and application func GenTxCmd(ctx *Context, cdc *wire.Codec, appInit AppInit) *cobra.Command { cmd := &cobra.Command{ @@ -92,7 +82,7 @@ func GenTxCmd(ctx *Context, cdc *wire.Codec, appInit AppInit) *cobra.Command { ip = eip } - genTxConfig := gc.GenTxConfig{ + genTxConfig := serverconfig.GenTx{ viper.GetString(FlagName), viper.GetString(FlagClientHome), viper.GetBool(FlagOWK), @@ -122,7 +112,7 @@ func GenTxCmd(ctx *Context, cdc *wire.Codec, appInit AppInit) *cobra.Command { return cmd } -func gentxWithConfig(ctx *Context, cdc *wire.Codec, appInit AppInit, config *cfg.Config, genTxConfig gc.GenTxConfig) ( +func gentxWithConfig(ctx *Context, cdc *wire.Codec, appInit AppInit, config *cfg.Config, genTxConfig serverconfig.GenTx) ( cliPrint json.RawMessage, genTxFile json.RawMessage, err error) { nodeKey, err := p2p.LoadOrGenNodeKey(config.NodeKeyFile()) if err != nil { @@ -244,7 +234,7 @@ func initWithConfig(ctx *Context, cdc *wire.Codec, appInit AppInit, config *cfg. configFilePath := filepath.Join(config.RootDir, "config", "config.toml") cfg.WriteConfigFile(configFilePath, config) } else { - genTxConfig := gc.GenTxConfig{ + genTxConfig := serverconfig.GenTx{ viper.GetString(FlagName), viper.GetString(FlagClientHome), viper.GetBool(FlagOWK), @@ -380,7 +370,7 @@ type AppInit struct { FlagsAppGenTx *pflag.FlagSet // create the application genesis tx - AppGenTx func(cdc *wire.Codec, pk crypto.PubKey, genTxConfig gc.GenTxConfig) ( + AppGenTx func(cdc *wire.Codec, pk crypto.PubKey, genTxConfig serverconfig.GenTx) ( appGenTx, cliPrint json.RawMessage, validator tmtypes.GenesisValidator, err error) // AppGenState creates the core parameters initialization. It takes in a @@ -402,7 +392,7 @@ type SimpleGenTx struct { } // Generate a genesis transaction -func SimpleAppGenTx(cdc *wire.Codec, pk crypto.PubKey, genTxConfig gc.GenTxConfig) ( +func SimpleAppGenTx(cdc *wire.Codec, pk crypto.PubKey, genTxConfig serverconfig.GenTx) ( appGenTx, cliPrint json.RawMessage, validator tmtypes.GenesisValidator, err error) { var addr sdk.Address diff --git a/server/mock/app.go b/server/mock/app.go index 6c553e2be4..42e8cf4b52 100644 --- a/server/mock/app.go +++ b/server/mock/app.go @@ -125,7 +125,7 @@ func AppGenState(_ *wire.Codec, _ []json.RawMessage) (appState json.RawMessage, } // Return a validator, not much else -func AppGenTx(_ *wire.Codec, pk crypto.PubKey, genTxConfig gc.GenTxConfig) ( +func AppGenTx(_ *wire.Codec, pk crypto.PubKey, genTxConfig gc.GenTx) ( appGenTx, cliPrint json.RawMessage, validator tmtypes.GenesisValidator, err error) { validator = tmtypes.GenesisValidator{ diff --git a/server/testnet.go b/server/testnet.go index 2ddf31d980..4d7643750e 100644 --- a/server/testnet.go +++ b/server/testnet.go @@ -96,7 +96,7 @@ func testnetWithConfig(config *cfg.Config, ctx *Context, cdc *wire.Codec, appIni } } - genTxConfig := gc.GenTxConfig{ + genTxConfig := gc.GenTx{ nodeDirName, clientDir, true, From ff34cbc8bc9684a8297a5f2238a36101867da7b0 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Wed, 13 Jun 2018 17:41:01 -0700 Subject: [PATCH 262/548] gaia/cli_test: remove sleeps --- cmd/gaia/cli_test/cli_test.go | 13 ++++---- tests/util.go | 56 +++++++++++++++++++++++++++++++---- 2 files changed, 58 insertions(+), 11 deletions(-) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 1868452a64..3eee20c855 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" "testing" - "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -50,7 +49,7 @@ func TestGaiaCLISend(t *testing.T) { assert.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak")) executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barCech), pass) - time.Sleep(time.Second * 2) // waiting for some blocks to pass + tests.WaitForNextHeightTM(port) barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) assert.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak")) @@ -59,7 +58,7 @@ func TestGaiaCLISend(t *testing.T) { // test autosequencing executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barCech), pass) - time.Sleep(time.Second * 2) // waiting for some blocks to pass + tests.WaitForNextHeightTM(port) barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) assert.Equal(t, int64(20), barAcc.GetCoins().AmountOf("steak")) @@ -96,7 +95,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { require.NoError(t, err) executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barCech), pass) - time.Sleep(time.Second * 3) // waiting for some blocks to pass + tests.WaitForNextHeightTM(port) barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) assert.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak")) @@ -112,7 +111,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { cvStr += fmt.Sprintf(" --moniker=%v", "bar-vally") executeWrite(t, cvStr, pass) - time.Sleep(time.Second * 3) // waiting for some blocks to pass + tests.WaitForNextHeightTM(port) barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) require.Equal(t, int64(8), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) @@ -131,7 +130,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { t.Log(fmt.Sprintf("debug unbondStr: %v\n", unbondStr)) executeWrite(t, unbondStr, pass) - time.Sleep(time.Second * 3) // waiting for some blocks to pass + tests.WaitForNextHeightTM(port) barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) require.Equal(t, int64(9), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) @@ -150,6 +149,8 @@ func executeWrite(t *testing.T, cmdStr string, writes ...string) { require.NoError(t, err) } proc.Wait() + // bz := proc.StdoutBuffer.Bytes() + // fmt.Println("EXEC WRITE", string(bz)) } func executeInit(t *testing.T, cmdStr string) (chainID string) { diff --git a/tests/util.go b/tests/util.go index 292cbab060..c47d9907f7 100644 --- a/tests/util.go +++ b/tests/util.go @@ -7,16 +7,61 @@ import ( "time" amino "github.com/tendermint/go-amino" + tmclient "github.com/tendermint/tendermint/rpc/client" ctypes "github.com/tendermint/tendermint/rpc/core/types" rpcclient "github.com/tendermint/tendermint/rpc/lib/client" ) +func WaitForNextHeightTM(port string) { + url := fmt.Sprintf("http://localhost:%v", port) + cl := tmclient.NewHTTP(url, "/websocket") + resBlock, err := cl.Block(nil) + if err != nil { + panic(err) + } + waitForHeightTM(resBlock.Block.Height+1, url) +} + +func WaitForHeightTM(height int64, port string) { + url := fmt.Sprintf("http://localhost:%v", port) + waitForHeightTM(height, url) +} + +func waitForHeightTM(height int64, url string) { + cl := tmclient.NewHTTP(url, "/websocket") + for { + // get url, try a few times + var resBlock *ctypes.ResultBlock + var err error + INNER: + for i := 0; i < 5; i++ { + resBlock, err = cl.Block(nil) + if err == nil { + break INNER + } + time.Sleep(time.Millisecond * 200) + } + if err != nil { + panic(err) + } + + if resBlock.Block != nil && + resBlock.Block.Height >= height { + fmt.Println("HEIGHT", resBlock.Block.Height) + return + } + time.Sleep(time.Millisecond * 100) + } +} + // Uses localhost func WaitForHeight(height int64, port string) { + url := fmt.Sprintf("http://localhost:%v/blocks/latest", port) + waitForHeight(height, url) +} + +func waitForHeight(height int64, url string) { for { - - url := fmt.Sprintf("http://localhost:%v/blocks/latest", port) - // get url, try a few times var res *http.Response var err error @@ -25,7 +70,7 @@ func WaitForHeight(height int64, port string) { if err == nil { break } - time.Sleep(time.Second) + time.Sleep(time.Millisecond * 200) } if err != nil { panic(err) @@ -45,7 +90,8 @@ func WaitForHeight(height int64, port string) { panic(err) } - if resultBlock.Block.Height >= height { + if resultBlock.Block != nil && + resultBlock.Block.Height >= height { return } time.Sleep(time.Millisecond * 100) From 059a1659bee9907b1ee705d42328fdd85f309c34 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Wed, 13 Jun 2018 18:33:09 -0700 Subject: [PATCH 263/548] add comments --- tests/util.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/util.go b/tests/util.go index c47d9907f7..387ccb769b 100644 --- a/tests/util.go +++ b/tests/util.go @@ -12,6 +12,8 @@ import ( rpcclient "github.com/tendermint/tendermint/rpc/lib/client" ) +// Wait for the next tendermint block from the Tendermint RPC +// on localhost func WaitForNextHeightTM(port string) { url := fmt.Sprintf("http://localhost:%v", port) cl := tmclient.NewHTTP(url, "/websocket") @@ -22,6 +24,8 @@ func WaitForNextHeightTM(port string) { waitForHeightTM(resBlock.Block.Height+1, url) } +// Wait for the given height from the Tendermint RPC +// on localhost func WaitForHeightTM(height int64, port string) { url := fmt.Sprintf("http://localhost:%v", port) waitForHeightTM(height, url) @@ -54,7 +58,7 @@ func waitForHeightTM(height int64, url string) { } } -// Uses localhost +// Wait for height from the LCD API on localhost func WaitForHeight(height int64, port string) { url := fmt.Sprintf("http://localhost:%v/blocks/latest", port) waitForHeight(height, url) From ab028a780570caeedefd5786f10ece2513539519 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Wed, 13 Jun 2018 21:58:36 -0700 Subject: [PATCH 264/548] cwgoes comments, improved pseudocode --- docs/guides/sdk/key-management.md | 14 +------ docs/guides/staking/overview.md | 65 ++++++++++++++++--------------- docs/spec/README.md | 2 +- docs/spec/staking/state.md | 12 ++++++ docs/spec/staking/transactions.md | 58 +++++++++++---------------- 5 files changed, 72 insertions(+), 79 deletions(-) diff --git a/docs/guides/sdk/key-management.md b/docs/guides/sdk/key-management.md index a4c0f55012..1474989b93 100644 --- a/docs/guides/sdk/key-management.md +++ b/docs/guides/sdk/key-management.md @@ -3,15 +3,5 @@ Here we cover many aspects of handling keys within the Cosmos SDK framework. -## Pseudo Code - -Generating an address for an ed25519 public key (in pseudo code): - -``` -const TypeDistinguisher = HexToBytes("1624de6220") - -// prepend the TypeDistinguisher as Bytes -SerializedBytes = TypeDistinguisher ++ PubKey.asBytes() - -Address = ripemd160(SerializedBytes) -``` +// TODO add relevant key discussion +(related https://github.com/tendermint/tendermint/blob/master/docs/spec/blockchain/encoding.md#public-key-cryptography) diff --git a/docs/guides/staking/overview.md b/docs/guides/staking/overview.md index 570a0bfc59..79033fe1ea 100644 --- a/docs/guides/staking/overview.md +++ b/docs/guides/staking/overview.md @@ -8,23 +8,24 @@ The Cosmos Hub is a Tendermint-based Delegated Proof of Stake (DPos) blockchain system that serves as a backbone of the Cosmos ecosystem. It is operated and secured by an open and globally decentralized set of validators. Tendermint is a Byzantine fault-tolerant distributed protocol for consensus among distrusting -parties, in this case the group of validators which produce the blocks for -cosmos. To avoid the nothing-at-stake problem, a validator in Tendermint needs -to lock up coins in a bond deposit. Each bond's atoms are illiquid, they cannot -be transferred however they can be unbonded to become liquid, this process -takes the unbonding-period which will be 3 weeks by default at Cosmos-Hub -launch. Tendermint protocol messages are signed by the validator's private key, -and this is a basis for Tendermint strict accountability that allows punishing -misbehaving validators by slashing (burning) their bonded Atoms. On the other -hand, validators are rewarded for their service of securing blockchain network -by the inflationary provisions and transactions fees. This incentivizes correct -behavior of the validators and provides the economic security of the network. +parties, in this case the group of validators which produce the blocks for the +Cosmos Hub. To avoid the nothing-at-stake problem, a validator in Tendermint +needs to lock up coins in a bond deposit. Each bond's atoms are illiquid, they +cannot be transferred - in order to become liquid, they must be unbonded, a +process which will take 3 weeks by default at Cosmos Hub launch. Tendermint +protocol messages are signed by the validator's private key and are therefor +attributable. Validators acting outside protocol specifications can be made +accountable through punishing by slashing (burning) their bonded Atoms. On the +other hand, validators are rewarded for their service of securing blockchain +network by the inflationary provisions and transactions fees. This incentivizes +correct behavior of the validators and provides the economic security of the +network. The native token of the Cosmos Hub is called the Atom; becoming a validator of the Cosmos Hub requires holding Atoms. However, not all Atom holders are validators of the Cosmos Hub. More precisely, there is a selection process that determines the validator set as a subset of all validators (Atom holders that -wants to become a validator). The other option for Atom holder is to delegate +want to become a validator). The other option for Atom holders is to delegate their atoms to validators, i.e., being a delegator. A delegator is an Atom holder that has put its Atoms at stake by delegating it to a validator. By bonding Atoms to secure the network (and taking a risk of being slashed in case of @@ -59,20 +60,22 @@ transaction fees. bonded the shares must first remain in an inbetween unbonding state for the duration of the unbonding period * Redelegating Shares - Process of redelegating atoms from one validator to - another. This process is instantanious, the redelegated delegation is - slashible to the old validator for all blocks before the redelegation and to - the new validator for all new blocks. + another. This process is instantaneous, but the redelegated atoms are + retrospecively slashable if the old validator is found to misbehave for any + blocks before the redelegation. These atoms are simultaniously slashable + for any new blocks which the new validator misbehavess * Validator - entity with atoms which is either actively validating the Tendermint protocol (bonded validator) or vying to validate . * Bonded Validator - a validator whose atoms are currently bonded and liable to - be slashed. These validators are to be able to sign protocol messages in the - Tendermint consensus protocol. There are limited number of bonded validators - at Cosmos Hub genesis there is a maximum of 100 bonded validators. Only Bonded - Validators receive atom provisions and fee rewards. + be slashed. These validators are to be able to sign protocol messages for + Tendermint consensus. At Cosmos Hub genesis there is a maximum of 100 + bonded validator positions. Only Bonded Validators receive atom provisions + and fee rewards. * Delegator - an Atom holder that has bonded Atoms to a validator * Unbonding period - time required in the unbonding state when unbonding shares. Time slashable to old validator after a redelegation. Time for which - validators can be slashed after an infraction + validators can be slashed after an infraction. To provide the requisite + cryptoeconomic security guarantees, all of these must be equal. * Atom provisions - The process of increasing the Atom supply. Atoms are periodically created on the Cosmos Hub and issued to bonded Atom holders. The goal of inflation is to incentize most of the Atoms in existence to be @@ -90,7 +93,7 @@ At the core of the Staking module is the concept of a pool which denotes a collection of Atoms contributed by different Atom holders. There are three pools in the Staking module: the bonded, unbonding, and unbonded pool. Bonded Atoms are part of the global bonded pool. If a validator or delegator wants to -unbond its Shares, these Shares are moved to the the unbonding pool for the +unbond its shares, these Shares are moved to the the unbonding pool for the duration of the unbonding period. From here normally Atoms will be moved directly into the delegators wallet, however under the situation thatn an entire validator gets unbonded, the Atoms of the delegations will remain with @@ -169,17 +172,17 @@ delegators (we will explain this in section X). #### Delegator shares -A validator is, depending on its status, contributing Atoms to either the bond, +A validator is, depending on its status, contributing Atoms to either the unbonding or unbonded pool - the validator in turn holds some amount of pool -shares. Not all of a validators Atoms (and respective shares) are owned by the -validator, some may be owned by delegators to that validator. The mechanism for -distribution of Atoms (and shares) between a validator and its delegators is -based on a notion of delegator shares. More precisely, every validator is -issuing (local) delegator shares (`Validator.IssuedDelegatorShares`) that -represents some portion of global shares managed by the validator -(`Validator.GlobalStakeShares`). The principle behind managing delegator shares -is the same as described in [Section](#The pool and the share). We now -illustrate it with an example. +shares. Not all of a validator's Atoms (and respective shares) are necessarily +owned by the validator, some may be owned by delegators to that validator. The +mechanism for distribution of Atoms (and shares) between a validator and its +delegators is based on a notion of delegator shares. More precisely, every +validator is issuing (local) delegator shares +(`Validator.IssuedDelegatorShares`) that represents some portion of global +shares managed by the validator (`Validator.GlobalStakeShares`). The principle +behind managing delegator shares is the same as described in [Section](#The +pool and the share). We now illustrate it with an example. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXX TODO make way less verbose lets use bullet points to describe the example diff --git a/docs/spec/README.md b/docs/spec/README.md index 7f773e6aa3..b115e0d45b 100644 --- a/docs/spec/README.md +++ b/docs/spec/README.md @@ -10,7 +10,7 @@ NOTE: the specifications are not yet complete and very much a work in progress. - [Governance](governance) - Governance related specifications including proposals and voting. - [IBC](ibc) - Specification of the Cosmos inter-blockchain communication (IBC) protocol. -- [Staking](staking) - Proof of Stake related specifications including bonding +- [Staking](staking) - Proof-of-stake related specifications including bonding and delegation transactions, inflation, etc. - [Slashing](slashing) - Specifications of validator punishment mechanisms - [Provisioning](provisioning) - Fee distribution, and atom provision distribution specification diff --git a/docs/spec/staking/state.md b/docs/spec/staking/state.md index 82a22dc652..1cfe4b26e6 100644 --- a/docs/spec/staking/state.md +++ b/docs/spec/staking/state.md @@ -8,6 +8,8 @@ information about the total amounts of Atoms in all states, representative validator shares for stake in the global pools, moving Atom inflation information, etc. + - stored object: + ```golang type Pool struct { LooseUnbondedTokens int64 // tokens not associated with any validator @@ -35,6 +37,8 @@ type PoolShares struct { Params is global data structure that stores system parameters and defines overall functioning of the stake module. + - stored object: + ```golang type Params struct { InflationRateChange sdk.Rat // maximum annual change in inflation rate @@ -59,6 +63,8 @@ Related Store which holds Validator.ABCIValidator() The `Validator` holds the current state and some historical actions of the validator. + - stored object: + ```golang type Validator struct { Owner sdk.Address // sender of BondTx - UnbondTx returns here @@ -98,6 +104,8 @@ funds are held in a `Delegation` data structure. It is owned by one delegator, and is associated with the shares for one validator. The sender of the transaction is the owner of the bond. + - stored object: + ```golang type Delegation struct { DelegatorAddr sdk.Address // delegation owner address @@ -114,6 +122,8 @@ A UnbondingDelegation object is created every time an unbonding is initiated. The unbond must be completed with a second transaction provided by the delegation owner after the unbonding period has passed. + - stored object: + ```golang type UnbondingDelegation struct { DelegationKey sdk.Address // key of the delegation @@ -135,6 +145,8 @@ delegation owner after the unbonding period has passed. The destination delegation of a redelegation may not itself undergo a new redelegation until the original redelegation has been completed. + - stored object: + ```golang type Redelegation struct { SourceDelegation sdk.Address // source delegation key diff --git a/docs/spec/staking/transactions.md b/docs/spec/staking/transactions.md index 11edbb98bc..91df029c9a 100644 --- a/docs/spec/staking/transactions.md +++ b/docs/spec/staking/transactions.md @@ -44,7 +44,7 @@ createValidator(tx TxCreateValidator): if validator != nil return // only one validator per address validator = NewValidator(OwnerAddr, ConsensusPubKey, GovernancePubKey, Description) - init validator poolShares, delegatorShares set to 0 //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + init validator poolShares, delegatorShares set to 0 init validator commision fields from tx validator.PoolShares = 0 @@ -71,8 +71,8 @@ type TxEditCandidacy struct { editCandidacy(tx TxEditCandidacy): validator = getValidator(tx.ValidatorAddr) - if tx.Commission > CommissionMax || tx.Commission < 0 return halt tx - if rateChange(tx.Commission) > CommissionMaxChange return halt tx + if tx.Commission > CommissionMax || tx.Commission < 0 then fail + if rateChange(tx.Commission) > CommissionMaxChange then fail validator.Commission = tx.Commission if tx.GovernancePubKey != nil validator.GovernancePubKey = tx.GovernancePubKey @@ -126,28 +126,16 @@ startUnbonding(tx TxStartUnbonding): delegation, found = getDelegatorBond(store, sender, tx.PubKey) if !found == nil return - if tx.Shares == "MAX" { - if !bond.Shares.GT(sdk.ZeroRat()) { - return ErrNotEnoughBondShares - else - var err sdk.Error - delShares, err = sdk.NewRatFromDecimal(tx.Shares) - if err != nil - return err - if bond.Shares.LT(delShares) + if bond.Shares < tx.Shares return ErrNotEnoughBondShares - validator, found := GetValidator(tx.ValidatorAddr) + validator, found = GetValidator(tx.ValidatorAddr) if !found { return err - if tx.Shares == "MAX" - delShares = bond.Shares + bond.Shares -= tx.Shares - bond.Shares -= delShares - - - revokeCandidacy := false + revokeCandidacy = false if bond.Shares.IsZero() { if bond.DelegatorAddr == validator.Owner && validator.Revoked == false @@ -158,8 +146,8 @@ startUnbonding(tx TxStartUnbonding): bond.Height = currentBlockHeight setDelegation(bond) - pool := GetPool() - validator, pool, returnAmount := validator.removeDelShares(pool, delShares) + pool = GetPool() + validator, pool, returnAmount = validator.removeDelShares(pool, tx.Shares) setPool( pool) unbondingDelegation = NewUnbondingDelegation(sender, returnAmount, currentHeight/Time, startSlashRatio) @@ -261,13 +249,13 @@ Tendermint. ```golang updateBondedValidators(newValidator Validator) (updatedVal Validator) - kickCliffValidator := false - oldCliffValidatorAddr := getCliffValidator(ctx) + kickCliffValidator = false + oldCliffValidatorAddr = getCliffValidator(ctx) // add the actual validator power sorted store - maxValidators := GetParams(ctx).MaxValidators - iterator := ReverseSubspaceIterator(ValidatorsByPowerKey) // largest to smallest - bondedValidatorsCount := 0 + maxValidators = GetParams(ctx).MaxValidators + iterator = ReverseSubspaceIterator(ValidatorsByPowerKey) // largest to smallest + bondedValidatorsCount = 0 var validator Validator for { if !iterator.Valid() || bondedValidatorsCount > int(maxValidators-1) { @@ -282,7 +270,7 @@ updateBondedValidators(newValidator Validator) (updatedVal Validator) // use the validator provided because it has not yet been updated // in the main validator store - ownerAddr := iterator.Value() + ownerAddr = iterator.Value() if bytes.Equal(ownerAddr, newValidator.Owner) { validator = newValidator else @@ -290,7 +278,7 @@ updateBondedValidators(newValidator Validator) (updatedVal Validator) // if not previously a validator (and unrevoked), // kick the cliff validator / bond this new validator - if validator.Status() != sdk.Bonded && !validator.Revoked { + if validator.Status() != Bonded && !validator.Revoked { kickCliffValidator = true validator = bondValidator(ctx, store, validator) @@ -302,16 +290,16 @@ updateBondedValidators(newValidator Validator) (updatedVal Validator) // perform the actual kicks if oldCliffValidatorAddr != nil && kickCliffValidator { - validator := getValidator(store, oldCliffValidatorAddr) + validator = getValidator(store, oldCliffValidatorAddr) unbondValidator(ctx, store, validator) return // perform all the store operations for when a validator status becomes unbonded -unbondValidator(ctx sdk.Context, store sdk.KVStore, validator Validator) - pool := GetPool(ctx) +unbondValidator(ctx Context, store KVStore, validator Validator) + pool = GetPool(ctx) // set the status - validator, pool = validator.UpdateStatus(pool, sdk.Unbonded) + validator, pool = validator.UpdateStatus(pool, Unbonded) setPool(ctx, pool) // save the now unbonded validator record @@ -325,11 +313,11 @@ unbondValidator(ctx sdk.Context, store sdk.KVStore, validator Validator) } // perform all the store operations for when a validator status becomes bonded -bondValidator(ctx sdk.Context, store sdk.KVStore, validator Validator) Validator - pool := GetPool(ctx) +bondValidator(ctx Context, store KVStore, validator Validator) Validator + pool = GetPool(ctx) // set the status - validator, pool = validator.UpdateStatus(pool, sdk.Bonded) + validator, pool = validator.UpdateStatus(pool, Bonded) setPool(ctx, pool) // save the now bonded validator record to the three referenced stores From 42e72956f45aaeb668c5f823d27f93295537edd7 Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 13 Jun 2018 22:49:21 -0700 Subject: [PATCH 265/548] Merge PR #1252: Query node version introduce non store queries add version query update lcd spec changelog moved version query into baseapp --- CHANGELOG.md | 1 + baseapp/baseapp.go | 6 ++++++ client/context/helpers.go | 28 ++++++++++++++++++++-------- client/lcd/lcd_test.go | 9 +++++++++ client/lcd/root.go | 4 ++-- client/lcd/version.go | 29 +++++++++++++++++++++++++++++ docs/sdk/lcd-rest-api.yaml | 7 +++++++ version/command.go | 12 +++--------- x/auth/client/cli/account.go | 2 +- x/auth/client/rest/query.go | 2 +- x/ibc/client/cli/relay.go | 2 +- x/slashing/client/cli/query.go | 2 +- x/stake/client/cli/query.go | 4 ++-- x/stake/client/rest/query.go | 2 +- 14 files changed, 84 insertions(+), 26 deletions(-) create mode 100644 client/lcd/version.go diff --git a/CHANGELOG.md b/CHANGELOG.md index b37db22926..f7d4b3c851 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ BREAKING CHANGES FEATURES * [x/auth] Added AccountNumbers to BaseAccount and StdTxs to allow for replay protection with account pruning +* [lcd] added an endpoint to query for the SDK version of the connected node IMPROVEMENTS * export command now writes current validator set for Tendermint diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 93ea6ae03a..3265a870fb 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -14,6 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" ) @@ -338,6 +339,11 @@ func (app *BaseApp) Query(req abci.RequestQuery) (res abci.ResponseQuery) { } else { result = app.Simulate(tx) } + case "version": + return abci.ResponseQuery{ + Code: uint32(sdk.ABCICodeOK), + Value: []byte(version.GetVersion()), + } default: result = sdk.ErrUnknownRequest(fmt.Sprintf("Unknown query: %s", path)).Result() } diff --git a/client/context/helpers.go b/client/context/helpers.go index 0e28f5fd0a..5449afa97e 100644 --- a/client/context/helpers.go +++ b/client/context/helpers.go @@ -3,6 +3,8 @@ package context import ( "fmt" + "github.com/tendermint/tmlibs/common" + "github.com/pkg/errors" "github.com/cosmos/cosmos-sdk/wire" @@ -42,14 +44,19 @@ func (ctx CoreContext) BroadcastTx(tx []byte) (*ctypes.ResultBroadcastTxCommit, return res, err } -// Query from Tendermint with the provided key and storename -func (ctx CoreContext) Query(key cmn.HexBytes, storeName string) (res []byte, err error) { - return ctx.query(key, storeName, "key") +// Query information about the connected node +func (ctx CoreContext) Query(path string) (res []byte, err error) { + return ctx.query(path, nil) +} + +// QueryStore from Tendermint with the provided key and storename +func (ctx CoreContext) QueryStore(key cmn.HexBytes, storeName string) (res []byte, err error) { + return ctx.queryStore(key, storeName, "key") } // Query from Tendermint with the provided storename and subspace func (ctx CoreContext) QuerySubspace(cdc *wire.Codec, subspace []byte, storeName string) (res []sdk.KVPair, err error) { - resRaw, err := ctx.query(subspace, storeName, "subspace") + resRaw, err := ctx.queryStore(subspace, storeName, "subspace") if err != nil { return res, err } @@ -58,8 +65,7 @@ func (ctx CoreContext) QuerySubspace(cdc *wire.Codec, subspace []byte, storeName } // Query from Tendermint with the provided storename and path -func (ctx CoreContext) query(key cmn.HexBytes, storeName, endPath string) (res []byte, err error) { - path := fmt.Sprintf("/store/%s/%s", storeName, endPath) +func (ctx CoreContext) query(path string, key common.HexBytes) (res []byte, err error) { node, err := ctx.GetNode() if err != nil { return res, err @@ -80,6 +86,12 @@ func (ctx CoreContext) query(key cmn.HexBytes, storeName, endPath string) (res [ return resp.Value, nil } +// Query from Tendermint with the provided storename and path +func (ctx CoreContext) queryStore(key cmn.HexBytes, storeName, endPath string) (res []byte, err error) { + path := fmt.Sprintf("/store/%s/%s", storeName, endPath) + return ctx.query(path, key) +} + // Get the from address from the name flag func (ctx CoreContext) GetFromAddress() (from sdk.Address, err error) { @@ -177,7 +189,7 @@ func (ctx CoreContext) GetAccountNumber(address []byte) (int64, error) { return 0, errors.New("accountDecoder required but not provided") } - res, err := ctx.Query(auth.AddressStoreKey(address), ctx.AccountStore) + res, err := ctx.QueryStore(auth.AddressStoreKey(address), ctx.AccountStore) if err != nil { return 0, err } @@ -201,7 +213,7 @@ func (ctx CoreContext) NextSequence(address []byte) (int64, error) { return 0, errors.New("accountDecoder required but not provided") } - res, err := ctx.Query(auth.AddressStoreKey(address), ctx.AccountStore) + res, err := ctx.QueryStore(auth.AddressStoreKey(address), ctx.AccountStore) if err != nil { return 0, err } diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index ba2937e050..0bacbee209 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -116,6 +116,15 @@ func TestVersion(t *testing.T) { require.Nil(t, err) match := reg.MatchString(body) assert.True(t, match, body) + + // node info + res, body = Request(t, port, "GET", "/node_version", nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + reg, err = regexp.Compile(`\d+\.\d+\.\d+(-dev)?`) + require.Nil(t, err) + match = reg.MatchString(body) + assert.True(t, match, body) } func TestNodeStatus(t *testing.T) { diff --git a/client/lcd/root.go b/client/lcd/root.go index 7d819740cd..4af0342979 100644 --- a/client/lcd/root.go +++ b/client/lcd/root.go @@ -17,7 +17,6 @@ import ( keys "github.com/cosmos/cosmos-sdk/client/keys" rpc "github.com/cosmos/cosmos-sdk/client/rpc" tx "github.com/cosmos/cosmos-sdk/client/tx" - version "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/wire" auth "github.com/cosmos/cosmos-sdk/x/auth/client/rest" bank "github.com/cosmos/cosmos-sdk/x/bank/client/rest" @@ -63,7 +62,6 @@ func ServeCommand(cdc *wire.Codec) *cobra.Command { func createHandler(cdc *wire.Codec) http.Handler { r := mux.NewRouter() - r.HandleFunc("/version", version.RequestHandler).Methods("GET") kb, err := keys.GetKeyBase() //XXX if err != nil { @@ -73,6 +71,8 @@ func createHandler(cdc *wire.Codec) http.Handler { ctx := context.NewCoreContextFromViper() // TODO make more functional? aka r = keys.RegisterRoutes(r) + r.HandleFunc("/version", CLIVersionRequestHandler).Methods("GET") + r.HandleFunc("/node_version", NodeVersionRequestHandler(cdc, ctx)).Methods("GET") keys.RegisterRoutes(r) rpc.RegisterRoutes(ctx, r) tx.RegisterRoutes(ctx, r, cdc) diff --git a/client/lcd/version.go b/client/lcd/version.go new file mode 100644 index 0000000000..0c8ef4ef6e --- /dev/null +++ b/client/lcd/version.go @@ -0,0 +1,29 @@ +package lcd + +import ( + "fmt" + "net/http" + + "github.com/cosmos/cosmos-sdk/client/context" + "github.com/cosmos/cosmos-sdk/version" + "github.com/cosmos/cosmos-sdk/wire" +) + +// cli version REST handler endpoint +func CLIVersionRequestHandler(w http.ResponseWriter, r *http.Request) { + v := version.GetVersion() + w.Write([]byte(v)) +} + +// connected node version REST handler endpoint +func NodeVersionRequestHandler(cdc *wire.Codec, ctx context.CoreContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + version, err := ctx.Query("/app/version") + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf("Could't query version. Error: %s", err.Error()))) + return + } + w.Write([]byte(version)) + } +} diff --git a/docs/sdk/lcd-rest-api.yaml b/docs/sdk/lcd-rest-api.yaml index 6a5be2394d..a39b7bf089 100644 --- a/docs/sdk/lcd-rest-api.yaml +++ b/docs/sdk/lcd-rest-api.yaml @@ -17,6 +17,13 @@ paths: responses: 200: description: Plaintext version i.e. "v0.5.0" + /node_version: + get: + summary: Version of the connected node + description: Get the version of the SDK running on the connected node to compare against expected + responses: + 200: + description: Plaintext version i.e. "v0.5.0" /node_info: get: description: Only the node info. Block information can be queried via /block/latest diff --git a/version/command.go b/version/command.go index b505414b1c..2cff1bbe92 100644 --- a/version/command.go +++ b/version/command.go @@ -2,7 +2,6 @@ package version import ( "fmt" - "net/http" "github.com/spf13/cobra" ) @@ -16,7 +15,8 @@ var ( } ) -func getVersion() string { +// return version of CLI/node and commit hash +func GetVersion() string { v := Version if GitCommit != "" { v = v + "-" + GitCommit @@ -26,12 +26,6 @@ func getVersion() string { // CMD func printVersion(cmd *cobra.Command, args []string) { - v := getVersion() + v := GetVersion() fmt.Println(v) } - -// version REST handler endpoint -func RequestHandler(w http.ResponseWriter, r *http.Request) { - v := getVersion() - w.Write([]byte(v)) -} diff --git a/x/auth/client/cli/account.go b/x/auth/client/cli/account.go index a3265a78cd..ccc1e277be 100644 --- a/x/auth/client/cli/account.go +++ b/x/auth/client/cli/account.go @@ -47,7 +47,7 @@ func GetAccountCmd(storeName string, cdc *wire.Codec, decoder auth.AccountDecode // perform query ctx := context.NewCoreContextFromViper() - res, err := ctx.Query(auth.AddressStoreKey(key), storeName) + res, err := ctx.QueryStore(auth.AddressStoreKey(key), storeName) if err != nil { return err } diff --git a/x/auth/client/rest/query.go b/x/auth/client/rest/query.go index 1f68a69e51..a5d6f328c6 100644 --- a/x/auth/client/rest/query.go +++ b/x/auth/client/rest/query.go @@ -34,7 +34,7 @@ func QueryAccountRequestHandlerFn(storeName string, cdc *wire.Codec, decoder aut return } - res, err := ctx.Query(auth.AddressStoreKey(addr), storeName) + res, err := ctx.QueryStore(auth.AddressStoreKey(addr), storeName) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(fmt.Sprintf("couldn't query account. Error: %s", err.Error()))) diff --git a/x/ibc/client/cli/relay.go b/x/ibc/client/cli/relay.go index 9742f83f93..90ea74b77a 100644 --- a/x/ibc/client/cli/relay.go +++ b/x/ibc/client/cli/relay.go @@ -151,7 +151,7 @@ OUTER: } func query(node string, key []byte, storeName string) (res []byte, err error) { - return context.NewCoreContextFromViper().WithNodeURI(node).Query(key, storeName) + return context.NewCoreContextFromViper().WithNodeURI(node).QueryStore(key, storeName) } func (c relayCommander) broadcastTx(seq int64, node string, tx []byte) error { diff --git a/x/slashing/client/cli/query.go b/x/slashing/client/cli/query.go index 948e756675..c1b16eb3a3 100644 --- a/x/slashing/client/cli/query.go +++ b/x/slashing/client/cli/query.go @@ -27,7 +27,7 @@ func GetCmdQuerySigningInfo(storeName string, cdc *wire.Codec) *cobra.Command { } key := slashing.GetValidatorSigningInfoKey(pk.Address()) ctx := context.NewCoreContextFromViper() - res, err := ctx.Query(key, storeName) + res, err := ctx.QueryStore(key, storeName) if err != nil { return err } diff --git a/x/stake/client/cli/query.go b/x/stake/client/cli/query.go index eac39b9efc..727cddcde2 100644 --- a/x/stake/client/cli/query.go +++ b/x/stake/client/cli/query.go @@ -27,7 +27,7 @@ func GetCmdQueryValidator(storeName string, cdc *wire.Codec) *cobra.Command { } key := stake.GetValidatorKey(addr) ctx := context.NewCoreContextFromViper() - res, err := ctx.Query(key, storeName) + res, err := ctx.QueryStore(key, storeName) if err != nil { return err } @@ -124,7 +124,7 @@ func GetCmdQueryDelegation(storeName string, cdc *wire.Codec) *cobra.Command { key := stake.GetDelegationKey(delAddr, addr, cdc) ctx := context.NewCoreContextFromViper() - res, err := ctx.Query(key, storeName) + res, err := ctx.QueryStore(key, storeName) if err != nil { return err } diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index d9288fb11c..ec0e81330a 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -48,7 +48,7 @@ func bondingStatusHandlerFn(ctx context.CoreContext, storeName string, cdc *wire key := stake.GetDelegationKey(delegatorAddr, validatorAddr, cdc) - res, err := ctx.Query(key, storeName) + res, err := ctx.QueryStore(key, storeName) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(fmt.Sprintf("couldn't query bond. Error: %s", err.Error()))) From 92fb6685fcbf9d227606fe24fcdf0ce23d6782a6 Mon Sep 17 00:00:00 2001 From: Greg Szabo Date: Thu, 14 Jun 2018 10:56:24 -0700 Subject: [PATCH 266/548] Rename fermion to denom in genesis.go --- cmd/gaia/app/genesis.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/cmd/gaia/app/genesis.go b/cmd/gaia/app/genesis.go index 42d0f72e54..846b74d695 100644 --- a/cmd/gaia/app/genesis.go +++ b/cmd/gaia/app/genesis.go @@ -17,9 +17,8 @@ import ( var ( // bonded tokens given to genesis validators/accounts - freeFermionVal = int64(100) - // ... - freeFermionsAcc = int64(50) + freeDenomVal = int64(100) + freeDenomsAcc = int64(50) ) // State to Unmarshal @@ -124,7 +123,7 @@ func GaiaAppGenTxNF(cdc *wire.Codec, pk crypto.PubKey, addr sdk.Address, name st validator = tmtypes.GenesisValidator{ PubKey: pk, - Power: freeFermionVal, + Power: freeDenomVal, } return } @@ -155,21 +154,21 @@ func GaiaAppGenState(cdc *wire.Codec, appGenTxs []json.RawMessage) (genesisState accAuth := auth.NewBaseAccountWithAddress(genTx.Address) accAuth.Coins = sdk.Coins{ {genTx.Name + "Token", 1000}, - {"steak", freeFermionsAcc}, + {"steak", freeDenomsAcc}, } acc := NewGenesisAccount(&accAuth) genaccs[i] = acc - stakeData.Pool.LooseUnbondedTokens += freeFermionsAcc // increase the supply + stakeData.Pool.LooseUnbondedTokens += freeDenomsAcc // increase the supply // add the validator if len(genTx.Name) > 0 { desc := stake.NewDescription(genTx.Name, "", "", "") validator := stake.NewValidator(genTx.Address, genTx.PubKey, desc) - validator.PoolShares = stake.NewBondedShares(sdk.NewRat(freeFermionVal)) + validator.PoolShares = stake.NewBondedShares(sdk.NewRat(freeDenomVal)) stakeData.Validators = append(stakeData.Validators, validator) // pool logic - stakeData.Pool.BondedTokens += freeFermionVal + stakeData.Pool.BondedTokens += freeDenomVal stakeData.Pool.BondedShares = sdk.NewRat(stakeData.Pool.BondedTokens) } } From 59698f8368b4073e8f9dc5e2fd022f3c474d9c92 Mon Sep 17 00:00:00 2001 From: Greg Szabo Date: Thu, 14 Jun 2018 13:42:38 -0700 Subject: [PATCH 267/548] Changed denom to token --- cmd/gaia/app/genesis.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cmd/gaia/app/genesis.go b/cmd/gaia/app/genesis.go index 846b74d695..38ef53bbfd 100644 --- a/cmd/gaia/app/genesis.go +++ b/cmd/gaia/app/genesis.go @@ -17,8 +17,8 @@ import ( var ( // bonded tokens given to genesis validators/accounts - freeDenomVal = int64(100) - freeDenomsAcc = int64(50) + freeTokenVal = int64(100) + freeTokensAcc = int64(50) ) // State to Unmarshal @@ -123,7 +123,7 @@ func GaiaAppGenTxNF(cdc *wire.Codec, pk crypto.PubKey, addr sdk.Address, name st validator = tmtypes.GenesisValidator{ PubKey: pk, - Power: freeDenomVal, + Power: freeTokenVal, } return } @@ -154,21 +154,21 @@ func GaiaAppGenState(cdc *wire.Codec, appGenTxs []json.RawMessage) (genesisState accAuth := auth.NewBaseAccountWithAddress(genTx.Address) accAuth.Coins = sdk.Coins{ {genTx.Name + "Token", 1000}, - {"steak", freeDenomsAcc}, + {"steak", freeTokensAcc}, } acc := NewGenesisAccount(&accAuth) genaccs[i] = acc - stakeData.Pool.LooseUnbondedTokens += freeDenomsAcc // increase the supply + stakeData.Pool.LooseUnbondedTokens += freeTokensAcc // increase the supply // add the validator if len(genTx.Name) > 0 { desc := stake.NewDescription(genTx.Name, "", "", "") validator := stake.NewValidator(genTx.Address, genTx.PubKey, desc) - validator.PoolShares = stake.NewBondedShares(sdk.NewRat(freeDenomVal)) + validator.PoolShares = stake.NewBondedShares(sdk.NewRat(freeTokenVal)) stakeData.Validators = append(stakeData.Validators, validator) // pool logic - stakeData.Pool.BondedTokens += freeDenomVal + stakeData.Pool.BondedTokens += freeTokenVal stakeData.Pool.BondedShares = sdk.NewRat(stakeData.Pool.BondedTokens) } } From b66f6475ef54c97195fa6854fdc65ca94c11aa34 Mon Sep 17 00:00:00 2001 From: Greg Szabo Date: Thu, 14 Jun 2018 15:25:34 -0700 Subject: [PATCH 268/548] No-change change to trigger CircleCI --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8059ab772..1b55734035 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## 0.20.0 -*TBD* +*TBD* BREAKING CHANGES * Change default ports from 466xx to 266xx From eb5113af558406122ec8f6a20b0039809bfce77b Mon Sep 17 00:00:00 2001 From: Aditya Sripal Date: Thu, 14 Jun 2018 19:18:48 -0700 Subject: [PATCH 269/548] Added documentation to guide --- docs/guides/guide.md | 187 ++++++++++++++++++++++++++++++++++++++----- types/store.go | 3 +- 2 files changed, 167 insertions(+), 23 deletions(-) diff --git a/docs/guides/guide.md b/docs/guides/guide.md index db5ba392e3..8c7a9bca62 100644 --- a/docs/guides/guide.md +++ b/docs/guides/guide.md @@ -99,18 +99,20 @@ type Tx interface { GetMsg() Msg - // Signatures returns the signature of signers who signed the Msg. - // CONTRACT: Length returned is same as length of - // pubkeys returned from MsgKeySigners, and the order - // matches. - // CONTRACT: If the signature is missing (ie the Msg is - // invalid), then the corresponding signature is - // .Empty(). - GetSignatures() []StdSignature } ``` -The `tx.GetSignatures()` method returns a list of signatures, which must match +The standard way to create a transaction from a message is to use the `StdTx` struct defined in the `x/auth` module. + +```go +type StdTx struct { + Msg sdk.Msg `json:"msg"` + Fee StdFee `json:"fee"` + Signatures []StdSignature `json:"signatures"` +} +``` + +The `StdTx.GetSignatures()` method returns a list of signatures, which must match the list of addresses returned by `tx.Msg.GetSigners()`. The signatures come in a standard form: @@ -118,6 +120,7 @@ a standard form: type StdSignature struct { crypto.PubKey // optional crypto.Signature + AccountNumber int64 Sequence int64 } ``` @@ -138,12 +141,21 @@ The address responsible for paying the transactions fee is the first address returned by msg.GetSigners(). The convenience function `FeePayer(tx Tx)` is provided to return this. -The standard way to create a transaction from a message is to use the `StdTx`: +The standard bytes for signers to sign over is provided by: ```go -type StdTx struct { - Msg - Signatures []StdSignature +func StdSignByes(chainID string, accnums []int64, sequences []int64, fee StdFee, msg sdk.Msg) []byte +``` + +in `x/auth`. The standard way to construct fees to pay for the processing of transactions is: + +```go +// StdFee includes the amount of coins paid in fees and the maximum +// gas to be used by the transaction. The ratio yields an effective "gasprice", +// which must be above some miminum to be accepted into the mempool. +type StdFee struct { + Amount sdk.Coins `json:"amount"` + Gas int64 `json:"gas"` } ``` @@ -154,7 +166,7 @@ specify their own encoding schemes. This enables the SDK to be used as the framwork for constructing already specified cryptocurrency state machines, for instance Ethereum. -When initializing an application, a developer must specify a `TxDecoder` +When initializing an application, a developer can specify a `TxDecoder` function which determines how an arbitrary byte array should be unmarshalled into a `Tx`: @@ -162,8 +174,10 @@ into a `Tx`: type TxDecoder func(txBytes []byte) (Tx, error) ``` -In `Basecoin`, we use the Tendermint wire format and the `go-amino` library for -encoding and decoding all message types. The `go-amino` library has the nice +The default tx decoder is the Tendermint wire format which uses the go-amino library +for encoding and decoding all message types. + +In `Basecoin`, we use the default transaction decoder. The `go-amino` library has the nice property that it can unmarshal into interface types, but it requires the relevant types to be registered ahead of type. Registration happens on a `Codec` object, so as not to taint the global name space. @@ -182,6 +196,14 @@ unique "prefix bytes" during encoding. A registered type will always use the same prefix-bytes, regardless of what interface it is satisfying. For more details, see the [go-amino documentation](https://github.com/tendermint/go-amino/blob/develop). +If you wish to use a custom encoding scheme, you must define a TxDecoder function +and set it as the decoder in your extended baseapp using the `SetTxDecoder(decoder sdk.TxDecoder)`. + +Ex: + +```go +app.SetTxDecoder(CustomTxDecodeFn) +``` ## Storage @@ -252,14 +274,14 @@ Many methods on SDK objects receive a context as the first argument. ## Handler -Transaction processing in the SDK is defined through `Handler` functions: +Message processing in the SDK is defined through `Handler` functions: ```go -type Handler func(ctx Context, tx Tx) Result +type Handler func(ctx Context, msg Msg) Result ``` -A handler takes a context and a transaction and returns a result. All -information necessary for processing a transaction should be available in the +A handler takes a context and a message and returns a result. All +information necessary for processing a message should be available in the context. While the context holds the entire application state (all referenced from the @@ -291,15 +313,138 @@ func NewHandler(am sdk.AccountMapper) sdk.Handler { ## AnteHandler +The AnteHandler is used to do all transaction-level processing (i.e. Fee payment, signature verification) +before passing the message to its respective handler. + +```go +type AnteHandler func(ctx Context, tx Tx) (newCtx Context, result Result, abort bool) +``` + +The antehandler takes a Context and a transaction and returns a new Context, a Result, and the abort boolean. +As with the handler, all information necessary for processing a message should be available in the +context. + +If the transaction fails, then the application should not waste time processing the message. Thus, the antehandler should +return an Error's Result method and set the abort boolean to `true` so that the application knows not to process the message in a handler. + +Most applications can use the provided antehandler implementation in `x/auth` which handles signature verification +as well as collecting fees. + +Note: Signatures must be over `auth.StdSignDoc` introduced above to use the provided antehandler. + +```go +// File: cosmos-sdk/examples/basecoin/app/app.go +app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, app.feeCollectionKeeper)) +``` + ### Handling Fee payment ### Handling Authentication +The antehandler is responsible for handling all authentication of a transaction before passing the message onto its handler. +This generally involves signature verification. The antehandler should check that all of the addresses that are returned in +`tx.GetMsg().GetSigners()` signed the message and that they signed over `tx.GetMsg().GetSignBytes()`. + ## Accounts and x/auth -### sdk.Account +### auth.Account + +```go +// Account is a standard account using a sequence number for replay protection +// and a pubkey for authentication. +type Account interface { + GetAddress() sdk.Address + SetAddress(sdk.Address) error // errors if already set. + + GetPubKey() crypto.PubKey // can return nil. + SetPubKey(crypto.PubKey) error + + GetAccountNumber() int64 + SetAccountNumber(int64) error + + GetSequence() int64 + SetSequence(int64) error + + GetCoins() sdk.Coins + SetCoins(sdk.Coins) error +} +``` + +Accounts are the standard way for an application to keep track of addresses and their associated balances. + ### auth.BaseAccount + +```go +// BaseAccount - base account structure. +// Extend this by embedding this in your AppAccount. +// See the examples/basecoin/types/account.go for an example. +type BaseAccount struct { + Address sdk.Address `json:"address"` + Coins sdk.Coins `json:"coins"` + PubKey crypto.PubKey `json:"public_key"` + AccountNumber int64 `json:"account_number"` + Sequence int64 `json:"sequence"` +} +``` + +The `auth.BaseAccount` struct provides a standard implementation of the Account interface with replay protection. +BaseAccount can be extended by embedding it in your own Account struct. + ### auth.AccountMapper +```go +// This AccountMapper encodes/decodes accounts using the +// go-amino (binary) encoding/decoding library. +type AccountMapper struct { + + // The (unexposed) key used to access the store from the Context. + key sdk.StoreKey + + // The prototypical Account concrete type. + proto Account + + // The wire codec for binary encoding/decoding of accounts. + cdc *wire.Codec +} +``` + +The AccountMapper is responsible for managing and storing the state of all accounts in the application. + +Example Initialization: + +```go +// File: examples/basecoin/app/app.go +// Define the accountMapper. +app.accountMapper = auth.NewAccountMapper( + cdc, + app.keyAccount, // target store + &types.AppAccount{}, // prototype +) +``` + +The accountMapper allows you to retrieve the current account state by `GetAccount(ctx Context, addr auth.Address)` and change the state by +`SetAccount(ctx Context, acc Account)`. + +Note: To update an account you will first have to get the account, update the appropriate fields with its associated setter method, and then call +`SetAccount(ctx Context, acc updatedAccount)`. + +Updating accounts is made easier by using the `Keeper` struct in the `x/bank` module. + +Example Initialization: + +```go +// File: examples/basecoin/app/app.go +app.coinKeeper = bank.NewKeeper(app.accountMapper) +``` + +Example Usage: + +```go +// Finds account with addr in accountmapper +// Adds coins to account's coin array +// Sets updated account in accountmapper +app.coinKeeper.AddCoins(ctx, addr, coins) +``` + ## Wire codec ### Why another codec? diff --git a/types/store.go b/types/store.go index 2bd34bebd8..7885d7ab64 100644 --- a/types/store.go +++ b/types/store.go @@ -105,12 +105,11 @@ type KVStore interface { // Iterator over a domain of keys in ascending order. End is exclusive. // Start must be less than end, or the Iterator is invalid. - // CONTRACT: No writes may happen within a domain while an iterator exists over it. + // To iterate over entire domain -> store.Iterator(nil, nil) Iterator(start, end []byte) Iterator // Iterator over a domain of keys in descending order. End is exclusive. // Start must be greater than end, or the Iterator is invalid. - // CONTRACT: No writes may happen within a domain while an iterator exists over it. ReverseIterator(start, end []byte) Iterator // TODO Not yet implemented. From 50ec5616fa2c94b6e9b8155bf2e2f68b34c11a24 Mon Sep 17 00:00:00 2001 From: Greg Szabo Date: Thu, 14 Jun 2018 23:02:40 -0700 Subject: [PATCH 270/548] Changed node names in Docker compose to avoid clash with tendermint similar localnodes. --- docker-compose.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 83e473a7db..0b9765969f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,8 @@ version: '3' services: - node0: - container_name: node0 + gaiadnode0: + container_name: gaiadnode0 image: "tendermint/gaiadnode" ports: - "46656-46657:46656-46657" @@ -15,8 +15,8 @@ services: localnet: ipv4_address: 192.168.10.2 - node1: - container_name: node1 + gaiadnode1: + container_name: gaiadnode1 image: "tendermint/gaiadnode" ports: - "46659-46660:46656-46657" @@ -29,8 +29,8 @@ services: localnet: ipv4_address: 192.168.10.3 - node2: - container_name: node2 + gaiadnode2: + container_name: gaiadnode2 image: "tendermint/gaiadnode" environment: - ID=2 @@ -43,8 +43,8 @@ services: localnet: ipv4_address: 192.168.10.4 - node3: - container_name: node3 + gaiadnode3: + container_name: gaiadnode3 image: "tendermint/gaiadnode" environment: - ID=3 From aab685beb5d86491e1f41e4edca7e696879ccf48 Mon Sep 17 00:00:00 2001 From: Greg Szabo Date: Fri, 15 Jun 2018 00:21:31 -0700 Subject: [PATCH 271/548] Changed port numbers in docker-compose to the new port numbers --- docker-compose.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 0b9765969f..fca518db4e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,7 @@ services: container_name: gaiadnode0 image: "tendermint/gaiadnode" ports: - - "46656-46657:46656-46657" + - "26656-26657:26656-26657" environment: - ID=0 - LOG=$${LOG:-gaiad.log} @@ -19,7 +19,7 @@ services: container_name: gaiadnode1 image: "tendermint/gaiadnode" ports: - - "46659-46660:46656-46657" + - "26659-26660:26656-26657" environment: - ID=1 - LOG=$${LOG:-gaiad.log} @@ -36,7 +36,7 @@ services: - ID=2 - LOG=$${LOG:-gaiad.log} ports: - - "46661-46662:46656-46657" + - "26661-26662:26656-26657" volumes: - ./build:/gaiad:Z networks: @@ -50,7 +50,7 @@ services: - ID=3 - LOG=$${LOG:-gaiad.log} ports: - - "46663-46664:46656-46657" + - "26663-26664:26656-26657" volumes: - ./build:/gaiad:Z networks: From 1d568d1706666f7cf8fd9cf5d3ce5915cae22bfa Mon Sep 17 00:00:00 2001 From: Greg Szabo Date: Fri, 15 Jun 2018 12:18:26 -0700 Subject: [PATCH 272/548] Added -tags netgo flag to statically link binary --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 9d517af755..f420446696 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ PACKAGES=$(shell go list ./... | grep -v '/vendor/') PACKAGES_NOCLITEST=$(shell go list ./... | grep -v '/vendor/' | grep -v github.com/cosmos/cosmos-sdk/cmd/gaia/cli_test) COMMIT_HASH := $(shell git rev-parse --short HEAD) -BUILD_FLAGS = -ldflags "-X github.com/cosmos/cosmos-sdk/version.GitCommit=${COMMIT_HASH}" +BUILD_FLAGS = -tags netgo -ldflags "-X github.com/cosmos/cosmos-sdk/version.GitCommit=${COMMIT_HASH}" all: check_tools get_vendor_deps install install_examples test_lint test From f68e903d06f6843ca469bed3a34eae861b27c9ac Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 15 Jun 2018 13:24:04 -0700 Subject: [PATCH 273/548] Merge PR #1260: Fixed url encoding issue --- client/lcd/lcd_test.go | 3 ++- client/tx/search.go | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 0bacbee209..ed736d01be 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -321,8 +321,9 @@ func TestTxs(t *testing.T) { assert.Equal(t, 1, len(indexedTxs)) // query sender + // also tests url decoding addrBech := sdk.MustBech32ifyAcc(addr) - res, body = Request(t, port, "GET", fmt.Sprintf("/txs?tag=sender_bech32='%s'", addrBech), nil) + res, body = Request(t, port, "GET", "/txs?tag=sender_bech32=%27"+addrBech+"%27", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) err = cdc.UnmarshalJSON([]byte(body), &indexedTxs) diff --git a/client/tx/search.go b/client/tx/search.go index 7c75be8f7e..2e164700db 100644 --- a/client/tx/search.go +++ b/client/tx/search.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "net/http" + "net/url" "strings" "github.com/spf13/cobra" @@ -107,7 +108,12 @@ func SearchTxRequestHandlerFn(ctx context.CoreContext, cdc *wire.Codec) http.Han } keyValue := strings.Split(tag, "=") key := keyValue[0] - value := keyValue[1] + value, err := url.QueryUnescape(keyValue[1]) + if err != nil { + w.WriteHeader(400) + w.Write([]byte("Could not decode address: " + err.Error())) + return + } if strings.HasSuffix(key, "_bech32") { bech32address := strings.Trim(value, "'") prefix := strings.Split(bech32address, "1")[0] From 314b5a854d63e675afb183984166d015281b7886 Mon Sep 17 00:00:00 2001 From: Joon Date: Fri, 15 Jun 2018 14:16:45 -0700 Subject: [PATCH 274/548] Merge PR #1218: sdk.Int in sdk.Coin implement Int, Int256, Uint256 pass ci pass ci add to changelog, add boundcheck to test add comments, fix cli_test.go fix errors apply requested changes panics on New*WithDecimal fix Int.BigInt() fix stake tests * Panic on uint division-by-zero * Set ok=false on NewIntFromString, NewUintFromString failure * Nuke CircleCI caches --- .circleci/config.yml | 24 +- CHANGELOG.md | 1 + client/lcd/lcd_test.go | 26 +- client/lcd/test_helpers.go | 2 +- cmd/gaia/app/genesis.go | 18 +- cmd/gaia/cli_test/cli_test.go | 18 +- examples/democoin/x/cool/app_test.go | 10 +- examples/democoin/x/cool/handler.go | 2 +- examples/democoin/x/pow/app_test.go | 6 +- examples/democoin/x/pow/keeper.go | 2 +- examples/democoin/x/simplestake/keeper.go | 6 +- .../democoin/x/simplestake/keeper_test.go | 4 +- examples/democoin/x/simplestake/msgs_test.go | 4 +- types/coin.go | 37 +- types/coin_test.go | 196 +++++---- types/int.go | 411 ++++++++++++++++++ types/int_test.go | 111 +++++ types/rational.go | 29 ++ x/auth/account_test.go | 4 +- x/auth/ante_test.go | 14 +- x/auth/feekeeper_test.go | 4 +- x/auth/mock/auth_app_test.go | 12 +- x/auth/mock/simulate_block.go | 2 +- x/bank/app_test.go | 46 +- x/bank/keeper_test.go | 146 +++---- x/bank/msgs_test.go | 46 +- x/ibc/app_test.go | 2 +- x/ibc/ibc_test.go | 2 +- x/ibc/types_test.go | 2 +- x/slashing/app_test.go | 6 +- x/slashing/keeper_test.go | 26 +- x/slashing/test_common.go | 6 +- x/slashing/tick_test.go | 8 +- x/stake/app_test.go | 8 +- x/stake/handler_test.go | 78 ++-- x/stake/inflation.go | 4 +- x/stake/inflation_test.go | 84 ++-- x/stake/keeper.go | 2 +- x/stake/keeper_test.go | 52 +-- x/stake/msg.go | 4 +- x/stake/msg_test.go | 12 +- x/stake/pool.go | 66 +-- x/stake/pool_test.go | 50 +-- x/stake/test_common.go | 2 +- x/stake/validator.go | 10 +- x/stake/validator_test.go | 88 ++-- x/stake/view_slash_keeper_test.go | 2 +- 47 files changed, 1142 insertions(+), 553 deletions(-) create mode 100644 types/int.go create mode 100644 types/int_test.go diff --git a/.circleci/config.yml b/.circleci/config.yml index 258c0b1060..2e6d1779bc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -16,7 +16,7 @@ jobs: - checkout - restore_cache: keys: - - v1-pkg-cache + - v2-pkg-cache - run: name: tools command: | @@ -39,11 +39,11 @@ jobs: - bin - profiles - save_cache: - key: v1-pkg-cache + key: v2-pkg-cache paths: - /go/pkg - save_cache: - key: v1-tree-{{ .Environment.CIRCLE_SHA1 }} + key: v2-tree-{{ .Environment.CIRCLE_SHA1 }} paths: - /go/src/github.com/cosmos/cosmos-sdk @@ -54,9 +54,9 @@ jobs: - attach_workspace: at: /tmp/workspace - restore_cache: - key: v1-pkg-cache + key: v2-pkg-cache - restore_cache: - key: v1-tree-{{ .Environment.CIRCLE_SHA1 }} + key: v2-tree-{{ .Environment.CIRCLE_SHA1 }} - run: name: Get metalinter command: | @@ -76,9 +76,9 @@ jobs: - attach_workspace: at: /tmp/workspace - restore_cache: - key: v1-pkg-cache + key: v2-pkg-cache - restore_cache: - key: v1-tree-{{ .Environment.CIRCLE_SHA1 }} + key: v2-tree-{{ .Environment.CIRCLE_SHA1 }} - run: name: Test unit command: | @@ -92,9 +92,9 @@ jobs: - attach_workspace: at: /tmp/workspace - restore_cache: - key: v1-pkg-cache + key: v2-pkg-cache - restore_cache: - key: v1-tree-{{ .Environment.CIRCLE_SHA1 }} + key: v2-tree-{{ .Environment.CIRCLE_SHA1 }} - run: name: Test cli command: | @@ -108,9 +108,9 @@ jobs: - attach_workspace: at: /tmp/workspace - restore_cache: - key: v1-pkg-cache + key: v2-pkg-cache - restore_cache: - key: v1-tree-{{ .Environment.CIRCLE_SHA1 }} + key: v2-tree-{{ .Environment.CIRCLE_SHA1 }} - run: name: Run tests command: | @@ -132,7 +132,7 @@ jobs: - attach_workspace: at: /tmp/workspace - restore_cache: - key: v1-tree-{{ .Environment.CIRCLE_SHA1 }} + key: v2-tree-{{ .Environment.CIRCLE_SHA1 }} - run: name: gather command: | diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b55734035..889b41746e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ BREAKING CHANGES BREAKING CHANGES * msg.GetSignBytes() now returns bech32-encoded addresses in all cases * [lcd] REST end-points now include gas +* sdk.Coin now uses sdk.Int, a big.Int wrapper with 256bit range cap FEATURES * [x/auth] Added AccountNumbers to BaseAccount and StdTxs to allow for replay protection with account pruning diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index ed736d01be..f4406a8693 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -241,15 +241,17 @@ func TestCoinSend(t *testing.T) { acc = getAccount(t, port, addr) coins := acc.GetCoins() mycoins := coins[0] + assert.Equal(t, "steak", mycoins.Denom) - assert.Equal(t, initialBalance[0].Amount-1, mycoins.Amount) + assert.Equal(t, initialBalance[0].Amount.SubRaw(1), mycoins.Amount) // query receiver acc = getAccount(t, port, receiveAddr) coins = acc.GetCoins() mycoins = coins[0] + assert.Equal(t, "steak", mycoins.Denom) - assert.Equal(t, int64(1), mycoins.Amount) + assert.Equal(t, int64(1), mycoins.Amount.Int64()) } func TestIBCTransfer(t *testing.T) { @@ -274,8 +276,9 @@ func TestIBCTransfer(t *testing.T) { acc = getAccount(t, port, addr) coins := acc.GetCoins() mycoins := coins[0] + assert.Equal(t, "steak", mycoins.Denom) - assert.Equal(t, initialBalance[0].Amount-1, mycoins.Amount) + assert.Equal(t, initialBalance[0].Amount.SubRaw(1), mycoins.Amount) // TODO: query ibc egress packet state } @@ -383,7 +386,8 @@ func TestBonding(t *testing.T) { // query sender acc := getAccount(t, port, addr) coins := acc.GetCoins() - assert.Equal(t, int64(40), coins.AmountOf(denom)) + + assert.Equal(t, int64(40), coins.AmountOf(denom).Int64()) // query validator bond := getDelegation(t, port, addr, validator1Owner) @@ -438,19 +442,19 @@ func doSend(t *testing.T, port, seed, name, password string, addr sdk.Address) ( sequence := acc.GetSequence() // send + coinbz, err := json.Marshal(sdk.NewCoin("steak", 1)) + if err != nil { + panic(err) + } + jsonStr := []byte(fmt.Sprintf(`{ "name":"%s", "password":"%s", "account_number":%d, "sequence":%d, "gas": 10000, - "amount":[ - { - "denom": "%s", - "amount": 1 - } - ] - }`, name, password, accnum, sequence, "steak")) + "amount":[%s] + }`, name, password, accnum, sequence, coinbz)) res, body := Request(t, port, "POST", "/accounts/"+receiveAddrBech+"/send", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) diff --git a/client/lcd/test_helpers.go b/client/lcd/test_helpers.go index c1898ff81c..9a22073b71 100644 --- a/client/lcd/test_helpers.go +++ b/client/lcd/test_helpers.go @@ -143,7 +143,7 @@ func InitializeTestLCD(t *testing.T, nValidators int, initAddrs []sdk.Address) ( // add some tokens to init accounts for _, addr := range initAddrs { accAuth := auth.NewBaseAccountWithAddress(addr) - accAuth.Coins = sdk.Coins{{"steak", 100}} + accAuth.Coins = sdk.Coins{sdk.NewCoin("steak", 100)} acc := gapp.NewGenesisAccount(&accAuth) genesisState.Accounts = append(genesisState.Accounts, acc) } diff --git a/cmd/gaia/app/genesis.go b/cmd/gaia/app/genesis.go index 38ef53bbfd..912ec25843 100644 --- a/cmd/gaia/app/genesis.go +++ b/cmd/gaia/app/genesis.go @@ -17,8 +17,8 @@ import ( var ( // bonded tokens given to genesis validators/accounts - freeTokenVal = int64(100) - freeTokensAcc = int64(50) + freeFermionVal = sdk.NewInt(100) + freeFermionsAcc = sdk.NewInt(50) ) // State to Unmarshal @@ -123,7 +123,7 @@ func GaiaAppGenTxNF(cdc *wire.Codec, pk crypto.PubKey, addr sdk.Address, name st validator = tmtypes.GenesisValidator{ PubKey: pk, - Power: freeTokenVal, + Power: freeFermionVal.Int64(), } return } @@ -153,23 +153,23 @@ func GaiaAppGenState(cdc *wire.Codec, appGenTxs []json.RawMessage) (genesisState // create the genesis account, give'm few steaks and a buncha token with there name accAuth := auth.NewBaseAccountWithAddress(genTx.Address) accAuth.Coins = sdk.Coins{ - {genTx.Name + "Token", 1000}, - {"steak", freeTokensAcc}, + {genTx.Name + "Token", sdk.NewInt(1000)}, + {"steak", freeFermionsAcc}, } acc := NewGenesisAccount(&accAuth) genaccs[i] = acc - stakeData.Pool.LooseUnbondedTokens += freeTokensAcc // increase the supply + stakeData.Pool.LooseUnbondedTokens = stakeData.Pool.LooseUnbondedTokens.Add(freeFermionsAcc) // increase the supply // add the validator if len(genTx.Name) > 0 { desc := stake.NewDescription(genTx.Name, "", "", "") validator := stake.NewValidator(genTx.Address, genTx.PubKey, desc) - validator.PoolShares = stake.NewBondedShares(sdk.NewRat(freeTokenVal)) + validator.PoolShares = stake.NewBondedShares(sdk.NewRatFromInt(freeFermionVal)) stakeData.Validators = append(stakeData.Validators, validator) // pool logic - stakeData.Pool.BondedTokens += freeTokenVal - stakeData.Pool.BondedShares = sdk.NewRat(stakeData.Pool.BondedTokens) + stakeData.Pool.BondedTokens = stakeData.Pool.BondedTokens.Add(freeFermionVal) + stakeData.Pool.BondedShares = sdk.NewRatFromInt(stakeData.Pool.BondedTokens) } } diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 3eee20c855..af62c3e992 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -46,24 +46,24 @@ func TestGaiaCLISend(t *testing.T) { require.NoError(t, err) fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooCech, flags)) - assert.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak")) + assert.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak").Int64()) executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barCech), pass) tests.WaitForNextHeightTM(port) barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) - assert.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak")) + assert.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak").Int64()) fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooCech, flags)) - assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak")) + assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak").Int64()) // test autosequencing executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barCech), pass) tests.WaitForNextHeightTM(port) barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) - assert.Equal(t, int64(20), barAcc.GetCoins().AmountOf("steak")) + assert.Equal(t, int64(20), barAcc.GetCoins().AmountOf("steak").Int64()) fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooCech, flags)) - assert.Equal(t, int64(30), fooAcc.GetCoins().AmountOf("steak")) + assert.Equal(t, int64(30), fooAcc.GetCoins().AmountOf("steak").Int64()) } func TestGaiaCLICreateValidator(t *testing.T) { @@ -98,9 +98,9 @@ func TestGaiaCLICreateValidator(t *testing.T) { tests.WaitForNextHeightTM(port) barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) - assert.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak")) + assert.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak").Int64()) fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooCech, flags)) - assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak")) + assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak").Int64()) // create validator cvStr := fmt.Sprintf("gaiacli stake create-validator %v", flags) @@ -114,7 +114,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { tests.WaitForNextHeightTM(port) barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) - require.Equal(t, int64(8), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) + require.Equal(t, int64(8), barAcc.GetCoins().AmountOf("steak").Int64(), "%v", barAcc) validator := executeGetValidator(t, fmt.Sprintf("gaiacli stake validator %v --output=json %v", barCech, flags)) assert.Equal(t, validator.Owner, barAddr) @@ -133,7 +133,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { tests.WaitForNextHeightTM(port) barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) - require.Equal(t, int64(9), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) + require.Equal(t, int64(9), barAcc.GetCoins().AmountOf("steak").Int64(), "%v", barAcc) validator = executeGetValidator(t, fmt.Sprintf("gaiacli stake validator %v --output=json %v", barCech, flags)) assert.Equal(t, "1/1", validator.PoolShares.Amount.String()) } diff --git a/examples/democoin/x/cool/app_test.go b/examples/democoin/x/cool/app_test.go index 8d3f347b35..eae3250e0b 100644 --- a/examples/democoin/x/cool/app_test.go +++ b/examples/democoin/x/cool/app_test.go @@ -91,15 +91,15 @@ func TestMsgQuiz(t *testing.T) { // Set the trend, submit a really cool quiz and check for reward mock.SignCheckDeliver(t, mapp.BaseApp, setTrendMsg1, []int64{0}, []int64{0}, true, priv1) mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg1, []int64{0}, []int64{1}, true, priv1) - mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"icecold", 69}}) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("icecold", 69)}) mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg2, []int64{0}, []int64{2}, false, priv1) // result without reward - mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"icecold", 69}}) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("icecold", 69)}) mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg1, []int64{0}, []int64{3}, true, priv1) - mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"icecold", 138}}) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("icecold", 138)}) mock.SignCheckDeliver(t, mapp.BaseApp, setTrendMsg2, []int64{0}, []int64{4}, true, priv1) // reset the trend mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg1, []int64{0}, []int64{5}, false, priv1) // the same answer will nolonger do! - mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"icecold", 138}}) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("icecold", 138)}) mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg2, []int64{0}, []int64{6}, true, priv1) // earlier answer now relavent again - mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"badvibesonly", 69}, {"icecold", 138}}) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("badvibesonly", 69), sdk.NewCoin("icecold", 138)}) mock.SignCheckDeliver(t, mapp.BaseApp, setTrendMsg3, []int64{0}, []int64{7}, false, priv1) // expect to fail to set the trend to something which is not cool } diff --git a/examples/democoin/x/cool/handler.go b/examples/democoin/x/cool/handler.go index b4375c5dcd..82247677cb 100644 --- a/examples/democoin/x/cool/handler.go +++ b/examples/democoin/x/cool/handler.go @@ -51,7 +51,7 @@ func handleMsgQuiz(ctx sdk.Context, k Keeper, msg MsgQuiz) sdk.Result { return sdk.Result{} // TODO } - bonusCoins := sdk.Coins{{msg.CoolAnswer, 69}} + bonusCoins := sdk.Coins{sdk.NewCoin(msg.CoolAnswer, 69)} _, _, err := k.ck.AddCoins(ctx, msg.Sender, bonusCoins) if err != nil { diff --git a/examples/democoin/x/pow/app_test.go b/examples/democoin/x/pow/app_test.go index aa71fb080b..0cfc890a06 100644 --- a/examples/democoin/x/pow/app_test.go +++ b/examples/democoin/x/pow/app_test.go @@ -72,12 +72,12 @@ func TestMsgMine(t *testing.T) { // Mine and check for reward mineMsg1 := GenerateMsgMine(addr1, 1, 2) mock.SignCheckDeliver(t, mapp.BaseApp, mineMsg1, []int64{0}, []int64{0}, true, priv1) - mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"pow", 1}}) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("pow", 1)}) // Mine again and check for reward mineMsg2 := GenerateMsgMine(addr1, 2, 3) mock.SignCheckDeliver(t, mapp.BaseApp, mineMsg2, []int64{0}, []int64{1}, true, priv1) - mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"pow", 2}}) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("pow", 2)}) // Mine again - should be invalid mock.SignCheckDeliver(t, mapp.BaseApp, mineMsg2, []int64{0}, []int64{1}, false, priv1) - mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"pow", 2}}) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("pow", 2)}) } diff --git a/examples/democoin/x/pow/keeper.go b/examples/democoin/x/pow/keeper.go index 35fccf7424..98258a2e9f 100644 --- a/examples/democoin/x/pow/keeper.go +++ b/examples/democoin/x/pow/keeper.go @@ -125,7 +125,7 @@ func (k Keeper) CheckValid(ctx sdk.Context, difficulty uint64, count uint64) (ui // Add some coins for a POW well done func (k Keeper) ApplyValid(ctx sdk.Context, sender sdk.Address, newDifficulty uint64, newCount uint64) sdk.Error { - _, _, ckErr := k.ck.AddCoins(ctx, sender, []sdk.Coin{sdk.Coin{k.config.Denomination, k.config.Reward}}) + _, _, ckErr := k.ck.AddCoins(ctx, sender, []sdk.Coin{sdk.NewCoin(k.config.Denomination, k.config.Reward)}) if ckErr != nil { return ckErr } diff --git a/examples/democoin/x/simplestake/keeper.go b/examples/democoin/x/simplestake/keeper.go index 5bd2639610..c75ccff07b 100644 --- a/examples/democoin/x/simplestake/keeper.go +++ b/examples/democoin/x/simplestake/keeper.go @@ -79,7 +79,7 @@ func (k Keeper) Bond(ctx sdk.Context, addr sdk.Address, pubKey crypto.PubKey, st } } - bi.Power = bi.Power + stake.Amount + bi.Power = bi.Power + stake.Amount.Int64() k.setBondInfo(ctx, addr, bi) return bi.Power, nil @@ -93,7 +93,7 @@ func (k Keeper) Unbond(ctx sdk.Context, addr sdk.Address) (crypto.PubKey, int64, } k.deleteBondInfo(ctx, addr) - returnedBond := sdk.Coin{stakingToken, bi.Power} + returnedBond := sdk.NewCoin(stakingToken, bi.Power) _, _, err := k.ck.AddCoins(ctx, addr, []sdk.Coin{returnedBond}) if err != nil { @@ -118,7 +118,7 @@ func (k Keeper) bondWithoutCoins(ctx sdk.Context, addr sdk.Address, pubKey crypt } } - bi.Power = bi.Power + stake.Amount + bi.Power = bi.Power + stake.Amount.Int64() k.setBondInfo(ctx, addr, bi) return bi.Power, nil diff --git a/examples/democoin/x/simplestake/keeper_test.go b/examples/democoin/x/simplestake/keeper_test.go index 15bd14c79b..a4c42bd568 100644 --- a/examples/democoin/x/simplestake/keeper_test.go +++ b/examples/democoin/x/simplestake/keeper_test.go @@ -75,10 +75,10 @@ func TestBonding(t *testing.T) { _, _, err := stakeKeeper.unbondWithoutCoins(ctx, addr) assert.Equal(t, err, ErrInvalidUnbond(DefaultCodespace)) - _, err = stakeKeeper.bondWithoutCoins(ctx, addr, pubKey, sdk.Coin{"steak", 10}) + _, err = stakeKeeper.bondWithoutCoins(ctx, addr, pubKey, sdk.NewCoin("steak", 10)) assert.Nil(t, err) - power, err := stakeKeeper.bondWithoutCoins(ctx, addr, pubKey, sdk.Coin{"steak", 10}) + power, err := stakeKeeper.bondWithoutCoins(ctx, addr, pubKey, sdk.NewCoin("steak", 10)) assert.Equal(t, int64(20), power) pk, _, err := stakeKeeper.unbondWithoutCoins(ctx, addr) diff --git a/examples/democoin/x/simplestake/msgs_test.go b/examples/democoin/x/simplestake/msgs_test.go index c71ebe7fc1..55d98a9fdf 100644 --- a/examples/democoin/x/simplestake/msgs_test.go +++ b/examples/democoin/x/simplestake/msgs_test.go @@ -16,8 +16,8 @@ func TestBondMsgValidation(t *testing.T) { valid bool msgBond MsgBond }{ - {true, NewMsgBond(sdk.Address{}, sdk.Coin{"mycoin", 5}, privKey.PubKey())}, - {false, NewMsgBond(sdk.Address{}, sdk.Coin{"mycoin", 0}, privKey.PubKey())}, + {true, NewMsgBond(sdk.Address{}, sdk.NewCoin("mycoin", 5), privKey.PubKey())}, + {false, NewMsgBond(sdk.Address{}, sdk.NewCoin("mycoin", 0), privKey.PubKey())}, } for i, tc := range cases { diff --git a/types/coin.go b/types/coin.go index ee26939646..30f84abdf6 100644 --- a/types/coin.go +++ b/types/coin.go @@ -11,7 +11,14 @@ import ( // Coin hold some amount of one currency type Coin struct { Denom string `json:"denom"` - Amount int64 `json:"amount"` + Amount Int `json:"amount"` +} + +func NewCoin(denom string, amount int64) Coin { + return Coin{ + Denom: denom, + Amount: NewInt(amount), + } } // String provides a human-readable representation of a coin @@ -26,28 +33,28 @@ func (coin Coin) SameDenomAs(other Coin) bool { // IsZero returns if this represents no money func (coin Coin) IsZero() bool { - return coin.Amount == 0 + return coin.Amount.IsZero() } // IsGTE returns true if they are the same type and the receiver is // an equal or greater value func (coin Coin) IsGTE(other Coin) bool { - return coin.SameDenomAs(other) && (coin.Amount >= other.Amount) + return coin.SameDenomAs(other) && (!coin.Amount.LT(other.Amount)) } // IsEqual returns true if the two sets of Coins have the same value func (coin Coin) IsEqual(other Coin) bool { - return coin.SameDenomAs(other) && (coin.Amount == other.Amount) + return coin.SameDenomAs(other) && (coin.Amount.Equal(other.Amount)) } // IsPositive returns true if coin amount is positive func (coin Coin) IsPositive() bool { - return (coin.Amount > 0) + return (coin.Amount.Sign() == 1) } // IsNotNegative returns true if coin amount is not negative func (coin Coin) IsNotNegative() bool { - return (coin.Amount >= 0) + return (coin.Amount.Sign() != -1) } // Adds amounts of two coins with same denom @@ -55,7 +62,7 @@ func (coin Coin) Plus(coinB Coin) Coin { if !coin.SameDenomAs(coinB) { return coin } - return Coin{coin.Denom, coin.Amount + coinB.Amount} + return Coin{coin.Denom, coin.Amount.Add(coinB.Amount)} } // Subtracts amounts of two coins with same denom @@ -63,7 +70,7 @@ func (coin Coin) Minus(coinB Coin) Coin { if !coin.SameDenomAs(coinB) { return coin } - return Coin{coin.Denom, coin.Amount - coinB.Amount} + return Coin{coin.Denom, coin.Amount.Sub(coinB.Amount)} } //---------------------------------------- @@ -128,7 +135,7 @@ func (coins Coins) Plus(coinsB Coins) Coins { sum = append(sum, coinA) indexA++ case 0: - if coinA.Amount+coinB.Amount == 0 { + if coinA.Amount.Add(coinB.Amount).IsZero() { // ignore 0 sum coin type } else { sum = append(sum, coinA.Plus(coinB)) @@ -148,7 +155,7 @@ func (coins Coins) Negative() Coins { for _, coin := range coins { res = append(res, Coin{ Denom: coin.Denom, - Amount: -coin.Amount, + Amount: coin.Amount.Neg(), }) } return res @@ -187,7 +194,7 @@ func (coins Coins) IsEqual(coinsB Coins) bool { return false } for i := 0; i < len(coins); i++ { - if coins[i] != coinsB[i] { + if coins[i].Denom != coinsB[i].Denom || !coins[i].Amount.Equal(coinsB[i].Amount) { return false } } @@ -223,16 +230,16 @@ func (coins Coins) IsNotNegative() bool { } // Returns the amount of a denom from coins -func (coins Coins) AmountOf(denom string) int64 { +func (coins Coins) AmountOf(denom string) Int { switch len(coins) { case 0: - return 0 + return ZeroInt() case 1: coin := coins[0] if coin.Denom == denom { return coin.Amount } - return 0 + return ZeroInt() default: midIdx := len(coins) / 2 // 2:1, 3:1, 4:2 coin := coins[midIdx] @@ -290,7 +297,7 @@ func ParseCoin(coinStr string) (coin Coin, err error) { return } - return Coin{denomStr, int64(amount)}, nil + return Coin{denomStr, NewInt(int64(amount))}, nil } // ParseCoins will parse out a list of coins separated by commas. diff --git a/types/coin_test.go b/types/coin_test.go index eb9f5e087e..5f5c82087b 100644 --- a/types/coin_test.go +++ b/types/coin_test.go @@ -13,9 +13,9 @@ func TestIsPositiveCoin(t *testing.T) { inputOne Coin expected bool }{ - {Coin{"A", 1}, true}, - {Coin{"A", 0}, false}, - {Coin{"a", -1}, false}, + {NewCoin("A", 1), true}, + {NewCoin("A", 0), false}, + {NewCoin("a", -1), false}, } for _, tc := range cases { @@ -31,9 +31,9 @@ func TestIsNotNegativeCoin(t *testing.T) { inputOne Coin expected bool }{ - {Coin{"A", 1}, true}, - {Coin{"A", 0}, true}, - {Coin{"a", -1}, false}, + {NewCoin("A", 1), true}, + {NewCoin("A", 0), true}, + {NewCoin("a", -1), false}, } for _, tc := range cases { @@ -50,11 +50,11 @@ func TestSameDenomAsCoin(t *testing.T) { inputTwo Coin expected bool }{ - {Coin{"A", 1}, Coin{"A", 1}, true}, - {Coin{"A", 1}, Coin{"a", 1}, false}, - {Coin{"a", 1}, Coin{"b", 1}, false}, - {Coin{"steak", 1}, Coin{"steak", 10}, true}, - {Coin{"steak", -11}, Coin{"steak", 10}, true}, + {NewCoin("A", 1), NewCoin("A", 1), true}, + {NewCoin("A", 1), NewCoin("a", 1), false}, + {NewCoin("a", 1), NewCoin("b", 1), false}, + {NewCoin("steak", 1), NewCoin("steak", 10), true}, + {NewCoin("steak", -11), NewCoin("steak", 10), true}, } for _, tc := range cases { @@ -71,10 +71,10 @@ func TestIsGTECoin(t *testing.T) { inputTwo Coin expected bool }{ - {Coin{"A", 1}, Coin{"A", 1}, true}, - {Coin{"A", 2}, Coin{"A", 1}, true}, - {Coin{"A", -1}, Coin{"A", 5}, false}, - {Coin{"a", 1}, Coin{"b", 1}, false}, + {NewCoin("A", 1), NewCoin("A", 1), true}, + {NewCoin("A", 2), NewCoin("A", 1), true}, + {NewCoin("A", -1), NewCoin("A", 5), false}, + {NewCoin("a", 1), NewCoin("b", 1), false}, } for _, tc := range cases { @@ -91,11 +91,11 @@ func TestIsEqualCoin(t *testing.T) { inputTwo Coin expected bool }{ - {Coin{"A", 1}, Coin{"A", 1}, true}, - {Coin{"A", 1}, Coin{"a", 1}, false}, - {Coin{"a", 1}, Coin{"b", 1}, false}, - {Coin{"steak", 1}, Coin{"steak", 10}, false}, - {Coin{"steak", -11}, Coin{"steak", 10}, false}, + {NewCoin("A", 1), NewCoin("A", 1), true}, + {NewCoin("A", 1), NewCoin("a", 1), false}, + {NewCoin("a", 1), NewCoin("b", 1), false}, + {NewCoin("steak", 1), NewCoin("steak", 10), false}, + {NewCoin("steak", -11), NewCoin("steak", 10), false}, } for _, tc := range cases { @@ -112,16 +112,23 @@ func TestPlusCoin(t *testing.T) { inputTwo Coin expected Coin }{ - {Coin{"A", 1}, Coin{"A", 1}, Coin{"A", 2}}, - {Coin{"A", 1}, Coin{"B", 1}, Coin{"A", 1}}, - {Coin{"asdf", -4}, Coin{"asdf", 5}, Coin{"asdf", 1}}, - {Coin{"asdf", -1}, Coin{"asdf", 1}, Coin{"asdf", 0}}, + {NewCoin("A", 1), NewCoin("A", 1), NewCoin("A", 2)}, + {NewCoin("A", 1), NewCoin("B", 1), NewCoin("A", 1)}, + {NewCoin("asdf", -4), NewCoin("asdf", 5), NewCoin("asdf", 1)}, } for _, tc := range cases { res := tc.inputOne.Plus(tc.inputTwo) assert.Equal(tc.expected, res) } + + tc := struct { + inputOne Coin + inputTwo Coin + expected int64 + }{NewCoin("asdf", -1), NewCoin("asdf", 1), 0} + res := tc.inputOne.Plus(tc.inputTwo) + assert.Equal(tc.expected, res.Amount.Int64()) } func TestMinusCoin(t *testing.T) { @@ -132,51 +139,60 @@ func TestMinusCoin(t *testing.T) { inputTwo Coin expected Coin }{ - {Coin{"A", 1}, Coin{"A", 1}, Coin{"A", 0}}, - {Coin{"A", 1}, Coin{"B", 1}, Coin{"A", 1}}, - {Coin{"asdf", -4}, Coin{"asdf", 5}, Coin{"asdf", -9}}, - {Coin{"asdf", 10}, Coin{"asdf", 1}, Coin{"asdf", 9}}, + + {NewCoin("A", 1), NewCoin("B", 1), NewCoin("A", 1)}, + {NewCoin("asdf", -4), NewCoin("asdf", 5), NewCoin("asdf", -9)}, + {NewCoin("asdf", 10), NewCoin("asdf", 1), NewCoin("asdf", 9)}, } for _, tc := range cases { res := tc.inputOne.Minus(tc.inputTwo) assert.Equal(tc.expected, res) } + + tc := struct { + inputOne Coin + inputTwo Coin + expected int64 + }{NewCoin("A", 1), NewCoin("A", 1), 0} + res := tc.inputOne.Minus(tc.inputTwo) + assert.Equal(tc.expected, res.Amount.Int64()) + } func TestCoins(t *testing.T) { //Define the coins to be used in tests good := Coins{ - {"GAS", 1}, - {"MINERAL", 1}, - {"TREE", 1}, + {"GAS", NewInt(1)}, + {"MINERAL", NewInt(1)}, + {"TREE", NewInt(1)}, } neg := good.Negative() sum := good.Plus(neg) empty := Coins{ - {"GOLD", 0}, + {"GOLD", NewInt(0)}, } badSort1 := Coins{ - {"TREE", 1}, - {"GAS", 1}, - {"MINERAL", 1}, + {"TREE", NewInt(1)}, + {"GAS", NewInt(1)}, + {"MINERAL", NewInt(1)}, } // both are after the first one, but the second and third are in the wrong order badSort2 := Coins{ - {"GAS", 1}, - {"TREE", 1}, - {"MINERAL", 1}, + {"GAS", NewInt(1)}, + {"TREE", NewInt(1)}, + {"MINERAL", NewInt(1)}, } badAmt := Coins{ - {"GAS", 1}, - {"TREE", 0}, - {"MINERAL", 1}, + {"GAS", NewInt(1)}, + {"TREE", NewInt(0)}, + {"MINERAL", NewInt(1)}, } dup := Coins{ - {"GAS", 1}, - {"GAS", 1}, - {"MINERAL", 1}, + {"GAS", NewInt(1)}, + {"GAS", NewInt(1)}, + {"MINERAL", NewInt(1)}, } assert.True(t, good.IsValid(), "Coins are valid") @@ -194,16 +210,21 @@ func TestCoins(t *testing.T) { func TestPlusCoins(t *testing.T) { assert := assert.New(t) + one := NewInt(1) + zero := NewInt(0) + negone := NewInt(-1) + two := NewInt(2) + cases := []struct { inputOne Coins inputTwo Coins expected Coins }{ - {Coins{{"A", 1}, {"B", 1}}, Coins{{"A", 1}, {"B", 1}}, Coins{{"A", 2}, {"B", 2}}}, - {Coins{{"A", 0}, {"B", 1}}, Coins{{"A", 0}, {"B", 0}}, Coins{{"B", 1}}}, - {Coins{{"A", 0}, {"B", 0}}, Coins{{"A", 0}, {"B", 0}}, Coins(nil)}, - {Coins{{"A", 1}, {"B", 0}}, Coins{{"A", -1}, {"B", 0}}, Coins(nil)}, - {Coins{{"A", -1}, {"B", 0}}, Coins{{"A", 0}, {"B", 0}}, Coins{{"A", -1}}}, + {Coins{{"A", one}, {"B", one}}, Coins{{"A", one}, {"B", one}}, Coins{{"A", two}, {"B", two}}}, + {Coins{{"A", zero}, {"B", one}}, Coins{{"A", zero}, {"B", zero}}, Coins{{"B", one}}}, + {Coins{{"A", zero}, {"B", zero}}, Coins{{"A", zero}, {"B", zero}}, Coins(nil)}, + {Coins{{"A", one}, {"B", zero}}, Coins{{"A", negone}, {"B", zero}}, Coins(nil)}, + {Coins{{"A", negone}, {"B", zero}}, Coins{{"A", zero}, {"B", zero}}, Coins{{"A", negone}}}, } for _, tc := range cases { @@ -215,6 +236,7 @@ func TestPlusCoins(t *testing.T) { //Test the parsing of Coin and Coins func TestParse(t *testing.T) { + one := NewInt(1) cases := []struct { input string @@ -222,12 +244,12 @@ func TestParse(t *testing.T) { expected Coins // if valid is true, make sure this is returned }{ {"", true, nil}, - {"1foo", true, Coins{{"foo", 1}}}, - {"10bar", true, Coins{{"bar", 10}}}, - {"99bar,1foo", true, Coins{{"bar", 99}, {"foo", 1}}}, - {"98 bar , 1 foo ", true, Coins{{"bar", 98}, {"foo", 1}}}, - {" 55\t \t bling\n", true, Coins{{"bling", 55}}}, - {"2foo, 97 bar", true, Coins{{"bar", 97}, {"foo", 2}}}, + {"1foo", true, Coins{{"foo", one}}}, + {"10bar", true, Coins{{"bar", NewInt(10)}}}, + {"99bar,1foo", true, Coins{{"bar", NewInt(99)}, {"foo", one}}}, + {"98 bar , 1 foo ", true, Coins{{"bar", NewInt(98)}, {"foo", one}}}, + {" 55\t \t bling\n", true, Coins{{"bling", NewInt(55)}}}, + {"2foo, 97 bar", true, Coins{{"bar", NewInt(97)}, {"foo", NewInt(2)}}}, {"5 mycoin,", false, nil}, // no empty coins in a list {"2 3foo, 97 bar", false, nil}, // 3foo is invalid coin name {"11me coin, 12you coin", false, nil}, // no spaces in coin names @@ -249,32 +271,32 @@ func TestParse(t *testing.T) { func TestSortCoins(t *testing.T) { good := Coins{ - {"GAS", 1}, - {"MINERAL", 1}, - {"TREE", 1}, + NewCoin("GAS", 1), + NewCoin("MINERAL", 1), + NewCoin("TREE", 1), } empty := Coins{ - {"GOLD", 0}, + NewCoin("GOLD", 0), } badSort1 := Coins{ - {"TREE", 1}, - {"GAS", 1}, - {"MINERAL", 1}, + NewCoin("TREE", 1), + NewCoin("GAS", 1), + NewCoin("MINERAL", 1), } badSort2 := Coins{ // both are after the first one, but the second and third are in the wrong order - {"GAS", 1}, - {"TREE", 1}, - {"MINERAL", 1}, + NewCoin("GAS", 1), + NewCoin("TREE", 1), + NewCoin("MINERAL", 1), } badAmt := Coins{ - {"GAS", 1}, - {"TREE", 0}, - {"MINERAL", 1}, + NewCoin("GAS", 1), + NewCoin("TREE", 0), + NewCoin("MINERAL", 1), } dup := Coins{ - {"GAS", 1}, - {"GAS", 1}, - {"MINERAL", 1}, + NewCoin("GAS", 1), + NewCoin("GAS", 1), + NewCoin("MINERAL", 1), } cases := []struct { @@ -300,31 +322,31 @@ func TestAmountOf(t *testing.T) { case0 := Coins{} case1 := Coins{ - {"", 0}, + NewCoin("", 0), } case2 := Coins{ - {" ", 0}, + NewCoin(" ", 0), } case3 := Coins{ - {"GOLD", 0}, + NewCoin("GOLD", 0), } case4 := Coins{ - {"GAS", 1}, - {"MINERAL", 1}, - {"TREE", 1}, + NewCoin("GAS", 1), + NewCoin("MINERAL", 1), + NewCoin("TREE", 1), } case5 := Coins{ - {"MINERAL", 1}, - {"TREE", 1}, + NewCoin("MINERAL", 1), + NewCoin("TREE", 1), } case6 := Coins{ - {"", 6}, + NewCoin("", 6), } case7 := Coins{ - {" ", 7}, + NewCoin(" ", 7), } case8 := Coins{ - {"GAS", 8}, + NewCoin("GAS", 8), } cases := []struct { @@ -347,10 +369,10 @@ func TestAmountOf(t *testing.T) { } for _, tc := range cases { - assert.Equal(t, tc.amountOf, tc.coins.AmountOf("")) - assert.Equal(t, tc.amountOfSpace, tc.coins.AmountOf(" ")) - assert.Equal(t, tc.amountOfGAS, tc.coins.AmountOf("GAS")) - assert.Equal(t, tc.amountOfMINERAL, tc.coins.AmountOf("MINERAL")) - assert.Equal(t, tc.amountOfTREE, tc.coins.AmountOf("TREE")) + assert.Equal(t, NewInt(tc.amountOf), tc.coins.AmountOf("")) + assert.Equal(t, NewInt(tc.amountOfSpace), tc.coins.AmountOf(" ")) + assert.Equal(t, NewInt(tc.amountOfGAS), tc.coins.AmountOf("GAS")) + assert.Equal(t, NewInt(tc.amountOfMINERAL), tc.coins.AmountOf("MINERAL")) + assert.Equal(t, NewInt(tc.amountOfTREE), tc.coins.AmountOf("TREE")) } } diff --git a/types/int.go b/types/int.go new file mode 100644 index 0000000000..7ac28233aa --- /dev/null +++ b/types/int.go @@ -0,0 +1,411 @@ +package types + +import ( + "math/big" +) + +func newIntegerFromString(s string) (*big.Int, bool) { + return new(big.Int).SetString(s, 0) +} + +func newIntegerWithDecimal(n int64, dec int) (res *big.Int) { + if dec < 0 { + return + } + exp := new(big.Int).Exp(big.NewInt(10), big.NewInt(int64(dec)), nil) + i := new(big.Int) + return i.Mul(big.NewInt(n), exp) +} + +func equal(i *big.Int, i2 *big.Int) bool { return i.Cmp(i2) == 0 } + +func gt(i *big.Int, i2 *big.Int) bool { return i.Cmp(i2) == 1 } + +func lt(i *big.Int, i2 *big.Int) bool { return i.Cmp(i2) == -1 } + +func add(i *big.Int, i2 *big.Int) *big.Int { return new(big.Int).Add(i, i2) } + +func sub(i *big.Int, i2 *big.Int) *big.Int { return new(big.Int).Sub(i, i2) } + +func mul(i *big.Int, i2 *big.Int) *big.Int { return new(big.Int).Mul(i, i2) } + +func div(i *big.Int, i2 *big.Int) *big.Int { return new(big.Int).Div(i, i2) } + +func mod(i *big.Int, i2 *big.Int) *big.Int { return new(big.Int).Mod(i, i2) } + +func neg(i *big.Int) *big.Int { return new(big.Int).Neg(i) } + +// MarshalAmino for custom encoding scheme +func marshalAmino(i *big.Int) (string, error) { + bz, err := i.MarshalText() + return string(bz), err +} + +// UnmarshalAmino for custom decoding scheme +func unmarshalAmino(i *big.Int, text string) (err error) { + return i.UnmarshalText([]byte(text)) +} + +// MarshalJSON for custom encodig scheme +func marshalJSON(i *big.Int) ([]byte, error) { + return i.MarshalText() +} + +// UnmarshalJSON for custom decoding scheme +func unmarshalJSON(i *big.Int, bz []byte) error { + return i.UnmarshalText(bz) +} + +// Int wraps integer with 256 bit range bound +// Checks overflow, underflow and division by zero +// Exists in range from -(2^255-1) to 2^255-1 +type Int struct { + i big.Int +} + +// BigInt converts Int to big.Int +func (i Int) BigInt() *big.Int { + return new(big.Int).Set(&(i.i)) +} + +// NewInt constructs Int from int64 +func NewInt(n int64) Int { + return Int{*big.NewInt(n)} +} + +// NewIntFromBigInt constructs Int from big.Int +func NewIntFromBigInt(i *big.Int) Int { + if i.BitLen() > 255 { + panic("NewIntFromBigInt() out of bound") + } + return Int{*i} +} + +// NewIntFromString constructs Int from string +func NewIntFromString(s string) (res Int, ok bool) { + i, ok := newIntegerFromString(s) + if !ok { + return + } + // Check overflow + if i.BitLen() > 255 { + ok = false + return + } + return Int{*i}, true +} + +// NewIntWithDecimal constructs Int with decimal +// Result value is n*10^dec +func NewIntWithDecimal(n int64, dec int) Int { + i := newIntegerWithDecimal(n, dec) + // Check overflow + if i.BitLen() > 255 { + panic("NewIntWithDecimal() out of bound") + } + return Int{*i} +} + +// ZeroInt returns Int value with zero +func ZeroInt() Int { return Int{*big.NewInt(0)} } + +// OneInt returns Int value with one +func OneInt() Int { return Int{*big.NewInt(1)} } + +// Int64 converts Int to int64 +// Panics if the value is out of range +func (i Int) Int64() int64 { + if !i.i.IsInt64() { + panic("Int64() out of bound") + } + return i.i.Int64() +} + +// IsZero returns true if Int is zero +func (i Int) IsZero() bool { + return i.i.Sign() == 0 +} + +// Sign returns sign of Int +func (i Int) Sign() int { + return i.i.Sign() +} + +// Equal compares two Ints +func (i Int) Equal(i2 Int) bool { + return equal(&(i.i), &(i2.i)) +} + +// GT returns true if first Int is greater than second +func (i Int) GT(i2 Int) bool { + return gt((&i.i), &(i2.i)) +} + +// LT returns true if first Int is lesser than second +func (i Int) LT(i2 Int) bool { + return lt((&i.i), &(i2.i)) +} + +// Add adds Int from another +func (i Int) Add(i2 Int) (res Int) { + res = Int{*add(&(i.i), &(i2.i))} + // Check overflow + if res.i.BitLen() > 255 { + panic("Int overflow") + } + return +} + +// AddRaw adds int64 to Int +func (i Int) AddRaw(i2 int64) Int { + return i.Add(NewInt(i2)) +} + +// Sub subtracts Int from another +func (i Int) Sub(i2 Int) (res Int) { + res = Int{*sub(&(i.i), &(i2.i))} + // Check overflow + if res.i.BitLen() > 255 { + panic("Int overflow") + } + return +} + +// SubRaw subtracts int64 from Int +func (i Int) SubRaw(i2 int64) Int { + return i.Sub(NewInt(i2)) +} + +// Mul multiples two Ints +func (i Int) Mul(i2 Int) (res Int) { + // Check overflow + if i.i.BitLen()+i2.i.BitLen()-1 > 255 { + panic("Int overflow") + } + res = Int{*mul(&(i.i), &(i2.i))} + // Check overflow if sign of both are same + if res.i.BitLen() > 255 { + panic("Int overflow") + } + return +} + +// MulRaw multipies Int and int64 +func (i Int) MulRaw(i2 int64) Int { + return i.Mul(NewInt(i2)) +} + +// Div divides Int with Int +func (i Int) Div(i2 Int) (res Int) { + // Check division-by-zero + if i2.i.Sign() == 0 { + panic("Division by zero") + } + return Int{*div(&(i.i), &(i2.i))} +} + +// DivRaw divides Int with int64 +func (i Int) DivRaw(i2 int64) Int { + return i.Div(NewInt(i2)) +} + +// Neg negates Int +func (i Int) Neg() (res Int) { + return Int{*neg(&(i.i))} +} + +// MarshalAmino defines custom encoding scheme +func (i Int) MarshalAmino() (string, error) { + return marshalAmino(&(i.i)) +} + +// UnmarshalAmino defines custom decoding scheme +func (i *Int) UnmarshalAmino(text string) error { + return unmarshalAmino(&(i.i), text) +} + +// MarshalJSON defines custom encoding scheme +func (i Int) MarshalJSON() ([]byte, error) { + return marshalJSON(&(i.i)) +} + +// UnmarshalJSON defines custom decoding scheme +func (i *Int) UnmarshalJSON(bz []byte) error { + return unmarshalJSON(&(i.i), bz) +} + +// Int wraps integer with 256 bit range bound +// Checks overflow, underflow and division by zero +// Exists in range from 0 to 2^256-1 +type Uint struct { + i big.Int +} + +// BigInt converts Uint to big.Unt +func (i Uint) BigInt() *big.Int { + return new(big.Int).Set(&(i.i)) +} + +// NewUint constructs Uint from int64 +func NewUint(n uint64) Uint { + i := new(big.Int) + i.SetUint64(n) + return Uint{*i} +} + +// NewUintFromBigUint constructs Uint from big.Uint +func NewUintFromBigInt(i *big.Int) Uint { + // Check overflow + if i.Sign() == -1 || i.Sign() == 1 && i.BitLen() > 256 { + panic("Uint overflow") + } + return Uint{*i} +} + +// NewUintFromString constructs Uint from string +func NewUintFromString(s string) (res Uint, ok bool) { + i, ok := newIntegerFromString(s) + if !ok { + return + } + // Check overflow + if i.Sign() == -1 || i.Sign() == 1 && i.BitLen() > 256 { + ok = false + return + } + return Uint{*i}, true +} + +// NewUintWithDecimal constructs Uint with decimal +// Result value is n*10^dec +func NewUintWithDecimal(n int64, dec int) Uint { + i := newIntegerWithDecimal(n, dec) + // Check overflow + if i.Sign() == -1 || i.Sign() == 1 && i.BitLen() > 256 { + panic("NewUintWithDecimal() out of bound") + } + return Uint{*i} +} + +// ZeroUint returns Uint value with zero +func ZeroUint() Uint { return Uint{*big.NewInt(0)} } + +// OneUint returns Uint value with one +func OneUint() Uint { return Uint{*big.NewInt(1)} } + +// Uint64 converts Uint to uint64 +// Panics if the value is out of range +func (i Uint) Uint64() uint64 { + if !i.i.IsUint64() { + panic("Uint64() out of bound") + } + return i.i.Uint64() +} + +// IsZero returns true if Uint is zero +func (i Uint) IsZero() bool { + return i.i.Sign() == 0 +} + +// Sign returns sign of Uint +func (i Uint) Sign() int { + return i.i.Sign() +} + +// Equal compares two Uints +func (i Uint) Equal(i2 Uint) bool { + return equal(&(i.i), &(i2.i)) +} + +// GT returns true if first Uint is greater than second +func (i Uint) GT(i2 Uint) bool { + return gt(&(i.i), &(i2.i)) +} + +// LT returns true if first Uint is lesser than second +func (i Uint) LT(i2 Uint) bool { + return lt(&(i.i), &(i2.i)) +} + +// Add adds Uint from another +func (i Uint) Add(i2 Uint) (res Uint) { + res = Uint{*add(&(i.i), &(i2.i))} + // Check overflow + if res.Sign() == -1 || res.Sign() == 1 && res.i.BitLen() > 256 { + panic("Uint overflow") + } + return +} + +// AddRaw adds int64 to Uint +func (i Uint) AddRaw(i2 uint64) Uint { + return i.Add(NewUint(i2)) +} + +// Sub subtracts Uint from another +func (i Uint) Sub(i2 Uint) (res Uint) { + res = Uint{*sub(&(i.i), &(i2.i))} + // Check overflow + if res.Sign() == -1 || res.Sign() == 1 && res.i.BitLen() > 256 { + panic("Uint overflow") + } + return +} + +// SubRaw subtracts int64 from Uint +func (i Uint) SubRaw(i2 uint64) Uint { + return i.Sub(NewUint(i2)) +} + +// Mul multiples two Uints +func (i Uint) Mul(i2 Uint) (res Uint) { + // Check overflow + if i.i.BitLen()+i2.i.BitLen()-1 > 256 { + panic("Uint overflow") + } + res = Uint{*mul(&(i.i), &(i2.i))} + // Check overflow + if res.Sign() == -1 || res.Sign() == 1 && res.i.BitLen() > 256 { + panic("Uint overflow") + } + return +} + +// MulRaw multipies Uint and int64 +func (i Uint) MulRaw(i2 uint64) Uint { + return i.Mul(NewUint(i2)) +} + +// Div divides Uint with Uint +func (i Uint) Div(i2 Uint) (res Uint) { + // Check division-by-zero + if i2.Sign() == 0 { + panic("division-by-zero") + } + return Uint{*div(&(i.i), &(i2.i))} +} + +// Div divides Uint with int64 +func (i Uint) DivRaw(i2 uint64) Uint { + return i.Div(NewUint(i2)) +} + +// MarshalAmino defines custom encoding scheme +func (i Uint) MarshalAmino() (string, error) { + return marshalAmino(&(i.i)) +} + +// UnmarshalAmino defines custom decoding scheme +func (i *Uint) UnmarshalAmino(text string) error { + return unmarshalAmino(&(i.i), text) +} + +// MarshalJSON defines custom encoding scheme +func (i Uint) MarshalJSON() ([]byte, error) { + return marshalJSON(&(i.i)) +} + +// UnmarshalJSON defines custom decoding scheme +func (i *Uint) UnmarshalJSON(bz []byte) error { + return unmarshalJSON(&(i.i), bz) +} diff --git a/types/int_test.go b/types/int_test.go new file mode 100644 index 0000000000..310325133b --- /dev/null +++ b/types/int_test.go @@ -0,0 +1,111 @@ +package types + +import ( + "math/big" + "math/rand" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestFromInt64(t *testing.T) { + for n := 0; n < 20; n++ { + r := rand.Int63() + assert.Equal(t, r, NewInt(r).Int64()) + } +} + +func TestInt(t *testing.T) { + // Max Int = 2^255-1 = 5.789e+76 + // Min Int = -(2^255-1) = -5.789e+76 + assert.NotPanics(t, func() { NewIntWithDecimal(1, 76) }) + i1 := NewIntWithDecimal(1, 76) + assert.NotPanics(t, func() { NewIntWithDecimal(2, 76) }) + i2 := NewIntWithDecimal(2, 76) + assert.NotPanics(t, func() { NewIntWithDecimal(3, 76) }) + i3 := NewIntWithDecimal(3, 76) + + assert.Panics(t, func() { NewIntWithDecimal(6, 76) }) + assert.Panics(t, func() { NewIntWithDecimal(9, 80) }) + + // Overflow check + assert.NotPanics(t, func() { i1.Add(i1) }) + assert.NotPanics(t, func() { i2.Add(i2) }) + assert.Panics(t, func() { i3.Add(i3) }) + + assert.NotPanics(t, func() { i1.Sub(i1.Neg()) }) + assert.NotPanics(t, func() { i2.Sub(i2.Neg()) }) + assert.Panics(t, func() { i3.Sub(i3.Neg()) }) + + assert.Panics(t, func() { i1.Mul(i1) }) + assert.Panics(t, func() { i2.Mul(i2) }) + assert.Panics(t, func() { i3.Mul(i3) }) + + assert.Panics(t, func() { i1.Neg().Mul(i1.Neg()) }) + assert.Panics(t, func() { i2.Neg().Mul(i2.Neg()) }) + assert.Panics(t, func() { i3.Neg().Mul(i3.Neg()) }) + + // Underflow check + i3n := i3.Neg() + assert.NotPanics(t, func() { i3n.Sub(i1) }) + assert.NotPanics(t, func() { i3n.Sub(i2) }) + assert.Panics(t, func() { i3n.Sub(i3) }) + + assert.NotPanics(t, func() { i3n.Add(i1.Neg()) }) + assert.NotPanics(t, func() { i3n.Add(i2.Neg()) }) + assert.Panics(t, func() { i3n.Add(i3.Neg()) }) + + assert.Panics(t, func() { i1.Mul(i1.Neg()) }) + assert.Panics(t, func() { i2.Mul(i2.Neg()) }) + assert.Panics(t, func() { i3.Mul(i3.Neg()) }) + + // Bound check + intmax := NewIntFromBigInt(new(big.Int).Sub(new(big.Int).Exp(big.NewInt(2), big.NewInt(255), nil), big.NewInt(1))) + intmin := intmax.Neg() + assert.NotPanics(t, func() { intmax.Add(ZeroInt()) }) + assert.NotPanics(t, func() { intmin.Sub(ZeroInt()) }) + assert.Panics(t, func() { intmax.Add(OneInt()) }) + assert.Panics(t, func() { intmin.Sub(OneInt()) }) + + // Division-by-zero check + assert.Panics(t, func() { i1.Div(NewInt(0)) }) +} + +func TestUint(t *testing.T) { + // Max Uint = 1.15e+77 + // Min Uint = 0 + assert.NotPanics(t, func() { NewUintWithDecimal(5, 76) }) + i1 := NewUintWithDecimal(5, 76) + assert.NotPanics(t, func() { NewUintWithDecimal(10, 76) }) + i2 := NewUintWithDecimal(10, 76) + assert.NotPanics(t, func() { NewUintWithDecimal(11, 76) }) + i3 := NewUintWithDecimal(11, 76) + + assert.Panics(t, func() { NewUintWithDecimal(12, 76) }) + assert.Panics(t, func() { NewUintWithDecimal(1, 80) }) + + // Overflow check + assert.NotPanics(t, func() { i1.Add(i1) }) + assert.Panics(t, func() { i2.Add(i2) }) + assert.Panics(t, func() { i3.Add(i3) }) + + assert.Panics(t, func() { i1.Mul(i1) }) + assert.Panics(t, func() { i2.Mul(i2) }) + assert.Panics(t, func() { i3.Mul(i3) }) + + // Underflow check + assert.NotPanics(t, func() { i2.Sub(i1) }) + assert.NotPanics(t, func() { i2.Sub(i2) }) + assert.Panics(t, func() { i2.Sub(i3) }) + + // Bound check + uintmax := NewUintFromBigInt(new(big.Int).Sub(new(big.Int).Exp(big.NewInt(2), big.NewInt(256), nil), big.NewInt(1))) + uintmin := NewUint(0) + assert.NotPanics(t, func() { uintmax.Add(ZeroUint()) }) + assert.NotPanics(t, func() { uintmin.Sub(ZeroUint()) }) + assert.Panics(t, func() { uintmax.Add(OneUint()) }) + assert.Panics(t, func() { uintmin.Sub(OneUint()) }) + + // Division-by-zero check + assert.Panics(t, func() { i1.Div(uintmin) }) +} diff --git a/types/rational.go b/types/rational.go index 0709a350f4..6e542e1102 100644 --- a/types/rational.go +++ b/types/rational.go @@ -80,6 +80,30 @@ func NewRatFromDecimal(decimalStr string) (f Rat, err Error) { return NewRat(int64(num), denom), nil } +// NewRatFromBigInt constructs Rat from big.Int +func NewRatFromBigInt(num *big.Int, denom ...*big.Int) Rat { + switch len(denom) { + case 0: + return Rat{*new(big.Rat).SetInt(num)} + case 1: + return Rat{*new(big.Rat).SetFrac(num, denom[0])} + default: + panic("improper use of NewRatFromBigInt, can only have one denominator") + } +} + +// NewRatFromInt constructs Rat from Int +func NewRatFromInt(num Int, denom ...Int) Rat { + switch len(denom) { + case 0: + return Rat{*new(big.Rat).SetInt(num.BigInt())} + case 1: + return Rat{*new(big.Rat).SetFrac(num.BigInt(), denom[0].BigInt())} + default: + panic("improper use of NewRatFromBigInt, can only have one denominator") + } +} + //nolint func (r Rat) Num() int64 { return r.Rat.Num().Int64() } // Num - return the numerator func (r Rat) Denom() int64 { return r.Rat.Denom().Int64() } // Denom - return the denominator @@ -137,6 +161,11 @@ func (r Rat) Evaluate() int64 { return r.EvaluateBig().Int64() } +// EvaulateInt evaludates the rational using EvaluateBig +func (r Rat) EvaluateInt() Int { + return NewIntFromBigInt(r.EvaluateBig()) +} + // round Rat with the provided precisionFactor func (r Rat) Round(precisionFactor int64) Rat { rTen := Rat{*new(big.Rat).Mul(&(r.Rat), big.NewRat(precisionFactor, 1))} diff --git a/x/auth/account_test.go b/x/auth/account_test.go index a06545d3b8..150bc3ae59 100644 --- a/x/auth/account_test.go +++ b/x/auth/account_test.go @@ -55,7 +55,7 @@ func TestBaseAccountCoins(t *testing.T) { _, _, addr := keyPubAddr() acc := NewBaseAccountWithAddress(addr) - someCoins := sdk.Coins{{"atom", 123}, {"eth", 246}} + someCoins := sdk.Coins{sdk.NewCoin("atom", 123), sdk.NewCoin("eth", 246)} err := acc.SetCoins(someCoins) assert.Nil(t, err) @@ -77,7 +77,7 @@ func TestBaseAccountMarshal(t *testing.T) { _, pub, addr := keyPubAddr() acc := NewBaseAccountWithAddress(addr) - someCoins := sdk.Coins{{"atom", 123}, {"eth", 246}} + someCoins := sdk.Coins{sdk.NewCoin("atom", 123), sdk.NewCoin("eth", 246)} seq := int64(7) // set everything on the account diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index aff80cb59a..3935334a8f 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -19,14 +19,14 @@ func newTestMsg(addrs ...sdk.Address) *sdk.TestMsg { func newStdFee() StdFee { return NewStdFee(100, - sdk.Coin{"atom", 150}, + sdk.NewCoin("atom", 150), ) } // coins to more than cover the fee func newCoins() sdk.Coins { return sdk.Coins{ - {"atom", 10000000}, + sdk.NewCoin("atom", 10000000), } } @@ -253,24 +253,24 @@ func TestAnteHandlerFees(t *testing.T) { msg := newTestMsg(addr1) privs, accnums, seqs := []crypto.PrivKey{priv1}, []int64{0}, []int64{0} fee := NewStdFee(100, - sdk.Coin{"atom", 150}, + sdk.NewCoin("atom", 150), ) // signer does not have enough funds to pay the fee tx = newTestTx(ctx, msg, privs, accnums, seqs, fee) checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeInsufficientFunds) - acc1.SetCoins(sdk.Coins{{"atom", 149}}) + acc1.SetCoins(sdk.Coins{sdk.NewCoin("atom", 149)}) mapper.SetAccount(ctx, acc1) checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeInsufficientFunds) assert.True(t, feeCollector.GetCollectedFees(ctx).IsEqual(emptyCoins)) - acc1.SetCoins(sdk.Coins{{"atom", 150}}) + acc1.SetCoins(sdk.Coins{sdk.NewCoin("atom", 150)}) mapper.SetAccount(ctx, acc1) checkValidTx(t, anteHandler, ctx, tx) - assert.True(t, feeCollector.GetCollectedFees(ctx).IsEqual(sdk.Coins{{"atom", 150}})) + assert.True(t, feeCollector.GetCollectedFees(ctx).IsEqual(sdk.Coins{sdk.NewCoin("atom", 150)})) } func TestAnteHandlerBadSignBytes(t *testing.T) { @@ -301,7 +301,7 @@ func TestAnteHandlerBadSignBytes(t *testing.T) { fee2 := newStdFee() fee2.Gas += 100 fee3 := newStdFee() - fee3.Amount[0].Amount += 100 + fee3.Amount[0].Amount = fee3.Amount[0].Amount.AddRaw(100) // test good tx and signBytes privs, accnums, seqs := []crypto.PrivKey{priv1}, []int64{0}, []int64{0} diff --git a/x/auth/feekeeper_test.go b/x/auth/feekeeper_test.go index 2f1ffc59bc..8667670976 100644 --- a/x/auth/feekeeper_test.go +++ b/x/auth/feekeeper_test.go @@ -14,8 +14,8 @@ import ( var ( emptyCoins = sdk.Coins{} - oneCoin = sdk.Coins{{"foocoin", 1}} - twoCoins = sdk.Coins{{"foocoin", 2}} + oneCoin = sdk.Coins{sdk.NewCoin("foocoin", 1)} + twoCoins = sdk.Coins{sdk.NewCoin("foocoin", 2)} ) func TestFeeCollectionKeeperGetSet(t *testing.T) { diff --git a/x/auth/mock/auth_app_test.go b/x/auth/mock/auth_app_test.go index bb4d7007b0..9dfaba3b65 100644 --- a/x/auth/mock/auth_app_test.go +++ b/x/auth/mock/auth_app_test.go @@ -21,7 +21,7 @@ var ( priv2 = crypto.GenPrivKeyEd25519() addr2 = priv2.PubKey().Address() - coins = sdk.Coins{{"foocoin", 10}} + coins = sdk.Coins{sdk.NewCoin("foocoin", 10)} sendMsg1 = bank.MsgSend{ Inputs: []bank.Input{bank.NewInput(addr1, coins)}, Outputs: []bank.Output{bank.NewOutput(addr2, coins)}, @@ -45,7 +45,7 @@ func TestMsgChangePubKey(t *testing.T) { // Construct some genesis bytes to reflect basecoin/types/AppAccount // Give 77 foocoin to the first key - coins := sdk.Coins{{"foocoin", 77}} + coins := sdk.Coins{sdk.NewCoin("foocoin", 77)} acc1 := &auth.BaseAccount{ Address: addr1, Coins: coins, @@ -64,8 +64,8 @@ func TestMsgChangePubKey(t *testing.T) { SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, []int64{0}, true, priv1) // Check balances - CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 67}}) - CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 10}}) + CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("foocoin", 67)}) + CheckBalance(t, mapp, addr2, sdk.Coins{sdk.NewCoin("foocoin", 10)}) changePubKeyMsg := auth.MsgChangeKey{ Address: addr1, @@ -92,6 +92,6 @@ func TestMsgChangePubKey(t *testing.T) { SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, []int64{2}, true, priv2) // Check balances - CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 57}}) - CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 20}}) + CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("foocoin", 57)}) + CheckBalance(t, mapp, addr2, sdk.Coins{sdk.NewCoin("foocoin", 20)}) } diff --git a/x/auth/mock/simulate_block.go b/x/auth/mock/simulate_block.go index 7a77e0f09a..7a4cb4aef3 100644 --- a/x/auth/mock/simulate_block.go +++ b/x/auth/mock/simulate_block.go @@ -37,7 +37,7 @@ func GenTx(msg sdk.Msg, accnums []int64, seq []int64, priv ...crypto.PrivKeyEd25 // make the transaction free fee := auth.StdFee{ - sdk.Coins{{"foocoin", 0}}, + sdk.Coins{sdk.NewCoin("foocoin", 0)}, 100000, } diff --git a/x/bank/app_test.go b/x/bank/app_test.go index d0c112b3da..b41ff42b09 100644 --- a/x/bank/app_test.go +++ b/x/bank/app_test.go @@ -23,12 +23,12 @@ var ( addr3 = crypto.GenPrivKeyEd25519().PubKey().Address() priv4 = crypto.GenPrivKeyEd25519() addr4 = priv4.PubKey().Address() - coins = sdk.Coins{{"foocoin", 10}} - halfCoins = sdk.Coins{{"foocoin", 5}} - manyCoins = sdk.Coins{{"foocoin", 1}, {"barcoin", 1}} + coins = sdk.Coins{sdk.NewCoin("foocoin", 10)} + halfCoins = sdk.Coins{sdk.NewCoin("foocoin", 5)} + manyCoins = sdk.Coins{sdk.NewCoin("foocoin", 1), sdk.NewCoin("barcoin", 1)} freeFee = auth.StdFee{ // no fees for a buncha gas - sdk.Coins{{"foocoin", 0}}, + sdk.Coins{sdk.NewCoin("foocoin", 0)}, 100000, } @@ -93,7 +93,7 @@ func TestMsgSendWithAccounts(t *testing.T) { // Add an account at genesis acc := &auth.BaseAccount{ Address: addr1, - Coins: sdk.Coins{{"foocoin", 67}}, + Coins: sdk.Coins{sdk.NewCoin("foocoin", 67)}, } accs := []auth.Account{acc} @@ -110,8 +110,8 @@ func TestMsgSendWithAccounts(t *testing.T) { mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, []int64{0}, true, priv1) // Check balances - mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 57}}) - mock.CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 10}}) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("foocoin", 57)}) + mock.CheckBalance(t, mapp, addr2, sdk.Coins{sdk.NewCoin("foocoin", 10)}) // Delivering again should cause replay error mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, []int64{0}, false, priv1) @@ -133,12 +133,12 @@ func TestMsgSendMultipleOut(t *testing.T) { acc1 := &auth.BaseAccount{ Address: addr1, - Coins: sdk.Coins{{"foocoin", 42}}, + Coins: sdk.Coins{sdk.NewCoin("foocoin", 42)}, } acc2 := &auth.BaseAccount{ Address: addr2, - Coins: sdk.Coins{{"foocoin", 42}}, + Coins: sdk.Coins{sdk.NewCoin("foocoin", 42)}, } accs := []auth.Account{acc1, acc2} @@ -148,9 +148,9 @@ func TestMsgSendMultipleOut(t *testing.T) { mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg2, []int64{0}, []int64{0}, true, priv1) // Check balances - mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 32}}) - mock.CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 47}}) - mock.CheckBalance(t, mapp, addr3, sdk.Coins{{"foocoin", 5}}) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("foocoin", 32)}) + mock.CheckBalance(t, mapp, addr2, sdk.Coins{sdk.NewCoin("foocoin", 47)}) + mock.CheckBalance(t, mapp, addr3, sdk.Coins{sdk.NewCoin("foocoin", 5)}) } func TestSengMsgMultipleInOut(t *testing.T) { @@ -158,15 +158,15 @@ func TestSengMsgMultipleInOut(t *testing.T) { acc1 := &auth.BaseAccount{ Address: addr1, - Coins: sdk.Coins{{"foocoin", 42}}, + Coins: sdk.Coins{sdk.NewCoin("foocoin", 42)}, } acc2 := &auth.BaseAccount{ Address: addr2, - Coins: sdk.Coins{{"foocoin", 42}}, + Coins: sdk.Coins{sdk.NewCoin("foocoin", 42)}, } acc4 := &auth.BaseAccount{ Address: addr4, - Coins: sdk.Coins{{"foocoin", 42}}, + Coins: sdk.Coins{sdk.NewCoin("foocoin", 42)}, } accs := []auth.Account{acc1, acc2, acc4} @@ -176,10 +176,10 @@ func TestSengMsgMultipleInOut(t *testing.T) { mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg3, []int64{0, 2}, []int64{0, 0}, true, priv1, priv4) // Check balances - mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 32}}) - mock.CheckBalance(t, mapp, addr4, sdk.Coins{{"foocoin", 32}}) - mock.CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 52}}) - mock.CheckBalance(t, mapp, addr3, sdk.Coins{{"foocoin", 10}}) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("foocoin", 32)}) + mock.CheckBalance(t, mapp, addr4, sdk.Coins{sdk.NewCoin("foocoin", 32)}) + mock.CheckBalance(t, mapp, addr2, sdk.Coins{sdk.NewCoin("foocoin", 52)}) + mock.CheckBalance(t, mapp, addr3, sdk.Coins{sdk.NewCoin("foocoin", 10)}) } func TestMsgSendDependent(t *testing.T) { @@ -187,7 +187,7 @@ func TestMsgSendDependent(t *testing.T) { acc1 := &auth.BaseAccount{ Address: addr1, - Coins: sdk.Coins{{"foocoin", 42}}, + Coins: sdk.Coins{sdk.NewCoin("foocoin", 42)}, } accs := []auth.Account{acc1} @@ -197,12 +197,12 @@ func TestMsgSendDependent(t *testing.T) { mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg1, []int64{0}, []int64{0}, true, priv1) // Check balances - mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 32}}) - mock.CheckBalance(t, mapp, addr2, sdk.Coins{{"foocoin", 10}}) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("foocoin", 32)}) + mock.CheckBalance(t, mapp, addr2, sdk.Coins{sdk.NewCoin("foocoin", 10)}) // Simulate a Block mock.SignCheckDeliver(t, mapp.BaseApp, sendMsg4, []int64{1}, []int64{0}, true, priv2) // Check balances - mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"foocoin", 42}}) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("foocoin", 42)}) } diff --git a/x/bank/keeper_test.go b/x/bank/keeper_test.go index 117c69e7ae..c510d2a3ad 100644 --- a/x/bank/keeper_test.go +++ b/x/bank/keeper_test.go @@ -44,69 +44,69 @@ func TestKeeper(t *testing.T) { accountMapper.SetAccount(ctx, acc) assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{})) - coinKeeper.SetCoins(ctx, addr, sdk.Coins{{"foocoin", 10}}) - assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}})) + coinKeeper.SetCoins(ctx, addr, sdk.Coins{sdk.NewCoin("foocoin", 10)}) + assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("foocoin", 10)})) // Test HasCoins - assert.True(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 10}})) - assert.True(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 5}})) - assert.False(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 15}})) - assert.False(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"barcoin", 5}})) + assert.True(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewCoin("foocoin", 10)})) + assert.True(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewCoin("foocoin", 5)})) + assert.False(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewCoin("foocoin", 15)})) + assert.False(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewCoin("barcoin", 5)})) // Test AddCoins - coinKeeper.AddCoins(ctx, addr, sdk.Coins{{"foocoin", 15}}) - assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 25}})) + coinKeeper.AddCoins(ctx, addr, sdk.Coins{sdk.NewCoin("foocoin", 15)}) + assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("foocoin", 25)})) - coinKeeper.AddCoins(ctx, addr, sdk.Coins{{"barcoin", 15}}) - assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 15}, {"foocoin", 25}})) + coinKeeper.AddCoins(ctx, addr, sdk.Coins{sdk.NewCoin("barcoin", 15)}) + assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("barcoin", 15), sdk.NewCoin("foocoin", 25)})) // Test SubtractCoins - coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{{"foocoin", 10}}) - coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{{"barcoin", 5}}) - assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 15}})) + coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{sdk.NewCoin("foocoin", 10)}) + coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{sdk.NewCoin("barcoin", 5)}) + assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("barcoin", 10), sdk.NewCoin("foocoin", 15)})) - coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{{"barcoin", 11}}) - assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 15}})) + coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{sdk.NewCoin("barcoin", 11)}) + assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("barcoin", 10), sdk.NewCoin("foocoin", 15)})) - coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{{"barcoin", 10}}) - assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 15}})) - assert.False(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{{"barcoin", 1}})) + coinKeeper.SubtractCoins(ctx, addr, sdk.Coins{sdk.NewCoin("barcoin", 10)}) + assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("foocoin", 15)})) + assert.False(t, coinKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewCoin("barcoin", 1)})) // Test SendCoins - coinKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"foocoin", 5}}) - assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}})) - assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"foocoin", 5}})) + coinKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{sdk.NewCoin("foocoin", 5)}) + assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("foocoin", 10)})) + assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewCoin("foocoin", 5)})) - _, err2 := coinKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"foocoin", 50}}) + _, err2 := coinKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{sdk.NewCoin("foocoin", 50)}) assert.Implements(t, (*sdk.Error)(nil), err2) - assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}})) - assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"foocoin", 5}})) + assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("foocoin", 10)})) + assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewCoin("foocoin", 5)})) - coinKeeper.AddCoins(ctx, addr, sdk.Coins{{"barcoin", 30}}) - coinKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"barcoin", 10}, {"foocoin", 5}}) - assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 20}, {"foocoin", 5}})) - assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 10}})) + coinKeeper.AddCoins(ctx, addr, sdk.Coins{sdk.NewCoin("barcoin", 30)}) + coinKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{sdk.NewCoin("barcoin", 10), sdk.NewCoin("foocoin", 5)}) + assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("barcoin", 20), sdk.NewCoin("foocoin", 5)})) + assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewCoin("barcoin", 10), sdk.NewCoin("foocoin", 10)})) // Test InputOutputCoins - input1 := NewInput(addr2, sdk.Coins{{"foocoin", 2}}) - output1 := NewOutput(addr, sdk.Coins{{"foocoin", 2}}) + input1 := NewInput(addr2, sdk.Coins{sdk.NewCoin("foocoin", 2)}) + output1 := NewOutput(addr, sdk.Coins{sdk.NewCoin("foocoin", 2)}) coinKeeper.InputOutputCoins(ctx, []Input{input1}, []Output{output1}) - assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 20}, {"foocoin", 7}})) - assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 8}})) + assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("barcoin", 20), sdk.NewCoin("foocoin", 7)})) + assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewCoin("barcoin", 10), sdk.NewCoin("foocoin", 8)})) inputs := []Input{ - NewInput(addr, sdk.Coins{{"foocoin", 3}}), - NewInput(addr2, sdk.Coins{{"barcoin", 3}, {"foocoin", 2}}), + NewInput(addr, sdk.Coins{sdk.NewCoin("foocoin", 3)}), + NewInput(addr2, sdk.Coins{sdk.NewCoin("barcoin", 3), sdk.NewCoin("foocoin", 2)}), } outputs := []Output{ - NewOutput(addr, sdk.Coins{{"barcoin", 1}}), - NewOutput(addr3, sdk.Coins{{"barcoin", 2}, {"foocoin", 5}}), + NewOutput(addr, sdk.Coins{sdk.NewCoin("barcoin", 1)}), + NewOutput(addr3, sdk.Coins{sdk.NewCoin("barcoin", 2), sdk.NewCoin("foocoin", 5)}), } coinKeeper.InputOutputCoins(ctx, inputs, outputs) - assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 21}, {"foocoin", 4}})) - assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 7}, {"foocoin", 6}})) - assert.True(t, coinKeeper.GetCoins(ctx, addr3).IsEqual(sdk.Coins{{"barcoin", 2}, {"foocoin", 5}})) + assert.True(t, coinKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("barcoin", 21), sdk.NewCoin("foocoin", 4)})) + assert.True(t, coinKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewCoin("barcoin", 7), sdk.NewCoin("foocoin", 6)})) + assert.True(t, coinKeeper.GetCoins(ctx, addr3).IsEqual(sdk.Coins{sdk.NewCoin("barcoin", 2), sdk.NewCoin("foocoin", 5)})) } @@ -130,52 +130,52 @@ func TestSendKeeper(t *testing.T) { accountMapper.SetAccount(ctx, acc) assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{})) - coinKeeper.SetCoins(ctx, addr, sdk.Coins{{"foocoin", 10}}) - assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}})) + coinKeeper.SetCoins(ctx, addr, sdk.Coins{sdk.NewCoin("foocoin", 10)}) + assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("foocoin", 10)})) // Test HasCoins - assert.True(t, sendKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 10}})) - assert.True(t, sendKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 5}})) - assert.False(t, sendKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 15}})) - assert.False(t, sendKeeper.HasCoins(ctx, addr, sdk.Coins{{"barcoin", 5}})) + assert.True(t, sendKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewCoin("foocoin", 10)})) + assert.True(t, sendKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewCoin("foocoin", 5)})) + assert.False(t, sendKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewCoin("foocoin", 15)})) + assert.False(t, sendKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewCoin("barcoin", 5)})) - coinKeeper.SetCoins(ctx, addr, sdk.Coins{{"foocoin", 15}}) + coinKeeper.SetCoins(ctx, addr, sdk.Coins{sdk.NewCoin("foocoin", 15)}) // Test SendCoins - sendKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"foocoin", 5}}) - assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}})) - assert.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"foocoin", 5}})) + sendKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{sdk.NewCoin("foocoin", 5)}) + assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("foocoin", 10)})) + assert.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewCoin("foocoin", 5)})) - _, err2 := sendKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"foocoin", 50}}) + _, err2 := sendKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{sdk.NewCoin("foocoin", 50)}) assert.Implements(t, (*sdk.Error)(nil), err2) - assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}})) - assert.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"foocoin", 5}})) + assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("foocoin", 10)})) + assert.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewCoin("foocoin", 5)})) - coinKeeper.AddCoins(ctx, addr, sdk.Coins{{"barcoin", 30}}) - sendKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{{"barcoin", 10}, {"foocoin", 5}}) - assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 20}, {"foocoin", 5}})) - assert.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 10}})) + coinKeeper.AddCoins(ctx, addr, sdk.Coins{sdk.NewCoin("barcoin", 30)}) + sendKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{sdk.NewCoin("barcoin", 10), sdk.NewCoin("foocoin", 5)}) + assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("barcoin", 20), sdk.NewCoin("foocoin", 5)})) + assert.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewCoin("barcoin", 10), sdk.NewCoin("foocoin", 10)})) // Test InputOutputCoins - input1 := NewInput(addr2, sdk.Coins{{"foocoin", 2}}) - output1 := NewOutput(addr, sdk.Coins{{"foocoin", 2}}) + input1 := NewInput(addr2, sdk.Coins{sdk.NewCoin("foocoin", 2)}) + output1 := NewOutput(addr, sdk.Coins{sdk.NewCoin("foocoin", 2)}) sendKeeper.InputOutputCoins(ctx, []Input{input1}, []Output{output1}) - assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 20}, {"foocoin", 7}})) - assert.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 10}, {"foocoin", 8}})) + assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("barcoin", 20), sdk.NewCoin("foocoin", 7)})) + assert.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewCoin("barcoin", 10), sdk.NewCoin("foocoin", 8)})) inputs := []Input{ - NewInput(addr, sdk.Coins{{"foocoin", 3}}), - NewInput(addr2, sdk.Coins{{"barcoin", 3}, {"foocoin", 2}}), + NewInput(addr, sdk.Coins{sdk.NewCoin("foocoin", 3)}), + NewInput(addr2, sdk.Coins{sdk.NewCoin("barcoin", 3), sdk.NewCoin("foocoin", 2)}), } outputs := []Output{ - NewOutput(addr, sdk.Coins{{"barcoin", 1}}), - NewOutput(addr3, sdk.Coins{{"barcoin", 2}, {"foocoin", 5}}), + NewOutput(addr, sdk.Coins{sdk.NewCoin("barcoin", 1)}), + NewOutput(addr3, sdk.Coins{sdk.NewCoin("barcoin", 2), sdk.NewCoin("foocoin", 5)}), } sendKeeper.InputOutputCoins(ctx, inputs, outputs) - assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"barcoin", 21}, {"foocoin", 4}})) - assert.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{{"barcoin", 7}, {"foocoin", 6}})) - assert.True(t, sendKeeper.GetCoins(ctx, addr3).IsEqual(sdk.Coins{{"barcoin", 2}, {"foocoin", 5}})) + assert.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("barcoin", 21), sdk.NewCoin("foocoin", 4)})) + assert.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewCoin("barcoin", 7), sdk.NewCoin("foocoin", 6)})) + assert.True(t, sendKeeper.GetCoins(ctx, addr3).IsEqual(sdk.Coins{sdk.NewCoin("barcoin", 2), sdk.NewCoin("foocoin", 5)})) } @@ -197,12 +197,12 @@ func TestViewKeeper(t *testing.T) { accountMapper.SetAccount(ctx, acc) assert.True(t, viewKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{})) - coinKeeper.SetCoins(ctx, addr, sdk.Coins{{"foocoin", 10}}) - assert.True(t, viewKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{{"foocoin", 10}})) + coinKeeper.SetCoins(ctx, addr, sdk.Coins{sdk.NewCoin("foocoin", 10)}) + assert.True(t, viewKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewCoin("foocoin", 10)})) // Test HasCoins - assert.True(t, viewKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 10}})) - assert.True(t, viewKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 5}})) - assert.False(t, viewKeeper.HasCoins(ctx, addr, sdk.Coins{{"foocoin", 15}})) - assert.False(t, viewKeeper.HasCoins(ctx, addr, sdk.Coins{{"barcoin", 5}})) + assert.True(t, viewKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewCoin("foocoin", 10)})) + assert.True(t, viewKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewCoin("foocoin", 5)})) + assert.False(t, viewKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewCoin("foocoin", 15)})) + assert.False(t, viewKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewCoin("barcoin", 5)})) } diff --git a/x/bank/msgs_test.go b/x/bank/msgs_test.go index 90b4869db0..b866e497b6 100644 --- a/x/bank/msgs_test.go +++ b/x/bank/msgs_test.go @@ -15,7 +15,7 @@ func TestMsgSendType(t *testing.T) { // Construct a MsgSend addr1 := sdk.Address([]byte("input")) addr2 := sdk.Address([]byte("output")) - coins := sdk.Coins{{"atom", 10}} + coins := sdk.Coins{sdk.NewCoin("atom", 10)} var msg = MsgSend{ Inputs: []Input{NewInput(addr1, coins)}, Outputs: []Output{NewOutput(addr2, coins)}, @@ -28,16 +28,16 @@ func TestMsgSendType(t *testing.T) { func TestInputValidation(t *testing.T) { addr1 := sdk.Address([]byte{1, 2}) addr2 := sdk.Address([]byte{7, 8}) - someCoins := sdk.Coins{{"atom", 123}} - multiCoins := sdk.Coins{{"atom", 123}, {"eth", 20}} + someCoins := sdk.Coins{sdk.NewCoin("atom", 123)} + multiCoins := sdk.Coins{sdk.NewCoin("atom", 123), sdk.NewCoin("eth", 20)} var emptyAddr sdk.Address emptyCoins := sdk.Coins{} - emptyCoins2 := sdk.Coins{{"eth", 0}} - someEmptyCoins := sdk.Coins{{"eth", 10}, {"atom", 0}} - minusCoins := sdk.Coins{{"eth", -34}} - someMinusCoins := sdk.Coins{{"atom", 20}, {"eth", -34}} - unsortedCoins := sdk.Coins{{"eth", 1}, {"atom", 1}} + emptyCoins2 := sdk.Coins{sdk.NewCoin("eth", 0)} + someEmptyCoins := sdk.Coins{sdk.NewCoin("eth", 10), sdk.NewCoin("atom", 0)} + minusCoins := sdk.Coins{sdk.NewCoin("eth", -34)} + someMinusCoins := sdk.Coins{sdk.NewCoin("atom", 20), sdk.NewCoin("eth", -34)} + unsortedCoins := sdk.Coins{sdk.NewCoin("eth", 1), sdk.NewCoin("atom", 1)} cases := []struct { valid bool @@ -70,16 +70,16 @@ func TestInputValidation(t *testing.T) { func TestOutputValidation(t *testing.T) { addr1 := sdk.Address([]byte{1, 2}) addr2 := sdk.Address([]byte{7, 8}) - someCoins := sdk.Coins{{"atom", 123}} - multiCoins := sdk.Coins{{"atom", 123}, {"eth", 20}} + someCoins := sdk.Coins{sdk.NewCoin("atom", 123)} + multiCoins := sdk.Coins{sdk.NewCoin("atom", 123), sdk.NewCoin("eth", 20)} var emptyAddr sdk.Address emptyCoins := sdk.Coins{} - emptyCoins2 := sdk.Coins{{"eth", 0}} - someEmptyCoins := sdk.Coins{{"eth", 10}, {"atom", 0}} - minusCoins := sdk.Coins{{"eth", -34}} - someMinusCoins := sdk.Coins{{"atom", 20}, {"eth", -34}} - unsortedCoins := sdk.Coins{{"eth", 1}, {"atom", 1}} + emptyCoins2 := sdk.Coins{sdk.NewCoin("eth", 0)} + someEmptyCoins := sdk.Coins{sdk.NewCoin("eth", 10), sdk.NewCoin("atom", 0)} + minusCoins := sdk.Coins{sdk.NewCoin("eth", -34)} + someMinusCoins := sdk.Coins{sdk.NewCoin("atom", 20), sdk.NewCoin("eth", -34)} + unsortedCoins := sdk.Coins{sdk.NewCoin("eth", 1), sdk.NewCoin("atom", 1)} cases := []struct { valid bool @@ -112,10 +112,10 @@ func TestOutputValidation(t *testing.T) { func TestMsgSendValidation(t *testing.T) { addr1 := sdk.Address([]byte{1, 2}) addr2 := sdk.Address([]byte{7, 8}) - atom123 := sdk.Coins{{"atom", 123}} - atom124 := sdk.Coins{{"atom", 124}} - eth123 := sdk.Coins{{"eth", 123}} - atom123eth123 := sdk.Coins{{"atom", 123}, {"eth", 123}} + atom123 := sdk.Coins{sdk.NewCoin("atom", 123)} + atom124 := sdk.Coins{sdk.NewCoin("atom", 124)} + eth123 := sdk.Coins{sdk.NewCoin("eth", 123)} + atom123eth123 := sdk.Coins{sdk.NewCoin("atom", 123), sdk.NewCoin("eth", 123)} input1 := NewInput(addr1, atom123) input2 := NewInput(addr1, eth123) @@ -180,7 +180,7 @@ func TestMsgSendValidation(t *testing.T) { func TestMsgSendGetSignBytes(t *testing.T) { addr1 := sdk.Address([]byte("input")) addr2 := sdk.Address([]byte("output")) - coins := sdk.Coins{{"atom", 10}} + coins := sdk.Coins{sdk.NewCoin("atom", 10)} var msg = MsgSend{ Inputs: []Input{NewInput(addr1, coins)}, Outputs: []Output{NewOutput(addr2, coins)}, @@ -213,7 +213,7 @@ func TestMsgSendSigners(t *testing.T) { {7, 8, 9}, } - someCoins := sdk.Coins{{"atom", 123}} + someCoins := sdk.Coins{sdk.NewCoin("atom", 123)} inputs := make([]Input, len(signers)) for i, signer := range signers { inputs[i] = NewInput(signer, someCoins) @@ -234,7 +234,7 @@ func TestNewMsgIssue(t *testing.T) { func TestMsgIssueType(t *testing.T) { // Construct an MsgIssue addr := sdk.Address([]byte("loan-from-bank")) - coins := sdk.Coins{{"atom", 10}} + coins := sdk.Coins{sdk.NewCoin("atom", 10)} var msg = MsgIssue{ Banker: sdk.Address([]byte("input")), Outputs: []Output{NewOutput(addr, coins)}, @@ -250,7 +250,7 @@ func TestMsgIssueValidation(t *testing.T) { func TestMsgIssueGetSignBytes(t *testing.T) { addr := sdk.Address([]byte("loan-from-bank")) - coins := sdk.Coins{{"atom", 10}} + coins := sdk.Coins{sdk.NewCoin("atom", 10)} var msg = MsgIssue{ Banker: sdk.Address([]byte("input")), Outputs: []Output{NewOutput(addr, coins)}, diff --git a/x/ibc/app_test.go b/x/ibc/app_test.go index 90d426882f..c546890100 100644 --- a/x/ibc/app_test.go +++ b/x/ibc/app_test.go @@ -36,7 +36,7 @@ func TestIBCMsgs(t *testing.T) { priv1 := crypto.GenPrivKeyEd25519() addr1 := priv1.PubKey().Address() - coins := sdk.Coins{{"foocoin", 10}} + coins := sdk.Coins{sdk.NewCoin("foocoin", 10)} var emptyCoins sdk.Coins acc := &auth.BaseAccount{ diff --git a/x/ibc/ibc_test.go b/x/ibc/ibc_test.go index e13df4f8dd..8ccf9245e2 100644 --- a/x/ibc/ibc_test.go +++ b/x/ibc/ibc_test.go @@ -69,7 +69,7 @@ func TestIBC(t *testing.T) { dest := newAddress() chainid := "ibcchain" zero := sdk.Coins(nil) - mycoins := sdk.Coins{sdk.Coin{"mycoin", 10}} + mycoins := sdk.Coins{sdk.NewCoin("mycoin", 10)} coins, _, err := ck.AddCoins(ctx, src, mycoins) assert.Nil(t, err) diff --git a/x/ibc/types_test.go b/x/ibc/types_test.go index 199270b29c..5127546989 100644 --- a/x/ibc/types_test.go +++ b/x/ibc/types_test.go @@ -100,7 +100,7 @@ func TestIBCReceiveMsgValidation(t *testing.T) { func constructIBCPacket(valid bool) IBCPacket { srcAddr := sdk.Address([]byte("source")) destAddr := sdk.Address([]byte("destination")) - coins := sdk.Coins{{"atom", 10}} + coins := sdk.Coins{sdk.NewCoin("atom", 10)} srcChain := "source-chain" destChain := "dest-chain" diff --git a/x/slashing/app_test.go b/x/slashing/app_test.go index 2a99795c6b..39b2819d25 100644 --- a/x/slashing/app_test.go +++ b/x/slashing/app_test.go @@ -18,7 +18,7 @@ import ( var ( priv1 = crypto.GenPrivKeyEd25519() addr1 = priv1.PubKey().Address() - coins = sdk.Coins{{"foocoin", 10}} + coins = sdk.Coins{sdk.NewCoin("foocoin", 10)} ) // initialize the mock application for this module @@ -79,8 +79,8 @@ func checkValidatorSigningInfo(t *testing.T, mapp *mock.App, keeper Keeper, func TestSlashingMsgs(t *testing.T) { mapp, stakeKeeper, keeper := getMockApp(t) - genCoin := sdk.Coin{"steak", 42} - bondCoin := sdk.Coin{"steak", 10} + genCoin := sdk.NewCoin("steak", 42) + bondCoin := sdk.NewCoin("steak", 10) acc1 := &auth.BaseAccount{ Address: addr1, diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 1f8f9db073..d0a87e149e 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -17,21 +17,21 @@ func TestHandleDoubleSign(t *testing.T) { // initial setup ctx, ck, sk, keeper := createTestInput(t) - addr, val, amt := addrs[0], pks[0], int64(100) + addr, val, amt := addrs[0], pks[0], sdk.NewInt(100) got := stake.NewHandler(sk)(ctx, newTestMsgCreateValidator(addr, val, amt)) require.True(t, got.IsOK()) stake.EndBlocker(ctx, sk) - require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) - require.Equal(t, sdk.NewRat(amt), sk.Validator(ctx, addr).GetPower()) + require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins.Sub(amt)}}) + require.True(t, sdk.NewRatFromInt(amt).Equal(sk.Validator(ctx, addr).GetPower())) // double sign less than max age keeper.handleDoubleSign(ctx, 0, 0, val) - require.Equal(t, sdk.NewRat(amt).Mul(sdk.NewRat(19).Quo(sdk.NewRat(20))), sk.Validator(ctx, addr).GetPower()) + require.Equal(t, sdk.NewRatFromInt(amt).Mul(sdk.NewRat(19).Quo(sdk.NewRat(20))), sk.Validator(ctx, addr).GetPower()) ctx = ctx.WithBlockHeader(abci.Header{Time: 300}) // double sign past max age keeper.handleDoubleSign(ctx, 0, 0, val) - require.Equal(t, sdk.NewRat(amt).Mul(sdk.NewRat(19).Quo(sdk.NewRat(20))), sk.Validator(ctx, addr).GetPower()) + require.Equal(t, sdk.NewRatFromInt(amt).Mul(sdk.NewRat(19).Quo(sdk.NewRat(20))), sk.Validator(ctx, addr).GetPower()) } // Test a validator through uptime, downtime, revocation, @@ -40,14 +40,14 @@ func TestHandleAbsentValidator(t *testing.T) { // initial setup ctx, ck, sk, keeper := createTestInput(t) - addr, val, amt := addrs[0], pks[0], int64(100) + addr, val, amt := addrs[0], pks[0], sdk.NewInt(100) sh := stake.NewHandler(sk) slh := NewHandler(keeper) got := sh(ctx, newTestMsgCreateValidator(addr, val, amt)) require.True(t, got.IsOK()) stake.EndBlocker(ctx, sk) - require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) - require.Equal(t, sdk.NewRat(amt), sk.Validator(ctx, addr).GetPower()) + require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins.Sub(amt)}}) + require.True(t, sdk.NewRatFromInt(amt).Equal(sk.Validator(ctx, addr).GetPower())) info, found := keeper.getValidatorSigningInfo(ctx, val.Address()) require.False(t, found) require.Equal(t, int64(0), info.StartHeight) @@ -80,7 +80,7 @@ func TestHandleAbsentValidator(t *testing.T) { validator, _ := sk.GetValidatorByPubKey(ctx, val) require.Equal(t, sdk.Bonded, validator.GetStatus()) pool := sk.GetPool(ctx) - require.Equal(t, int64(100), pool.BondedTokens) + require.Equal(t, int64(100), pool.BondedTokens.Int64()) // 51st block missed ctx = ctx.WithBlockHeight(height) @@ -109,7 +109,7 @@ func TestHandleAbsentValidator(t *testing.T) { // validator should have been slashed pool = sk.GetPool(ctx) - require.Equal(t, int64(99), pool.BondedTokens) + require.Equal(t, int64(99), pool.BondedTokens.Int64()) // validator start height should have been changed info, found = keeper.getValidatorSigningInfo(ctx, val.Address()) @@ -142,10 +142,10 @@ func TestHandleNewValidator(t *testing.T) { ctx, ck, sk, keeper := createTestInput(t) addr, val, amt := addrs[0], pks[0], int64(100) sh := stake.NewHandler(sk) - got := sh(ctx, newTestMsgCreateValidator(addr, val, amt)) + got := sh(ctx, newTestMsgCreateValidator(addr, val, sdk.NewInt(amt))) require.True(t, got.IsOK()) stake.EndBlocker(ctx, sk) - require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) + require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins.SubRaw(amt)}}) require.Equal(t, sdk.NewRat(amt), sk.Validator(ctx, addr).GetPower()) // 1000 first blocks not a validator @@ -167,5 +167,5 @@ func TestHandleNewValidator(t *testing.T) { validator, _ := sk.GetValidatorByPubKey(ctx, val) require.Equal(t, sdk.Bonded, validator.GetStatus()) pool := sk.GetPool(ctx) - require.Equal(t, int64(100), pool.BondedTokens) + require.Equal(t, int64(100), pool.BondedTokens.Int64()) } diff --git a/x/slashing/test_common.go b/x/slashing/test_common.go index 94d323d232..d595361e4d 100644 --- a/x/slashing/test_common.go +++ b/x/slashing/test_common.go @@ -31,7 +31,7 @@ var ( newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB51"), newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB52"), } - initCoins int64 = 200 + initCoins sdk.Int = sdk.NewInt(200) ) func createTestCodec() *wire.Codec { @@ -61,7 +61,7 @@ func createTestInput(t *testing.T) (sdk.Context, bank.Keeper, stake.Keeper, Keep ck := bank.NewKeeper(accountMapper) sk := stake.NewKeeper(cdc, keyStake, ck, stake.DefaultCodespace) genesis := stake.DefaultGenesisState() - genesis.Pool.LooseUnbondedTokens = initCoins * int64(len(addrs)) + genesis.Pool.LooseUnbondedTokens = initCoins.MulRaw(int64(len(addrs))) stake.InitGenesis(ctx, sk, genesis) for _, addr := range addrs { ck.AddCoins(ctx, addr, sdk.Coins{ @@ -87,7 +87,7 @@ func testAddr(addr string) sdk.Address { return res } -func newTestMsgCreateValidator(address sdk.Address, pubKey crypto.PubKey, amt int64) stake.MsgCreateValidator { +func newTestMsgCreateValidator(address sdk.Address, pubKey crypto.PubKey, amt sdk.Int) stake.MsgCreateValidator { return stake.MsgCreateValidator{ Description: stake.Description{}, ValidatorAddr: address, diff --git a/x/slashing/tick_test.go b/x/slashing/tick_test.go index adf2e5e5b9..9f1fa11200 100644 --- a/x/slashing/tick_test.go +++ b/x/slashing/tick_test.go @@ -14,18 +14,18 @@ import ( func TestBeginBlocker(t *testing.T) { ctx, ck, sk, keeper := createTestInput(t) - addr, pk, amt := addrs[2], pks[2], int64(100) + addr, pk, amt := addrs[2], pks[2], sdk.NewInt(100) // bond the validator got := stake.NewHandler(sk)(ctx, newTestMsgCreateValidator(addr, pk, amt)) require.True(t, got.IsOK()) stake.EndBlocker(ctx, sk) - require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) - require.Equal(t, sdk.NewRat(amt), sk.Validator(ctx, addr).GetPower()) + require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins.Sub(amt)}}) + require.True(t, sdk.NewRatFromInt(amt).Equal(sk.Validator(ctx, addr).GetPower())) val := abci.Validator{ PubKey: tmtypes.TM2PB.PubKey(pk), - Power: amt, + Power: amt.Int64(), } // mark the validator as having signed diff --git a/x/stake/app_test.go b/x/stake/app_test.go index 940d4db2be..023999c48c 100644 --- a/x/stake/app_test.go +++ b/x/stake/app_test.go @@ -22,9 +22,9 @@ var ( addr3 = crypto.GenPrivKeyEd25519().PubKey().Address() priv4 = crypto.GenPrivKeyEd25519() addr4 = priv4.PubKey().Address() - coins = sdk.Coins{{"foocoin", 10}} + coins = sdk.Coins{sdk.NewCoin("foocoin", 10)} fee = auth.StdFee{ - sdk.Coins{{"foocoin", 0}}, + sdk.Coins{sdk.NewCoin("foocoin", 0)}, 100000, } ) @@ -93,8 +93,8 @@ func checkDelegation(t *testing.T, mapp *mock.App, keeper Keeper, delegatorAddr, func TestStakeMsgs(t *testing.T) { mapp, keeper := getMockApp(t) - genCoin := sdk.Coin{"steak", 42} - bondCoin := sdk.Coin{"steak", 10} + genCoin := sdk.NewCoin("steak", 42) + bondCoin := sdk.NewCoin("steak", 10) acc1 := &auth.BaseAccount{ Address: addr1, diff --git a/x/stake/handler_test.go b/x/stake/handler_test.go index 6dcf3e66d8..56c2adf9d5 100644 --- a/x/stake/handler_test.go +++ b/x/stake/handler_test.go @@ -14,7 +14,7 @@ import ( //______________________________________________________________________ -func newTestMsgCreateValidator(address sdk.Address, pubKey crypto.PubKey, amt int64) MsgCreateValidator { +func newTestMsgCreateValidator(address sdk.Address, pubKey crypto.PubKey, amt sdk.Int) MsgCreateValidator { return MsgCreateValidator{ Description: Description{}, ValidatorAddr: address, @@ -23,7 +23,7 @@ func newTestMsgCreateValidator(address sdk.Address, pubKey crypto.PubKey, amt in } } -func newTestMsgDelegate(delegatorAddr, validatorAddr sdk.Address, amt int64) MsgDelegate { +func newTestMsgDelegate(delegatorAddr, validatorAddr sdk.Address, amt sdk.Int) MsgDelegate { return MsgDelegate{ DelegatorAddr: delegatorAddr, ValidatorAddr: validatorAddr, @@ -36,7 +36,7 @@ func newTestMsgDelegate(delegatorAddr, validatorAddr sdk.Address, amt int64) Msg func TestValidatorByPowerIndex(t *testing.T) { validatorAddr, validatorAddr3 := addrs[0], addrs[1] - initBond := int64(1000000) + initBond := sdk.NewInt(1000000) initBondStr := "1000" ctx, _, keeper := createTestInput(t, false, initBond) @@ -49,7 +49,7 @@ func TestValidatorByPowerIndex(t *testing.T) { bond, found := keeper.GetDelegation(ctx, validatorAddr, validatorAddr) require.True(t, found) gotBond := bond.Shares.Evaluate() - require.Equal(t, initBond, gotBond, + require.Equal(t, initBond.Int64(), gotBond, "initBond: %v\ngotBond: %v\nbond: %v\n", initBond, gotBond, bond) @@ -61,7 +61,7 @@ func TestValidatorByPowerIndex(t *testing.T) { require.True(t, keeper.validatorByPowerIndexExists(ctx, power)) // create a second validator keep it bonded - msgCreateValidator = newTestMsgCreateValidator(validatorAddr3, pks[2], int64(1000000)) + msgCreateValidator = newTestMsgCreateValidator(validatorAddr3, pks[2], sdk.NewInt(1000000)) got = handleMsgCreateValidator(ctx, msgCreateValidator, keeper) assert.True(t, got.IsOK(), "expected create-validator to be ok, got %v", got) @@ -106,11 +106,11 @@ func TestValidatorByPowerIndex(t *testing.T) { } func TestDuplicatesMsgCreateValidator(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 1000) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(1000)) validatorAddr := addrs[0] pk := pks[0] - msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pk, 10) + msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pk, sdk.NewInt(10)) got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) assert.True(t, got.IsOK(), "%v", got) validator, found := keeper.GetValidator(ctx, validatorAddr) @@ -130,11 +130,11 @@ func TestDuplicatesMsgCreateValidator(t *testing.T) { } func TestIncrementsMsgDelegate(t *testing.T) { - initBond := int64(1000) + initBond := sdk.NewInt(1000) ctx, accMapper, keeper := createTestInput(t, false, initBond) params := keeper.GetParams(ctx) - bondAmount := int64(10) + bondAmount := sdk.NewInt(10) validatorAddr, delegatorAddr := addrs[0], addrs[1] // first create validator @@ -145,20 +145,20 @@ func TestIncrementsMsgDelegate(t *testing.T) { validator, found := keeper.GetValidator(ctx, validatorAddr) require.True(t, found) require.Equal(t, sdk.Bonded, validator.Status()) - assert.Equal(t, bondAmount, validator.DelegatorShares.Evaluate()) - assert.Equal(t, bondAmount, validator.PoolShares.Bonded().Evaluate(), "validator: %v", validator) + assert.Equal(t, bondAmount, validator.DelegatorShares.EvaluateInt()) + assert.Equal(t, bondAmount, validator.PoolShares.Bonded().EvaluateInt(), "validator: %v", validator) _, found = keeper.GetDelegation(ctx, delegatorAddr, validatorAddr) require.False(t, found) bond, found := keeper.GetDelegation(ctx, validatorAddr, validatorAddr) require.True(t, found) - assert.Equal(t, bondAmount, bond.Shares.Evaluate()) + assert.Equal(t, bondAmount, bond.Shares.EvaluateInt()) pool := keeper.GetPool(ctx) exRate := validator.DelegatorShareExRate(pool) require.True(t, exRate.Equal(sdk.OneRat()), "expected exRate 1 got %v", exRate) - assert.Equal(t, bondAmount, pool.BondedShares.Evaluate()) + assert.Equal(t, bondAmount, pool.BondedShares.EvaluateInt()) assert.Equal(t, bondAmount, pool.BondedTokens) // just send the same msgbond multiple times @@ -180,14 +180,14 @@ func TestIncrementsMsgDelegate(t *testing.T) { exRate := validator.DelegatorShareExRate(pool) require.True(t, exRate.Equal(sdk.OneRat()), "expected exRate 1 got %v, i = %v", exRate, i) - expBond := int64(i+1) * bondAmount - expDelegatorShares := int64(i+2) * bondAmount // (1 self delegation) - expDelegatorAcc := initBond - expBond + expBond := sdk.NewInt(int64(i + 1)).Mul(bondAmount) + expDelegatorShares := sdk.NewInt(int64(i + 2)).Mul(bondAmount) // (1 self delegation) + expDelegatorAcc := initBond.Sub(expBond) require.Equal(t, bond.Height, int64(i), "Incorrect bond height") - gotBond := bond.Shares.Evaluate() - gotDelegatorShares := validator.DelegatorShares.Evaluate() + gotBond := bond.Shares.EvaluateInt() + gotDelegatorShares := validator.DelegatorShares.EvaluateInt() gotDelegatorAcc := accMapper.GetAccount(ctx, delegatorAddr).GetCoins().AmountOf(params.BondDenom) require.Equal(t, expBond, gotBond, @@ -203,7 +203,7 @@ func TestIncrementsMsgDelegate(t *testing.T) { } func TestIncrementsMsgUnbond(t *testing.T) { - initBond := int64(1000) + initBond := sdk.NewInt(1000) ctx, accMapper, keeper := createTestInput(t, false, initBond) params := keeper.GetParams(ctx) @@ -220,8 +220,8 @@ func TestIncrementsMsgUnbond(t *testing.T) { validator, found := keeper.GetValidator(ctx, validatorAddr) require.True(t, found) - assert.Equal(t, initBond*2, validator.DelegatorShares.Evaluate()) - assert.Equal(t, initBond*2, validator.PoolShares.Bonded().Evaluate()) + assert.Equal(t, initBond.MulRaw(2), validator.DelegatorShares.EvaluateInt()) + assert.Equal(t, initBond.MulRaw(2), validator.PoolShares.Bonded().EvaluateInt()) // just send the same msgUnbond multiple times // TODO use decimals here @@ -238,12 +238,12 @@ func TestIncrementsMsgUnbond(t *testing.T) { bond, found := keeper.GetDelegation(ctx, delegatorAddr, validatorAddr) require.True(t, found) - expBond := initBond - int64(i+1)*unbondShares - expDelegatorShares := 2*initBond - int64(i+1)*unbondShares - expDelegatorAcc := initBond - expBond + expBond := initBond.SubRaw(int64(i+1) * unbondShares) + expDelegatorShares := initBond.MulRaw(2).SubRaw(int64(i+1) * unbondShares) + expDelegatorAcc := initBond.Sub(expBond) - gotBond := bond.Shares.Evaluate() - gotDelegatorShares := validator.DelegatorShares.Evaluate() + gotBond := bond.Shares.EvaluateInt() + gotDelegatorShares := validator.DelegatorShares.EvaluateInt() gotDelegatorAcc := accMapper.GetAccount(ctx, delegatorAddr).GetCoins().AmountOf(params.BondDenom) require.Equal(t, expBond, gotBond, @@ -263,7 +263,7 @@ func TestIncrementsMsgUnbond(t *testing.T) { //1<<63 + 1, // more than int64 1<<63 - 1, 1 << 31, - initBond, + initBond.Int64(), } for _, c := range errorCases { unbondShares := strconv.Itoa(int(c)) @@ -272,17 +272,17 @@ func TestIncrementsMsgUnbond(t *testing.T) { require.False(t, got.IsOK(), "expected unbond msg to fail") } - leftBonded := initBond - unbondShares*int64(numUnbonds) + leftBonded := initBond.SubRaw(unbondShares * int64(numUnbonds)) // should be unable to unbond one more than we have - unbondSharesStr = strconv.Itoa(int(leftBonded) + 1) + unbondSharesStr = strconv.Itoa(int(leftBonded.Int64()) + 1) msgUnbond = NewMsgUnbond(delegatorAddr, validatorAddr, unbondSharesStr) got = handleMsgUnbond(ctx, msgUnbond, keeper) assert.False(t, got.IsOK(), "got: %v\nmsgUnbond: %v\nshares: %v\nleftBonded: %v\n", got, msgUnbond, unbondSharesStr, leftBonded) // should be able to unbond just what we have - unbondSharesStr = strconv.Itoa(int(leftBonded)) + unbondSharesStr = strconv.Itoa(int(leftBonded.Int64())) msgUnbond = NewMsgUnbond(delegatorAddr, validatorAddr, unbondSharesStr) got = handleMsgUnbond(ctx, msgUnbond, keeper) assert.True(t, got.IsOK(), @@ -290,14 +290,14 @@ func TestIncrementsMsgUnbond(t *testing.T) { } func TestMultipleMsgCreateValidator(t *testing.T) { - initBond := int64(1000) + initBond := sdk.NewInt(1000) ctx, accMapper, keeper := createTestInput(t, false, initBond) params := keeper.GetParams(ctx) validatorAddrs := []sdk.Address{addrs[0], addrs[1], addrs[2]} // bond them all for i, validatorAddr := range validatorAddrs { - msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pks[i], 10) + msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pks[i], sdk.NewInt(10)) got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) require.True(t, got.IsOK(), "expected msg %d to be ok, got %v", i, got) @@ -305,7 +305,7 @@ func TestMultipleMsgCreateValidator(t *testing.T) { validators := keeper.GetValidators(ctx, 100) require.Equal(t, (i + 1), len(validators)) val := validators[i] - balanceExpd := initBond - 10 + balanceExpd := initBond.SubRaw(10) balanceGot := accMapper.GetAccount(ctx, val.Owner).GetCoins().AmountOf(params.BondDenom) require.Equal(t, i+1, len(validators), "expected %d validators got %d, validators: %v", i+1, len(validators), validators) require.Equal(t, 10, int(val.DelegatorShares.Evaluate()), "expected %d shares, got %d", 10, val.DelegatorShares) @@ -335,17 +335,17 @@ func TestMultipleMsgCreateValidator(t *testing.T) { } func TestMultipleMsgDelegate(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 1000) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(1000)) validatorAddr, delegatorAddrs := addrs[0], addrs[1:] //first make a validator - msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pks[0], 10) + msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pks[0], sdk.NewInt(10)) got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) require.True(t, got.IsOK(), "expected msg to be ok, got %v", got) // delegate multiple parties for i, delegatorAddr := range delegatorAddrs { - msgDelegate := newTestMsgDelegate(delegatorAddr, validatorAddr, 10) + msgDelegate := newTestMsgDelegate(delegatorAddr, validatorAddr, sdk.NewInt(10)) got := handleMsgDelegate(ctx, msgDelegate, keeper) require.True(t, got.IsOK(), "expected msg %d to be ok, got %v", i, got) @@ -368,16 +368,16 @@ func TestMultipleMsgDelegate(t *testing.T) { } func TestRevokeValidator(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 1000) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(1000)) validatorAddr, delegatorAddr := addrs[0], addrs[1] // create the validator - msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pks[0], 10) + msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pks[0], sdk.NewInt(10)) got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) require.True(t, got.IsOK(), "expected no error on runMsgCreateValidator") // bond a delegator - msgDelegate := newTestMsgDelegate(delegatorAddr, validatorAddr, 10) + msgDelegate := newTestMsgDelegate(delegatorAddr, validatorAddr, sdk.NewInt(10)) got = handleMsgDelegate(ctx, msgDelegate, keeper) require.True(t, got.IsOK(), "expected ok, got %v", got) diff --git a/x/stake/inflation.go b/x/stake/inflation.go index fe3f59435b..b123dd2dda 100644 --- a/x/stake/inflation.go +++ b/x/stake/inflation.go @@ -21,10 +21,10 @@ func (k Keeper) processProvisions(ctx sdk.Context) Pool { // more bonded tokens are added proportionally to all validators the only term // which needs to be updated is the `BondedPool`. So for each previsions cycle: - provisions := pool.Inflation.Mul(sdk.NewRat(pool.TokenSupply())).Quo(hrsPerYrRat).Evaluate() + provisions := pool.Inflation.Mul(sdk.NewRatFromInt(pool.TokenSupply())).Quo(hrsPerYrRat).EvaluateInt() // TODO add to the fees provisions - pool.LooseUnbondedTokens += provisions + pool.LooseUnbondedTokens = pool.LooseUnbondedTokens.Add(provisions) return pool } diff --git a/x/stake/inflation_test.go b/x/stake/inflation_test.go index 0d5183f4cf..8a117fc92b 100644 --- a/x/stake/inflation_test.go +++ b/x/stake/inflation_test.go @@ -14,7 +14,7 @@ import ( var r = rand.New(rand.NewSource(6595)) func TestGetInflation(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) pool := keeper.GetPool(ctx) params := keeper.GetParams(ctx) hrsPerYrRat := sdk.NewRat(hrsPerYr) @@ -23,33 +23,36 @@ func TestGetInflation(t *testing.T) { // bondedRatio = BondedTokens / TotalSupply // inflationRateChangePerYear = (1- bondedRatio/ GoalBonded) * MaxInflationRateChange + zero := sdk.ZeroInt() + one := sdk.OneInt() + tests := []struct { name string - setBondedTokens, setLooseTokens int64 + setBondedTokens, setLooseTokens sdk.Int setInflation, expectedChange sdk.Rat }{ // with 0% bonded atom supply the inflation should increase by InflationRateChange - {"test 1", 0, 0, sdk.NewRat(7, 100), params.InflationRateChange.Quo(hrsPerYrRat).Round(precision)}, + {"test 1", zero, zero, sdk.NewRat(7, 100), params.InflationRateChange.Quo(hrsPerYrRat).Round(precision)}, // 100% bonded, starting at 20% inflation and being reduced // (1 - (1/0.67))*(0.13/8667) - {"test 2", 1, 0, sdk.NewRat(20, 100), + {"test 2", one, zero, sdk.NewRat(20, 100), sdk.OneRat().Sub(sdk.OneRat().Quo(params.GoalBonded)).Mul(params.InflationRateChange).Quo(hrsPerYrRat).Round(precision)}, // 50% bonded, starting at 10% inflation and being increased - {"test 3", 1, 1, sdk.NewRat(10, 100), + {"test 3", one, one, sdk.NewRat(10, 100), sdk.OneRat().Sub(sdk.NewRat(1, 2).Quo(params.GoalBonded)).Mul(params.InflationRateChange).Quo(hrsPerYrRat).Round(precision)}, // test 7% minimum stop (testing with 100% bonded) - {"test 4", 1, 0, sdk.NewRat(7, 100), sdk.ZeroRat()}, - {"test 5", 1, 0, sdk.NewRat(70001, 1000000), sdk.NewRat(-1, 1000000).Round(precision)}, + {"test 4", one, zero, sdk.NewRat(7, 100), sdk.ZeroRat()}, + {"test 5", one, zero, sdk.NewRat(70001, 1000000), sdk.NewRat(-1, 1000000).Round(precision)}, // test 20% maximum stop (testing with 0% bonded) - {"test 6", 0, 0, sdk.NewRat(20, 100), sdk.ZeroRat()}, - {"test 7", 0, 0, sdk.NewRat(199999, 1000000), sdk.NewRat(1, 1000000).Round(precision)}, + {"test 6", zero, zero, sdk.NewRat(20, 100), sdk.ZeroRat()}, + {"test 7", zero, zero, sdk.NewRat(199999, 1000000), sdk.NewRat(1, 1000000).Round(precision)}, // perfect balance shouldn't change inflation - {"test 8", 67, 33, sdk.NewRat(15, 100), sdk.ZeroRat()}, + {"test 8", sdk.NewInt(67), sdk.NewInt(33), sdk.NewRat(15, 100), sdk.ZeroRat()}, } for _, tc := range tests { pool.BondedTokens, pool.LooseUnbondedTokens = tc.setBondedTokens, tc.setLooseTokens @@ -66,16 +69,16 @@ func TestGetInflation(t *testing.T) { // Test that provisions are correctly added to the pool and validators each hour for 1 year func TestProcessProvisions(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.ZeroInt()) pool := keeper.GetPool(ctx) var ( - initialTotalTokens int64 = 550000000 - initialBondedTokens int64 = 250000000 - initialUnbondedTokens int64 = 300000000 - cumulativeExpProvs int64 - validatorTokens = []int64{150000000, 100000000, 100000000, 100000000, 100000000} - bondedValidators uint16 = 2 + initialTotalTokens int64 = 550000000 + initialBondedTokens int64 = 250000000 + initialUnbondedTokens int64 = 300000000 + cumulativeExpProvs sdk.Int = sdk.ZeroInt() + validatorTokens = []int64{150000000, 100000000, 100000000, 100000000, 100000000} + bondedValidators uint16 = 2 ) // create some validators some bonded, some unbonded @@ -86,7 +89,7 @@ func TestProcessProvisions(t *testing.T) { for hr := 0; hr < 8766; hr++ { pool := keeper.GetPool(ctx) _, expProvisions, _ := updateProvisions(t, keeper, pool, ctx, hr) - cumulativeExpProvs = cumulativeExpProvs + expProvisions + cumulativeExpProvs = cumulativeExpProvs.Add(expProvisions) } //get the pool and do the final value checks from checkFinalPoolValues @@ -97,16 +100,16 @@ func TestProcessProvisions(t *testing.T) { // Tests that the hourly rate of change of inflation will be positive, negative, or zero, depending on bonded ratio and inflation rate // Cycles through the whole gambit of inflation possibilities, starting at 7% inflation, up to 20%, back down to 7% (it takes ~11.4 years) func TestHourlyInflationRateOfChange(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.ZeroInt()) pool := keeper.GetPool(ctx) var ( - initialTotalTokens int64 = 550000000 - initialBondedTokens int64 = 150000000 - initialUnbondedTokens int64 = 400000000 - cumulativeExpProvs int64 - validatorTokens = []int64{150000000, 100000000, 100000000, 100000000, 100000000} - bondedValidators uint16 = 1 + initialTotalTokens int64 = 550000000 + initialBondedTokens int64 = 150000000 + initialUnbondedTokens int64 = 400000000 + cumulativeExpProvs sdk.Int = sdk.ZeroInt() + validatorTokens = []int64{150000000, 100000000, 100000000, 100000000, 100000000} + bondedValidators uint16 = 1 ) // create some validators some bonded, some unbonded @@ -118,7 +121,7 @@ func TestHourlyInflationRateOfChange(t *testing.T) { pool := keeper.GetPool(ctx) previousInflation := pool.Inflation updatedInflation, expProvisions, pool := updateProvisions(t, keeper, pool, ctx, hr) - cumulativeExpProvs = cumulativeExpProvs + expProvisions + cumulativeExpProvs = cumulativeExpProvs.Add(expProvisions) msg := strconv.Itoa(hr) checkInflation(t, pool, previousInflation, updatedInflation, msg) } @@ -130,7 +133,7 @@ func TestHourlyInflationRateOfChange(t *testing.T) { //Test that a large unbonding will significantly lower the bonded ratio func TestLargeUnbond(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.ZeroInt()) pool := keeper.GetPool(ctx) var ( @@ -178,7 +181,7 @@ func TestLargeUnbond(t *testing.T) { //Test that a large bonding will significantly increase the bonded ratio func TestLargeBond(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.ZeroInt()) pool := keeper.GetPool(ctx) var ( @@ -225,7 +228,7 @@ func TestLargeBond(t *testing.T) { // Tests that inflation increases or decreases as expected when we do a random operation on 20 different validators func TestInflationWithRandomOperations(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.ZeroInt()) params := DefaultParams() keeper.setParams(ctx, params) numValidators := 20 @@ -237,6 +240,7 @@ func TestInflationWithRandomOperations(t *testing.T) { for i := 0; i < len(validators); i++ { keeper.setValidator(ctx, validators[i]) } + keeper.setPool(ctx, pool) // Used to rotate validators so each random operation is applied to a different validator @@ -281,23 +285,23 @@ func TestInflationWithRandomOperations(t *testing.T) { ////////////////////////////////HELPER FUNCTIONS BELOW///////////////////////////////////// // Final check on the global pool values for what the total tokens accumulated from each hour of provisions -func checkFinalPoolValues(t *testing.T, pool Pool, initialTotalTokens, cumulativeExpProvs int64) { - calculatedTotalTokens := initialTotalTokens + cumulativeExpProvs - assert.Equal(t, calculatedTotalTokens, pool.TokenSupply()) +func checkFinalPoolValues(t *testing.T, pool Pool, initialTotalTokens int64, cumulativeExpProvs sdk.Int) { + calculatedTotalTokens := cumulativeExpProvs.AddRaw(initialTotalTokens) + + assert.Equal(t, calculatedTotalTokens.Int64(), pool.TokenSupply().Int64()) } // Processes provisions are added to the pool correctly every hour // Returns expected Provisions, expected Inflation, and pool, to help with cumulative calculations back in main Tests -func updateProvisions(t *testing.T, keeper Keeper, pool Pool, ctx sdk.Context, hr int) (sdk.Rat, int64, Pool) { +func updateProvisions(t *testing.T, keeper Keeper, pool Pool, ctx sdk.Context, hr int) (sdk.Rat, sdk.Int, Pool) { expInflation := keeper.nextInflation(ctx) - expProvisions := (expInflation.Mul(sdk.NewRat(pool.TokenSupply())).Quo(hrsPerYrRat)).Evaluate() + expProvisions := (expInflation.Mul(sdk.NewRatFromInt(pool.TokenSupply())).Quo(hrsPerYrRat)).EvaluateInt() startTotalSupply := pool.TokenSupply() pool = keeper.processProvisions(ctx) keeper.setPool(ctx, pool) //check provisions were added to pool - require.Equal(t, startTotalSupply+expProvisions, pool.TokenSupply()) - + require.Equal(t, startTotalSupply.Add(expProvisions).Int64(), pool.TokenSupply().Int64()) return expInflation, expProvisions, pool } @@ -313,7 +317,7 @@ func setupTestValidators(pool Pool, keeper Keeper, ctx sdk.Context, validatorTok for i := 0; i < numValidators; i++ { validators[i] = NewValidator(addrs[i], pks[i], Description{}) - validators[i], pool, _ = validators[i].addTokensFromDel(pool, validatorTokens[i]) + validators[i], pool, _ = validators[i].addTokensFromDel(pool, sdk.NewInt(validatorTokens[i])) keeper.setPool(ctx, pool) validators[i] = keeper.updateValidator(ctx, validators[i]) //will kick out lower power validators. Keep this in mind when setting up the test validators order pool = keeper.GetPool(ctx) @@ -324,9 +328,9 @@ func setupTestValidators(pool Pool, keeper Keeper, ctx sdk.Context, validatorTok // Checks that the deterministic validator setup you wanted matches the values in the pool func checkValidatorSetup(t *testing.T, pool Pool, initialTotalTokens, initialBondedTokens, initialUnbondedTokens int64) { - assert.Equal(t, initialTotalTokens, pool.TokenSupply()) - assert.Equal(t, initialBondedTokens, pool.BondedTokens) - assert.Equal(t, initialUnbondedTokens, pool.UnbondedTokens) + assert.Equal(t, initialTotalTokens, pool.TokenSupply().Int64()) + assert.Equal(t, initialBondedTokens, pool.BondedTokens.Int64()) + assert.Equal(t, initialUnbondedTokens, pool.UnbondedTokens.Int64()) // test initial bonded ratio assert.True(t, pool.bondedRatio().Equal(sdk.NewRat(initialBondedTokens, initialTotalTokens)), "%v", pool.bondedRatio()) diff --git a/x/stake/keeper.go b/x/stake/keeper.go index be36b7a676..cfe685304d 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -809,7 +809,7 @@ func (k Keeper) Slash(ctx sdk.Context, pubkey crypto.PubKey, height int64, fract val, pool, burned := val.removePoolShares(pool, sharesToRemove) k.setPool(ctx, pool) // update the pool k.updateValidator(ctx, val) // update the validator, possibly kicking it out - logger.Info(fmt.Sprintf("Validator %s slashed by fraction %v, removed %v shares and burned %d tokens", pubkey.Address(), fraction, sharesToRemove, burned)) + logger.Info(fmt.Sprintf("Validator %s slashed by fraction %v, removed %v shares and burned %v tokens", pubkey.Address(), fraction, sharesToRemove, burned)) return } diff --git a/x/stake/keeper_test.go b/x/stake/keeper_test.go index 76bfc507a4..7c163a4343 100644 --- a/x/stake/keeper_test.go +++ b/x/stake/keeper_test.go @@ -25,21 +25,21 @@ var ( ) func TestUpdateValidatorByPowerIndex(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) pool := keeper.GetPool(ctx) // create a random pool - pool.BondedTokens = 1234 + pool.BondedTokens = sdk.NewInt(1234) pool.BondedShares = sdk.NewRat(124) - pool.UnbondingTokens = 13934 + pool.UnbondingTokens = sdk.NewInt(13934) pool.UnbondingShares = sdk.NewRat(145) - pool.UnbondedTokens = 154 + pool.UnbondedTokens = sdk.NewInt(154) pool.UnbondedShares = sdk.NewRat(1333) keeper.setPool(ctx, pool) // add a validator validator := NewValidator(addrVals[0], pks[0], Description{}) - validator, pool, delSharesCreated := validator.addTokensFromDel(pool, 100) + validator, pool, delSharesCreated := validator.addTokensFromDel(pool, sdk.NewInt(100)) require.Equal(t, sdk.Unbonded, validator.Status()) assert.Equal(t, int64(100), validator.PoolShares.Tokens(pool).Evaluate()) keeper.setPool(ctx, pool) @@ -54,7 +54,7 @@ func TestUpdateValidatorByPowerIndex(t *testing.T) { // burn half the delegator shares validator, pool, burned := validator.removeDelShares(pool, delSharesCreated.Quo(sdk.NewRat(2))) - assert.Equal(t, int64(50), burned) + assert.Equal(t, int64(50), burned.Int64()) keeper.setPool(ctx, pool) // update the pool keeper.updateValidator(ctx, validator) // update the validator, possibly kicking it out assert.False(t, keeper.validatorByPowerIndexExists(ctx, power)) @@ -66,12 +66,12 @@ func TestUpdateValidatorByPowerIndex(t *testing.T) { } func TestSetValidator(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) pool := keeper.GetPool(ctx) // test how the validator is set from a purely unbonbed pool validator := NewValidator(addrVals[0], pks[0], Description{}) - validator, pool, _ = validator.addTokensFromDel(pool, 10) + validator, pool, _ = validator.addTokensFromDel(pool, sdk.NewInt(10)) require.Equal(t, sdk.Unbonded, validator.Status()) assert.True(sdk.RatEq(t, sdk.NewRat(10), validator.PoolShares.Unbonded())) assert.True(sdk.RatEq(t, sdk.NewRat(10), validator.DelegatorShares)) @@ -105,7 +105,7 @@ func TestSetValidator(t *testing.T) { // This function tests updateValidator, GetValidator, GetValidatorsBonded, removeValidator func TestValidatorBasics(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) pool := keeper.GetPool(ctx) //construct the validators @@ -114,7 +114,7 @@ func TestValidatorBasics(t *testing.T) { for i, amt := range amts { validators[i] = NewValidator(addrVals[i], pks[i], Description{}) validators[i].PoolShares = NewUnbondedShares(sdk.ZeroRat()) - validators[i].addTokensFromDel(pool, amt) + validators[i].addTokensFromDel(pool, sdk.NewInt(amt)) } // check the empty keeper first @@ -169,7 +169,7 @@ func TestValidatorBasics(t *testing.T) { // test how the validators are sorted, tests GetValidatorsByPower func GetValidatorSortingUnmixed(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) // initialize some validators into the state amts := []int64{0, 100, 1, 400, 200} @@ -245,7 +245,7 @@ func GetValidatorSortingUnmixed(t *testing.T) { } func GetValidatorSortingMixed(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) // now 2 max resValidators params := keeper.GetParams(ctx) @@ -302,7 +302,7 @@ func GetValidatorSortingMixed(t *testing.T) { // TODO seperate out into multiple tests func TestGetValidatorsEdgeCases(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) var found bool // now 2 max resValidators @@ -373,7 +373,7 @@ func TestGetValidatorsEdgeCases(t *testing.T) { } func TestValidatorBondHeight(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) // now 2 max resValidators params := keeper.GetParams(ctx) @@ -414,7 +414,7 @@ func TestValidatorBondHeight(t *testing.T) { } func TestFullValidatorSetPowerChange(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) params := keeper.GetParams(ctx) max := 2 params.MaxValidators = uint16(2) @@ -455,7 +455,7 @@ func TestFullValidatorSetPowerChange(t *testing.T) { // clear the tracked changes to the gotValidator set func TestClearTendermintUpdates(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) amts := []int64{100, 400, 200} validators := make([]Validator, len(amts)) @@ -474,7 +474,7 @@ func TestClearTendermintUpdates(t *testing.T) { } func TestGetTendermintUpdatesAllNone(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) amts := []int64{10, 20} var validators [2]Validator @@ -512,7 +512,7 @@ func TestGetTendermintUpdatesAllNone(t *testing.T) { } func TestGetTendermintUpdatesIdentical(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) amts := []int64{10, 20} var validators [2]Validator @@ -534,7 +534,7 @@ func TestGetTendermintUpdatesIdentical(t *testing.T) { } func TestGetTendermintUpdatesSingleValueChange(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) amts := []int64{10, 20} var validators [2]Validator @@ -560,7 +560,7 @@ func TestGetTendermintUpdatesSingleValueChange(t *testing.T) { } func TestGetTendermintUpdatesMultipleValueChange(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) amts := []int64{10, 20} var validators [2]Validator @@ -588,7 +588,7 @@ func TestGetTendermintUpdatesMultipleValueChange(t *testing.T) { } func TestGetTendermintUpdatesInserted(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) amts := []int64{10, 20, 5, 15, 25} var validators [5]Validator @@ -627,7 +627,7 @@ func TestGetTendermintUpdatesInserted(t *testing.T) { } func TestGetTendermintUpdatesNotValidatorCliff(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) params := DefaultParams() params.MaxValidators = 2 keeper.setParams(ctx, params) @@ -666,7 +666,7 @@ func TestGetTendermintUpdatesNotValidatorCliff(t *testing.T) { // tests GetDelegation, GetDelegations, SetDelegation, removeDelegation, GetBonds func TestBond(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) //construct the validators amts := []int64{9, 8, 7} @@ -762,7 +762,7 @@ func TestBond(t *testing.T) { } func TestParams(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) expParams := DefaultParams() //check that the empty keeper loads the default @@ -777,7 +777,7 @@ func TestParams(t *testing.T) { } func TestPool(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) expPool := InitialPool() //check that the empty keeper loads the default @@ -785,7 +785,7 @@ func TestPool(t *testing.T) { assert.True(t, expPool.equal(resPool)) //modify a params, save, and retrieve - expPool.BondedTokens = 777 + expPool.BondedTokens = sdk.NewInt(777) keeper.setPool(ctx, expPool) resPool = keeper.GetPool(ctx) assert.True(t, expPool.equal(resPool)) diff --git a/x/stake/msg.go b/x/stake/msg.go index fbdd048536..b764a2388d 100644 --- a/x/stake/msg.go +++ b/x/stake/msg.go @@ -69,7 +69,7 @@ func (msg MsgCreateValidator) ValidateBasic() sdk.Error { if msg.Bond.Denom != StakingToken { return ErrBadBondingDenom(DefaultCodespace) } - if msg.Bond.Amount <= 0 { + if msg.Bond.Amount.Sign() != 1 { return ErrBadBondingAmount(DefaultCodespace) } empty := Description{} @@ -178,7 +178,7 @@ func (msg MsgDelegate) ValidateBasic() sdk.Error { if msg.Bond.Denom != StakingToken { return ErrBadBondingDenom(DefaultCodespace) } - if msg.Bond.Amount <= 0 { + if msg.Bond.Amount.Sign() != 1 { return ErrBadBondingAmount(DefaultCodespace) } return nil diff --git a/x/stake/msg_test.go b/x/stake/msg_test.go index 863613a039..c14698d1b9 100644 --- a/x/stake/msg_test.go +++ b/x/stake/msg_test.go @@ -10,12 +10,12 @@ import ( ) var ( - coinPos = sdk.Coin{"steak", 1000} - coinZero = sdk.Coin{"steak", 0} - coinNeg = sdk.Coin{"steak", -10000} - coinPosNotAtoms = sdk.Coin{"foo", 10000} - coinZeroNotAtoms = sdk.Coin{"foo", 0} - coinNegNotAtoms = sdk.Coin{"foo", -10000} + coinPos = sdk.NewCoin("steak", 1000) + coinZero = sdk.NewCoin("steak", 0) + coinNeg = sdk.NewCoin("steak", -10000) + coinPosNotAtoms = sdk.NewCoin("foo", 10000) + coinZeroNotAtoms = sdk.NewCoin("foo", 0) + coinNegNotAtoms = sdk.NewCoin("foo", -10000) ) // test ValidateBasic for MsgCreateValidator diff --git a/x/stake/pool.go b/x/stake/pool.go index ba1890ce55..91e898770e 100644 --- a/x/stake/pool.go +++ b/x/stake/pool.go @@ -8,10 +8,10 @@ import ( // Pool - dynamic parameters of the current state type Pool struct { - LooseUnbondedTokens int64 `json:"loose_unbonded_tokens"` // tokens not associated with any validator - UnbondedTokens int64 `json:"unbonded_tokens"` // reserve of unbonded tokens held with validators - UnbondingTokens int64 `json:"unbonding_tokens"` // tokens moving from bonded to unbonded pool - BondedTokens int64 `json:"bonded_tokens"` // reserve of bonded tokens + LooseUnbondedTokens sdk.Int `json:"loose_unbonded_tokens"` // tokens not associated with any validator + UnbondedTokens sdk.Int `json:"unbonded_tokens"` // reserve of unbonded tokens held with validators + UnbondingTokens sdk.Int `json:"unbonding_tokens"` // tokens moving from bonded to unbonded pool + BondedTokens sdk.Int `json:"bonded_tokens"` // reserve of bonded tokens UnbondedShares sdk.Rat `json:"unbonded_shares"` // sum of all shares distributed for the Unbonded Pool UnbondingShares sdk.Rat `json:"unbonding_shares"` // shares moving from Bonded to Unbonded Pool BondedShares sdk.Rat `json:"bonded_shares"` // sum of all shares distributed for the Bonded Pool @@ -33,10 +33,10 @@ func (p Pool) equal(p2 Pool) bool { // initial pool for testing func InitialPool() Pool { return Pool{ - LooseUnbondedTokens: 0, - BondedTokens: 0, - UnbondingTokens: 0, - UnbondedTokens: 0, + LooseUnbondedTokens: sdk.ZeroInt(), + BondedTokens: sdk.ZeroInt(), + UnbondingTokens: sdk.ZeroInt(), + UnbondedTokens: sdk.ZeroInt(), BondedShares: sdk.ZeroRat(), UnbondingShares: sdk.ZeroRat(), UnbondedShares: sdk.ZeroRat(), @@ -50,16 +50,16 @@ func InitialPool() Pool { //____________________________________________________________________ // Sum total of all staking tokens in the pool -func (p Pool) TokenSupply() int64 { - return p.LooseUnbondedTokens + p.UnbondedTokens + p.UnbondingTokens + p.BondedTokens +func (p Pool) TokenSupply() sdk.Int { + return p.LooseUnbondedTokens.Add(p.UnbondedTokens).Add(p.UnbondingTokens).Add(p.BondedTokens) } //____________________________________________________________________ // get the bond ratio of the global state func (p Pool) bondedRatio() sdk.Rat { - if p.TokenSupply() > 0 { - return sdk.NewRat(p.BondedTokens, p.TokenSupply()) + if p.TokenSupply().Sign() == 1 { + return sdk.NewRatFromInt(p.BondedTokens, p.TokenSupply()) } return sdk.ZeroRat() } @@ -69,7 +69,7 @@ func (p Pool) bondedShareExRate() sdk.Rat { if p.BondedShares.IsZero() { return sdk.OneRat() } - return sdk.NewRat(p.BondedTokens).Quo(p.BondedShares) + return sdk.NewRatFromInt(p.BondedTokens).Quo(p.BondedShares) } // get the exchange rate of unbonding tokens held in validators per issued share @@ -77,7 +77,7 @@ func (p Pool) unbondingShareExRate() sdk.Rat { if p.UnbondingShares.IsZero() { return sdk.OneRat() } - return sdk.NewRat(p.UnbondingTokens).Quo(p.UnbondingShares) + return sdk.NewRatFromInt(p.UnbondingTokens).Quo(p.UnbondingShares) } // get the exchange rate of unbonded tokens held in validators per issued share @@ -85,49 +85,49 @@ func (p Pool) unbondedShareExRate() sdk.Rat { if p.UnbondedShares.IsZero() { return sdk.OneRat() } - return sdk.NewRat(p.UnbondedTokens).Quo(p.UnbondedShares) + return sdk.NewRatFromInt(p.UnbondedTokens).Quo(p.UnbondedShares) } //_______________________________________________________________________ -func (p Pool) addTokensUnbonded(amount int64) (p2 Pool, issuedShares PoolShares) { - issuedSharesAmount := sdk.NewRat(amount).Quo(p.unbondedShareExRate()) // tokens * (shares/tokens) +func (p Pool) addTokensUnbonded(amount sdk.Int) (p2 Pool, issuedShares PoolShares) { + issuedSharesAmount := sdk.NewRatFromInt(amount).Quo(p.unbondedShareExRate()) // tokens * (shares/tokens) p.UnbondedShares = p.UnbondedShares.Add(issuedSharesAmount) - p.UnbondedTokens += amount + p.UnbondedTokens = p.UnbondedTokens.Add(amount) return p, NewUnbondedShares(issuedSharesAmount) } -func (p Pool) removeSharesUnbonded(shares sdk.Rat) (p2 Pool, removedTokens int64) { - removedTokens = p.unbondedShareExRate().Mul(shares).Evaluate() // (tokens/shares) * shares +func (p Pool) removeSharesUnbonded(shares sdk.Rat) (p2 Pool, removedTokens sdk.Int) { + removedTokens = sdk.NewIntFromBigInt(p.unbondedShareExRate().Mul(shares).EvaluateBig()) // (tokens/shares) * shares p.UnbondedShares = p.UnbondedShares.Sub(shares) - p.UnbondedTokens -= removedTokens + p.UnbondedTokens = p.UnbondedTokens.Sub(removedTokens) return p, removedTokens } -func (p Pool) addTokensUnbonding(amount int64) (p2 Pool, issuedShares PoolShares) { - issuedSharesAmount := sdk.NewRat(amount).Quo(p.unbondingShareExRate()) // tokens * (shares/tokens) +func (p Pool) addTokensUnbonding(amount sdk.Int) (p2 Pool, issuedShares PoolShares) { + issuedSharesAmount := sdk.NewRatFromInt(amount).Quo(p.unbondingShareExRate()) // tokens * (shares/tokens) p.UnbondingShares = p.UnbondingShares.Add(issuedSharesAmount) - p.UnbondingTokens += amount + p.UnbondingTokens = p.UnbondingTokens.Add(amount) return p, NewUnbondingShares(issuedSharesAmount) } -func (p Pool) removeSharesUnbonding(shares sdk.Rat) (p2 Pool, removedTokens int64) { - removedTokens = p.unbondingShareExRate().Mul(shares).Evaluate() // (tokens/shares) * shares +func (p Pool) removeSharesUnbonding(shares sdk.Rat) (p2 Pool, removedTokens sdk.Int) { + removedTokens = sdk.NewIntFromBigInt(p.unbondingShareExRate().Mul(shares).EvaluateBig()) // (tokens/shares) * shares p.UnbondingShares = p.UnbondingShares.Sub(shares) - p.UnbondingTokens -= removedTokens + p.UnbondingTokens = p.UnbondingTokens.Sub(removedTokens) return p, removedTokens } -func (p Pool) addTokensBonded(amount int64) (p2 Pool, issuedShares PoolShares) { - issuedSharesAmount := sdk.NewRat(amount).Quo(p.bondedShareExRate()) // tokens * (shares/tokens) +func (p Pool) addTokensBonded(amount sdk.Int) (p2 Pool, issuedShares PoolShares) { + issuedSharesAmount := sdk.NewRatFromInt(amount).Quo(p.bondedShareExRate()) // tokens * (shares/tokens) p.BondedShares = p.BondedShares.Add(issuedSharesAmount) - p.BondedTokens += amount + p.BondedTokens = p.BondedTokens.Add(amount) return p, NewBondedShares(issuedSharesAmount) } -func (p Pool) removeSharesBonded(shares sdk.Rat) (p2 Pool, removedTokens int64) { - removedTokens = p.bondedShareExRate().Mul(shares).Evaluate() // (tokens/shares) * shares +func (p Pool) removeSharesBonded(shares sdk.Rat) (p2 Pool, removedTokens sdk.Int) { + removedTokens = sdk.NewIntFromBigInt(p.bondedShareExRate().Mul(shares).EvaluateBig()) // (tokens/shares) * shares p.BondedShares = p.BondedShares.Sub(shares) - p.BondedTokens -= removedTokens + p.BondedTokens = p.BondedTokens.Sub(removedTokens) return p, removedTokens } diff --git a/x/stake/pool_test.go b/x/stake/pool_test.go index 99cfa5a127..62ecdd1a61 100644 --- a/x/stake/pool_test.go +++ b/x/stake/pool_test.go @@ -10,24 +10,24 @@ import ( ) func TestBondedRatio(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) pool := keeper.GetPool(ctx) - pool.LooseUnbondedTokens = 1 - pool.BondedTokens = 2 + pool.LooseUnbondedTokens = sdk.NewInt(1) + pool.BondedTokens = sdk.NewInt(2) // bonded pool / total supply require.Equal(t, pool.bondedRatio(), sdk.NewRat(2).Quo(sdk.NewRat(3))) // avoids divide-by-zero - pool.LooseUnbondedTokens = 0 - pool.BondedTokens = 0 + pool.LooseUnbondedTokens = sdk.NewInt(0) + pool.BondedTokens = sdk.NewInt(0) require.Equal(t, pool.bondedRatio(), sdk.ZeroRat()) } func TestBondedShareExRate(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) pool := keeper.GetPool(ctx) - pool.BondedTokens = 3 + pool.BondedTokens = sdk.NewInt(3) pool.BondedShares = sdk.NewRat(10) // bonded pool / bonded shares @@ -39,9 +39,9 @@ func TestBondedShareExRate(t *testing.T) { } func TestUnbondingShareExRate(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) pool := keeper.GetPool(ctx) - pool.UnbondingTokens = 3 + pool.UnbondingTokens = sdk.NewInt(3) pool.UnbondingShares = sdk.NewRat(10) // unbonding pool / unbonding shares @@ -53,9 +53,9 @@ func TestUnbondingShareExRate(t *testing.T) { } func TestUnbondedShareExRate(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) pool := keeper.GetPool(ctx) - pool.UnbondedTokens = 3 + pool.UnbondedTokens = sdk.NewInt(3) pool.UnbondedShares = sdk.NewRat(10) // unbonded pool / unbonded shares @@ -67,23 +67,23 @@ func TestUnbondedShareExRate(t *testing.T) { } func TestAddTokensBonded(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) poolA := keeper.GetPool(ctx) assert.Equal(t, poolA.bondedShareExRate(), sdk.OneRat()) - poolB, sharesB := poolA.addTokensBonded(10) + poolB, sharesB := poolA.addTokensBonded(sdk.NewInt(10)) assert.Equal(t, poolB.bondedShareExRate(), sdk.OneRat()) // correct changes to bonded shares and bonded pool assert.Equal(t, poolB.BondedShares, poolA.BondedShares.Add(sharesB.Amount)) - assert.Equal(t, poolB.BondedTokens, poolA.BondedTokens+10) + assert.Equal(t, poolB.BondedTokens, poolA.BondedTokens.Add(sdk.NewInt(10))) // same number of bonded shares / tokens when exchange rate is one - assert.True(t, poolB.BondedShares.Equal(sdk.NewRat(poolB.BondedTokens))) + assert.True(t, poolB.BondedShares.Equal(sdk.NewRatFromInt(poolB.BondedTokens))) } func TestRemoveSharesBonded(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) poolA := keeper.GetPool(ctx) assert.Equal(t, poolA.bondedShareExRate(), sdk.OneRat()) @@ -92,30 +92,30 @@ func TestRemoveSharesBonded(t *testing.T) { // correct changes to bonded shares and bonded pool assert.Equal(t, poolB.BondedShares, poolA.BondedShares.Sub(sdk.NewRat(10))) - assert.Equal(t, poolB.BondedTokens, poolA.BondedTokens-tokensB) + assert.Equal(t, poolB.BondedTokens, poolA.BondedTokens.Sub(tokensB)) // same number of bonded shares / tokens when exchange rate is one - assert.True(t, poolB.BondedShares.Equal(sdk.NewRat(poolB.BondedTokens))) + assert.True(t, poolB.BondedShares.Equal(sdk.NewRatFromInt(poolB.BondedTokens))) } func TestAddTokensUnbonded(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) poolA := keeper.GetPool(ctx) assert.Equal(t, poolA.unbondedShareExRate(), sdk.OneRat()) - poolB, sharesB := poolA.addTokensUnbonded(10) + poolB, sharesB := poolA.addTokensUnbonded(sdk.NewInt(10)) assert.Equal(t, poolB.unbondedShareExRate(), sdk.OneRat()) // correct changes to unbonded shares and unbonded pool assert.Equal(t, poolB.UnbondedShares, poolA.UnbondedShares.Add(sharesB.Amount)) - assert.Equal(t, poolB.UnbondedTokens, poolA.UnbondedTokens+10) + assert.Equal(t, poolB.UnbondedTokens, poolA.UnbondedTokens.Add(sdk.NewInt(10))) // same number of unbonded shares / tokens when exchange rate is one - assert.True(t, poolB.UnbondedShares.Equal(sdk.NewRat(poolB.UnbondedTokens))) + assert.True(t, poolB.UnbondedShares.Equal(sdk.NewRatFromInt(poolB.UnbondedTokens))) } func TestRemoveSharesUnbonded(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) poolA := keeper.GetPool(ctx) assert.Equal(t, poolA.unbondedShareExRate(), sdk.OneRat()) @@ -124,8 +124,8 @@ func TestRemoveSharesUnbonded(t *testing.T) { // correct changes to unbonded shares and bonded pool assert.Equal(t, poolB.UnbondedShares, poolA.UnbondedShares.Sub(sdk.NewRat(10))) - assert.Equal(t, poolB.UnbondedTokens, poolA.UnbondedTokens-tokensB) + assert.Equal(t, poolB.UnbondedTokens, poolA.UnbondedTokens.Sub(tokensB)) // same number of unbonded shares / tokens when exchange rate is one - assert.True(t, poolB.UnbondedShares.Equal(sdk.NewRat(poolB.UnbondedTokens))) + assert.True(t, poolB.UnbondedShares.Equal(sdk.NewRatFromInt(poolB.UnbondedTokens))) } diff --git a/x/stake/test_common.go b/x/stake/test_common.go index 3cea0b281a..eb409529b3 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -68,7 +68,7 @@ func paramsNoInflation() Params { } // hogpodge of all sorts of input required for testing -func createTestInput(t *testing.T, isCheckTx bool, initCoins int64) (sdk.Context, auth.AccountMapper, Keeper) { +func createTestInput(t *testing.T, isCheckTx bool, initCoins sdk.Int) (sdk.Context, auth.AccountMapper, Keeper) { keyStake := sdk.NewKVStoreKey("stake") keyAcc := sdk.NewKVStoreKey("acc") diff --git a/x/stake/validator.go b/x/stake/validator.go index 1971e18789..612b0e3290 100644 --- a/x/stake/validator.go +++ b/x/stake/validator.go @@ -123,7 +123,7 @@ func (v Validator) Status() sdk.BondStatus { // update the location of the shares within a validator if its bond status has changed func (v Validator) UpdateStatus(pool Pool, NewStatus sdk.BondStatus) (Validator, Pool) { - var tokens int64 + var tokens sdk.Int switch v.Status() { case sdk.Unbonded: @@ -159,8 +159,8 @@ func (v Validator) UpdateStatus(pool Pool, NewStatus sdk.BondStatus) (Validator, // Remove pool shares // Returns corresponding tokens, which could be burned (e.g. when slashing // a validator) or redistributed elsewhere -func (v Validator) removePoolShares(pool Pool, poolShares sdk.Rat) (Validator, Pool, int64) { - var tokens int64 +func (v Validator) removePoolShares(pool Pool, poolShares sdk.Rat) (Validator, Pool, sdk.Int) { + var tokens sdk.Int switch v.Status() { case sdk.Unbonded: pool, tokens = pool.removeSharesUnbonded(poolShares) @@ -187,7 +187,7 @@ func (v Validator) EquivalentBondedShares(pool Pool) (eqBondedShares sdk.Rat) { // XXX Audit this function further to make sure it's correct // add tokens to a validator func (v Validator) addTokensFromDel(pool Pool, - amount int64) (validator2 Validator, p2 Pool, issuedDelegatorShares sdk.Rat) { + amount sdk.Int) (validator2 Validator, p2 Pool, issuedDelegatorShares sdk.Rat) { exRate := v.DelegatorShareExRate(pool) // bshr/delshr @@ -213,7 +213,7 @@ func (v Validator) addTokensFromDel(pool Pool, // remove delegator shares from a validator // NOTE this function assumes the shares have already been updated for the validator status func (v Validator) removeDelShares(pool Pool, - delShares sdk.Rat) (validator2 Validator, p2 Pool, createdCoins int64) { + delShares sdk.Rat) (validator2 Validator, p2 Pool, createdCoins sdk.Int) { amount := v.DelegatorShareExRate(pool).Mul(delShares) eqBondedSharesToRemove := NewBondedShares(amount) diff --git a/x/stake/validator_test.go b/x/stake/validator_test.go index 5834e59898..b9540a2fef 100644 --- a/x/stake/validator_test.go +++ b/x/stake/validator_test.go @@ -11,12 +11,12 @@ import ( ) func TestAddTokensValidatorBonded(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) pool := keeper.GetPool(ctx) val := NewValidator(addrs[0], pks[0], Description{}) val, pool = val.UpdateStatus(pool, sdk.Bonded) - val, pool, delShares := val.addTokensFromDel(pool, 10) + val, pool, delShares := val.addTokensFromDel(pool, sdk.NewInt(10)) assert.Equal(t, sdk.OneRat(), val.DelegatorShareExRate(pool)) assert.Equal(t, sdk.OneRat(), pool.bondedShareExRate()) @@ -28,12 +28,12 @@ func TestAddTokensValidatorBonded(t *testing.T) { } func TestAddTokensValidatorUnbonding(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) pool := keeper.GetPool(ctx) val := NewValidator(addrs[0], pks[0], Description{}) val, pool = val.UpdateStatus(pool, sdk.Unbonding) - val, pool, delShares := val.addTokensFromDel(pool, 10) + val, pool, delShares := val.addTokensFromDel(pool, sdk.NewInt(10)) assert.Equal(t, sdk.OneRat(), val.DelegatorShareExRate(pool)) assert.Equal(t, sdk.OneRat(), pool.bondedShareExRate()) @@ -45,12 +45,12 @@ func TestAddTokensValidatorUnbonding(t *testing.T) { } func TestAddTokensValidatorUnbonded(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) pool := keeper.GetPool(ctx) val := NewValidator(addrs[0], pks[0], Description{}) val, pool = val.UpdateStatus(pool, sdk.Unbonded) - val, pool, delShares := val.addTokensFromDel(pool, 10) + val, pool, delShares := val.addTokensFromDel(pool, sdk.NewInt(10)) assert.Equal(t, sdk.OneRat(), val.DelegatorShareExRate(pool)) assert.Equal(t, sdk.OneRat(), pool.bondedShareExRate()) @@ -63,7 +63,7 @@ func TestAddTokensValidatorUnbonded(t *testing.T) { // TODO refactor to make simpler like the AddToken tests above func TestRemoveShares(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) poolA := keeper.GetPool(ctx) valA := Validator{ @@ -72,7 +72,7 @@ func TestRemoveShares(t *testing.T) { PoolShares: NewBondedShares(sdk.NewRat(9)), DelegatorShares: sdk.NewRat(9), } - poolA.BondedTokens = valA.PoolShares.Bonded().Evaluate() + poolA.BondedTokens = valA.PoolShares.Bonded().EvaluateInt() poolA.BondedShares = valA.PoolShares.Bonded() assert.Equal(t, valA.DelegatorShareExRate(poolA), sdk.OneRat()) assert.Equal(t, poolA.bondedShareExRate(), sdk.OneRat()) @@ -80,11 +80,11 @@ func TestRemoveShares(t *testing.T) { valB, poolB, coinsB := valA.removeDelShares(poolA, sdk.NewRat(10)) // coins were created - assert.Equal(t, coinsB, int64(10)) + assert.Equal(t, coinsB.Int64(), int64(10)) // pool shares were removed assert.Equal(t, valB.PoolShares.Bonded(), valA.PoolShares.Bonded().Sub(sdk.NewRat(10).Mul(valA.DelegatorShareExRate(poolA)))) // conservation of tokens - assert.Equal(t, poolB.UnbondedTokens+poolB.BondedTokens+coinsB, poolA.UnbondedTokens+poolA.BondedTokens) + assert.Equal(t, poolB.UnbondedTokens.Add(poolB.BondedTokens).Add(coinsB), poolA.UnbondedTokens.Add(poolA.BondedTokens)) // specific case from random tests poolShares := sdk.NewRat(5102) @@ -98,8 +98,8 @@ func TestRemoveShares(t *testing.T) { pool := Pool{ BondedShares: sdk.NewRat(248305), UnbondedShares: sdk.NewRat(232147), - BondedTokens: 248305, - UnbondedTokens: 232147, + BondedTokens: sdk.NewInt(248305), + UnbondedTokens: sdk.NewInt(232147), InflationLastTime: 0, Inflation: sdk.NewRat(7, 100), } @@ -109,39 +109,39 @@ func TestRemoveShares(t *testing.T) { msg = fmt.Sprintf("Removed %v shares from %s", shares, msg) _, newPool, tokens := val.removeDelShares(pool, shares) require.Equal(t, - tokens+newPool.UnbondedTokens+newPool.BondedTokens, - pool.BondedTokens+pool.UnbondedTokens, + tokens.Add(newPool.UnbondedTokens).Add(newPool.BondedTokens), + pool.BondedTokens.Add(pool.UnbondedTokens), "Tokens were not conserved: %s", msg) } func TestUpdateStatus(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) pool := keeper.GetPool(ctx) val := NewValidator(addrs[0], pks[0], Description{}) - val, pool, _ = val.addTokensFromDel(pool, 100) + val, pool, _ = val.addTokensFromDel(pool, sdk.NewInt(100)) assert.Equal(t, int64(0), val.PoolShares.Bonded().Evaluate()) assert.Equal(t, int64(0), val.PoolShares.Unbonding().Evaluate()) assert.Equal(t, int64(100), val.PoolShares.Unbonded().Evaluate()) - assert.Equal(t, int64(0), pool.BondedTokens) - assert.Equal(t, int64(0), pool.UnbondingTokens) - assert.Equal(t, int64(100), pool.UnbondedTokens) + assert.Equal(t, int64(0), pool.BondedTokens.Int64()) + assert.Equal(t, int64(0), pool.UnbondingTokens.Int64()) + assert.Equal(t, int64(100), pool.UnbondedTokens.Int64()) val, pool = val.UpdateStatus(pool, sdk.Unbonding) assert.Equal(t, int64(0), val.PoolShares.Bonded().Evaluate()) assert.Equal(t, int64(100), val.PoolShares.Unbonding().Evaluate()) assert.Equal(t, int64(0), val.PoolShares.Unbonded().Evaluate()) - assert.Equal(t, int64(0), pool.BondedTokens) - assert.Equal(t, int64(100), pool.UnbondingTokens) - assert.Equal(t, int64(0), pool.UnbondedTokens) + assert.Equal(t, int64(0), pool.BondedTokens.Int64()) + assert.Equal(t, int64(100), pool.UnbondingTokens.Int64()) + assert.Equal(t, int64(0), pool.UnbondedTokens.Int64()) val, pool = val.UpdateStatus(pool, sdk.Bonded) assert.Equal(t, int64(100), val.PoolShares.Bonded().Evaluate()) assert.Equal(t, int64(0), val.PoolShares.Unbonding().Evaluate()) assert.Equal(t, int64(0), val.PoolShares.Unbonded().Evaluate()) - assert.Equal(t, int64(100), pool.BondedTokens) - assert.Equal(t, int64(0), pool.UnbondingTokens) - assert.Equal(t, int64(0), pool.UnbondedTokens) + assert.Equal(t, int64(100), pool.BondedTokens.Int64()) + assert.Equal(t, int64(0), pool.UnbondingTokens.Int64()) + assert.Equal(t, int64(0), pool.UnbondedTokens.Int64()) } //________________________________________________________________________________ @@ -176,10 +176,10 @@ func randomSetup(r *rand.Rand, numValidators int) (Pool, Validators) { validator := randomValidator(r, i) if validator.Status() == sdk.Bonded { pool.BondedShares = pool.BondedShares.Add(validator.PoolShares.Bonded()) - pool.BondedTokens += validator.PoolShares.Bonded().Evaluate() + pool.BondedTokens = pool.BondedTokens.Add(validator.PoolShares.Bonded().EvaluateInt()) } else if validator.Status() == sdk.Unbonded { pool.UnbondedShares = pool.UnbondedShares.Add(validator.PoolShares.Unbonded()) - pool.UnbondedTokens += validator.PoolShares.Unbonded().Evaluate() + pool.UnbondedTokens = pool.UnbondedTokens.Add(validator.PoolShares.Unbonded().EvaluateInt()) } validators[i] = validator } @@ -189,10 +189,10 @@ func randomSetup(r *rand.Rand, numValidators int) (Pool, Validators) { // any operation that transforms staking state // takes in RNG instance, pool, validator // returns updated pool, updated validator, delta tokens, descriptive message -type Operation func(r *rand.Rand, pool Pool, c Validator) (Pool, Validator, int64, string) +type Operation func(r *rand.Rand, pool Pool, c Validator) (Pool, Validator, sdk.Int, string) // operation: bond or unbond a validator depending on current status -func OpBondOrUnbond(r *rand.Rand, pool Pool, val Validator) (Pool, Validator, int64, string) { +func OpBondOrUnbond(r *rand.Rand, pool Pool, val Validator) (Pool, Validator, sdk.Int, string) { var msg string var newStatus sdk.BondStatus if val.Status() == sdk.Bonded { @@ -206,21 +206,21 @@ func OpBondOrUnbond(r *rand.Rand, pool Pool, val Validator) (Pool, Validator, in newStatus = sdk.Bonded } val, pool = val.UpdateStatus(pool, newStatus) - return pool, val, 0, msg + return pool, val, sdk.ZeroInt(), msg } // operation: add a random number of tokens to a validator -func OpAddTokens(r *rand.Rand, pool Pool, val Validator) (Pool, Validator, int64, string) { - tokens := int64(r.Int31n(1000)) +func OpAddTokens(r *rand.Rand, pool Pool, val Validator) (Pool, Validator, sdk.Int, string) { + tokens := sdk.NewInt(int64(r.Int31n(1000))) msg := fmt.Sprintf("validator %s (status: %d, poolShares: %v, delShares: %v, DelegatorShareExRate: %v)", val.Owner, val.Status(), val.PoolShares.Bonded(), val.DelegatorShares, val.DelegatorShareExRate(pool)) val, pool, _ = val.addTokensFromDel(pool, tokens) - msg = fmt.Sprintf("Added %d tokens to %s", tokens, msg) - return pool, val, -1 * tokens, msg // tokens are removed so for accounting must be negative + msg = fmt.Sprintf("Added %v tokens to %s", tokens, msg) + return pool, val, tokens.Neg(), msg // tokens are removed so for accounting must be negative } // operation: remove a random number of shares from a validator -func OpRemoveShares(r *rand.Rand, pool Pool, val Validator) (Pool, Validator, int64, string) { +func OpRemoveShares(r *rand.Rand, pool Pool, val Validator) (Pool, Validator, sdk.Int, string) { var shares sdk.Rat for { shares = sdk.NewRat(int64(r.Int31n(1000))) @@ -251,12 +251,12 @@ func randomOperation(r *rand.Rand) Operation { // ensure invariants that should always be true are true func assertInvariants(t *testing.T, msg string, - pOrig Pool, cOrig Validators, pMod Pool, vMods Validators, tokens int64) { + pOrig Pool, cOrig Validators, pMod Pool, vMods Validators, tokens sdk.Int) { // total tokens conserved require.Equal(t, - pOrig.UnbondedTokens+pOrig.BondedTokens, - pMod.UnbondedTokens+pMod.BondedTokens+tokens, + pOrig.UnbondedTokens.Add(pOrig.BondedTokens), + pMod.UnbondedTokens.Add(pMod.BondedTokens).Add(tokens), "Tokens not conserved - msg: %v\n, pOrig.PoolShares.Bonded(): %v, pOrig.PoolShares.Unbonded(): %v, pMod.PoolShares.Bonded(): %v, pMod.PoolShares.Unbonded(): %v, pOrig.UnbondedTokens: %v, pOrig.BondedTokens: %v, pMod.UnbondedTokens: %v, pMod.BondedTokens: %v, tokens: %v\n", msg, pOrig.BondedShares, pOrig.UnbondedShares, @@ -330,17 +330,17 @@ func TestPossibleOverflow(t *testing.T) { pool := Pool{ BondedShares: poolShares, UnbondedShares: sdk.ZeroRat(), - BondedTokens: poolShares.Evaluate(), - UnbondedTokens: 0, + BondedTokens: poolShares.EvaluateInt(), + UnbondedTokens: sdk.ZeroInt(), InflationLastTime: 0, Inflation: sdk.NewRat(7, 100), } - tokens := int64(71) + tokens := sdk.NewInt(71) msg := fmt.Sprintf("validator %s (status: %d, poolShares: %v, delShares: %v, DelegatorShareExRate: %v)", val.Owner, val.Status(), val.PoolShares.Bonded(), val.DelegatorShares, val.DelegatorShareExRate(pool)) newValidator, _, _ := val.addTokensFromDel(pool, tokens) - msg = fmt.Sprintf("Added %d tokens to %s", tokens, msg) + msg = fmt.Sprintf("Added %v tokens to %s", tokens, msg) require.False(t, newValidator.DelegatorShareExRate(pool).LT(sdk.ZeroRat()), "Applying operation \"%s\" resulted in negative DelegatorShareExRate(): %v", msg, newValidator.DelegatorShareExRate(pool)) @@ -357,7 +357,7 @@ func TestSingleValidatorIntegrationInvariants(t *testing.T) { // sanity check assertInvariants(t, "no operation", poolOrig, validatorsOrig, - poolOrig, validatorsOrig, 0) + poolOrig, validatorsOrig, sdk.ZeroInt()) for j := 0; j < 5; j++ { poolMod, validatorMod, tokens, msg := randomOperation(r)(r, poolOrig, validatorsOrig[0]) @@ -387,7 +387,7 @@ func TestMultiValidatorIntegrationInvariants(t *testing.T) { assertInvariants(t, "no operation", poolOrig, validatorsOrig, - poolOrig, validatorsOrig, 0) + poolOrig, validatorsOrig, sdk.ZeroInt()) for j := 0; j < 5; j++ { index := int(r.Int31n(int32(len(validatorsOrig)))) diff --git a/x/stake/view_slash_keeper_test.go b/x/stake/view_slash_keeper_test.go index 7f481fc601..a65c3fb386 100644 --- a/x/stake/view_slash_keeper_test.go +++ b/x/stake/view_slash_keeper_test.go @@ -11,7 +11,7 @@ import ( // tests GetDelegation, GetDelegations func TestViewSlashBond(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) + ctx, _, keeper := createTestInput(t, false, sdk.NewInt(0)) //construct the validators amts := []int64{9, 8, 7} From 364bb0813f7c2db2b937fc52859b457e86179a95 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Sat, 16 Jun 2018 05:36:01 +0200 Subject: [PATCH 275/548] Merge PR #1282: Fix CircleCI --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2e6d1779bc..762bd5de72 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ version: 2 defaults: &defaults working_directory: /go/src/github.com/cosmos/cosmos-sdk docker: - - image: circleci/golang:1.10.0 + - image: circleci/golang:1.10.3 environment: GOBIN: /tmp/workspace/bin From aa51fddaca02376ddedd71b677d4ce15df5bc73c Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Wed, 13 Jun 2018 18:33:09 -0700 Subject: [PATCH 276/548] add comments --- tests/util.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/util.go b/tests/util.go index c47d9907f7..387ccb769b 100644 --- a/tests/util.go +++ b/tests/util.go @@ -12,6 +12,8 @@ import ( rpcclient "github.com/tendermint/tendermint/rpc/lib/client" ) +// Wait for the next tendermint block from the Tendermint RPC +// on localhost func WaitForNextHeightTM(port string) { url := fmt.Sprintf("http://localhost:%v", port) cl := tmclient.NewHTTP(url, "/websocket") @@ -22,6 +24,8 @@ func WaitForNextHeightTM(port string) { waitForHeightTM(resBlock.Block.Height+1, url) } +// Wait for the given height from the Tendermint RPC +// on localhost func WaitForHeightTM(height int64, port string) { url := fmt.Sprintf("http://localhost:%v", port) waitForHeightTM(height, url) @@ -54,7 +58,7 @@ func waitForHeightTM(height int64, url string) { } } -// Uses localhost +// Wait for height from the LCD API on localhost func WaitForHeight(height int64, port string) { url := fmt.Sprintf("http://localhost:%v/blocks/latest", port) waitForHeight(height, url) From 3c10b54ec7a1efe305297609c335db2acb3a32b5 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Sat, 16 Jun 2018 00:02:20 -0700 Subject: [PATCH 277/548] fix circle --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ceb9e78a8d..6aa1662291 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ version: 2 defaults: &defaults working_directory: /go/src/github.com/cosmos/cosmos-sdk docker: - - image: circleci/golang:1.10.0 + - image: circleci/golang:1.10.3 environment: GOBIN: /tmp/workspace/bin From 85389f0db9d60f938555634c90cb9f0cbb47939d Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Thu, 14 Jun 2018 17:48:33 -0700 Subject: [PATCH 278/548] docs/spec/staking: update state.md --- docs/spec/staking/state.md | 87 +++++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 33 deletions(-) diff --git a/docs/spec/staking/state.md b/docs/spec/staking/state.md index 1cfe4b26e6..064d4879a2 100644 --- a/docs/spec/staking/state.md +++ b/docs/spec/staking/state.md @@ -52,13 +52,21 @@ type Params struct { ``` ### Validator - - index 1: validator owner address - - index 2: validator Tendermint PubKey - - index 3: bonded validators only - - index 4: voting power -Related Store which holds Validator.ABCIValidator() - - index: validator owner address +val owner address: SDK account addresss of the owner of the validator :) +tm val pubkey: Public Key of the Tendermint Validator + + - map1: -> + - map2: -> + - map3: -> + + map1 is the main lookup. each owner can have only one validator. + delegators point to an immutable owner + owners can change their TM val pubkey + need map2 so we can do lookups for slashing ! + need map3 so we have sorted vals to know the top 100 + +----------- The `Validator` holds the current state and some historical actions of the validator. @@ -67,7 +75,6 @@ validator. ```golang type Validator struct { - Owner sdk.Address // sender of BondTx - UnbondTx returns here ConsensusPubKey crypto.PubKey // Tendermint consensus pubkey of validator Revoked bool // has the validator been revoked? @@ -75,17 +82,26 @@ type Validator struct { DelegatorShares sdk.Rat // total shares issued to a validator's delegators SlashRatio sdk.Rat // increases each time the validator is slashed - Description Description // description terms for the validator - BondHeight int64 // earliest height as a bonded validator - BondIntraTxCounter int16 // block-local tx index of validator change - ProposerRewardPool sdk.Coins // reward pool collected from being the proposer + Description Description // description terms for the validator - Commission sdk.Rat // the commission rate of fees charged to any delegators - CommissionMax sdk.Rat // maximum commission rate which this validator can ever charge - CommissionChangeRate sdk.Rat // maximum daily increase of the validator commission - CommissionChangeToday sdk.Rat // commission rate change today, reset each day (UTC time) + // Needed for ordering vals in the bypower key + BondHeight int64 // earliest height as a bonded validator + BondIntraTxCounter int16 // block-local tx index of validator change - PrevPoolShares PoolShares // total shares of a global hold pools + CommissionInfo CommissionInfo // info about the validator's commission + + ProposerRewardPool sdk.Coins // reward pool collected from being the proposer + + // TODO: maybe this belongs in distribution module ? + PrevPoolShares PoolShares // total shares of a global hold pools +} + +type CommissionInfo struct { + Rate sdk.Rat // the commission rate of fees charged to any delegators + Max sdk.Rat // maximum commission rate which this validator can ever charge + ChangeRate sdk.Rat // maximum daily increase of the validator commission + ChangeToday sdk.Rat // commission rate change today, reset each day (UTC time) + LastChange int64 // unix timestamp of last commission change } type Description struct { @@ -97,7 +113,8 @@ type Description struct { ``` ### Delegation - - index: delegation address + + - map1: < delegator address | val owner address > -> < delegation > Atom holders may delegate coins to validators; under this circumstance their funds are held in a `Delegation` data structure. It is owned by one @@ -108,15 +125,18 @@ the transaction is the owner of the bond. ```golang type Delegation struct { - DelegatorAddr sdk.Address // delegation owner address - ValidatorAddr sdk.Address // validator owner address - Shares sdk.Rat // delegation shares recieved - Height int64 // last height bond updated + Shares sdk.Rat // delegation shares recieved + Height int64 // last height bond updated } ``` ### UnbondingDelegation - - index: delegation address + + - map1: < prefix-unbonding | delegator address | val owner address > -> < unbonding delegation > + - map2: < prefix-unbonding | val owner address | delegator address > -> nil + + map1 for queries. + map2 for eager slashing A UnbondingDelegation object is created every time an unbonding is initiated. The unbond must be completed with a second transaction provided by the @@ -126,18 +146,23 @@ delegation owner after the unbonding period has passed. ```golang type UnbondingDelegation struct { - DelegationKey sdk.Address // key of the delegation - ExpectedTokens sdk.Coins // the value in Atoms of the amount of shares which are unbonding - StartSlashRatio sdk.Rat // validator slash ratio at unbonding initiation + Tokens sdk.Coins // the value in Atoms of the amount of shares which are unbonding CompleteTime int64 // unix time to complete redelegation - CompleteHeight int64 // block height to complete redelegation } ``` ### Redelegation - - index 1: delegation address - - index 2: source validator owner address - - index 3: destination validator owner address + + - map1: < prefix-redelegation | delegator address | from val owner address | to + val owner address > -> < redelegation > + - map2: < prefix-redelegation | from val owner address | to + val owner address | delegator > -> nil + - map2: < prefix-redelegation | to val owner address | from + val owner address | delegator > -> nil + + map1: queries + map2: slash for from validator + map3: slash for to validator A redelegation object is created every time a redelegation occurs. The redelegation must be completed with a second transaction provided by the @@ -149,12 +174,8 @@ the original redelegation has been completed. ```golang type Redelegation struct { - SourceDelegation sdk.Address // source delegation key - DestinationDelegation sdk.Address // destination delegation key SourceShares sdk.Rat // amount of source shares redelegating DestinationShares sdk.Rat // amount of destination shares created at redelegation - SourceStartSlashRatio sdk.Rat // source validator slash ratio at unbonding initiation CompleteTime int64 // unix time to complete redelegation - CompleteHeight int64 // block height to complete redelegation } ``` From cab0a9bbae502a2a212a13adb52f65883733532f Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Thu, 14 Jun 2018 20:26:21 -0700 Subject: [PATCH 279/548] docs/spec/slashing --- .../end-block.md} | 73 ++++++++++++++++--- docs/spec/{WIP_slashing => slashing}/state.md | 0 .../transactions.md | 0 3 files changed, 62 insertions(+), 11 deletions(-) rename docs/spec/{WIP_slashing/valset-changes.md => slashing/end-block.md} (63%) rename docs/spec/{WIP_slashing => slashing}/state.md (100%) rename docs/spec/{WIP_slashing => slashing}/transactions.md (100%) diff --git a/docs/spec/WIP_slashing/valset-changes.md b/docs/spec/slashing/end-block.md similarity index 63% rename from docs/spec/WIP_slashing/valset-changes.md rename to docs/spec/slashing/end-block.md index 8aad213b80..840269d3ec 100644 --- a/docs/spec/WIP_slashing/valset-changes.md +++ b/docs/spec/slashing/end-block.md @@ -23,18 +23,52 @@ For some `evidence` to be valid, it must satisfy: where `evidence.Timestamp` is the timestamp in the block at height `evidence.Height` and `block.Timestamp` is the current block timestamp. -If valid evidence is included in a block, the offending validator loses -a constant `SLASH_PROPORTION` of their current stake at the beginning of the block: +If valid evidence is included in a block, the validator's stake is reduced by `SLASH_PROPORTION` of +what there stake was at the eqiuvocation occurred (rather than when it was found): ``` -oldShares = validator.shares -validator.shares = oldShares * (1 - SLASH_PROPORTION) +curVal := validator +oldVal := loadValidator(evidence.Height, evidence.Address) + +slashAmount := SLASH_PROPORTION * oldVal.Shares + +curVal.Shares -= slashAmount ``` This ensures that offending validators are punished the same amount whether they act as a single validator with X stake or as N validators with collectively X stake. +We also need to loop through the unbondings and redelegations to slash them as +well: + +``` +unbondings := getUnbondings(validator.Address) +for unbond in unbondings { + if was not bonded before evidence.Height { + continue + } + unbond.InitialTokens + burn := unbond.InitialTokens * SLASH_PROPORTION + unbond.Tokens -= burn +} + +// only care if source gets slashed because we're already bonded to destination +// so if destination validator gets slashed our delegation just has same shares +// of smaller pool. +redels := getRedelegationsBySource(validator.Address) +for redel in redels { + + if was not bonded before evidence.Height { + continue + } + + burn := redel.InitialTokens * SLASH_PROPORTION + + amount := unbondFromValidator(redel.Destination, burn) + destroy(amount) +} +``` ## Automatic Unbonding @@ -49,6 +83,11 @@ LastCommit and +2/3 (see [TODO](https://github.com/cosmos/cosmos-sdk/issues/967) Validators are penalized for failing to be included in the LastCommit for some number of blocks by being automatically unbonded. +Maps: + +- map1: < prefix-info | tm val addr > -> +- map2: < prefix-bit-array | tm val addr | LE uint64 index in sign bit array > -> < signed bool > + The following information is stored with each validator candidate, and is only non-zero if the candidate becomes an active validator: ```go @@ -57,8 +96,8 @@ type ValidatorSigningInfo struct { IndexOffset int64 JailedUntil int64 SignedBlocksCounter int64 - SignedBlocksBitArray BitArray } + ``` Where: @@ -66,8 +105,13 @@ Where: * `IndexOffset` is incremented each time the candidate was a bonded validator in a block (and may have signed a precommit or not). * `JailedUntil` is set whenever the candidate is revoked due to downtime * `SignedBlocksCounter` is a counter kept to avoid unnecessary array reads. `SignedBlocksBitArray.Sum() == SignedBlocksCounter` always. -* `SignedBlocksBitArray` is a bit-array of size `SIGNED_BLOCKS_WINDOW` that records, for each of the last `SIGNED_BLOCKS_WINDOW` blocks, -whether or not this validator was included in the LastCommit. It uses a `1` if the validator was included, and a `0` if it was not. Note it is initialized with all 0s. + + +Map2 simulates a bit array - better to do the lookup rather than read/write the +bitarray every time. Size of bit-array is `SIGNED_BLOCKS_WINDOW`. It records, for each of the last `SIGNED_BLOCKS_WINDOW` blocks, +whether or not this validator was included in the LastCommit. +It sets the value to true if the validator was included and false if not. +Note it is not explicilty initialized (the keys wont exist). At the beginning of each block, we update the signing info for each validator and check if they should be automatically unbonded: @@ -75,17 +119,21 @@ At the beginning of each block, we update the signing info for each validator an height := block.Height for val in block.Validators: - signInfo = val.SignInfo + signInfo = getSignInfo(val.Address) + if signInfo == nil{ + signInfo.StartHeight = height + } + index := signInfo.IndexOffset % SIGNED_BLOCKS_WINDOW signInfo.IndexOffset++ - previous = signInfo.SignedBlocksBitArray.Get(index) + previous = getDidSign(val.Address, index) // update counter if array has changed if previous and val in block.AbsentValidators: - signInfo.SignedBlocksBitArray.Set(index, 0) + setDidSign(val.Address, index, false) signInfo.SignedBlocksCounter-- else if !previous and val not in block.AbsentValidators: - signInfo.SignedBlocksBitArray.Set(index, 1) + setDidSign(val.Address, index, true) signInfo.SignedBlocksCounter++ // else previous == val not in block.AbsentValidators, no change @@ -96,5 +144,8 @@ for val in block.Validators: minSigned = SIGNED_BLOCKS_WINDOW / 2 if height > minHeight AND signInfo.SignedBlocksCounter < minSigned: signInfo.JailedUntil = block.Time + DOWNTIME_UNBOND_DURATION + slash & unbond the validator + + setSignInfo(val.Address, signInfo) ``` diff --git a/docs/spec/WIP_slashing/state.md b/docs/spec/slashing/state.md similarity index 100% rename from docs/spec/WIP_slashing/state.md rename to docs/spec/slashing/state.md diff --git a/docs/spec/WIP_slashing/transactions.md b/docs/spec/slashing/transactions.md similarity index 100% rename from docs/spec/WIP_slashing/transactions.md rename to docs/spec/slashing/transactions.md From 1b93f468bc32ef33df76b3c790214fba47f2fef2 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Fri, 15 Jun 2018 02:53:00 -0700 Subject: [PATCH 280/548] docs/spec/staking: clean up state.md --- docs/spec/staking/state.md | 162 +++++++++++++++++++++---------------- 1 file changed, 91 insertions(+), 71 deletions(-) diff --git a/docs/spec/staking/state.md b/docs/spec/staking/state.md index 064d4879a2..2593f4754c 100644 --- a/docs/spec/staking/state.md +++ b/docs/spec/staking/state.md @@ -1,44 +1,43 @@ ## State ### Pool - - index: n/a single-record + + - key: `01` + - value: `amino(pool)` The pool is a space for all dynamic global state of the Cosmos Hub. It tracks information about the total amounts of Atoms in all states, representative validator shares for stake in the global pools, moving Atom inflation information, etc. - - stored object: - ```golang type Pool struct { LooseUnbondedTokens int64 // tokens not associated with any validator - UnbondedTokens int64 // reserve of unbonded tokens held with validators - UnbondingTokens int64 // tokens moving from bonded to unbonded pool - BondedTokens int64 // reserve of bonded tokens - UnbondedShares sdk.Rat // sum of all shares distributed for the Unbonded Pool - UnbondingShares sdk.Rat // shares moving from Bonded to Unbonded Pool - BondedShares sdk.Rat // sum of all shares distributed for the Bonded Pool - InflationLastTime int64 // block which the last inflation was processed // TODO make time - Inflation sdk.Rat // current annual inflation rate - - DateLastCommissionReset int64 // unix timestamp for last commission accounting reset (daily) + UnbondedTokens int64 // reserve of unbonded tokens held with validators + UnbondingTokens int64 // tokens moving from bonded to unbonded pool + BondedTokens int64 // reserve of bonded tokens + UnbondedShares sdk.Rat // sum of all shares distributed for the Unbonded Pool + UnbondingShares sdk.Rat // shares moving from Bonded to Unbonded Pool + BondedShares sdk.Rat // sum of all shares distributed for the Bonded Pool + InflationLastTime int64 // block which the last inflation was processed // TODO make time + Inflation sdk.Rat // current annual inflation rate + + DateLastCommissionReset int64 // unix timestamp for last commission accounting reset (daily) } type PoolShares struct { - Status sdk.BondStatus // either: unbonded, unbonding, or bonded - Amount sdk.Rat // total shares of type ShareKind + Status sdk.BondStatus // either: unbonded, unbonding, or bonded + Amount sdk.Rat // total shares of type ShareKind } ``` ### Params - - index: n/a single-record + - key: `00` + - value: `amino(params)` Params is global data structure that stores system parameters and defines overall functioning of the stake module. - - stored object: - ```golang type Params struct { InflationRateChange sdk.Rat // maximum annual change in inflation rate @@ -53,54 +52,62 @@ type Params struct { ### Validator -val owner address: SDK account addresss of the owner of the validator :) -tm val pubkey: Public Key of the Tendermint Validator +Validators are identified according to the `ValOwnerAddr`, +an SDK account address for the owner of the validator. - - map1: -> - - map2: -> - - map3: -> +Validators also have a `ValTendermintAddr`, the address +of the public key of the validator. - map1 is the main lookup. each owner can have only one validator. - delegators point to an immutable owner - owners can change their TM val pubkey - need map2 so we can do lookups for slashing ! - need map3 so we have sorted vals to know the top 100 +Validators are indexed in the store using the following maps: ------------ + - Validators: `0x02 | ValOwnerAddr -> amino(validator)` + - ValidatorsByPubKey: `0x03 | ValTendermintAddr -> ValOwnerAddr` + - ValidatorsByPower: `0x05 | power | blockHeight | blockTx -> ValOwnerAddr` + + `Validators` is the primary index - it ensures that each owner can have only one + associated validator, where the public key of that validator can change in the + future. Delegators can refer to the immutable owner of the validator, without + concern for the changing public key. + + `ValidatorsByPubKey` is a secondary index that enables lookups for slashing. + When Tendermint reports evidence, it provides the validator address, so this + map is needed to find the owner. + + `ValidatorsByPower` is a secondary index that provides a sorted list of + potential validators to quickly determine the current active set. For instance, + the first 100 validators in this list can be returned with every EndBlock. The `Validator` holds the current state and some historical actions of the validator. - - stored object: - ```golang type Validator struct { - ConsensusPubKey crypto.PubKey // Tendermint consensus pubkey of validator - Revoked bool // has the validator been revoked? - - PoolShares PoolShares // total shares for tokens held in the pool - DelegatorShares sdk.Rat // total shares issued to a validator's delegators - SlashRatio sdk.Rat // increases each time the validator is slashed - - Description Description // description terms for the validator - + ConsensusPubKey crypto.PubKey // Tendermint consensus pubkey of validator + Revoked bool // has the validator been revoked? + + PoolShares PoolShares // total shares for tokens held in the pool + DelegatorShares sdk.Rat // total shares issued to a validator's delegators + SlashRatio sdk.Rat // increases each time the validator is slashed + + Description Description // description terms for the validator + // Needed for ordering vals in the bypower key - BondHeight int64 // earliest height as a bonded validator - BondIntraTxCounter int16 // block-local tx index of validator change - + BondHeight int64 // earliest height as a bonded validator + BondIntraTxCounter int16 // block-local tx index of validator change + CommissionInfo CommissionInfo // info about the validator's commission - - ProposerRewardPool sdk.Coins // reward pool collected from being the proposer - + + ProposerRewardPool sdk.Coins // reward pool collected from being the proposer + // TODO: maybe this belongs in distribution module ? - PrevPoolShares PoolShares // total shares of a global hold pools + PrevPoolShares PoolShares // total shares of a global hold pools } type CommissionInfo struct { - Rate sdk.Rat // the commission rate of fees charged to any delegators - Max sdk.Rat // maximum commission rate which this validator can ever charge - ChangeRate sdk.Rat // maximum daily increase of the validator commission - ChangeToday sdk.Rat // commission rate change today, reset each day (UTC time) + Rate sdk.Rat // the commission rate of fees charged to any delegators + Max sdk.Rat // maximum commission rate which this validator can ever charge + ChangeRate sdk.Rat // maximum daily increase of the validator commission + ChangeToday sdk.Rat // commission rate change today, reset each day (UTC time) LastChange int64 // unix timestamp of last commission change } @@ -114,15 +121,16 @@ type Description struct { ### Delegation - - map1: < delegator address | val owner address > -> < delegation > +Delegations are identified by combining `DelegatorAddr` (the address of the delegator) with the ValOwnerAddr +Delegators are indexed in the store as follows: + + - Delegation: ` 0x0A | DelegatorAddr | ValOwnerAddr -> amino(delegation)` Atom holders may delegate coins to validators; under this circumstance their funds are held in a `Delegation` data structure. It is owned by one delegator, and is associated with the shares for one validator. The sender of the transaction is the owner of the bond. - - stored object: - ```golang type Delegation struct { Shares sdk.Rat // delegation shares recieved @@ -132,18 +140,25 @@ type Delegation struct { ### UnbondingDelegation - - map1: < prefix-unbonding | delegator address | val owner address > -> < unbonding delegation > - - map2: < prefix-unbonding | val owner address | delegator address > -> nil +Shares in a `Delegation` can be unbonded, but they must for some time exist as an `UnbondingDelegation`, +where shares can be reduced if Byzantine behaviour is detected. - map1 for queries. - map2 for eager slashing +`UnbondingDelegation` are indexed in the store as: + + - UnbondingDelegationByDelegator: ` 0x0B | DelegatorAddr | ValOwnerAddr -> + amino(unbondingDelegation)` + - UnbondingDelegationByValOwner: ` 0x0C | ValOwnerAddr | DelegatorAddr | ValOwnerAddr -> + nil` + + The first map here is used in queries, to lookup all unbonding delegations for + a given delegator, while the second map is used in slashing, to lookup all + unbonding delegations associated with a given validator that need to be + slashed. A UnbondingDelegation object is created every time an unbonding is initiated. The unbond must be completed with a second transaction provided by the delegation owner after the unbonding period has passed. - - stored object: - ```golang type UnbondingDelegation struct { Tokens sdk.Coins // the value in Atoms of the amount of shares which are unbonding @@ -153,16 +168,23 @@ type UnbondingDelegation struct { ### Redelegation - - map1: < prefix-redelegation | delegator address | from val owner address | to - val owner address > -> < redelegation > - - map2: < prefix-redelegation | from val owner address | to - val owner address | delegator > -> nil - - map2: < prefix-redelegation | to val owner address | from - val owner address | delegator > -> nil +Shares in a `Delegation` can be rebonded to a different validator, but they must for some time exist as a `Redelegation`, +where shares can be reduced if Byzantine behaviour is detected. This is tracked +as moving a delegation from a `FromValOwnerAddr` to a `ToValOwnerAddr`. - map1: queries - map2: slash for from validator - map3: slash for to validator +`Redelegation` are indexed in the store as: + + - Redelegations: `0x0D | DelegatorAddr | FromValOwnerAddr | ToValOwnerAddr -> + amino(redelegation)` + - RedelegationsBySrc: `0x0E | FromValOwnerAddr | ToValOwnerAddr | + DelegatorAddr -> nil` + - RedelegationsByDst: `0x0F | ToValOwnerAddr | FromValOwnerAddr | DelegatorAddr + -> nil` + + +The first map here is used for queries, to lookup all redelegations for a given +delegator. The second map is used for slashing based on the FromValOwnerAddr, +while the third map is for slashing based on the ToValOwnerAddr. A redelegation object is created every time a redelegation occurs. The redelegation must be completed with a second transaction provided by the @@ -170,8 +192,6 @@ delegation owner after the unbonding period has passed. The destination delegation of a redelegation may not itself undergo a new redelegation until the original redelegation has been completed. - - stored object: - ```golang type Redelegation struct { SourceShares sdk.Rat // amount of source shares redelegating From 902d066f52338d97488da304a1641e4d4b313e01 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Fri, 15 Jun 2018 03:22:06 -0700 Subject: [PATCH 281/548] docs/spec/slashing: separate out a proper state.md --- docs/spec/WIP_provisioning/state.md | 13 +++++ .../slashing/{end-block.md => end_block.md} | 53 +++--------------- docs/spec/slashing/state.md | 54 ++++++++++++++++--- 3 files changed, 65 insertions(+), 55 deletions(-) create mode 100644 docs/spec/WIP_provisioning/state.md rename docs/spec/slashing/{end-block.md => end_block.md} (60%) diff --git a/docs/spec/WIP_provisioning/state.md b/docs/spec/WIP_provisioning/state.md new file mode 100644 index 0000000000..0711b01aac --- /dev/null +++ b/docs/spec/WIP_provisioning/state.md @@ -0,0 +1,13 @@ + + +Validator + +* Adjustment factor used to passively calculate each validators entitled fees + from `GlobalState.FeePool` + +Delegation Shares + +* AdjustmentFeePool: Adjustment factor used to passively calculate each bonds + entitled fees from `GlobalState.FeePool` +* AdjustmentRewardPool: Adjustment factor used to passively calculate each + bonds entitled fees from `Validator.ProposerRewardPool` diff --git a/docs/spec/slashing/end-block.md b/docs/spec/slashing/end_block.md similarity index 60% rename from docs/spec/slashing/end-block.md rename to docs/spec/slashing/end_block.md index 840269d3ec..d86b7110b0 100644 --- a/docs/spec/slashing/end-block.md +++ b/docs/spec/slashing/end_block.md @@ -1,4 +1,4 @@ -# Validator Set Changes +# End-Block ## Slashing @@ -72,68 +72,27 @@ for redel in redels { ## Automatic Unbonding -Every block includes a set of precommits by the validators for the previous block, -known as the LastCommit. A LastCommit is valid so long as it contains precommits from +2/3 of voting power. - -Proposers are incentivized to include precommits from all -validators in the LastCommit by receiving additional fees -proportional to the difference between the voting power included in the -LastCommit and +2/3 (see [TODO](https://github.com/cosmos/cosmos-sdk/issues/967)). - -Validators are penalized for failing to be included in the LastCommit for some -number of blocks by being automatically unbonded. - -Maps: - -- map1: < prefix-info | tm val addr > -> -- map2: < prefix-bit-array | tm val addr | LE uint64 index in sign bit array > -> < signed bool > - -The following information is stored with each validator candidate, and is only non-zero if the candidate becomes an active validator: - -```go -type ValidatorSigningInfo struct { - StartHeight int64 - IndexOffset int64 - JailedUntil int64 - SignedBlocksCounter int64 -} - -``` - -Where: -* `StartHeight` is set to the height that the candidate became an active validator (with non-zero voting power). -* `IndexOffset` is incremented each time the candidate was a bonded validator in a block (and may have signed a precommit or not). -* `JailedUntil` is set whenever the candidate is revoked due to downtime -* `SignedBlocksCounter` is a counter kept to avoid unnecessary array reads. `SignedBlocksBitArray.Sum() == SignedBlocksCounter` always. - - -Map2 simulates a bit array - better to do the lookup rather than read/write the -bitarray every time. Size of bit-array is `SIGNED_BLOCKS_WINDOW`. It records, for each of the last `SIGNED_BLOCKS_WINDOW` blocks, -whether or not this validator was included in the LastCommit. -It sets the value to true if the validator was included and false if not. -Note it is not explicilty initialized (the keys wont exist). - At the beginning of each block, we update the signing info for each validator and check if they should be automatically unbonded: ``` height := block.Height for val in block.Validators: - signInfo = getSignInfo(val.Address) + signInfo = SigningInfo.Get(val.Address) if signInfo == nil{ signInfo.StartHeight = height } index := signInfo.IndexOffset % SIGNED_BLOCKS_WINDOW signInfo.IndexOffset++ - previous = getDidSign(val.Address, index) + previous = SigningBitArray.Get(val.Address, index) // update counter if array has changed if previous and val in block.AbsentValidators: - setDidSign(val.Address, index, false) + SigningBitArray.Set(val.Address, index, false) signInfo.SignedBlocksCounter-- else if !previous and val not in block.AbsentValidators: - setDidSign(val.Address, index, true) + SigningBitArray.Set(val.Address, index, true) signInfo.SignedBlocksCounter++ // else previous == val not in block.AbsentValidators, no change @@ -147,5 +106,5 @@ for val in block.Validators: slash & unbond the validator - setSignInfo(val.Address, signInfo) + SigningInfo.Set(val.Address, signInfo) ``` diff --git a/docs/spec/slashing/state.md b/docs/spec/slashing/state.md index 0711b01aac..1df9d5022d 100644 --- a/docs/spec/slashing/state.md +++ b/docs/spec/slashing/state.md @@ -1,13 +1,51 @@ +## State +### Signing Info -Validator +Every block includes a set of precommits by the validators for the previous block, +known as the LastCommit. A LastCommit is valid so long as it contains precommits from +2/3 of voting power. -* Adjustment factor used to passively calculate each validators entitled fees - from `GlobalState.FeePool` +Proposers are incentivized to include precommits from all +validators in the LastCommit by receiving additional fees +proportional to the difference between the voting power included in the +LastCommit and +2/3 (see [TODO](https://github.com/cosmos/cosmos-sdk/issues/967)). -Delegation Shares +Validators are penalized for failing to be included in the LastCommit for some +number of blocks by being automatically unbonded. -* AdjustmentFeePool: Adjustment factor used to passively calculate each bonds - entitled fees from `GlobalState.FeePool` -* AdjustmentRewardPool: Adjustment factor used to passively calculate each - bonds entitled fees from `Validator.ProposerRewardPool` +Information about validator activity is tracked in a `ValidatorSigningInfo`. +It is indexed in the store as follows: + +- SigningInfo: ` 0x01 | ValTendermintAddr -> amino(valSigningInfo)` +- SigningBitArray: ` 0x02 | ValTendermintAddr | LittleEndianUint64(signArrayIndex) -> VarInt(didSign)` + +The first map allows us to easily lookup the recent signing info for a +validator, according to the Tendermint validator address. The second map acts as +a bit-array of size `SIGNED_BLOCKS_WINDOW` that tells us if the validator signed for a given index in the bit-array. + +The index in the bit-array is given as little endian uint64. + +The result is a `varint` that takes on `0` or `1`, where `0` indicates the +validator did not sign the corresponding block, and `1` indicates they did. + +Note that the SigningBitArray is not explicitly initialized up-front. Keys are +added as we progress through the first `SIGNED_BLOCKS_WINDOW` blocks for a newly +bonded validator. + +The information stored for tracking validator liveness is as follows: + +```go +type ValidatorSigningInfo struct { + StartHeight int64 + IndexOffset int64 + JailedUntil int64 + SignedBlocksCounter int64 +} + +``` + +Where: +* `StartHeight` is set to the height that the candidate became an active validator (with non-zero voting power). +* `IndexOffset` is incremented each time the candidate was a bonded validator in a block (and may have signed a precommit or not). +* `JailedUntil` is set whenever the candidate is revoked due to downtime +* `SignedBlocksCounter` is a counter kept to avoid unnecessary array reads. `SignedBlocksBitArray.Sum() == SignedBlocksCounter` always. From 0a6d09ebb32809b12e2caa7f3c61f6bde31bacc0 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 15 Jun 2018 23:26:14 +0200 Subject: [PATCH 282/548] Fix two typos, ensure nonnegative tokens --- docs/spec/slashing/end_block.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/spec/slashing/end_block.md b/docs/spec/slashing/end_block.md index d86b7110b0..ef36250ebb 100644 --- a/docs/spec/slashing/end_block.md +++ b/docs/spec/slashing/end_block.md @@ -24,7 +24,7 @@ where `evidence.Timestamp` is the timestamp in the block at height `evidence.Height` and `block.Timestamp` is the current block timestamp. If valid evidence is included in a block, the validator's stake is reduced by `SLASH_PROPORTION` of -what there stake was at the eqiuvocation occurred (rather than when it was found): +what their stake was when the equivocation occurred (rather than when the evidence was discovered): ``` curVal := validator @@ -32,7 +32,7 @@ oldVal := loadValidator(evidence.Height, evidence.Address) slashAmount := SLASH_PROPORTION * oldVal.Shares -curVal.Shares -= slashAmount +curVal.Shares = max(0, curVal.Shares - slashAmount) ``` This ensures that offending validators are punished the same amount whether they @@ -50,7 +50,7 @@ for unbond in unbondings { } unbond.InitialTokens burn := unbond.InitialTokens * SLASH_PROPORTION - unbond.Tokens -= burn + unbond.Tokens = max(0, unbond.Tokens - burn) } // only care if source gets slashed because we're already bonded to destination From 2219c3b1c784b5f67656adbe888bad2c4f59005c Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Fri, 15 Jun 2018 23:26:09 -0700 Subject: [PATCH 283/548] docs/spec/slashing: point to Tendermint evidence --- docs/spec/slashing/end_block.md | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/docs/spec/slashing/end_block.md b/docs/spec/slashing/end_block.md index ef36250ebb..5958d0a215 100644 --- a/docs/spec/slashing/end_block.md +++ b/docs/spec/slashing/end_block.md @@ -2,19 +2,11 @@ ## Slashing -Messges which may compromise the safety of the underlying consensus protocol ("equivocations") -result in some amount of the offending validator's shares being removed ("slashed"). - -Currently, such messages include only the following: - -- prevotes by the same validator for more than one BlockID at the same - Height and Round -- precommits by the same validator for more than one BlockID at the same - Height and Round - -We call any such pair of conflicting votes `Evidence`. Full nodes in the network prioritize the -detection and gossipping of `Evidence` so that it may be rapidly included in blocks and the offending -validators punished. +Tendermint blocks can include +[Evidence](https://github.com/tendermint/tendermint/blob/develop/docs/spec/blockchain/blockchain.md#evidence), which indicates that a validator +committed malicious behaviour. The relevant information is forwarded to the +application as [ABCI +Evidence](https://github.com/tendermint/abci/blob/develop/types/types.proto#L259), so the validator an be accordingly punished. For some `evidence` to be valid, it must satisfy: From 190d87d750d6695b47be240fd821bc3f1ea63e8d Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Sat, 16 Jun 2018 00:39:15 -0700 Subject: [PATCH 284/548] docs/spec: flesh out dir structure and update index --- docs/spec/README.md | 17 ++++++++--------- docs/spec/auth/state.md | 0 docs/spec/auth/transactions.md | 0 .../{basecoin/basecoin.md => bank/state.md} | 0 docs/spec/bank/transactions.md | 0 .../fee_distribution_model.xlsx | Bin .../overview.md | 0 .../state.md | 0 docs/spec/store/README.md | 0 9 files changed, 8 insertions(+), 9 deletions(-) create mode 100644 docs/spec/auth/state.md create mode 100644 docs/spec/auth/transactions.md rename docs/spec/{basecoin/basecoin.md => bank/state.md} (100%) create mode 100644 docs/spec/bank/transactions.md rename docs/spec/{WIP_provisioning => provisioning}/fee_distribution_model.xlsx (100%) rename docs/spec/{WIP_provisioning => provisioning}/overview.md (100%) rename docs/spec/{WIP_provisioning => provisioning}/state.md (100%) create mode 100644 docs/spec/store/README.md diff --git a/docs/spec/README.md b/docs/spec/README.md index b115e0d45b..4b58baf9e1 100644 --- a/docs/spec/README.md +++ b/docs/spec/README.md @@ -5,15 +5,14 @@ the Cosmos Hub. NOTE: the specifications are not yet complete and very much a work in progress. -- [Basecoin](basecoin) - Cosmos SDK related specifications and transactions for - sending tokens. -- [Governance](governance) - Governance related specifications including - proposals and voting. -- [IBC](ibc) - Specification of the Cosmos inter-blockchain communication (IBC) protocol. -- [Staking](staking) - Proof-of-stake related specifications including bonding - and delegation transactions, inflation, etc. -- [Slashing](slashing) - Specifications of validator punishment mechanisms -- [Provisioning](provisioning) - Fee distribution, and atom provision distribution specification +- [Store](store) - The core Merkle store that holds the state. +- [Auth](auth) - The structure and authnentication of accounts and transactions. +- [Bank](bank) - Sending tokens. +- [Governance](governance) - Proposals and voting. +- [IBC](ibc) - Inter-Blockchain Communication (IBC) protocol. +- [Staking](staking) - Proof-of-stake bonding, delegation, etc. +- [Slashing](slashing) - Validator punishment mechanisms. +- [Provisioning](provisioning) - Fee distribution, and atom provision distribution - [Other](other) - Other components of the Cosmos Hub, including the reserve pool, All in Bits vesting, etc. diff --git a/docs/spec/auth/state.md b/docs/spec/auth/state.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/spec/auth/transactions.md b/docs/spec/auth/transactions.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/spec/basecoin/basecoin.md b/docs/spec/bank/state.md similarity index 100% rename from docs/spec/basecoin/basecoin.md rename to docs/spec/bank/state.md diff --git a/docs/spec/bank/transactions.md b/docs/spec/bank/transactions.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/spec/WIP_provisioning/fee_distribution_model.xlsx b/docs/spec/provisioning/fee_distribution_model.xlsx similarity index 100% rename from docs/spec/WIP_provisioning/fee_distribution_model.xlsx rename to docs/spec/provisioning/fee_distribution_model.xlsx diff --git a/docs/spec/WIP_provisioning/overview.md b/docs/spec/provisioning/overview.md similarity index 100% rename from docs/spec/WIP_provisioning/overview.md rename to docs/spec/provisioning/overview.md diff --git a/docs/spec/WIP_provisioning/state.md b/docs/spec/provisioning/state.md similarity index 100% rename from docs/spec/WIP_provisioning/state.md rename to docs/spec/provisioning/state.md diff --git a/docs/spec/store/README.md b/docs/spec/store/README.md new file mode 100644 index 0000000000..e69de29bb2 From 1f88b0bf8fd5e32c50bb31ef06864d7626024ec8 Mon Sep 17 00:00:00 2001 From: Dev Ojha Date: Sat, 16 Jun 2018 00:49:55 -0700 Subject: [PATCH 285/548] Merge PR #1281: Don't run defers if it would result in an NPE * Don't run defers if it would result in an NPE * Nuke CircleCI caches --- .circleci/config.yml | 24 ++++++++++++------------ CHANGELOG.md | 7 +++++-- client/lcd/lcd_test.go | 28 ++++++++++++++-------------- server/start_test.go | 1 + server/test_helpers.go | 2 +- 5 files changed, 33 insertions(+), 29 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 762bd5de72..06f5bb03ba 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -16,7 +16,7 @@ jobs: - checkout - restore_cache: keys: - - v2-pkg-cache + - v1-pkg-cache - run: name: tools command: | @@ -39,11 +39,11 @@ jobs: - bin - profiles - save_cache: - key: v2-pkg-cache + key: v1-pkg-cache paths: - /go/pkg - save_cache: - key: v2-tree-{{ .Environment.CIRCLE_SHA1 }} + key: v1-tree-{{ .Environment.CIRCLE_SHA1 }} paths: - /go/src/github.com/cosmos/cosmos-sdk @@ -54,9 +54,9 @@ jobs: - attach_workspace: at: /tmp/workspace - restore_cache: - key: v2-pkg-cache + key: v1-pkg-cache - restore_cache: - key: v2-tree-{{ .Environment.CIRCLE_SHA1 }} + key: v1-tree-{{ .Environment.CIRCLE_SHA1 }} - run: name: Get metalinter command: | @@ -76,9 +76,9 @@ jobs: - attach_workspace: at: /tmp/workspace - restore_cache: - key: v2-pkg-cache + key: v1-pkg-cache - restore_cache: - key: v2-tree-{{ .Environment.CIRCLE_SHA1 }} + key: v1-tree-{{ .Environment.CIRCLE_SHA1 }} - run: name: Test unit command: | @@ -92,9 +92,9 @@ jobs: - attach_workspace: at: /tmp/workspace - restore_cache: - key: v2-pkg-cache + key: v1-pkg-cache - restore_cache: - key: v2-tree-{{ .Environment.CIRCLE_SHA1 }} + key: v1-tree-{{ .Environment.CIRCLE_SHA1 }} - run: name: Test cli command: | @@ -108,9 +108,9 @@ jobs: - attach_workspace: at: /tmp/workspace - restore_cache: - key: v2-pkg-cache + key: v1-pkg-cache - restore_cache: - key: v2-tree-{{ .Environment.CIRCLE_SHA1 }} + key: v1-tree-{{ .Environment.CIRCLE_SHA1 }} - run: name: Run tests command: | @@ -132,7 +132,7 @@ jobs: - attach_workspace: at: /tmp/workspace - restore_cache: - key: v2-tree-{{ .Environment.CIRCLE_SHA1 }} + key: v1-tree-{{ .Environment.CIRCLE_SHA1 }} - run: name: gather command: | diff --git a/CHANGELOG.md b/CHANGELOG.md index 889b41746e..4a8615977d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,14 @@ ## 0.20.0 -*TBD* +*TBD* BREAKING CHANGES * Change default ports from 466xx to 266xx +FIXES +* \#1259 - fix bug where certain tests that could have a nil pointer in defer + ## 0.19.0 *June 13, 2018* @@ -42,7 +45,7 @@ FEATURES * [docs] Reorganize documentation * [docs] Update staking spec, create WIP spec for slashing, and fees -## 0.18.0 +## 0.18.0 *June 9, 2018* diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index f4406a8693..d6a1b77425 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -87,7 +87,7 @@ func TestKeys(t *testing.T) { // update key jsonStr = []byte(fmt.Sprintf(`{ - "old_password":"%s", + "old_password":"%s", "new_password":"12345678901" }`, newPassword)) @@ -347,8 +347,8 @@ func TestTxs(t *testing.T) { func TestValidatorsQuery(t *testing.T) { cleanup, pks, port := InitializeTestLCD(t, 2, []sdk.Address{}) - require.Equal(t, 2, len(pks)) defer cleanup() + require.Equal(t, 2, len(pks)) validators := getValidators(t, port) assert.Equal(t, len(validators), 2) @@ -448,12 +448,12 @@ func doSend(t *testing.T, port, seed, name, password string, addr sdk.Address) ( } jsonStr := []byte(fmt.Sprintf(`{ - "name":"%s", + "name":"%s", "password":"%s", - "account_number":%d, - "sequence":%d, + "account_number":%d, + "sequence":%d, "gas": 10000, - "amount":[%s] + "amount":[%s] }`, name, password, accnum, sequence, coinbz)) res, body := Request(t, port, "POST", "/accounts/"+receiveAddrBech+"/send", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) @@ -478,18 +478,18 @@ func doIBCTransfer(t *testing.T, port, seed, name, password string, addr sdk.Add sequence := acc.GetSequence() // send - jsonStr := []byte(fmt.Sprintf(`{ - "name":"%s", - "password": "%s", + jsonStr := []byte(fmt.Sprintf(`{ + "name":"%s", + "password": "%s", "account_number":%d, - "sequence": %d, + "sequence": %d, "gas": 100000, "amount":[ - { - "denom": "%s", - "amount": 1 + { + "denom": "%s", + "amount": 1 } - ] + ] }`, name, password, accnum, sequence, "steak")) res, body := Request(t, port, "POST", "/ibc/testchain/"+receiveAddrBech+"/send", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) diff --git a/server/start_test.go b/server/start_test.go index 046bbe19b6..c024546f5f 100644 --- a/server/start_test.go +++ b/server/start_test.go @@ -18,6 +18,7 @@ import ( func TestStartStandAlone(t *testing.T) { home, err := ioutil.TempDir("", "mock-sdk-cmd") + require.Nil(t, err) defer func() { os.RemoveAll(home) }() diff --git a/server/test_helpers.go b/server/test_helpers.go index b1050bc6f3..fc6098e3cf 100644 --- a/server/test_helpers.go +++ b/server/test_helpers.go @@ -18,10 +18,10 @@ import ( // protocol is either tcp, http, etc func FreeTCPAddr() (addr, port string, err error) { l, err := net.Listen("tcp", "0.0.0.0:0") - defer l.Close() if err != nil { return "", "", err } + defer l.Close() portI := l.Addr().(*net.TCPAddr).Port port = fmt.Sprintf("%d", portI) From a77ac582a36539df695eb7b5b09f1c193a472966 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Sat, 16 Jun 2018 17:45:48 -0700 Subject: [PATCH 286/548] note on iterators --- types/store.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/types/store.go b/types/store.go index 7885d7ab64..d0a8df07ab 100644 --- a/types/store.go +++ b/types/store.go @@ -105,11 +105,15 @@ type KVStore interface { // Iterator over a domain of keys in ascending order. End is exclusive. // Start must be less than end, or the Iterator is invalid. - // To iterate over entire domain -> store.Iterator(nil, nil) + // Iterator must be closed by caller. + // To iterate over entire domain, use store.Iterator(nil, nil) + // CONTRACT: No writes may happen within a domain while an iterator exists over it. Iterator(start, end []byte) Iterator // Iterator over a domain of keys in descending order. End is exclusive. // Start must be greater than end, or the Iterator is invalid. + // Iterator must be closed by caller. + // CONTRACT: No writes may happen within a domain while an iterator exists over it. ReverseIterator(start, end []byte) Iterator // TODO Not yet implemented. From 0292a3b4d99a7786f7cb3fbba29046257a042635 Mon Sep 17 00:00:00 2001 From: Dev Ojha Date: Tue, 19 Jun 2018 15:29:54 -0700 Subject: [PATCH 287/548] Merge PR #1291: Delete unused tests * Tweak retry logic on waitForHeight * Add HTTP retry logic to LCD tests * Simplify waitForHeight changes * Update changelog * Add 'make test_cli_retry', 'make test_unit_retry' * Run test_cli_retry in CI * Delete unused tests --- .circleci/config.yml | 2 +- CHANGELOG.md | 1 + Makefile | 6 + tests/tests.go | 321 ------------------------------------------- tests/util.go | 13 +- 5 files changed, 20 insertions(+), 323 deletions(-) delete mode 100644 tests/tests.go diff --git a/.circleci/config.yml b/.circleci/config.yml index 06f5bb03ba..a873c8190f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -99,7 +99,7 @@ jobs: name: Test cli command: | export PATH="$GOBIN:$PATH" - make test_cli + make test_cli_retry test_cover: <<: *defaults diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a8615977d..b7e56af337 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ BREAKING CHANGES FIXES * \#1259 - fix bug where certain tests that could have a nil pointer in defer +* Retry on HTTP request failure in CLI tests, add option to retry tests in Makefile ## 0.19.0 diff --git a/Makefile b/Makefile index f420446696..be593ef355 100644 --- a/Makefile +++ b/Makefile @@ -92,9 +92,15 @@ test: test_unit test_cli: @go test -count 1 -p 1 `go list github.com/cosmos/cosmos-sdk/cmd/gaia/cli_test` +test_cli_retry: + for i in 1 2 3; do make test_cli && break || sleep 2; done + test_unit: @go test $(PACKAGES_NOCLITEST) +test_unit_retry: + for i in 1 2 3; do make test_unit && break || sleep 2; done + test_race: @go test -race $(PACKAGES_NOCLITEST) diff --git a/tests/tests.go b/tests/tests.go deleted file mode 100644 index b4435659b3..0000000000 --- a/tests/tests.go +++ /dev/null @@ -1,321 +0,0 @@ -package tests - -import ( - "bufio" - "bytes" - "fmt" - "os" - "os/exec" - "path" - "path/filepath" - "strings" - "testing" - "time" - - "github.com/cosmos/cosmos-sdk/server" - "github.com/stretchr/testify/require" -) - -// Tests assume the `basecoind` and `basecli` binaries -// have been built and are located in `./build` - -// TODO remove test dirs if tests are successful - -//nolint -var ( - basecoind = "build/basecoind" - basecli = "build/basecli" - - basecoindDir = "./tmp-basecoind-tests" - basecliDir = "./tmp-basecli-tests" - - ACCOUNTS = []string{"alice", "bob", "charlie", "igor"} - alice = ACCOUNTS[0] - bob = ACCOUNTS[1] - charlie = ACCOUNTS[2] - igor = ACCOUNTS[3] -) - -func gopath() string { - return filepath.Join(os.Getenv("GOPATH"), "src", "github.com", "cosmos", "cosmos-sdk") -} - -func whereIsBasecoind() string { - return filepath.Join(gopath(), basecoind) -} - -func whereIsBasecli() string { - return filepath.Join(gopath(), basecli) -} - -// Init Basecoin Test -func TestInitBasecoin(t *testing.T, home string) string { - var err error - - password := "some-random-password" - - initBasecoind := exec.Command(whereIsBasecoind(), "init", "--home", home) - cmdWriter, err := initBasecoind.StdinPipe() - require.Nil(t, err) - - buf := new(bytes.Buffer) - initBasecoind.Stdout = buf - - if err = initBasecoind.Start(); err != nil { - t.Error(err) - } - - _, err = cmdWriter.Write([]byte(password)) - require.Nil(t, err) - cmdWriter.Close() - - if err = initBasecoind.Wait(); err != nil { - t.Error(err) - } - - // get seed from initialization - theOutput := strings.Split(buf.String(), "\n") - var seedLine int - for _seedLine, o := range theOutput { - if strings.HasPrefix(string(o), "Secret phrase") { - seedLine = _seedLine + 1 - break - } - } - - seed := string(theOutput[seedLine]) - - // enable indexing - err = appendToFile(path.Join(home, "config", "config.toml"), "\n\n[tx_indexing]\nindex_all_tags = true\n") - require.Nil(t, err) - - return seed -} - -func appendToFile(path string, text string) error { - f, err := os.OpenFile(path, os.O_APPEND|os.O_WRONLY, 0600) - if err != nil { - return err - } - - defer f.Close() - - if _, err = f.WriteString(text); err != nil { - return err - } - - return nil -} - -func makeKeys() error { - for _, acc := range ACCOUNTS { - makeKeys := exec.Command(whereIsBasecli(), "keys", "add", acc, "--home", basecliDir) - cmdWriter, err := makeKeys.StdinPipe() - if err != nil { - return err - } - - makeKeys.Stdout = os.Stdout - if err := makeKeys.Start(); err != nil { - return err - } - cmdWriter.Write([]byte("1234567890")) - if err != nil { - return err - } - cmdWriter.Close() - - if err := makeKeys.Wait(); err != nil { - return err - } - } - - return nil -} - -func _TestSendCoins(t *testing.T) { - if err := StartServer(); err != nil { - t.Error(err) - } - - // send some coins - // [zr] where dafuq do I get a FROM (oh, use --name) - - sendTo := fmt.Sprintf("--to=%s", bob) - sendFrom := fmt.Sprintf("--from=%s", alice) - - cmdOut, err := exec.Command(whereIsBasecli(), "send", sendTo, "--amount=1000mycoin", sendFrom, "--seq=0").Output() - if err != nil { - t.Error(err) - } - - fmt.Printf("sent: %s", string(cmdOut)) - -} - -// expects TestInitBaseCoin to have been run -func StartServer() error { - // straight outta https://nathanleclaire.com/blog/2014/12/29/shelled-out-commands-in-golang/ - cmdName := whereIsBasecoind() - cmdArgs := []string{"start", "--home", basecoindDir} - - cmd := exec.Command(cmdName, cmdArgs...) - cmdReader, err := cmd.StdoutPipe() - if err != nil { - return err - } - - scanner := bufio.NewScanner(cmdReader) - go func() { - for scanner.Scan() { - fmt.Printf("running [basecoind start] %s\n", scanner.Text()) - } - }() - - err = cmd.Start() - if err != nil { - return err - } - - err = cmd.Wait() - if err != nil { - return err - } - - time.Sleep(5 * time.Second) - - return nil - - // TODO return cmd.Process so that we can later do something like: - // cmd.Process.Kill() - // see: https://stackoverflow.com/questions/11886531/terminating-a-process-started-with-os-exec-in-golang -} - -// Init Basecoin Test -func InitServerForTest(t *testing.T) { - Clean() - - var err error - - password := "some-random-password" - usePassword := exec.Command("echo", password) - - initBasecoind := exec.Command(whereIsBasecoind(), "init", "--home", basecoindDir) - - initBasecoind.Stdin, err = usePassword.StdoutPipe() - require.Nil(t, err) - - initBasecoind.Stdout = os.Stdout - - err = initBasecoind.Start() - require.Nil(t, err) - err = usePassword.Run() - require.Nil(t, err) - err = initBasecoind.Wait() - require.Nil(t, err) - - err = makeKeys() - require.Nil(t, err) -} - -// expects TestInitBaseCoin to have been run -func StartNodeServerForTest(t *testing.T, home string) *exec.Cmd { - cmdName := whereIsBasecoind() - cmdArgs := []string{"start", "--home", home} - cmd := exec.Command(cmdName, cmdArgs...) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err := cmd.Start() - require.Nil(t, err) - - // FIXME: if there is a nondeterministic node start failure, - // we should probably make this read the logs to wait for RPC - time.Sleep(time.Second * 2) - - return cmd -} - -// expects TestInitBaseCoin to have been run -func StartLCDServerForTest(t *testing.T, home, chainID string) (cmd *exec.Cmd, port string) { - cmdName := whereIsBasecli() - var err error - _, port, err = server.FreeTCPAddr() - require.NoError(t, err) - cmdArgs := []string{ - "rest-server", - "--home", - home, - "--bind", - fmt.Sprintf("localhost:%s", port), - "--chain-id", - chainID, - } - cmd = exec.Command(cmdName, cmdArgs...) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err = cmd.Start() - require.Nil(t, err) - time.Sleep(time.Second * 2) // TODO: LOL - return cmd, port -} - -// clean the directories -func Clean() { - // ignore errors b/c the dirs may not yet exist - err := os.Remove(basecoindDir) - panic(err) - err = os.Remove(basecliDir) - panic(err) -} - -/* - - chainID = "staking_test" - testDir = "./tmp_tests" -) - -func runTests() { - - if err := os.Mkdir(testDir, 0666); err != nil { - panic(err) - } - defer os.Remove(testDir) - - // make some keys - - //if err := makeKeys(); err != nil { - // panic(err) - //} - - if err := initServer(); err != nil { - fmt.Printf("Err: %v", err) - panic(err) - } - -} - -func initServer() error { - serveDir := filepath.Join(testDir, "server") - //serverLog := filepath.Join(testDir, "gaia-node.log") - - // get RICH - keyOut, err := exec.Command(GAIA, CLIENT_EXE, "keys", "get", "alice").Output() - if err != nil { - fmt.Println("one") - return err - } - key := strings.Split(string(keyOut), "\t") - fmt.Printf("wit:%s", key[2]) - - outByte, err := exec.Command(GAIA, SERVER_EXE, "init", "--static", fmt.Sprintf("--chain-id=%s", chainID), fmt.Sprintf("--home=%s", serveDir), key[2]).Output() - if err != nil { - fmt.Println("teo") - fmt.Printf("Error: %v", err) - - return err - } - fmt.Sprintf("OUT: %s", string(outByte)) - return nil -} - -*/ diff --git a/tests/util.go b/tests/util.go index 387ccb769b..9e2c0d0446 100644 --- a/tests/util.go +++ b/tests/util.go @@ -64,6 +64,17 @@ func WaitForHeight(height int64, port string) { waitForHeight(height, url) } +// Whether or not an HTTP status code was "successful" +func StatusOK(statusCode int) bool { + switch statusCode { + case http.StatusOK: + case http.StatusCreated: + case http.StatusNoContent: + return true + } + return false +} + func waitForHeight(height int64, url string) { for { // get url, try a few times @@ -71,7 +82,7 @@ func waitForHeight(height int64, url string) { var err error for i := 0; i < 5; i++ { res, err = http.Get(url) - if err == nil { + if err == nil && StatusOK(res.StatusCode) { break } time.Sleep(time.Millisecond * 200) From 0b0236f2bf2797d940696009e627c31fb2f55f32 Mon Sep 17 00:00:00 2001 From: Peng Zhong <172531+nylira@users.noreply.github.com> Date: Wed, 20 Jun 2018 13:37:59 +0800 Subject: [PATCH 288/548] Merge PR #1309: Update testnet README with solutions to common problems * update readme with common problems * readme tweaks * readme tweak * Link to nodes page, not a single node, and rephrase slashing --- cmd/gaia/testnets/README.md | 52 ++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/cmd/gaia/testnets/README.md b/cmd/gaia/testnets/README.md index b65feeb915..757308ebfd 100644 --- a/cmd/gaia/testnets/README.md +++ b/cmd/gaia/testnets/README.md @@ -102,7 +102,7 @@ Your node needs to know how to find peers. You'll need to add healthy seed nodes seeds = "38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6002.coinculture.net:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@seed.cosmos.cryptium.ch:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@35.198.166.171:46656,032fa56301de335d835057fb6ad9f7ce2242a66d@165.227.236.213:46656" ``` -You can also [ask other validators](https://riot.im/app/#/room/#cosmos_validators:matrix.org) for a persistent peer and add it under the `persistent_peers` key. For more information on seeds and peers, [read this](https://github.com/tendermint/tendermint/blob/develop/docs/using-tendermint.md#peers). +If those seeds aren't working, you can find more seeds and persistent peers on the [Cosmos Explorer](https://explorecosmos.network/nodes). For more information on seeds and peers, [read this](https://github.com/tendermint/tendermint/blob/develop/docs/using-tendermint.md#peers). ## Run a Full Node @@ -228,6 +228,56 @@ gaiacli advanced tendermint validator-set **Note:** To be in the validator set, you need to have more total voting power than the 100th validator. +### Problem #1: My validator has `voting_power: 0` + +Your validator has become auto-unbonded. In `gaia-6002`, we unbond validators if they do not vote on `50` of the last `100` blocks. Since blocks are proposed every ~2 seconds, a validator unresponsive for ~100 seconds will become unbonded. This usually happens when your `gaiad` process crashes. + +Here's how you can return the voting power back to your validator. First, if `gaiad` is not running, start it up again: + +``` +gaiad start +``` + +Wait for your full node to catch up to the latest block. Next, run the following command. Note that `` is the address of your validator account, and `` is the name of the validator account. You can find this info by running `gaiacli keys list`. + +``` +gaiacli stake unrevoke --chain-id=gaia-6002 --name= +``` + +**WARNING:** If you don't wait for `gaiad` to sync before running `unrevoke`, you will receive an error message telling you your validator is still jailed. + +Lastly, check your validator again to see if your voting power is back. + +``` +gaiacli status +``` + +You may notice that your voting power is less than it used to be. That's because you got slashed for downtime! + +### Problem #2: My `gaiad` crashes because of `too many open files` + +The default number of files Linux can open (per-process) is `1024`. `gaiad` is known to open more than `1024` files. This causes the process to crash. Here's how you can fix it. + +``` +# find out your system's max open files (per-process) +ulimit -Sn + +# find out gaiad's current open files +ls /proc/(pidof gaiad)/fd/ | wc -l + +# edit limits config file +sudo vi /etc/security/limits.conf + +# add this line to increase your 's max open files to 2048 + soft nofile 2048 + +# reboot to apply this new open file limit +reboot + +# review the new per-process max open files (should be 2048) +ulimit -Sn +``` + ## Delegating to a Validator On the upcoming mainnet, you can delegate `atom` to a validator. These [delegators](https://cosmos.network/resources/delegators) can receive part of the validator's fee revenue. Read more about the [Cosmos Token Model](https://github.com/cosmos/cosmos/raw/master/Cosmos_Token_Model.pdf). From 2a9bc2153a42bc7b22305903182753e64c6e024c Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 20 Jun 2018 19:34:12 +0200 Subject: [PATCH 289/548] Merge pull request #1310: Fix x/bank REST handler * Update sendtx.go * Pass chain_id through in LCD tests * Update changelog --- CHANGELOG.md | 1 + client/lcd/lcd_test.go | 7 +++++-- x/bank/client/rest/sendtx.go | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7e56af337..d557899372 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ BREAKING CHANGES FIXES * \#1259 - fix bug where certain tests that could have a nil pointer in defer * Retry on HTTP request failure in CLI tests, add option to retry tests in Makefile +* Fixed bug where chain ID wasn't passed properly in x/bank REST handler ## 0.19.0 diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index d6a1b77425..8ad8b45dbe 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -8,6 +8,7 @@ import ( "regexp" "testing" + "github.com/spf13/viper" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -440,6 +441,7 @@ func doSend(t *testing.T, port, seed, name, password string, addr sdk.Address) ( acc := getAccount(t, port, addr) accnum := acc.GetAccountNumber() sequence := acc.GetSequence() + chainID := viper.GetString(client.FlagChainID) // send coinbz, err := json.Marshal(sdk.NewCoin("steak", 1)) @@ -453,8 +455,9 @@ func doSend(t *testing.T, port, seed, name, password string, addr sdk.Address) ( "account_number":%d, "sequence":%d, "gas": 10000, - "amount":[%s] - }`, name, password, accnum, sequence, coinbz)) + "amount":[%s], + "chain_id":"%s" + }`, name, password, accnum, sequence, coinbz, chainID)) res, body := Request(t, port, "POST", "/accounts/"+receiveAddrBech+"/send", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) diff --git a/x/bank/client/rest/sendtx.go b/x/bank/client/rest/sendtx.go index 2639d27887..4678d81849 100644 --- a/x/bank/client/rest/sendtx.go +++ b/x/bank/client/rest/sendtx.go @@ -90,6 +90,8 @@ func SendRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx context.CoreCont // add gas to context ctx = ctx.WithGas(m.Gas) + // add chain-id to context + ctx = ctx.WithChainID(m.ChainID) // sign ctx = ctx.WithAccountNumber(m.AccountNumber) From 918e217e1f52daa6f30a19468a04f9b1893eee82 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 20 Jun 2018 21:27:36 +0200 Subject: [PATCH 290/548] Merge PR #1280: Implement simple transaction memos * AltBytes -> Memo, memo CLI support & thread-through * Check memo size, update changelog * Update existing testcases * Nuke CircleCI caches * Charge gas proportional to memo size * Fix gas allocations in ante handler testcases * Add testcases * Update changelog * Fix tiny CLI bug & add to CLI tests * Add '--memo' to gaiacli * Add testcase for large memos * Address PR comments --- CHANGELOG.md | 4 ++ baseapp/baseapp_test.go | 2 + client/context/helpers.go | 4 +- client/context/types.go | 7 +++ client/context/viper.go | 1 + client/flags.go | 2 + cmd/gaia/cli_test/cli_test.go | 9 ++++ examples/kvstore/tx.go | 4 ++ server/mock/tx.go | 4 ++ types/errors.go | 6 +++ types/tx_msg.go | 3 ++ x/auth/ante.go | 25 ++++++++--- x/auth/ante_test.go | 81 ++++++++++++++++++++++++++++++----- x/auth/mock/simulate_block.go | 5 ++- x/auth/stdtx.go | 30 +++++++------ x/auth/stdtx_test.go | 2 +- 16 files changed, 157 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d557899372..5edcaedcf8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ BREAKING CHANGES * Change default ports from 466xx to 266xx +* AltBytes renamed to Memo, now a string, max 100 characters, costs a bit of gas + +FEATURES +* [gaiacli] You can now attach a simple text-only memo to any transaction, with the `--memo` flag FIXES * \#1259 - fix bug where certain tests that could have a nil pointer in defer diff --git a/baseapp/baseapp_test.go b/baseapp/baseapp_test.go index 532d39f1e6..7ee9f418ec 100644 --- a/baseapp/baseapp_test.go +++ b/baseapp/baseapp_test.go @@ -263,6 +263,7 @@ const msgType2 = "testTx" func (tx testTx) Type() string { return msgType2 } func (tx testTx) GetMsg() sdk.Msg { return tx } +func (tx testTx) GetMemo() string { return "" } func (tx testTx) GetSignBytes() []byte { return nil } func (tx testTx) GetSigners() []sdk.Address { return nil } func (tx testTx) GetSignatures() []auth.StdSignature { return nil } @@ -547,6 +548,7 @@ const msgType = "testUpdatePowerTx" func (tx testUpdatePowerTx) Type() string { return msgType } func (tx testUpdatePowerTx) GetMsg() sdk.Msg { return tx } +func (tx testUpdatePowerTx) GetMemo() string { return "" } func (tx testUpdatePowerTx) GetSignBytes() []byte { return nil } func (tx testUpdatePowerTx) ValidateBasic() sdk.Error { return nil } func (tx testUpdatePowerTx) GetSigners() []sdk.Address { return nil } diff --git a/client/context/helpers.go b/client/context/helpers.go index 5449afa97e..5ce81d0d35 100644 --- a/client/context/helpers.go +++ b/client/context/helpers.go @@ -123,12 +123,14 @@ func (ctx CoreContext) SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *w } accnum := ctx.AccountNumber sequence := ctx.Sequence + memo := ctx.Memo signMsg := auth.StdSignMsg{ ChainID: chainID, AccountNumbers: []int64{accnum}, Sequences: []int64{sequence}, Msg: msg, + Memo: memo, Fee: auth.NewStdFee(ctx.Gas, sdk.Coin{}), // TODO run simulate to estimate gas? } @@ -152,7 +154,7 @@ func (ctx CoreContext) SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *w }} // marshal bytes - tx := auth.NewStdTx(signMsg.Msg, signMsg.Fee, sigs) + tx := auth.NewStdTx(signMsg.Msg, signMsg.Fee, sigs, memo) return cdc.MarshalBinary(tx) } diff --git a/client/context/types.go b/client/context/types.go index 791ffb23a2..6b0c074f2c 100644 --- a/client/context/types.go +++ b/client/context/types.go @@ -16,6 +16,7 @@ type CoreContext struct { FromAddressName string AccountNumber int64 Sequence int64 + Memo string Client rpcclient.Client Decoder auth.AccountDecoder AccountStore string @@ -70,6 +71,12 @@ func (c CoreContext) WithSequence(sequence int64) CoreContext { return c } +// WithMemo - return a copy of the context with an updated memo +func (c CoreContext) WithMemo(memo string) CoreContext { + c.Memo = memo + return c +} + // WithClient - return a copy of the context with an updated RPC client instance func (c CoreContext) WithClient(client rpcclient.Client) CoreContext { c.Client = client diff --git a/client/context/viper.go b/client/context/viper.go index 5f262d56f6..d3896fe580 100644 --- a/client/context/viper.go +++ b/client/context/viper.go @@ -36,6 +36,7 @@ func NewCoreContextFromViper() CoreContext { NodeURI: nodeURI, AccountNumber: viper.GetInt64(client.FlagAccountNumber), Sequence: viper.GetInt64(client.FlagSequence), + Memo: viper.GetString(client.FlagMemo), Client: rpc, Decoder: nil, AccountStore: "acc", diff --git a/client/flags.go b/client/flags.go index 5af588bd44..eb390e8a04 100644 --- a/client/flags.go +++ b/client/flags.go @@ -12,6 +12,7 @@ const ( FlagName = "name" FlagAccountNumber = "account-number" FlagSequence = "sequence" + FlagMemo = "memo" FlagFee = "fee" ) @@ -37,6 +38,7 @@ func PostCommands(cmds ...*cobra.Command) []*cobra.Command { c.Flags().String(FlagName, "", "Name of private key with which to sign") c.Flags().Int64(FlagAccountNumber, 0, "AccountNumber number to sign the tx") c.Flags().Int64(FlagSequence, 0, "Sequence number to sign the tx") + c.Flags().String(FlagMemo, "", "Memo to send along with transaction") c.Flags().String(FlagFee, "", "Fee to pay along with transaction") c.Flags().String(FlagChainID, "", "Chain ID of tendermint node") c.Flags().String(FlagNode, "tcp://localhost:26657", ": to tendermint rpc interface for this chain") diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index af62c3e992..919a4c5b66 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -64,6 +64,15 @@ func TestGaiaCLISend(t *testing.T) { assert.Equal(t, int64(20), barAcc.GetCoins().AmountOf("steak").Int64()) fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooCech, flags)) assert.Equal(t, int64(30), fooAcc.GetCoins().AmountOf("steak").Int64()) + + // test memo + executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo --memo 'testmemo'", flags, barCech), pass) + tests.WaitForNextHeightTM(port) + + barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) + assert.Equal(t, int64(30), barAcc.GetCoins().AmountOf("steak").Int64()) + fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooCech, flags)) + assert.Equal(t, int64(20), fooAcc.GetCoins().AmountOf("steak").Int64()) } func TestGaiaCLICreateValidator(t *testing.T) { diff --git a/examples/kvstore/tx.go b/examples/kvstore/tx.go index fa32d93bfb..3cedf35bb8 100644 --- a/examples/kvstore/tx.go +++ b/examples/kvstore/tx.go @@ -22,6 +22,10 @@ func (tx kvstoreTx) GetMsg() sdk.Msg { return tx } +func (tx kvstoreTx) GetMemo() string { + return "" +} + func (tx kvstoreTx) GetSignBytes() []byte { return tx.bytes } diff --git a/server/mock/tx.go b/server/mock/tx.go index bd437f2d08..5630b46d86 100644 --- a/server/mock/tx.go +++ b/server/mock/tx.go @@ -35,6 +35,10 @@ func (tx kvstoreTx) GetMsg() sdk.Msg { return tx } +func (tx kvstoreTx) GetMemo() string { + return "" +} + func (tx kvstoreTx) GetSignBytes() []byte { return tx.bytes } diff --git a/types/errors.go b/types/errors.go index f979ee118c..f76b171afb 100644 --- a/types/errors.go +++ b/types/errors.go @@ -53,6 +53,7 @@ const ( CodeInsufficientCoins CodeType = 10 CodeInvalidCoins CodeType = 11 CodeOutOfGas CodeType = 12 + CodeMemoTooLarge CodeType = 13 // CodespaceRoot is a codespace for error codes in this file only. // Notice that 0 is an "unset" codespace, which can be overridden with @@ -91,6 +92,8 @@ func CodeToDefaultMsg(code CodeType) string { return "invalid coins" case CodeOutOfGas: return "out of gas" + case CodeMemoTooLarge: + return "memo too large" default: return fmt.Sprintf("unknown code %d", code) } @@ -137,6 +140,9 @@ func ErrInvalidCoins(msg string) Error { func ErrOutOfGas(msg string) Error { return newErrorWithRootCodespace(CodeOutOfGas, msg) } +func ErrMemoTooLarge(msg string) Error { + return newErrorWithRootCodespace(CodeMemoTooLarge, msg) +} //---------------------------------------- // Error & sdkError diff --git a/types/tx_msg.go b/types/tx_msg.go index 240db31060..510e0a3838 100644 --- a/types/tx_msg.go +++ b/types/tx_msg.go @@ -31,6 +31,9 @@ type Tx interface { // Gets the Msg. GetMsg() Msg + + // Gets the memo. + GetMemo() string } //__________________________________________________________ diff --git a/x/auth/ante.go b/x/auth/ante.go index c50da0c32a..cedc94dc47 100644 --- a/x/auth/ante.go +++ b/x/auth/ante.go @@ -9,8 +9,10 @@ import ( ) const ( - deductFeesCost sdk.Gas = 10 - verifyCost = 100 + deductFeesCost sdk.Gas = 10 + memoCostPerByte sdk.Gas = 1 + verifyCost = 100 + maxMemoCharacters = 100 ) // NewAnteHandler returns an AnteHandler that checks @@ -36,6 +38,20 @@ func NewAnteHandler(am AccountMapper, fck FeeCollectionKeeper) sdk.AnteHandler { true } + memo := tx.GetMemo() + + if len(memo) > maxMemoCharacters { + return ctx, + sdk.ErrMemoTooLarge(fmt.Sprintf("maximum number of characters is %d but received %d characters", maxMemoCharacters, len(memo))).Result(), + true + } + + // set the gas meter + ctx = ctx.WithGasMeter(sdk.NewGasMeter(stdTx.Fee.Gas)) + + // charge gas for the memo + ctx.GasMeter().ConsumeGas(memoCostPerByte*sdk.Gas(len(memo)), "memo") + msg := tx.GetMsg() // Assert that number of signatures is correct. @@ -62,7 +78,7 @@ func NewAnteHandler(am AccountMapper, fck FeeCollectionKeeper) sdk.AnteHandler { if chainID == "" { chainID = viper.GetString("chain-id") } - signBytes := StdSignBytes(ctx.ChainID(), accNums, sequences, fee, msg) + signBytes := StdSignBytes(ctx.ChainID(), accNums, sequences, fee, msg, memo) // Check sig and nonce and collect signer accounts. var signerAccs = make([]Account, len(signerAddrs)) @@ -99,9 +115,6 @@ func NewAnteHandler(am AccountMapper, fck FeeCollectionKeeper) sdk.AnteHandler { // cache the signer accounts in the context ctx = WithSigners(ctx, signerAccs) - // set the gas meter - ctx = ctx.WithGasMeter(sdk.NewGasMeter(stdTx.Fee.Gas)) - // TODO: tx tags (?) return ctx, sdk.Result{}, false // continue... diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index 3935334a8f..453502ddf0 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -1,6 +1,7 @@ package auth import ( + "fmt" "testing" "github.com/stretchr/testify/assert" @@ -18,7 +19,7 @@ func newTestMsg(addrs ...sdk.Address) *sdk.TestMsg { } func newStdFee() StdFee { - return NewStdFee(100, + return NewStdFee(5000, sdk.NewCoin("atom", 150), ) } @@ -47,22 +48,39 @@ func checkValidTx(t *testing.T, anteHandler sdk.AnteHandler, ctx sdk.Context, tx // run the tx through the anteHandler and ensure it fails with the given code func checkInvalidTx(t *testing.T, anteHandler sdk.AnteHandler, ctx sdk.Context, tx sdk.Tx, code sdk.CodeType) { + defer func() { + if r := recover(); r != nil { + switch r.(type) { + case sdk.ErrorOutOfGas: + assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, code), sdk.ToABCICode(sdk.CodespaceRoot, sdk.CodeOutOfGas), + fmt.Sprintf("Expected ErrorOutOfGas, got %v", r)) + default: + panic(r) + } + } + }() _, result, abort := anteHandler(ctx, tx) assert.True(t, abort) - assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, code), result.Code) + assert.Equal(t, sdk.ToABCICode(sdk.CodespaceRoot, code), result.Code, + fmt.Sprintf("Expected %v, got %v", sdk.ToABCICode(sdk.CodespaceRoot, code), result)) } func newTestTx(ctx sdk.Context, msg sdk.Msg, privs []crypto.PrivKey, accNums []int64, seqs []int64, fee StdFee) sdk.Tx { - signBytes := StdSignBytes(ctx.ChainID(), accNums, seqs, fee, msg) - return newTestTxWithSignBytes(msg, privs, accNums, seqs, fee, signBytes) + signBytes := StdSignBytes(ctx.ChainID(), accNums, seqs, fee, msg, "") + return newTestTxWithSignBytes(msg, privs, accNums, seqs, fee, signBytes, "") } -func newTestTxWithSignBytes(msg sdk.Msg, privs []crypto.PrivKey, accNums []int64, seqs []int64, fee StdFee, signBytes []byte) sdk.Tx { +func newTestTxWithMemo(ctx sdk.Context, msg sdk.Msg, privs []crypto.PrivKey, accNums []int64, seqs []int64, fee StdFee, memo string) sdk.Tx { + signBytes := StdSignBytes(ctx.ChainID(), accNums, seqs, fee, msg, memo) + return newTestTxWithSignBytes(msg, privs, accNums, seqs, fee, signBytes, memo) +} + +func newTestTxWithSignBytes(msg sdk.Msg, privs []crypto.PrivKey, accNums []int64, seqs []int64, fee StdFee, signBytes []byte, memo string) sdk.Tx { sigs := make([]StdSignature, len(privs)) for i, priv := range privs { sigs[i] = StdSignature{PubKey: priv.PubKey(), Signature: priv.Sign(signBytes), AccountNumber: accNums[i], Sequence: seqs[i]} } - tx := NewStdTx(msg, fee, sigs) + tx := NewStdTx(msg, fee, sigs, memo) return tx } @@ -252,9 +270,7 @@ func TestAnteHandlerFees(t *testing.T) { var tx sdk.Tx msg := newTestMsg(addr1) privs, accnums, seqs := []crypto.PrivKey{priv1}, []int64{0}, []int64{0} - fee := NewStdFee(100, - sdk.NewCoin("atom", 150), - ) + fee := newStdFee() // signer does not have enough funds to pay the fee tx = newTestTx(ctx, msg, privs, accnums, seqs, fee) @@ -273,6 +289,50 @@ func TestAnteHandlerFees(t *testing.T) { assert.True(t, feeCollector.GetCollectedFees(ctx).IsEqual(sdk.Coins{sdk.NewCoin("atom", 150)})) } +// Test logic around memo gas consumption. +func TestAnteHandlerMemoGas(t *testing.T) { + // setup + ms, capKey, capKey2 := setupMultiStore() + cdc := wire.NewCodec() + RegisterBaseAccount(cdc) + mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) + feeCollector := NewFeeCollectionKeeper(cdc, capKey2) + anteHandler := NewAnteHandler(mapper, feeCollector) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) + + // keys and addresses + priv1, addr1 := privAndAddr() + + // set the accounts + acc1 := mapper.NewAccountWithAddress(ctx, addr1) + mapper.SetAccount(ctx, acc1) + + // msg and signatures + var tx sdk.Tx + msg := newTestMsg(addr1) + privs, accnums, seqs := []crypto.PrivKey{priv1}, []int64{0}, []int64{0} + fee := NewStdFee(0, sdk.NewCoin("atom", 0)) + + // tx does not have enough gas + tx = newTestTx(ctx, msg, privs, accnums, seqs, fee) + checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeOutOfGas) + + // tx with memo doesn't have enough gas + fee = NewStdFee(1001, sdk.NewCoin("atom", 0)) + tx = newTestTxWithMemo(ctx, msg, privs, accnums, seqs, fee, "abcininasidniandsinasindiansdiansdinaisndiasndiadninsd") + checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeOutOfGas) + + // memo too large + fee = NewStdFee(2001, sdk.NewCoin("atom", 0)) + tx = newTestTxWithMemo(ctx, msg, privs, accnums, seqs, fee, "abcininasidniandsinasindiansdiansdinaisndiasndiadninsdabcininasidniandsinasindiansdiansdinaisndiasndiadninsdabcininasidniandsinasindiansdiansdinaisndiasndiadninsd") + checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeMemoTooLarge) + + // tx with memo has enough gas + fee = NewStdFee(1100, sdk.NewCoin("atom", 0)) + tx = newTestTxWithMemo(ctx, msg, privs, accnums, seqs, fee, "abcininasidniandsinasindiansdiansdinaisndiasndiadninsd") + checkValidTx(t, anteHandler, ctx, tx) +} + func TestAnteHandlerBadSignBytes(t *testing.T) { // setup ms, capKey, capKey2 := setupMultiStore() @@ -333,7 +393,8 @@ func TestAnteHandlerBadSignBytes(t *testing.T) { for _, cs := range cases { tx := newTestTxWithSignBytes( msg, privs, accnums, seqs, fee, - StdSignBytes(cs.chainID, cs.accnums, cs.seqs, cs.fee, cs.msg), + StdSignBytes(cs.chainID, cs.accnums, cs.seqs, cs.fee, cs.msg, ""), + "", ) checkInvalidTx(t, anteHandler, ctx, tx, cs.code) } diff --git a/x/auth/mock/simulate_block.go b/x/auth/mock/simulate_block.go index 7a4cb4aef3..ff578c2b36 100644 --- a/x/auth/mock/simulate_block.go +++ b/x/auth/mock/simulate_block.go @@ -42,15 +42,16 @@ func GenTx(msg sdk.Msg, accnums []int64, seq []int64, priv ...crypto.PrivKeyEd25 } sigs := make([]auth.StdSignature, len(priv)) + memo := "testmemotestmemo" for i, p := range priv { sigs[i] = auth.StdSignature{ PubKey: p.PubKey(), - Signature: p.Sign(auth.StdSignBytes(chainID, accnums, seq, fee, msg)), + Signature: p.Sign(auth.StdSignBytes(chainID, accnums, seq, fee, msg, memo)), AccountNumber: accnums[i], Sequence: seq[i], } } - return auth.NewStdTx(msg, fee, sigs) + return auth.NewStdTx(msg, fee, sigs, memo) } // check a transaction result diff --git a/x/auth/stdtx.go b/x/auth/stdtx.go index 5c43a37177..e3a69a0391 100644 --- a/x/auth/stdtx.go +++ b/x/auth/stdtx.go @@ -15,19 +15,24 @@ type StdTx struct { Msg sdk.Msg `json:"msg"` Fee StdFee `json:"fee"` Signatures []StdSignature `json:"signatures"` + Memo string `json:"memo"` } -func NewStdTx(msg sdk.Msg, fee StdFee, sigs []StdSignature) StdTx { +func NewStdTx(msg sdk.Msg, fee StdFee, sigs []StdSignature, memo string) StdTx { return StdTx{ Msg: msg, Fee: fee, Signatures: sigs, + Memo: memo, } } //nolint func (tx StdTx) GetMsg() sdk.Msg { return tx.Msg } +//nolint +func (tx StdTx) GetMemo() string { return tx.Memo } + // Signatures returns the signature of signers who signed the Msg. // CONTRACT: Length returned is same as length of // pubkeys returned from MsgKeySigners, and the order @@ -85,23 +90,24 @@ func (fee StdFee) Bytes() []byte { // and the Sequence numbers for each signature (prevent // inchain replay and enforce tx ordering per account). type StdSignDoc struct { - ChainID string `json:"chain_id"` - AccountNumbers []int64 `json:"account_numbers"` - Sequences []int64 `json:"sequences"` - FeeBytes []byte `json:"fee_bytes"` - MsgBytes []byte `json:"msg_bytes"` - AltBytes []byte `json:"alt_bytes"` + ChainID string `json:"chain_id"` + AccountNumbers []int64 `json:"account_numbers"` + Sequences []int64 `json:"sequences"` + Fee json.RawMessage `json:"fee"` + Msg json.RawMessage `json:"msg"` + Memo string `json:"memo"` } // StdSignBytes returns the bytes to sign for a transaction. // TODO: change the API to just take a chainID and StdTx ? -func StdSignBytes(chainID string, accnums []int64, sequences []int64, fee StdFee, msg sdk.Msg) []byte { +func StdSignBytes(chainID string, accnums []int64, sequences []int64, fee StdFee, msg sdk.Msg, memo string) []byte { bz, err := json.Marshal(StdSignDoc{ ChainID: chainID, AccountNumbers: accnums, Sequences: sequences, - FeeBytes: fee.Bytes(), - MsgBytes: msg.GetSignBytes(), + Fee: json.RawMessage(fee.Bytes()), + Msg: json.RawMessage(msg.GetSignBytes()), + Memo: memo, }) if err != nil { panic(err) @@ -118,12 +124,12 @@ type StdSignMsg struct { Sequences []int64 Fee StdFee Msg sdk.Msg - // XXX: Alt + Memo string } // get message bytes func (msg StdSignMsg) Bytes() []byte { - return StdSignBytes(msg.ChainID, msg.AccountNumbers, msg.Sequences, msg.Fee, msg.Msg) + return StdSignBytes(msg.ChainID, msg.AccountNumbers, msg.Sequences, msg.Fee, msg.Msg, msg.Memo) } // Standard Signature diff --git a/x/auth/stdtx_test.go b/x/auth/stdtx_test.go index 412b37c20d..6b84b3f6e5 100644 --- a/x/auth/stdtx_test.go +++ b/x/auth/stdtx_test.go @@ -23,7 +23,7 @@ func TestStdTx(t *testing.T) { fee := newStdFee() sigs := []StdSignature{} - tx := NewStdTx(msg, fee, sigs) + tx := NewStdTx(msg, fee, sigs, "") assert.Equal(t, msg, tx.GetMsg()) assert.Equal(t, sigs, tx.GetSignatures()) From fb7e370c65f9da3a658d0225db716568f2c83677 Mon Sep 17 00:00:00 2001 From: Jack Zampolin Date: Wed, 20 Jun 2018 20:15:29 -0700 Subject: [PATCH 291/548] Merge PR #1316: Update testnet validator instructions * Update testnet validator instructions * Address PR comments --- cmd/gaia/testnets/README.md | 277 ++++++++++++++++++++++-------------- 1 file changed, 169 insertions(+), 108 deletions(-) diff --git a/cmd/gaia/testnets/README.md b/cmd/gaia/testnets/README.md index 757308ebfd..a6a59562cf 100644 --- a/cmd/gaia/testnets/README.md +++ b/cmd/gaia/testnets/README.md @@ -1,10 +1,9 @@ # Connect to the `gaia-6002` Testnet -Note: We are aware this documentation is sub-par. We are working to -improve the tooling and the documentation to make this process as painless as -possible. In the meantime, join the -[Validator Chat](https://riot.im/app/#/room/#cosmos_validators:matrix.org) -for technical support. Thanks very much for your patience. :) +Note: We are aware this documentation is a work in progress. We are actively +working to improve the tooling and the documentation to make this process as painless as +possible. In the meantime, join the [Validator Chat](https://riot.im/app/#/room/#cosmos_validators:matrix.org) +for technical support, and [open issues](https://github.com/cosmos/cosmos-sdk) if you run into any! Thanks very much for your patience and support. :) ## Setting Up a New Node @@ -13,13 +12,20 @@ These instructions are for setting up a brand new full node from scratch. If you ### Install Go Install `go` by following the [official docs](https://golang.org/doc/install). -**Go 1.10+** is required for the Cosmos SDK. +**Go 1.10+** is required for the Cosmos SDK. Remember to properly setup your `$GOPATH`, `$GOBIN`, and `$PATH` variables, for example: + +```bash +mkdir -p $HOME/go/bin +echo "export GOPATH=$HOME/go" >> ~/.bash_profile +echo "export GOBIN=$GOPATH/bin" >> ~/.bash_profile +echo "export PATH=$PATH:$GOBIN" >> ~/.bash_profile +``` ### Install Cosmos SDK -Next, let's install the testnet's version of the Cosmos SDK. +Next, let's install the testnet's version of the Cosmos SDK. -``` +```bash mkdir -p $GOPATH/src/github.com/cosmos cd $GOPATH/src/github.com/cosmos git clone https://github.com/cosmos/cosmos-sdk @@ -29,22 +35,27 @@ make get_tools && make get_vendor_deps && make install That will install the `gaiad` and `gaiacli` binaries. Verify that everything is OK: -``` -gaiad version -0.19.0- +```bash +$ gaiad version +0.19.0-c6711810 + +$ gaiacli version +0.19.0-c6711810 ``` ### Node Setup -Create the required configuration files: +Create the required configuration files, and initialize the node: -``` -gaiad init +```bash +gaiad init --name ``` -Name your node by editing the `moniker` in `$HOME/.gaiad/config/config.toml`. Note that only ASCII characters are supported. Using Unicode renders your node unconnectable. +> *NOTE:* Note that only ASCII characters are supported for the `--name`. Using Unicode renders your node unreachable. -``` +You can also edit this `name` in the `~/.gaiad/config/config.toml` file: + +```toml # A custom human readable name for this node moniker = "" ``` @@ -59,12 +70,12 @@ These instructions are for full nodes that have ran on previous testnets and wou First, remove the outdated files and reset the data. -``` +```bash rm $HOME/.gaiad/config/addrbook.json $HOME/.gaiad/config/genesis.json gaiad unsafe_reset_all ``` -Your node is now in a pristine state while keeping the original `priv_validator.json` and `config.toml`. If you had any sentry nodes or full nodes setup before, +Your node is now in a pristine state while keeping the original `priv_validator.json` and `config.toml`. If you had any sentry nodes or full nodes setup before, your node will still try to connect to them, but may fail if they haven't also been upgraded. @@ -74,7 +85,7 @@ been upgraded. Now it is time to upgrade the software: -``` +```bash cd $GOPATH/src/github.com/cosmos/cosmos-sdk git fetch --all && git checkout v0.19.0 make update_tools && make get_vendor_deps && make install @@ -88,145 +99,153 @@ Your full node has been cleanly upgraded! Copy the testnet's `genesis.json` file and place it in `gaiad`'s config directory. -``` +```bash mkdir -p $HOME/.gaiad/config cp -a $GOPATH/src/github.com/cosmos/cosmos-sdk/cmd/gaia/testnets/gaia-6002/genesis.json $HOME/.gaiad/config/genesis.json ``` ### Add Seed Nodes -Your node needs to know how to find peers. You'll need to add healthy seed nodes to `$HOME/.gaiad/config/config.toml`. Here are some seed nodes you can use: +Your node needs to know how to find peers. You'll need to add healthy seed nodes to `$HOME/.gaiad/config/config.toml`. Here are some seed nodes you can use: -``` +```toml # Comma separated list of seed nodes to connect to seeds = "38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6002.coinculture.net:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@seed.cosmos.cryptium.ch:46656,80a35a46ce09cfb31ee220c8141a25e73e0b239b@35.198.166.171:46656,032fa56301de335d835057fb6ad9f7ce2242a66d@165.227.236.213:46656" ``` -If those seeds aren't working, you can find more seeds and persistent peers on the [Cosmos Explorer](https://explorecosmos.network/nodes). For more information on seeds and peers, [read this](https://github.com/tendermint/tendermint/blob/develop/docs/using-tendermint.md#peers). +If those seeds aren't working, you can find more seeds and persistent peers on the [Cosmos Explorer](https://explorecosmos.network/nodes). Open the the `Full Nodes` pane and select nodes that do not have private (`10.x.x.x`) or [local IP addresses](https://en.wikipedia.org/wiki/Private_network). The `Persistent Peer` field contains the connection string. For best results use 4-6. + +For more information on seeds and peers, [read this](https://github.com/tendermint/tendermint/blob/develop/docs/using-tendermint.md#peers). ## Run a Full Node Start the full node with this command: -``` +```bash gaiad start ``` Check that everything is running smoothly: -``` +```bash gaiacli status ``` View the status of the network with the [Cosmos Explorer](https://explorecosmos.network). Once your full node syncs up to the current block height, you should see it appear on the [list of full nodes](https://explorecosmos.network/validators). If it doesn't show up, that's ok--the Explorer does not connect to every node. -## Generate Keys +## Generating Keys -You'll need a private and public key pair \(a.k.a. `sk, pk` respectively\) to be able to receive funds, send txs, bond tx, etc. +### A Note on Keys in Cosmos: + +There are three types of key representations that are used in this tutorial: + +- `cosmosaccaddr` + * Derived from account keys generated by `gaiacli keys add` + * Used to receive funds + * e.g. `cosmosaccaddr15h6vd5f0wqps26zjlwrc6chah08ryu4hzzdwhc` + +- `cosmosaccpub` + * Derived from account keys generated by `gaiacli keys add` + * e.g. `cosmosaccpub1zcjduc3q7fu03jnlu2xpl75s2nkt7krm6grh4cc5aqth73v0zwmea25wj2hsqhlqzm` + +- `cosmosvalpub` + * Generated when the node is created with `gaiad init`. + * Get this value with `gaiad tendermint show_validator` + * e.g. `cosmosvalpub1zcjduc3qcyj09qc03elte23zwshdx92jm6ce88fgc90rtqhjx8v0608qh5ssp0w94c` + +### Key Generation + +You'll need an account private and public key pair \(a.k.a. `sk, pk` respectively\) to be able to receive funds, send txs, bond tx, etc. To generate a new key \(default _ed25519_ elliptic curve\): -``` -gaiacli keys add +```bash +gaiacli keys add ``` -Next, you will have to create a passphrase. Save the _seed_ _phrase_ in a safe place in case you forget the password. +Next, you will have to create a passphrase to protect the key on disk. The output of the above command will contain a _seed phrase_. Save the _seed phrase_ in a safe place in case you forget the password! -If you check your private keys, you'll now see ``: +If you check your private keys, you'll now see ``: -``` -gaiacli keys show +```bash +gaiacli keys show ``` You can see all your available keys by typing: -``` +```bash gaiacli keys list ``` View the validator pubkey for your node by typing: -``` +```bash gaiad tendermint show_validator ``` -Save your address and pubkey to environment variables for later use: - -``` -MYADDR= -MYPUBKEY= -``` - **WARNING:** We strongly recommend NOT using the same passphrase for multiple keys. The Tendermint team and the Interchain Foundation will not be responsible for the loss of funds. -## Get Tokens +## Fund your account -The best way to get tokens is from the [Cosmos Testnet Faucet](https://faucetcosmos.network). If the faucet is not working for you, try asking [#cosmos-validators](https://riot.im/app/#/room/#cosmos-validators:matrix.org). +The best way to get tokens is from the [Cosmos Testnet Faucet](https://faucetcosmos.network). If the faucet is not working for you, try asking [#cosmos-validators](https://riot.im/app/#/room/#cosmos-validators:matrix.org). The faucet needs the `cosmosaccaddr` from the account you wish to use for staking. -After receiving tokens to your address, you can view your account's balance by typing: +After receiving tokens to your address, you can view your account's balance by typing: -``` -gaiacli account +```bash +gaiacli account ``` -Note: When you query an account balance with zero tokens, you will get this error: `No account with address was found in the state.` This is expected! We're working on improving our error messages. - -## Send Tokens - -``` -gaiacli send --amount=10faucetToken --chain-id= --name= --to= -``` - -Note: The `--amount` flag accepts the format `--amount=`. - -Now, view the updated balances of the origin and destination accounts: - -``` -gaiacli account -gaiacli account -``` - -You can also check your balance at a given block by using the `--block` flag: - -``` -gaiacli account --block= -``` +> _*Note:*_ When you query an account balance with zero tokens, you will get this error: `No account with address was found in the state.` This can also happen if you fund the account before your node has fully synced with the chain. These are both normal. Also, we're working on improving our error messages! ## Run a Validator Node [Validators](https://cosmos.network/validators) are responsible for committing new blocks to the blockchain through voting. A validator's stake is slashed if they become unavailable, double sign a transaction, or don't cast their votes. If you only want to run a full node, a VM in the cloud is fine. However, if you are want to become a validator for the Hub's `mainnet`, you should research hardened setups. Please read [Sentry Node Architecture](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#how-can-validators-protect-themselves-from-denial-of-service-attacks) to protect your node from DDOS and ensure high-availability. Also see the [technical requirements](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#technical-requirements)). There's also more info on our [website](https://cosmos.network/validators). -Your `pubkey` can be used to create a new validator by staking tokens. You can find your validator pubkey by running: +Your `cosmosvalpub` can be used to create a new validator by staking tokens. You can find your validator pubkey by running: -``` +```bash gaiad tendermint show_validator ``` Next, craft your `gaiacli stake create-validator` command: -``` -gaiacli stake create-validator --amount=5steak --pubkey= --address-validator= --moniker=satoshi --chain-id= --name= +> _*NOTE:*_ Don't use more `steak` thank you have! You can always get more by using the [Faucet](https://faucetcosmos.network/)! + +```bash +gaiacli stake create-validator \ + --amount=5steak \ + --pubkey=$(gaiad tendermint show_validator) \ + --address-validator= + --moniker= \ + --chain-id=gaia-6002 \ + --name= ``` You can add more information to the validator, such as`--website`, `--keybase-sig`, or `--details`. Here's how: -``` -gaiacli stake edit-validator --details="To the cosmos !" --website="https://cosmos.network" +```bash +gaiacli stake edit-validator \ + --details="To the cosmos!" \ + --website="https://cosmos.network" ``` View the validator's information with this command: -``` -gaiacli stake validator --address-validator= --chain-id= +```bash +gaiacli stake validator \ + --address-validator= \ + --chain-id=gaia-6002 ``` -To check that the validator is active, look for it here: +Your validator is active if the following command returns anything: -``` -gaiacli advanced tendermint validator-set +```bash +gaiacli advanced tendermint validator-set | grep "$(gaiad tendermint show_validator)" ``` -**Note:** To be in the validator set, you need to have more total voting power than the 100th validator. +You should also be able to see your validator on the [Explorer](https://explorecosmos.network/validators). You are looking for the `bech32` encoded `address` in the `~/.gaiad/config/priv_validator.json` file. + +> _*Note:*_ To be in the validator set, you need to have more total voting power than the 100th validator. This is not normally an issue. ### Problem #1: My validator has `voting_power: 0` @@ -234,13 +253,13 @@ Your validator has become auto-unbonded. In `gaia-6002`, we unbond validators if Here's how you can return the voting power back to your validator. First, if `gaiad` is not running, start it up again: -``` +```bash gaiad start ``` Wait for your full node to catch up to the latest block. Next, run the following command. Note that `` is the address of your validator account, and `` is the name of the validator account. You can find this info by running `gaiacli keys list`. -``` +```bash gaiacli stake unrevoke --chain-id=gaia-6002 --name= ``` @@ -248,7 +267,7 @@ gaiacli stake unrevoke --chain-id=gaia-6002 --name= Lastly, check your validator again to see if your voting power is back. -``` +```bash gaiacli status ``` @@ -256,26 +275,25 @@ You may notice that your voting power is less than it used to be. That's because ### Problem #2: My `gaiad` crashes because of `too many open files` -The default number of files Linux can open (per-process) is `1024`. `gaiad` is known to open more than `1024` files. This causes the process to crash. Here's how you can fix it. +The default number of files Linux can open (per-process) is `1024`. `gaiad` is known to open more than `1024` files. This causes the process to crash. A quick fix is to run `ulimit -n 4096` (increase the number of open files allowed) and then restart the process with `gaiad start`. If you are using `systemd` or another process manager to launch `gaiad` this may require some configuration at that level. A sample `systemd` file to fix this issue is below: -``` -# find out your system's max open files (per-process) -ulimit -Sn +```toml +# /etc/systemd/system/gaiad.service +[Unit] +Description=Cosmos Gaia Node +After=network.target -# find out gaiad's current open files -ls /proc/(pidof gaiad)/fd/ | wc -l +[Service] +Type=simple +User=ubuntu +WorkingDirectory=/home/ubuntu +ExecStart=/home/ubuntu/go/bin/gaiad start +Restart=on-failure +RestartSec=3 +LimitNOFILE=4096 -# edit limits config file -sudo vi /etc/security/limits.conf - -# add this line to increase your 's max open files to 2048 - soft nofile 2048 - -# reboot to apply this new open file limit -reboot - -# review the new per-process max open files (should be 2048) -ulimit -Sn +[Install] +WantedBy=multi-user.target ``` ## Delegating to a Validator @@ -286,23 +304,66 @@ On the upcoming mainnet, you can delegate `atom` to a validator. These [delegato On the testnet, we delegate `steak` instead of `atom`. Here's how you can bond tokens to a testnet validator: -``` -gaiacli stake delegate --amount=10steak --address-delegator= --address-validator= --name= --chain-id= +```bash +gaiacli stake delegate \ + --amount=10steak \ + --address-delegator= \ + --address-validator=$(gaiad tendermint show_validator) \ + --name= \ + --chain-id=gaia-6002 ``` -While tokens are bonded, they are pooled with all the other bonded tokens in the network. Validators and delegators obtain a percentage of shares that equal their stake in this pool. +While tokens are bonded, they are pooled with all the other bonded tokens in the network. Validators and delegators obtain a percentage of shares that equal their stake in this pool. + +> _*NOTE:*_ Don't use more `steak` thank you have! You can always get more by using the [Faucet](https://faucetcosmos.network/)! ### Unbond Tokens If for any reason the validator misbehaves, or you want to unbond a certain amount of tokens, use this following command. You can unbond a specific amount of`shares`\(eg:`12.1`\) or all of them \(`MAX`\). -``` -gaiacli stake unbond --address-delegator= --address-validator= --shares=MAX --name= --chain-id= +```bash +gaiacli stake unbond \ + --address-delegator= \ + --address-validator=$(gaiad tendermint show_validator) \ + --shares=MAX \ + --name= \ + --chain-id=gaia-6002 ``` You can check your balance and your stake delegation to see that the unbonding went through successfully. +```bash +gaiacli account + +gaiacli stake delegation \ + --address-delegator= \ + --address-validator=$(gaiad tendermint show_validator) \ + --chain-id=gaia-6002 ``` -gaiacli account -gaiacli stake delegation --address-delegator= --address-validator= --chain-id= + +## Other Operations + +### Send Tokens + +```bash +gaiacli send \ + --amount=10faucetToken \ + --chain-id=gaia-6002 \ + --name= \ + --to= +``` + +> _*Note:*_ The `--amount` flag accepts the format `--amount=`. + +Now, view the updated balances of the origin and destination accounts: + +```bash +gaiacli account +gaiacli account +``` + +You can also check your balance at a given block by using the `--block` flag: + +```bash +gaiacli account --block= ``` From e2d23040a832f4e49ce22dcb807737591554dce5 Mon Sep 17 00:00:00 2001 From: Dev Ojha Date: Thu, 21 Jun 2018 09:55:08 -0700 Subject: [PATCH 292/548] Merge PR #1325: Refactor Complete Setup to not take in a testing parameter * Refactor Complete Setup to not take in a testing parameter * Update changelog --- CHANGELOG.md | 1 + examples/democoin/x/cool/app_test.go | 3 ++- examples/democoin/x/pow/app_test.go | 3 ++- x/auth/mock/app.go | 8 ++------ x/auth/mock/auth_app_test.go | 3 ++- x/bank/app_test.go | 2 +- x/ibc/app_test.go | 5 +++-- x/slashing/app_test.go | 2 +- x/stake/app_test.go | 2 +- 9 files changed, 15 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5edcaedcf8..9efa8c047d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ BREAKING CHANGES FEATURES * [gaiacli] You can now attach a simple text-only memo to any transaction, with the `--memo` flag +* [mockapp] CompleteSetup() no longer takes a testing parameter FIXES * \#1259 - fix bug where certain tests that could have a nil pointer in defer diff --git a/examples/democoin/x/cool/app_test.go b/examples/democoin/x/cool/app_test.go index eae3250e0b..abb048dcc5 100644 --- a/examples/democoin/x/cool/app_test.go +++ b/examples/democoin/x/cool/app_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" @@ -56,7 +57,7 @@ func getMockApp(t *testing.T) *mock.App { mapp.SetInitChainer(getInitChainer(mapp, keeper, "ice-cold")) - mapp.CompleteSetup(t, []*sdk.KVStoreKey{keyCool}) + require.NoError(t, mapp.CompleteSetup([]*sdk.KVStoreKey{keyCool})) return mapp } diff --git a/examples/democoin/x/pow/app_test.go b/examples/democoin/x/pow/app_test.go index 0cfc890a06..2c1df6d6f3 100644 --- a/examples/democoin/x/pow/app_test.go +++ b/examples/democoin/x/pow/app_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" @@ -32,7 +33,7 @@ func getMockApp(t *testing.T) *mock.App { mapp.SetInitChainer(getInitChainer(mapp, keeper)) - mapp.CompleteSetup(t, []*sdk.KVStoreKey{keyPOW}) + require.NoError(t, mapp.CompleteSetup([]*sdk.KVStoreKey{keyPOW})) return mapp } diff --git a/x/auth/mock/app.go b/x/auth/mock/app.go index 9530088076..8223733e05 100644 --- a/x/auth/mock/app.go +++ b/x/auth/mock/app.go @@ -1,11 +1,8 @@ package mock import ( - "testing" - "os" - "github.com/stretchr/testify/require" abci "github.com/tendermint/abci/types" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" @@ -65,13 +62,12 @@ func NewApp() *App { } // complete the application setup after the routes have been registered -func (app *App) CompleteSetup(t *testing.T, newKeys []*sdk.KVStoreKey) { - +func (app *App) CompleteSetup(newKeys []*sdk.KVStoreKey) error { newKeys = append(newKeys, app.KeyMain) newKeys = append(newKeys, app.KeyAccount) app.MountStoresIAVL(newKeys...) err := app.LoadLatestVersion(app.KeyMain) - require.NoError(t, err) + return err } // custom logic for initialization diff --git a/x/auth/mock/auth_app_test.go b/x/auth/mock/auth_app_test.go index 9dfaba3b65..02c8eb454d 100644 --- a/x/auth/mock/auth_app_test.go +++ b/x/auth/mock/auth_app_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" @@ -36,7 +37,7 @@ func getMockApp(t *testing.T) *App { mapp.Router().AddRoute("bank", bank.NewHandler(coinKeeper)) mapp.Router().AddRoute("auth", auth.NewHandler(mapp.AccountMapper)) - mapp.CompleteSetup(t, []*sdk.KVStoreKey{}) + require.NoError(t, mapp.CompleteSetup([]*sdk.KVStoreKey{})) return mapp } diff --git a/x/bank/app_test.go b/x/bank/app_test.go index b41ff42b09..8922eab44d 100644 --- a/x/bank/app_test.go +++ b/x/bank/app_test.go @@ -83,7 +83,7 @@ func getMockApp(t *testing.T) *mock.App { coinKeeper := NewKeeper(mapp.AccountMapper) mapp.Router().AddRoute("bank", NewHandler(coinKeeper)) - mapp.CompleteSetup(t, []*sdk.KVStoreKey{}) + require.NoError(t, mapp.CompleteSetup([]*sdk.KVStoreKey{})) return mapp } diff --git a/x/ibc/app_test.go b/x/ibc/app_test.go index c546890100..a75a401f62 100644 --- a/x/ibc/app_test.go +++ b/x/ibc/app_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" @@ -24,7 +25,7 @@ func getMockApp(t *testing.T) *mock.App { coinKeeper := bank.NewKeeper(mapp.AccountMapper) mapp.Router().AddRoute("ibc", NewHandler(ibcMapper, coinKeeper)) - mapp.CompleteSetup(t, []*sdk.KVStoreKey{keyIBC}) + require.NoError(t, mapp.CompleteSetup([]*sdk.KVStoreKey{keyIBC})) return mapp } @@ -70,7 +71,7 @@ func TestIBCMsgs(t *testing.T) { Sequence: 0, } - mock.SignCheckDeliver(t, mapp.BaseApp, transferMsg, []int64{0},[]int64{0}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, transferMsg, []int64{0}, []int64{0}, true, priv1) mock.CheckBalance(t, mapp, addr1, emptyCoins) mock.SignCheckDeliver(t, mapp.BaseApp, transferMsg, []int64{0}, []int64{1}, false, priv1) mock.SignCheckDeliver(t, mapp.BaseApp, receiveMsg, []int64{0}, []int64{2}, true, priv1) diff --git a/x/slashing/app_test.go b/x/slashing/app_test.go index 39b2819d25..9895c3ea2c 100644 --- a/x/slashing/app_test.go +++ b/x/slashing/app_test.go @@ -36,7 +36,7 @@ func getMockApp(t *testing.T) (*mock.App, stake.Keeper, Keeper) { mapp.SetEndBlocker(getEndBlocker(stakeKeeper)) mapp.SetInitChainer(getInitChainer(mapp, stakeKeeper)) - mapp.CompleteSetup(t, []*sdk.KVStoreKey{keyStake, keySlashing}) + require.NoError(t, mapp.CompleteSetup([]*sdk.KVStoreKey{keyStake, keySlashing})) return mapp, stakeKeeper, keeper } diff --git a/x/stake/app_test.go b/x/stake/app_test.go index 023999c48c..c926a97523 100644 --- a/x/stake/app_test.go +++ b/x/stake/app_test.go @@ -42,7 +42,7 @@ func getMockApp(t *testing.T) (*mock.App, Keeper) { mapp.SetEndBlocker(getEndBlocker(keeper)) mapp.SetInitChainer(getInitChainer(mapp, keeper)) - mapp.CompleteSetup(t, []*sdk.KVStoreKey{keyStake}) + require.NoError(t, mapp.CompleteSetup([]*sdk.KVStoreKey{keyStake})) return mapp, keeper } From 81c773c8bf42dcbb3f56d35d10380d0a1dcb539a Mon Sep 17 00:00:00 2001 From: Peng Zhong <172531+nylira@users.noreply.github.com> Date: Fri, 22 Jun 2018 01:12:35 +0800 Subject: [PATCH 293/548] Merge PR #1328: Testnet readme: how to edit validator description * show how to edit validator description * teach about keybase sig * add dash * add more dashes * talk about logos for validators --- cmd/gaia/testnets/README.md | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/cmd/gaia/testnets/README.md b/cmd/gaia/testnets/README.md index a6a59562cf..5b6df83ad3 100644 --- a/cmd/gaia/testnets/README.md +++ b/cmd/gaia/testnets/README.md @@ -201,6 +201,8 @@ gaiacli account [Validators](https://cosmos.network/validators) are responsible for committing new blocks to the blockchain through voting. A validator's stake is slashed if they become unavailable, double sign a transaction, or don't cast their votes. If you only want to run a full node, a VM in the cloud is fine. However, if you are want to become a validator for the Hub's `mainnet`, you should research hardened setups. Please read [Sentry Node Architecture](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#how-can-validators-protect-themselves-from-denial-of-service-attacks) to protect your node from DDOS and ensure high-availability. Also see the [technical requirements](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#technical-requirements)). There's also more info on our [website](https://cosmos.network/validators). +### Create Your Validator + Your `cosmosvalpub` can be used to create a new validator by staking tokens. You can find your validator pubkey by running: ```bash @@ -216,19 +218,29 @@ gaiacli stake create-validator \ --amount=5steak \ --pubkey=$(gaiad tendermint show_validator) \ --address-validator= - --moniker= \ + --moniker="choose a moniker" \ --chain-id=gaia-6002 \ --name= ``` -You can add more information to the validator, such as`--website`, `--keybase-sig`, or `--details`. Here's how: +### Edit Validator Description + +You can edit your validator's public description. This info is to identify your validator, and will be relied on by delegators to decide which validators to stake to. Make sure to provide input for every flag below, otherwise the field will default to empty (`--moniker` defaults to the machine name). + +The `--keybase-sig` is a 16-digit string that is generated with a [keybase.io](https://keybase.io) account. It's a cryptographically secure method of verifying your identity across multiple online networks. The Keybase API allows us to retrieve your Keybase avatar. This is how you can add a logo to your validator profile. ```bash -gaiacli stake edit-validator \ - --details="To the cosmos!" \ - --website="https://cosmos.network" +gaiacli stake edit-validator + --address-validator= + --moniker="choose a moniker" \ + --website="https://cosmos.network" \ + --keybase-sig="6A0D65E29A4CBC8E" + --details="To infinity and beyond!" + --chain-id=gaia-6002 \ + --name= ``` +### View Validator Description View the validator's information with this command: ```bash From 4884747662768d0325c86e5f10f8dc7f508e0d60 Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 21 Jun 2018 10:21:58 -0700 Subject: [PATCH 294/548] Merge PR #1317: Added tx hash to query output in LCD * added tx hash * changelog --- CHANGELOG.md | 1 + client/lcd/lcd_test.go | 6 ++++++ client/tx/query.go | 4 ++++ 3 files changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9efa8c047d..81a22e048d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ BREAKING CHANGES FEATURES * [gaiacli] You can now attach a simple text-only memo to any transaction, with the `--memo` flag +* [lcd] Queried TXs now include the tx hash to identify each tx * [mockapp] CompleteSetup() no longer takes a testing parameter FIXES diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 8ad8b45dbe..c3bec2f8b1 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -16,6 +16,7 @@ import ( cryptoKeys "github.com/tendermint/go-crypto/keys" p2p "github.com/tendermint/tendermint/p2p" ctypes "github.com/tendermint/tendermint/rpc/core/types" + "github.com/tendermint/tmlibs/common" client "github.com/cosmos/cosmos-sdk/client" keys "github.com/cosmos/cosmos-sdk/client/keys" @@ -309,6 +310,7 @@ func TestTxs(t *testing.T) { require.Equal(t, http.StatusOK, res.StatusCode, body) type txInfo struct { + Hash common.HexBytes `json:"hash"` Height int64 `json:"height"` Tx sdk.Tx `json:"tx"` Result abci.ResponseDeliverTx `json:"result"` @@ -324,6 +326,10 @@ func TestTxs(t *testing.T) { require.NoError(t, err) assert.Equal(t, 1, len(indexedTxs)) + // XXX should this move into some other testfile for txs in general? + // test if created TX hash is the correct hash + assert.Equal(t, resultTx.Hash, indexedTxs[0].Hash) + // query sender // also tests url decoding addrBech := sdk.MustBech32ifyAcc(addr) diff --git a/client/tx/query.go b/client/tx/query.go index 86439b3177..01cf959c8d 100644 --- a/client/tx/query.go +++ b/client/tx/query.go @@ -7,6 +7,8 @@ import ( "net/http" "strconv" + "github.com/tendermint/tmlibs/common" + "github.com/gorilla/mux" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -81,6 +83,7 @@ func formatTxResult(cdc *wire.Codec, res *ctypes.ResultTx) (txInfo, error) { } info := txInfo{ + Hash: res.Hash, Height: res.Height, Tx: tx, Result: res.TxResult, @@ -90,6 +93,7 @@ func formatTxResult(cdc *wire.Codec, res *ctypes.ResultTx) (txInfo, error) { // txInfo is used to prepare info to display type txInfo struct { + Hash common.HexBytes `json:"hash"` Height int64 `json:"height"` Tx sdk.Tx `json:"tx"` Result abci.ResponseDeliverTx `json:"result"` From 3fa68249eb727d35fd2eea57fd30241fb53d951b Mon Sep 17 00:00:00 2001 From: Joon Date: Thu, 21 Jun 2018 14:33:36 -0700 Subject: [PATCH 295/548] Merge PR #1254: Add prefixstore and lib refactor * Merge pull request #1254: add prefixstore and lib refactor add prefixstore refactor lib fix test fix linter in progress in progress add test for prefixstore add KVStoreGetter, PrefixStoreGetter move PrefixStoreGetter to types/ add tests KVStore.Prefix(string) -> KVStore.Prefix([]byte) fix mock apply requests pass lint, add test apply requests * Remove unnecessarily 'valid' boolean --- server/mock/store.go | 4 + store/cachekvstore.go | 5 + store/dbstoreadapter.go | 5 + store/gaskvstore.go | 5 + store/iavlstore.go | 5 + store/prefixstore.go | 102 ++++++++++++++ store/prefixstore_test.go | 109 +++++++++++++++ types/lib/linear.go | 250 +++++++++++++++++++++++++++++++++ types/lib/linear_test.go | 157 +++++++++++++++++++++ types/lib/mapper.go | 286 -------------------------------------- types/lib/mapper_test.go | 110 --------------- types/store.go | 31 +++++ 12 files changed, 673 insertions(+), 396 deletions(-) create mode 100644 store/prefixstore.go create mode 100644 store/prefixstore_test.go create mode 100644 types/lib/linear.go create mode 100644 types/lib/linear_test.go delete mode 100644 types/lib/mapper.go delete mode 100644 types/lib/mapper_test.go diff --git a/server/mock/store.go b/server/mock/store.go index 7f62234eaf..f00c4dd8d0 100644 --- a/server/mock/store.go +++ b/server/mock/store.go @@ -95,6 +95,10 @@ func (kv kvStore) Delete(key []byte) { delete(kv.store, string(key)) } +func (kv kvStore) Prefix(prefix []byte) sdk.KVStore { + panic("not implemented") +} + func (kv kvStore) Iterator(start, end []byte) sdk.Iterator { panic("not implemented") } diff --git a/store/cachekvstore.go b/store/cachekvstore.go index 109bbfc75b..aeed6ee5fe 100644 --- a/store/cachekvstore.go +++ b/store/cachekvstore.go @@ -80,6 +80,11 @@ func (ci *cacheKVStore) Delete(key []byte) { ci.setCacheValue(key, nil, true, true) } +// Implements KVStore +func (ci *cacheKVStore) Prefix(prefix []byte) KVStore { + return prefixStore{ci, prefix} +} + // Implements CacheKVStore. func (ci *cacheKVStore) Write() { ci.mtx.Lock() diff --git a/store/dbstoreadapter.go b/store/dbstoreadapter.go index 58c9e1b293..59369af563 100644 --- a/store/dbstoreadapter.go +++ b/store/dbstoreadapter.go @@ -19,5 +19,10 @@ func (dsa dbStoreAdapter) CacheWrap() CacheWrap { return NewCacheKVStore(dsa) } +// Implements KVStore +func (dsa dbStoreAdapter) Prefix(prefix []byte) KVStore { + return prefixStore{dsa, prefix} +} + // dbm.DB implements KVStore so we can CacheKVStore it. var _ KVStore = dbStoreAdapter{dbm.DB(nil)} diff --git a/store/gaskvstore.go b/store/gaskvstore.go index db65921da7..6dc699dfb3 100644 --- a/store/gaskvstore.go +++ b/store/gaskvstore.go @@ -65,6 +65,11 @@ func (gi *gasKVStore) Delete(key []byte) { gi.parent.Delete(key) } +// Implements KVStore +func (gi *gasKVStore) Prefix(prefix []byte) KVStore { + return prefixStore{gi, prefix} +} + // Implements KVStore. func (gi *gasKVStore) Iterator(start, end []byte) sdk.Iterator { return gi.iterator(start, end, true) diff --git a/store/iavlstore.go b/store/iavlstore.go index 2b7914c4eb..3b4e77ee0a 100644 --- a/store/iavlstore.go +++ b/store/iavlstore.go @@ -115,6 +115,11 @@ func (st *iavlStore) Delete(key []byte) { st.tree.Remove(key) } +// Implements KVStore +func (st *iavlStore) Prefix(prefix []byte) KVStore { + return prefixStore{st, prefix} +} + // Implements KVStore. func (st *iavlStore) Iterator(start, end []byte) Iterator { return newIAVLIterator(st.tree.Tree(), start, end, true) diff --git a/store/prefixstore.go b/store/prefixstore.go new file mode 100644 index 0000000000..8c0624f35b --- /dev/null +++ b/store/prefixstore.go @@ -0,0 +1,102 @@ +package store + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + +type prefixStore struct { + store KVStore + prefix []byte +} + +// Implements Store +func (s prefixStore) GetStoreType() StoreType { + return sdk.StoreTypePrefix +} + +// Implements CacheWrap +func (s prefixStore) CacheWrap() CacheWrap { + return NewCacheKVStore(s) +} + +// Implements KVStore +func (s prefixStore) Get(key []byte) []byte { + return s.store.Get(append(s.prefix, key...)) +} + +// Implements KVStore +func (s prefixStore) Has(key []byte) bool { + return s.store.Has(append(s.prefix, key...)) +} + +// Implements KVStore +func (s prefixStore) Set(key, value []byte) { + s.store.Set(append(s.prefix, key...), value) +} + +// Implements KVStore +func (s prefixStore) Delete(key []byte) { + s.store.Delete(append(s.prefix, key...)) +} + +// Implements KVStore +func (s prefixStore) Prefix(prefix []byte) KVStore { + return prefixStore{s, prefix} +} + +// Implements KVStore +func (s prefixStore) Iterator(start, end []byte) Iterator { + return prefixIterator{ + prefix: s.prefix, + iter: s.store.Iterator(start, end), + } +} + +// Implements KVStore +func (s prefixStore) ReverseIterator(start, end []byte) Iterator { + return prefixIterator{ + prefix: s.prefix, + iter: s.store.ReverseIterator(start, end), + } +} + +type prefixIterator struct { + prefix []byte + + iter Iterator +} + +// Implements Iterator +func (iter prefixIterator) Domain() (start []byte, end []byte) { + start, end = iter.iter.Domain() + start = start[len(iter.prefix):] + end = end[len(iter.prefix):] + return +} + +// Implements Iterator +func (iter prefixIterator) Valid() bool { + return iter.iter.Valid() +} + +// Implements Iterator +func (iter prefixIterator) Next() { + iter.iter.Next() +} + +// Implements Iterator +func (iter prefixIterator) Key() (key []byte) { + key = iter.iter.Key() + key = key[len(iter.prefix):] + return +} + +// Implements Iterator +func (iter prefixIterator) Value() []byte { + return iter.iter.Value() +} + +// Implements Iterator +func (iter prefixIterator) Close() { + iter.iter.Close() +} diff --git a/store/prefixstore_test.go b/store/prefixstore_test.go new file mode 100644 index 0000000000..d41d120553 --- /dev/null +++ b/store/prefixstore_test.go @@ -0,0 +1,109 @@ +package store + +import ( + "math/rand" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/tendermint/iavl" + dbm "github.com/tendermint/tmlibs/db" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +type kvpair struct { + key []byte + value []byte +} + +func setRandomKVPairs(t *testing.T, store KVStore) []kvpair { + kvps := make([]kvpair, 20) + + for i := 0; i < 20; i++ { + kvps[i].key = make([]byte, 32) + rand.Read(kvps[i].key) + kvps[i].value = make([]byte, 32) + rand.Read(kvps[i].value) + + store.Set(kvps[i].key, kvps[i].value) + } + + return kvps +} + +func testPrefixStore(t *testing.T, baseStore KVStore, prefix []byte) { + prefixStore := baseStore.Prefix(prefix) + + kvps := setRandomKVPairs(t, prefixStore) + + buf := make([]byte, 32) + for i := 0; i < 20; i++ { + rand.Read(buf) + assert.False(t, prefixStore.Has(buf)) + assert.Nil(t, prefixStore.Get(buf)) + assert.False(t, baseStore.Has(append(prefix, buf...))) + assert.Nil(t, baseStore.Get(append(prefix, buf...))) + } + + for i := 0; i < 20; i++ { + key := kvps[i].key + assert.True(t, prefixStore.Has(key)) + assert.Equal(t, kvps[i].value, prefixStore.Get(key)) + assert.True(t, baseStore.Has(append(prefix, key...))) + assert.Equal(t, kvps[i].value, baseStore.Get(append(prefix, key...))) + + prefixStore.Delete(key) + assert.False(t, prefixStore.Has(key)) + assert.Nil(t, prefixStore.Get(key)) + assert.False(t, baseStore.Has(append(prefix, buf...))) + assert.Nil(t, baseStore.Get(append(prefix, buf...))) + } + +} + +func TestIAVLStorePrefix(t *testing.T) { + db := dbm.NewMemDB() + tree := iavl.NewVersionedTree(db, cacheSize) + iavlStore := newIAVLStore(tree, numHistory) + + testPrefixStore(t, iavlStore, []byte("test")) +} + +func TestCacheKVStorePrefix(t *testing.T) { + cacheStore := newCacheKVStore() + + testPrefixStore(t, cacheStore, []byte("test")) +} + +func TestGasKVStorePrefix(t *testing.T) { + meter := sdk.NewGasMeter(100000000) + mem := dbStoreAdapter{dbm.NewMemDB()} + gasStore := NewGasKVStore(meter, mem) + + testPrefixStore(t, gasStore, []byte("test")) +} + +func TestPrefixStoreIterate(t *testing.T) { + db := dbm.NewMemDB() + baseStore := dbStoreAdapter{db} + prefix := []byte("test") + prefixStore := baseStore.Prefix(prefix) + + setRandomKVPairs(t, prefixStore) + + bIter := sdk.KVStorePrefixIterator(baseStore, prefix) + pIter := sdk.KVStorePrefixIterator(prefixStore, nil) + + for bIter.Valid() && pIter.Valid() { + assert.Equal(t, bIter.Key(), append(prefix, pIter.Key()...)) + assert.Equal(t, bIter.Value(), pIter.Value()) + + bIter.Next() + pIter.Next() + } + + assert.Equal(t, bIter.Valid(), pIter.Valid()) + bIter.Close() + pIter.Close() +} diff --git a/types/lib/linear.go b/types/lib/linear.go new file mode 100644 index 0000000000..75cb719a5d --- /dev/null +++ b/types/lib/linear.go @@ -0,0 +1,250 @@ +package lib + +import ( + "fmt" + "strconv" + + sdk "github.com/cosmos/cosmos-sdk/types" + wire "github.com/cosmos/cosmos-sdk/wire" +) + +// Linear defines a primitive mapper type +type Linear struct { + cdc *wire.Codec + store sdk.KVStore + keys *LinearKeys +} + +// LinearKeys defines keysions for the key bytes +type LinearKeys struct { + LengthKey []byte + ElemKey []byte + TopKey []byte +} + +// Should never be modified +var cachedDefaultLinearKeys = DefaultLinearKeys() + +// DefaultLinearKeys returns the default setting of LinearOption +func DefaultLinearKeys() *LinearKeys { + keys := LinearKeys{ + LengthKey: []byte{0x00}, + ElemKey: []byte{0x01}, + TopKey: []byte{0x02}, + } + return &keys +} + +// NewLinear constructs new Linear +func NewLinear(cdc *wire.Codec, store sdk.KVStore, keys *LinearKeys) Linear { + if keys == nil { + keys = cachedDefaultLinearKeys + } + if keys.LengthKey == nil || keys.ElemKey == nil || keys.TopKey == nil { + panic("Invalid LinearKeys") + } + return Linear{ + cdc: cdc, + store: store, + keys: keys, + } +} + +// List is a Linear interface that provides list-like functions +// It panics when the element type cannot be (un/)marshalled by the codec +type List interface { + + // Len() returns the length of the list + // The length is only increased by Push() and not decreased + // List dosen't check if an index is in bounds + // The user should check Len() before doing any actions + Len() uint64 + + // Get() returns the element by its index + Get(uint64, interface{}) error + + // Set() stores the element to the given position + // Setting element out of range will break length counting + // Use Push() instead of Set() to append a new element + Set(uint64, interface{}) + + // Delete() deletes the element in the given position + // Other elements' indices are preserved after deletion + // Panics when the index is out of range + Delete(uint64) + + // Push() inserts the element to the end of the list + // It will increase the length when it is called + Push(interface{}) + + // Iterate*() is used to iterate over all existing elements in the list + // Return true in the continuation to break + // The second element of the continuation will indicate the position of the element + // Using it with Get() will return the same one with the provided element + + // CONTRACT: No writes may happen within a domain while iterating over it. + Iterate(interface{}, func(uint64) bool) +} + +// NewList constructs new List +func NewList(cdc *wire.Codec, store sdk.KVStore, keys *LinearKeys) List { + return NewLinear(cdc, store, keys) +} + +// Key for the length of the list +func (m Linear) LengthKey() []byte { + return m.keys.LengthKey +} + +// Key for the elements of the list +func (m Linear) ElemKey(index uint64) []byte { + return append(m.keys.ElemKey, []byte(fmt.Sprintf("%020d", index))...) +} + +// Len implements List +func (m Linear) Len() (res uint64) { + bz := m.store.Get(m.LengthKey()) + if bz == nil { + return 0 + } + m.cdc.MustUnmarshalBinary(bz, &res) + return +} + +// Get implements List +func (m Linear) Get(index uint64, ptr interface{}) error { + bz := m.store.Get(m.ElemKey(index)) + return m.cdc.UnmarshalBinary(bz, ptr) +} + +// Set implements List +func (m Linear) Set(index uint64, value interface{}) { + bz := m.cdc.MustMarshalBinary(value) + m.store.Set(m.ElemKey(index), bz) +} + +// Delete implements List +func (m Linear) Delete(index uint64) { + m.store.Delete(m.ElemKey(index)) +} + +// Push implements List +func (m Linear) Push(value interface{}) { + length := m.Len() + m.Set(length, value) + m.store.Set(m.LengthKey(), m.cdc.MustMarshalBinary(length+1)) +} + +// IterateRead implements List +func (m Linear) Iterate(ptr interface{}, fn func(uint64) bool) { + iter := sdk.KVStorePrefixIterator(m.store, []byte{0x01}) + for ; iter.Valid(); iter.Next() { + v := iter.Value() + m.cdc.MustUnmarshalBinary(v, ptr) + k := iter.Key() + s := string(k[len(k)-20:]) + index, err := strconv.ParseUint(s, 10, 64) + if err != nil { + panic(err) + } + if fn(index) { + break + } + } + + iter.Close() +} + +// Queue is a Linear interface that provides queue-like functions +// It panics when the element type cannot be (un/)marshalled by the codec +type Queue interface { + // Push() inserts the elements to the rear of the queue + Push(interface{}) + + // Popping/Peeking on an empty queue will cause panic + // The user should check IsEmpty() before doing any actions + + // Peek() returns the element at the front of the queue without removing it + Peek(interface{}) error + + // Pop() returns the element at the front of the queue and removes it + Pop() + + // IsEmpty() checks if the queue is empty + IsEmpty() bool + + // Flush() removes elements it processed + // Return true in the continuation to break + // The interface{} is unmarshalled before the continuation is called + // Starts from the top(head) of the queue + // CONTRACT: Pop() or Push() should not be performed while flushing + Flush(interface{}, func() bool) +} + +// NewQueue constructs new Queue +func NewQueue(cdc *wire.Codec, store sdk.KVStore, keys *LinearKeys) Queue { + return NewLinear(cdc, store, keys) +} + +// Key for the top element position in the queue +func (m Linear) TopKey() []byte { + return m.keys.TopKey +} + +func (m Linear) getTop() (res uint64) { + bz := m.store.Get(m.TopKey()) + if bz == nil { + return 0 + } + + m.cdc.MustUnmarshalBinary(bz, &res) + return +} + +func (m Linear) setTop(top uint64) { + bz := m.cdc.MustMarshalBinary(top) + m.store.Set(m.TopKey(), bz) +} + +// Peek implements Queue +func (m Linear) Peek(ptr interface{}) error { + top := m.getTop() + return m.Get(top, ptr) +} + +// Pop implements Queue +func (m Linear) Pop() { + top := m.getTop() + m.Delete(top) + m.setTop(top + 1) +} + +// IsEmpty implements Queue +func (m Linear) IsEmpty() bool { + top := m.getTop() + length := m.Len() + return top >= length +} + +// Flush implements Queue +func (m Linear) Flush(ptr interface{}, fn func() bool) { + top := m.getTop() + length := m.Len() + + var i uint64 + for i = top; i < length; i++ { + m.Get(i, ptr) + m.Delete(i) + if fn() { + break + } + } + m.setTop(i) +} + +func subspace(prefix []byte) (start, end []byte) { + end = make([]byte, len(prefix)) + copy(end, prefix) + end[len(end)-1]++ + return prefix, end +} diff --git a/types/lib/linear_test.go b/types/lib/linear_test.go new file mode 100644 index 0000000000..db65f374fc --- /dev/null +++ b/types/lib/linear_test.go @@ -0,0 +1,157 @@ +package lib + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + + dbm "github.com/tendermint/tmlibs/db" + "github.com/tendermint/tmlibs/log" + + abci "github.com/tendermint/abci/types" + + "github.com/cosmos/cosmos-sdk/store" + sdk "github.com/cosmos/cosmos-sdk/types" + wire "github.com/cosmos/cosmos-sdk/wire" +) + +type S struct { + I uint64 + B bool +} + +func defaultComponents(key sdk.StoreKey) (sdk.Context, *wire.Codec) { + db := dbm.NewMemDB() + cms := store.NewCommitMultiStore(db) + cms.MountStoreWithDB(key, sdk.StoreTypeIAVL, db) + cms.LoadLatestVersion() + ctx := sdk.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger()) + cdc := wire.NewCodec() + return ctx, cdc +} + +func TestList(t *testing.T) { + key := sdk.NewKVStoreKey("test") + ctx, cdc := defaultComponents(key) + store := ctx.KVStore(key) + lm := NewList(cdc, store, nil) + + val := S{1, true} + var res S + + lm.Push(val) + assert.Equal(t, uint64(1), lm.Len()) + lm.Get(uint64(0), &res) + assert.Equal(t, val, res) + + val = S{2, false} + lm.Set(uint64(0), val) + lm.Get(uint64(0), &res) + assert.Equal(t, val, res) + + val = S{100, false} + lm.Push(val) + assert.Equal(t, uint64(2), lm.Len()) + lm.Get(uint64(1), &res) + assert.Equal(t, val, res) + + lm.Delete(uint64(1)) + assert.Equal(t, uint64(2), lm.Len()) + + lm.Iterate(&res, func(index uint64) (brk bool) { + var temp S + lm.Get(index, &temp) + assert.Equal(t, temp, res) + + assert.True(t, index != 1) + return + }) + + lm.Iterate(&res, func(index uint64) (brk bool) { + lm.Set(index, S{res.I + 1, !res.B}) + return + }) + + lm.Get(uint64(0), &res) + assert.Equal(t, S{3, true}, res) +} + +func TestQueue(t *testing.T) { + key := sdk.NewKVStoreKey("test") + ctx, cdc := defaultComponents(key) + store := ctx.KVStore(key) + + qm := NewQueue(cdc, store, nil) + + val := S{1, true} + var res S + + qm.Push(val) + qm.Peek(&res) + assert.Equal(t, val, res) + + qm.Pop() + empty := qm.IsEmpty() + + assert.True(t, empty) + assert.NotNil(t, qm.Peek(&res)) + + qm.Push(S{1, true}) + qm.Push(S{2, true}) + qm.Push(S{3, true}) + qm.Flush(&res, func() (brk bool) { + if res.I == 3 { + brk = true + } + return + }) + + assert.False(t, qm.IsEmpty()) + + qm.Pop() + assert.True(t, qm.IsEmpty()) +} + +func TestOptions(t *testing.T) { + key := sdk.NewKVStoreKey("test") + ctx, cdc := defaultComponents(key) + store := ctx.KVStore(key) + + keys := &LinearKeys{ + LengthKey: []byte{0xDE, 0xAD}, + ElemKey: []byte{0xBE, 0xEF}, + TopKey: []byte{0x12, 0x34}, + } + linear := NewLinear(cdc, store, keys) + + for i := 0; i < 10; i++ { + linear.Push(i) + } + + var len uint64 + var top uint64 + var expected int + var actual int + + // Checking keys.LengthKey + err := cdc.UnmarshalBinary(store.Get(keys.LengthKey), &len) + assert.Nil(t, err) + assert.Equal(t, len, linear.Len()) + + // Checking keys.ElemKey + for i := 0; i < 10; i++ { + linear.Get(uint64(i), &expected) + bz := store.Get(append(keys.ElemKey, []byte(fmt.Sprintf("%020d", i))...)) + err = cdc.UnmarshalBinary(bz, &actual) + assert.Nil(t, err) + assert.Equal(t, expected, actual) + } + + linear.Pop() + + err = cdc.UnmarshalBinary(store.Get(keys.TopKey), &top) + assert.Nil(t, err) + assert.Equal(t, top, linear.getTop()) + +} diff --git a/types/lib/mapper.go b/types/lib/mapper.go deleted file mode 100644 index ca90200773..0000000000 --- a/types/lib/mapper.go +++ /dev/null @@ -1,286 +0,0 @@ -package lib - -import ( - "fmt" - "strconv" - - sdk "github.com/cosmos/cosmos-sdk/types" - wire "github.com/cosmos/cosmos-sdk/wire" -) - -// Mapper defines a primitive mapper type -type Mapper struct { - key sdk.StoreKey - cdc *wire.Codec - prefix string -} - -// ListMapper is a Mapper interface that provides list-like functions -// It panics when the element type cannot be (un/)marshalled by the codec -type ListMapper interface { - - // Len() returns the length of the list - // The length is only increased by Push() and not decreased - // ListMapper dosen't check if an index is in bounds - // The user should check Len() before doing any actions - Len(sdk.Context) uint64 - - // Get() returns the element by its index - Get(sdk.Context, uint64, interface{}) error - - // Set() stores the element to the given position - // Setting element out of range will break length counting - // Use Push() instead of Set() to append a new element - Set(sdk.Context, uint64, interface{}) - - // Delete() deletes the element in the given position - // Other elements' indices are preserved after deletion - // Panics when the index is out of range - Delete(sdk.Context, uint64) - - // Push() inserts the element to the end of the list - // It will increase the length when it is called - Push(sdk.Context, interface{}) - - // Iterate*() is used to iterate over all existing elements in the list - // Return true in the continuation to break - // The second element of the continuation will indicate the position of the element - // Using it with Get() will return the same one with the provided element - - // CONTRACT: No writes may happen within a domain while iterating over it. - IterateRead(sdk.Context, interface{}, func(sdk.Context, uint64) bool) - - // IterateWrite() is safe to write over the domain - IterateWrite(sdk.Context, interface{}, func(sdk.Context, uint64) bool) - - // Key for the length of the list - LengthKey() []byte - - // Key for getting elements - ElemKey(uint64) []byte -} - -// NewListMapper constructs new ListMapper -func NewListMapper(cdc *wire.Codec, key sdk.StoreKey, prefix string) ListMapper { - return Mapper{ - key: key, - cdc: cdc, - prefix: prefix, - } -} - -// Len implements ListMapper -func (m Mapper) Len(ctx sdk.Context) uint64 { - store := ctx.KVStore(m.key) - bz := store.Get(m.LengthKey()) - if bz == nil { - zero, err := m.cdc.MarshalBinary(0) - if err != nil { - panic(err) - } - store.Set(m.LengthKey(), zero) - return 0 - } - var res uint64 - if err := m.cdc.UnmarshalBinary(bz, &res); err != nil { - panic(err) - } - return res -} - -// Get implements ListMapper -func (m Mapper) Get(ctx sdk.Context, index uint64, ptr interface{}) error { - store := ctx.KVStore(m.key) - bz := store.Get(m.ElemKey(index)) - return m.cdc.UnmarshalBinary(bz, ptr) -} - -// Set implements ListMapper -func (m Mapper) Set(ctx sdk.Context, index uint64, value interface{}) { - store := ctx.KVStore(m.key) - bz, err := m.cdc.MarshalBinary(value) - if err != nil { - panic(err) - } - store.Set(m.ElemKey(index), bz) -} - -// Delete implements ListMapper -func (m Mapper) Delete(ctx sdk.Context, index uint64) { - store := ctx.KVStore(m.key) - store.Delete(m.ElemKey(index)) -} - -// Push implements ListMapper -func (m Mapper) Push(ctx sdk.Context, value interface{}) { - length := m.Len(ctx) - m.Set(ctx, length, value) - - store := ctx.KVStore(m.key) - store.Set(m.LengthKey(), marshalUint64(m.cdc, length+1)) -} - -// IterateRead implements ListMapper -func (m Mapper) IterateRead(ctx sdk.Context, ptr interface{}, fn func(sdk.Context, uint64) bool) { - store := ctx.KVStore(m.key) - start, end := subspace([]byte(fmt.Sprintf("%s/elem/", m.prefix))) - iter := store.Iterator(start, end) - for ; iter.Valid(); iter.Next() { - v := iter.Value() - if err := m.cdc.UnmarshalBinary(v, ptr); err != nil { - panic(err) - } - s := string(iter.Key()[len(m.prefix)+6:]) - index, err := strconv.ParseUint(s, 10, 64) - if err != nil { - panic(err) - } - if fn(ctx, index) { - break - } - } - - iter.Close() -} - -// IterateWrite implements ListMapper -func (m Mapper) IterateWrite(ctx sdk.Context, ptr interface{}, fn func(sdk.Context, uint64) bool) { - length := m.Len(ctx) - - for i := uint64(0); i < length; i++ { - if err := m.Get(ctx, i, ptr); err != nil { - continue - } - if fn(ctx, i) { - break - } - } -} - -// LengthKey implements ListMapper -func (m Mapper) LengthKey() []byte { - return []byte(fmt.Sprintf("%s/length", m.prefix)) -} - -// ElemKey implements ListMapper -func (m Mapper) ElemKey(i uint64) []byte { - return []byte(fmt.Sprintf("%s/elem/%020d", m.prefix, i)) -} - -// QueueMapper is a Mapper interface that provides queue-like functions -// It panics when the element type cannot be (un/)marshalled by the codec -type QueueMapper interface { - // Push() inserts the elements to the rear of the queue - Push(sdk.Context, interface{}) - - // Popping/Peeking on an empty queue will cause panic - // The user should check IsEmpty() before doing any actions - - // Peek() returns the element at the front of the queue without removing it - Peek(sdk.Context, interface{}) error - - // Pop() returns the element at the front of the queue and removes it - Pop(sdk.Context) - - // IsEmpty() checks if the queue is empty - IsEmpty(sdk.Context) bool - - // Flush() removes elements it processed - // Return true in the continuation to break - // The interface{} is unmarshalled before the continuation is called - // Starts from the top(head) of the queue - // CONTRACT: Pop() or Push() should not be performed while flushing - Flush(sdk.Context, interface{}, func(sdk.Context) bool) - - // Key for the index of top element - TopKey() []byte -} - -// NewQueueMapper constructs new QueueMapper -func NewQueueMapper(cdc *wire.Codec, key sdk.StoreKey, prefix string) QueueMapper { - return Mapper{ - key: key, - cdc: cdc, - prefix: prefix, - } -} - -func (m Mapper) getTop(store sdk.KVStore) (res uint64) { - bz := store.Get(m.TopKey()) - if bz == nil { - store.Set(m.TopKey(), marshalUint64(m.cdc, 0)) - return 0 - } - - if err := m.cdc.UnmarshalBinary(bz, &res); err != nil { - panic(err) - } - - return -} - -func (m Mapper) setTop(store sdk.KVStore, top uint64) { - bz := marshalUint64(m.cdc, top) - store.Set(m.TopKey(), bz) -} - -// Peek implements QueueMapper -func (m Mapper) Peek(ctx sdk.Context, ptr interface{}) error { - store := ctx.KVStore(m.key) - top := m.getTop(store) - return m.Get(ctx, top, ptr) -} - -// Pop implements QueueMapper -func (m Mapper) Pop(ctx sdk.Context) { - store := ctx.KVStore(m.key) - top := m.getTop(store) - m.Delete(ctx, top) - m.setTop(store, top+1) -} - -// IsEmpty implements QueueMapper -func (m Mapper) IsEmpty(ctx sdk.Context) bool { - store := ctx.KVStore(m.key) - top := m.getTop(store) - length := m.Len(ctx) - return top >= length -} - -// Flush implements QueueMapper -func (m Mapper) Flush(ctx sdk.Context, ptr interface{}, fn func(sdk.Context) bool) { - store := ctx.KVStore(m.key) - top := m.getTop(store) - length := m.Len(ctx) - - var i uint64 - for i = top; i < length; i++ { - m.Get(ctx, i, ptr) - m.Delete(ctx, i) - if fn(ctx) { - break - } - } - - m.setTop(store, i) -} - -// TopKey implements QueueMapper -func (m Mapper) TopKey() []byte { - return []byte(fmt.Sprintf("%s/top", m.prefix)) -} - -func marshalUint64(cdc *wire.Codec, i uint64) []byte { - bz, err := cdc.MarshalBinary(i) - if err != nil { - panic(err) - } - return bz -} - -func subspace(prefix []byte) (start, end []byte) { - end = make([]byte, len(prefix)) - copy(end, prefix) - end[len(end)-1]++ - return prefix, end -} diff --git a/types/lib/mapper_test.go b/types/lib/mapper_test.go deleted file mode 100644 index e1759b06ac..0000000000 --- a/types/lib/mapper_test.go +++ /dev/null @@ -1,110 +0,0 @@ -package lib - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - dbm "github.com/tendermint/tmlibs/db" - "github.com/tendermint/tmlibs/log" - - abci "github.com/tendermint/abci/types" - - "github.com/cosmos/cosmos-sdk/store" - sdk "github.com/cosmos/cosmos-sdk/types" - wire "github.com/cosmos/cosmos-sdk/wire" -) - -type S struct { - I uint64 - B bool -} - -func defaultComponents(key sdk.StoreKey) (sdk.Context, *wire.Codec) { - db := dbm.NewMemDB() - cms := store.NewCommitMultiStore(db) - cms.MountStoreWithDB(key, sdk.StoreTypeIAVL, db) - cms.LoadLatestVersion() - ctx := sdk.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger()) - cdc := wire.NewCodec() - return ctx, cdc -} - -func TestListMapper(t *testing.T) { - key := sdk.NewKVStoreKey("list") - ctx, cdc := defaultComponents(key) - lm := NewListMapper(cdc, key, "data") - - val := S{1, true} - var res S - - lm.Push(ctx, val) - assert.Equal(t, uint64(1), lm.Len(ctx)) - lm.Get(ctx, uint64(0), &res) - assert.Equal(t, val, res) - - val = S{2, false} - lm.Set(ctx, uint64(0), val) - lm.Get(ctx, uint64(0), &res) - assert.Equal(t, val, res) - - val = S{100, false} - lm.Push(ctx, val) - assert.Equal(t, uint64(2), lm.Len(ctx)) - lm.Get(ctx, uint64(1), &res) - assert.Equal(t, val, res) - - lm.Delete(ctx, uint64(1)) - assert.Equal(t, uint64(2), lm.Len(ctx)) - - lm.IterateRead(ctx, &res, func(ctx sdk.Context, index uint64) (brk bool) { - var temp S - lm.Get(ctx, index, &temp) - assert.Equal(t, temp, res) - - assert.True(t, index != 1) - return - }) - - lm.IterateWrite(ctx, &res, func(ctx sdk.Context, index uint64) (brk bool) { - lm.Set(ctx, index, S{res.I + 1, !res.B}) - return - }) - - lm.Get(ctx, uint64(0), &res) - assert.Equal(t, S{3, true}, res) -} - -func TestQueueMapper(t *testing.T) { - key := sdk.NewKVStoreKey("queue") - ctx, cdc := defaultComponents(key) - qm := NewQueueMapper(cdc, key, "data") - - val := S{1, true} - var res S - - qm.Push(ctx, val) - qm.Peek(ctx, &res) - assert.Equal(t, val, res) - - qm.Pop(ctx) - empty := qm.IsEmpty(ctx) - - assert.True(t, empty) - assert.NotNil(t, qm.Peek(ctx, &res)) - - qm.Push(ctx, S{1, true}) - qm.Push(ctx, S{2, true}) - qm.Push(ctx, S{3, true}) - qm.Flush(ctx, &res, func(ctx sdk.Context) (brk bool) { - if res.I == 3 { - brk = true - } - return - }) - - assert.False(t, qm.IsEmpty(ctx)) - - qm.Pop(ctx) - assert.True(t, qm.IsEmpty(ctx)) -} diff --git a/types/store.go b/types/store.go index d0a8df07ab..899b57015b 100644 --- a/types/store.go +++ b/types/store.go @@ -103,6 +103,9 @@ type KVStore interface { // Delete deletes the key. Panics on nil key. Delete(key []byte) + // Prefix applied keys with the argument + Prefix(prefix []byte) KVStore + // Iterator over a domain of keys in ascending order. End is exclusive. // Start must be less than end, or the Iterator is invalid. // Iterator must be closed by caller. @@ -152,6 +155,11 @@ type CommitKVStore interface { KVStore } +// Wrapper for StoreKeys to get KVStores +type KVStoreGetter interface { + KVStore(Context) KVStore +} + //---------------------------------------- // CacheWrap @@ -204,6 +212,7 @@ const ( StoreTypeMulti StoreType = iota StoreTypeDB StoreTypeIAVL + StoreTypePrefix ) //---------------------------------------- @@ -237,6 +246,11 @@ func (key *KVStoreKey) String() string { return fmt.Sprintf("KVStoreKey{%p, %s}", key, key.name) } +// Implements KVStoreGetter +func (key *KVStoreKey) KVStore(ctx Context) KVStore { + return ctx.KVStore(key) +} + // PrefixEndBytes returns the []byte that would end a // range query for all []byte with a certain prefix // Deals with last byte of prefix being FF without overflowing @@ -263,7 +277,24 @@ func PrefixEndBytes(prefix []byte) []byte { return end } +// Getter struct for prefixed stores +type PrefixStoreGetter struct { + key StoreKey + prefix []byte +} + +func NewPrefixStoreGetter(key StoreKey, prefix []byte) PrefixStoreGetter { + return PrefixStoreGetter{key, prefix} +} + +// Implements sdk.KVStoreGetter +func (getter PrefixStoreGetter) KVStore(ctx Context) KVStore { + return ctx.KVStore(getter.key).Prefix(getter.prefix) +} + //---------------------------------------- // key-value result for iterator queries type KVPair cmn.KVPair + +//---------------------------------------- From f049a563763a1f5118a221065b1f6a530b32437a Mon Sep 17 00:00:00 2001 From: Aditya Date: Thu, 21 Jun 2018 15:05:25 -0700 Subject: [PATCH 296/548] Merge PR #1266: Multiple messages * Started work on multiple msgs, types and x/auth tests pass * Fix issues in x, examples, and baseapp * Added baseapp tests for multiple msgs * Documentation fixes * Fix baseapp tests with sdk.Int * Modify test * Transaction handling is now atomic * Fix test comment * Minor doc fixes and code cleanup * Added baseapp result changes * Use address in validator update accumulation * Started work on multiple msgs, types and x/auth tests pass * Fix issues in x, examples, and baseapp * Added baseapp tests for multiple msgs * Documentation fixes * Fix baseapp tests with sdk.Int * Modify test * Transaction handling is now atomic * Fix test comment * Minor doc fixes and code cleanup * Added baseapp result changes * Use address in validator update accumulation * Added ante tests for multisigner * Remove validatorUpdates from tx result * Better error logs * Put Memo in StdSignBytes and formatting * Updated changelog --- CHANGELOG.md | 2 + baseapp/baseapp.go | 84 +++-- baseapp/baseapp_test.go | 319 +++++++++++++++++- client/context/helpers.go | 20 +- cmd/gaia/app/genesis.go | 1 + docs/guides/guide.md | 7 +- examples/democoin/x/cool/app_test.go | 26 +- examples/democoin/x/cool/client/cli/tx.go | 5 +- examples/democoin/x/pow/app_test.go | 12 +- examples/democoin/x/pow/client/cli/tx.go | 3 +- .../x/simplestake/client/cli/commands.go | 2 +- examples/democoin/x/simplestake/handler.go | 31 +- examples/kvstore/kvstore | Bin 0 -> 20701460 bytes examples/kvstore/tx.go | 4 +- server/mock/tx.go | 4 +- types/result.go | 7 - types/tx_msg.go | 2 +- x/auth/ante.go | 6 +- x/auth/ante_test.go | 193 ++++++++--- x/auth/mock/auth_app_test.go | 8 +- x/auth/mock/simulate_block.go | 14 +- x/auth/stdtx.go | 75 ++-- x/auth/stdtx_test.go | 6 +- x/bank/app_test.go | 16 +- x/bank/client/cli/sendtx.go | 2 +- x/bank/client/rest/sendtx.go | 2 +- x/ibc/app_test.go | 8 +- x/ibc/client/cli/ibctx.go | 2 +- x/ibc/client/cli/relay.go | 2 +- x/ibc/client/rest/transfer.go | 2 +- x/slashing/app_test.go | 4 +- x/slashing/client/cli/tx.go | 2 +- x/stake/app_test.go | 8 +- x/stake/client/cli/tx.go | 8 +- x/stake/client/rest/tx.go | 2 +- 35 files changed, 657 insertions(+), 232 deletions(-) create mode 100755 examples/kvstore/kvstore diff --git a/CHANGELOG.md b/CHANGELOG.md index 81a22e048d..21a93b7248 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ BREAKING CHANGES * Change default ports from 466xx to 266xx * AltBytes renamed to Memo, now a string, max 100 characters, costs a bit of gas +* Transactions now take a list of Messages +* Signers of a transaction now only sign over their account and sequence number FEATURES * [gaiacli] You can now attach a simple text-only memo to any transaction, with the `--memo` flag diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 3265a870fb..ca4ee1447c 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -64,11 +64,8 @@ type BaseApp struct { // checkState is set on initialization and reset on Commit. // deliverState is set in InitChain and BeginBlock and cleared on Commit. // See methods setCheckState and setDeliverState. - // .valUpdates accumulate in DeliverTx and are reset in BeginBlock. - // QUESTION: should we put valUpdates in the deliverState.ctx? checkState *state // for CheckTx deliverState *state // for DeliverTx - valUpdates []abci.Validator // cached validator changes from DeliverTx signedValidators []abci.SigningValidator // absent validators from begin block } @@ -387,7 +384,6 @@ func (app *BaseApp) BeginBlock(req abci.RequestBeginBlock) (res abci.ResponseBeg if app.deliverState == nil { app.setDeliverState(req.Header) } - app.valUpdates = nil if app.beginBlocker != nil { res = app.beginBlocker(app.deliverState.ctx, req) } @@ -432,13 +428,8 @@ func (app *BaseApp) DeliverTx(txBytes []byte) (res abci.ResponseDeliverTx) { result = app.runTx(runTxModeDeliver, txBytes, tx) } - // After-handler hooks. - if result.IsOK() { - app.valUpdates = append(app.valUpdates, result.ValidatorUpdates...) - } else { - // Even though the Result.Code is not OK, there are still effects, - // namely fee deductions and sequence incrementing. - } + // Even though the Result.Code is not OK, there are still effects, + // namely fee deductions and sequence incrementing. // Tell the blockchain engine (i.e. Tendermint). return abci.ResponseDeliverTx{ @@ -484,16 +475,18 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte, tx sdk.Tx) (result sdk }() // Get the Msg. - var msg = tx.GetMsg() - if msg == nil { - return sdk.ErrInternal("Tx.GetMsg() returned nil").Result() + var msgs = tx.GetMsgs() + if msgs == nil || len(msgs) == 0 { + return sdk.ErrInternal("Tx.GetMsgs() must return at least one message in list").Result() } - // Validate the Msg. - err := msg.ValidateBasic() - if err != nil { - err = err.WithDefaultCodespace(sdk.CodespaceRoot) - return err.Result() + for _, msg := range msgs { + // Validate the Msg + err := msg.ValidateBasic() + if err != nil { + err = err.WithDefaultCodespace(sdk.CodespaceRoot) + return err.Result() + } } // Get the context @@ -521,13 +514,6 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte, tx sdk.Tx) (result sdk } } - // Match route. - msgType := msg.Type() - handler := app.router.Route(msgType) - if handler == nil { - return sdk.ErrUnknownRequest("Unrecognized Msg type: " + msgType).Result() - } - // Get the correct cache var msCache sdk.CacheMultiStore if mode == runTxModeCheck || mode == runTxModeSimulate { @@ -540,25 +526,59 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte, tx sdk.Tx) (result sdk ctx = ctx.WithMultiStore(msCache) } - result = handler(ctx, msg) + finalResult := sdk.Result{} + var logs []string + for i, msg := range msgs { + // Match route. + msgType := msg.Type() + handler := app.router.Route(msgType) + if handler == nil { + return sdk.ErrUnknownRequest("Unrecognized Msg type: " + msgType).Result() + } - // Set gas utilized - result.GasUsed = ctx.GasMeter().GasConsumed() + result = handler(ctx, msg) + + // Set gas utilized + finalResult.GasUsed += ctx.GasMeter().GasConsumed() + finalResult.GasWanted += result.GasWanted + + // Append Data and Tags + finalResult.Data = append(finalResult.Data, result.Data...) + finalResult.Tags = append(finalResult.Tags, result.Tags...) + + // Construct usable logs in multi-message transactions. Messages are 1-indexed in logs. + logs = append(logs, fmt.Sprintf("Msg %d: %s", i+1, finalResult.Log)) + + // Stop execution and return on first failed message. + if !result.IsOK() { + if len(msgs) == 1 { + return result + } + result.GasUsed = finalResult.GasUsed + if i == 0 { + result.Log = fmt.Sprintf("Msg 1 failed: %s", result.Log) + } else { + result.Log = fmt.Sprintf("Msg 1-%d Passed. Msg %d failed: %s", i, i+1, result.Log) + } + return result + } + } // If not a simulated run and result was successful, write to app.checkState.ms or app.deliverState.ms + // Only update state if all messages pass. if mode != runTxModeSimulate && result.IsOK() { msCache.Write() } - return result + finalResult.Log = strings.Join(logs, "\n") + + return finalResult } // Implements ABCI func (app *BaseApp) EndBlock(req abci.RequestEndBlock) (res abci.ResponseEndBlock) { if app.endBlocker != nil { res = app.endBlocker(app.deliverState.ctx, req) - } else { - res.ValidatorUpdates = app.valUpdates } return } diff --git a/baseapp/baseapp_test.go b/baseapp/baseapp_test.go index 7ee9f418ec..c939996c76 100644 --- a/baseapp/baseapp_test.go +++ b/baseapp/baseapp_test.go @@ -3,6 +3,7 @@ package baseapp import ( "encoding/json" "fmt" + "github.com/cosmos/cosmos-sdk/x/bank" "os" "testing" @@ -29,7 +30,7 @@ func newBaseApp(name string) *BaseApp { logger := defaultLogger() db := dbm.NewMemDB() codec := wire.NewCodec() - wire.RegisterCrypto(codec) + auth.RegisterBaseAccount(codec) return NewBaseApp(name, codec, logger, db) } @@ -262,8 +263,8 @@ type testTx struct { const msgType2 = "testTx" func (tx testTx) Type() string { return msgType2 } -func (tx testTx) GetMsg() sdk.Msg { return tx } func (tx testTx) GetMemo() string { return "" } +func (tx testTx) GetMsgs() []sdk.Msg { return []sdk.Msg{tx} } func (tx testTx) GetSignBytes() []byte { return nil } func (tx testTx) GetSigners() []sdk.Address { return nil } func (tx testTx) GetSignatures() []auth.StdSignature { return nil } @@ -547,8 +548,8 @@ type testUpdatePowerTx struct { const msgType = "testUpdatePowerTx" func (tx testUpdatePowerTx) Type() string { return msgType } -func (tx testUpdatePowerTx) GetMsg() sdk.Msg { return tx } func (tx testUpdatePowerTx) GetMemo() string { return "" } +func (tx testUpdatePowerTx) GetMsgs() []sdk.Msg { return []sdk.Msg{tx} } func (tx testUpdatePowerTx) GetSignBytes() []byte { return nil } func (tx testUpdatePowerTx) ValidateBasic() sdk.Error { return nil } func (tx testUpdatePowerTx) GetSigners() []sdk.Address { return nil } @@ -640,6 +641,318 @@ func TestValidatorChange(t *testing.T) { //---------------------------------------- +// Use burn and send msg types to test multiple msgs in one tx +type testBurnMsg struct { + Addr sdk.Address + Amount sdk.Coins +} + +const msgType3 = "burn" + +func (msg testBurnMsg) Type() string { return msgType3 } +func (msg testBurnMsg) GetSignBytes() []byte { + bz, _ := json.Marshal(msg) + return bz +} +func (msg testBurnMsg) ValidateBasic() sdk.Error { + if msg.Addr == nil { + return sdk.ErrInvalidAddress("Cannot use nil as Address") + } + return nil +} +func (msg testBurnMsg) GetSigners() []sdk.Address { + return []sdk.Address{msg.Addr} +} + +type testSendMsg struct { + Sender sdk.Address + Receiver sdk.Address + Amount sdk.Coins +} + +const msgType4 = "send" + +func (msg testSendMsg) Type() string { return msgType4 } +func (msg testSendMsg) GetSignBytes() []byte { + bz, _ := json.Marshal(msg) + return bz +} +func (msg testSendMsg) ValidateBasic() sdk.Error { + if msg.Sender == nil || msg.Receiver == nil { + return sdk.ErrInvalidAddress("Cannot use nil as Address") + } + return nil +} +func (msg testSendMsg) GetSigners() []sdk.Address { + return []sdk.Address{msg.Sender} +} + +// Simple Handlers for burn and send + +func newHandleBurn(keeper bank.Keeper) sdk.Handler { + return func(ctx sdk.Context, msg sdk.Msg) sdk.Result { + burnMsg := msg.(testBurnMsg) + _, _, err := keeper.SubtractCoins(ctx, burnMsg.Addr, burnMsg.Amount) + if err != nil { + return err.Result() + } + return sdk.Result{} + } +} + +func newHandleSpend(keeper bank.Keeper) sdk.Handler { + return func(ctx sdk.Context, msg sdk.Msg) sdk.Result { + spendMsg := msg.(testSendMsg) + _, _, err := keeper.SubtractCoins(ctx, spendMsg.Sender, spendMsg.Amount) + if err != nil { + return err.Result() + } + _, _, err = keeper.AddCoins(ctx, spendMsg.Receiver, spendMsg.Amount) + if err != nil { + return err.Result() + } + return sdk.Result{} + } +} + +// generate a signed transaction +func GenTx(chainID string, msgs []sdk.Msg, accnums []int64, seq []int64, priv ...crypto.PrivKey) auth.StdTx { + // make the transaction free + fee := auth.StdFee{ + sdk.Coins{{"foocoin", sdk.NewInt(0)}}, + 100000, + } + + sigs := make([]auth.StdSignature, len(priv)) + for i, p := range priv { + sigs[i] = auth.StdSignature{ + PubKey: p.PubKey(), + Signature: p.Sign(auth.StdSignBytes(chainID, accnums[i], seq[i], fee, msgs, "")), + AccountNumber: accnums[i], + Sequence: seq[i], + } + } + return auth.NewStdTx(msgs, fee, sigs, "") +} + +// spin up simple app for testing +type testApp struct { + *BaseApp + accountMapper auth.AccountMapper + accountKeeper bank.Keeper +} + +func newTestApp(name string) testApp { + return testApp{ + BaseApp: newBaseApp(name), + } +} + +func MakeCodec() *wire.Codec { + cdc := wire.NewCodec() + cdc.RegisterInterface((*sdk.Msg)(nil), nil) + crypto.RegisterAmino(cdc) + cdc.RegisterInterface((*auth.Account)(nil), nil) + cdc.RegisterConcrete(&auth.BaseAccount{}, "cosmos-sdk/BaseAccount", nil) + return cdc +} + +// tests multiple msgs of same type from same address in single tx +func TestMultipleBurn(t *testing.T) { + // Create app. + app := newTestApp(t.Name()) + capKey := sdk.NewKVStoreKey("key") + app.MountStoresIAVL(capKey) + app.SetTxDecoder(func(txBytes []byte) (sdk.Tx, sdk.Error) { + var tx auth.StdTx + fromJSON(txBytes, &tx) + return tx, nil + }) + + err := app.LoadLatestVersion(capKey) + if err != nil { + panic(err) + } + + app.accountMapper = auth.NewAccountMapper(app.cdc, capKey, &auth.BaseAccount{}) + app.accountKeeper = bank.NewKeeper(app.accountMapper) + + app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, auth.FeeCollectionKeeper{})) + + app.Router(). + AddRoute("burn", newHandleBurn(app.accountKeeper)). + AddRoute("send", newHandleSpend(app.accountKeeper)) + + app.InitChain(abci.RequestInitChain{}) + app.BeginBlock(abci.RequestBeginBlock{}) + + // Set chain-id + app.deliverState.ctx = app.deliverState.ctx.WithChainID(t.Name()) + + priv := makePrivKey("my secret") + addr := priv.PubKey().Address() + + app.accountKeeper.AddCoins(app.deliverState.ctx, addr, sdk.Coins{{"foocoin", sdk.NewInt(100)}}) + assert.Equal(t, sdk.Coins{{"foocoin", sdk.NewInt(100)}}, app.accountKeeper.GetCoins(app.deliverState.ctx, addr), "Balance did not update") + + msg := testBurnMsg{addr, sdk.Coins{{"foocoin", sdk.NewInt(50)}}} + tx := GenTx(t.Name(), []sdk.Msg{msg, msg}, []int64{0}, []int64{0}, priv) + + res := app.Deliver(tx) + + assert.Equal(t, true, res.IsOK(), res.Log) + assert.Equal(t, sdk.Coins(nil), app.accountKeeper.GetCoins(app.deliverState.ctx, addr), "Double burn did not work") +} + +// tests multiples msgs of same type from different addresses in single tx +func TestBurnMultipleOwners(t *testing.T) { + // Create app. + app := newTestApp(t.Name()) + capKey := sdk.NewKVStoreKey("key") + app.MountStoresIAVL(capKey) + app.SetTxDecoder(func(txBytes []byte) (sdk.Tx, sdk.Error) { + var tx auth.StdTx + fromJSON(txBytes, &tx) + return tx, nil + }) + + err := app.LoadLatestVersion(capKey) + if err != nil { + panic(err) + } + + app.accountMapper = auth.NewAccountMapper(app.cdc, capKey, &auth.BaseAccount{}) + app.accountKeeper = bank.NewKeeper(app.accountMapper) + + app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, auth.FeeCollectionKeeper{})) + + app.Router(). + AddRoute("burn", newHandleBurn(app.accountKeeper)). + AddRoute("send", newHandleSpend(app.accountKeeper)) + + app.InitChain(abci.RequestInitChain{}) + app.BeginBlock(abci.RequestBeginBlock{}) + + // Set chain-id + app.deliverState.ctx = app.deliverState.ctx.WithChainID(t.Name()) + + priv1 := makePrivKey("my secret 1") + addr1 := priv1.PubKey().Address() + + priv2 := makePrivKey("my secret 2") + addr2 := priv2.PubKey().Address() + + // fund accounts + app.accountKeeper.AddCoins(app.deliverState.ctx, addr1, sdk.Coins{{"foocoin", sdk.NewInt(100)}}) + app.accountKeeper.AddCoins(app.deliverState.ctx, addr2, sdk.Coins{{"foocoin", sdk.NewInt(100)}}) + + assert.Equal(t, sdk.Coins{{"foocoin", sdk.NewInt(100)}}, app.accountKeeper.GetCoins(app.deliverState.ctx, addr1), "Balance1 did not update") + assert.Equal(t, sdk.Coins{{"foocoin", sdk.NewInt(100)}}, app.accountKeeper.GetCoins(app.deliverState.ctx, addr2), "Balance2 did not update") + + msg1 := testBurnMsg{addr1, sdk.Coins{{"foocoin", sdk.NewInt(100)}}} + msg2 := testBurnMsg{addr2, sdk.Coins{{"foocoin", sdk.NewInt(100)}}} + + // test wrong signers: Address 1 signs both messages + tx := GenTx(t.Name(), []sdk.Msg{msg1, msg2}, []int64{0, 0}, []int64{0, 0}, priv1, priv1) + + res := app.Deliver(tx) + assert.Equal(t, sdk.ABCICodeType(0x10003), res.Code, "Wrong signatures passed") + + assert.Equal(t, sdk.Coins{{"foocoin", sdk.NewInt(100)}}, app.accountKeeper.GetCoins(app.deliverState.ctx, addr1), "Balance1 changed after invalid sig") + assert.Equal(t, sdk.Coins{{"foocoin", sdk.NewInt(100)}}, app.accountKeeper.GetCoins(app.deliverState.ctx, addr2), "Balance2 changed after invalid sig") + + // test valid tx + tx = GenTx(t.Name(), []sdk.Msg{msg1, msg2}, []int64{0, 1}, []int64{1, 0}, priv1, priv2) + + res = app.Deliver(tx) + assert.Equal(t, true, res.IsOK(), res.Log) + + assert.Equal(t, sdk.Coins(nil), app.accountKeeper.GetCoins(app.deliverState.ctx, addr1), "Balance1 did not change after valid tx") + assert.Equal(t, sdk.Coins(nil), app.accountKeeper.GetCoins(app.deliverState.ctx, addr2), "Balance2 did not change after valid tx") +} + +// tests different msg types in single tx with different addresses +func TestSendBurn(t *testing.T) { + // Create app. + app := newTestApp(t.Name()) + capKey := sdk.NewKVStoreKey("key") + app.MountStoresIAVL(capKey) + app.SetTxDecoder(func(txBytes []byte) (sdk.Tx, sdk.Error) { + var tx auth.StdTx + fromJSON(txBytes, &tx) + return tx, nil + }) + + err := app.LoadLatestVersion(capKey) + if err != nil { + panic(err) + } + + app.accountMapper = auth.NewAccountMapper(app.cdc, capKey, &auth.BaseAccount{}) + app.accountKeeper = bank.NewKeeper(app.accountMapper) + + app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, auth.FeeCollectionKeeper{})) + + app.Router(). + AddRoute("burn", newHandleBurn(app.accountKeeper)). + AddRoute("send", newHandleSpend(app.accountKeeper)) + + app.InitChain(abci.RequestInitChain{}) + app.BeginBlock(abci.RequestBeginBlock{}) + + // Set chain-id + app.deliverState.ctx = app.deliverState.ctx.WithChainID(t.Name()) + + priv1 := makePrivKey("my secret 1") + addr1 := priv1.PubKey().Address() + + priv2 := makePrivKey("my secret 2") + addr2 := priv2.PubKey().Address() + + // fund accounts + app.accountKeeper.AddCoins(app.deliverState.ctx, addr1, sdk.Coins{{"foocoin", sdk.NewInt(100)}}) + acc := app.accountMapper.NewAccountWithAddress(app.deliverState.ctx, addr2) + app.accountMapper.SetAccount(app.deliverState.ctx, acc) + + assert.Equal(t, sdk.Coins{{"foocoin", sdk.NewInt(100)}}, app.accountKeeper.GetCoins(app.deliverState.ctx, addr1), "Balance1 did not update") + + sendMsg := testSendMsg{addr1, addr2, sdk.Coins{{"foocoin", sdk.NewInt(50)}}} + + msg1 := testBurnMsg{addr1, sdk.Coins{{"foocoin", sdk.NewInt(50)}}} + msg2 := testBurnMsg{addr2, sdk.Coins{{"foocoin", sdk.NewInt(50)}}} + + // send then burn + tx := GenTx(t.Name(), []sdk.Msg{sendMsg, msg2, msg1}, []int64{0, 1}, []int64{0, 0}, priv1, priv2) + + res := app.Deliver(tx) + assert.Equal(t, true, res.IsOK(), res.Log) + + assert.Equal(t, sdk.Coins(nil), app.accountKeeper.GetCoins(app.deliverState.ctx, addr1), "Balance1 did not change after valid tx") + assert.Equal(t, sdk.Coins(nil), app.accountKeeper.GetCoins(app.deliverState.ctx, addr2), "Balance2 did not change after valid tx") + + // Check that state is only updated if all msgs in tx pass. + app.accountKeeper.AddCoins(app.deliverState.ctx, addr1, sdk.Coins{{"foocoin", sdk.NewInt(50)}}) + + // burn then send + tx = GenTx(t.Name(), []sdk.Msg{msg1, sendMsg}, []int64{0}, []int64{1}, priv1) + + res = app.Deliver(tx) + + // Double check that state is correct after Commit. + app.EndBlock(abci.RequestEndBlock{}) + app.Commit() + + app.BeginBlock(abci.RequestBeginBlock{}) + app.deliverState.ctx = app.deliverState.ctx.WithChainID(t.Name()) + + assert.Equal(t, sdk.ABCICodeType(0x1000a), res.Code, "Allowed tx to pass with insufficient funds") + + assert.Equal(t, sdk.Coins{{"foocoin", sdk.NewInt(50)}}, app.accountKeeper.GetCoins(app.deliverState.ctx, addr1), "Allowed valid msg to pass in invalid tx") + assert.Equal(t, sdk.Coins(nil), app.accountKeeper.GetCoins(app.deliverState.ctx, addr2), "Balance2 changed after invalid tx") +} + +//---------------------------------------- + func randPower() int64 { return cmn.RandInt64() } diff --git a/client/context/helpers.go b/client/context/helpers.go index 5ce81d0d35..c782503b09 100644 --- a/client/context/helpers.go +++ b/client/context/helpers.go @@ -114,7 +114,7 @@ func (ctx CoreContext) GetFromAddress() (from sdk.Address, err error) { } // sign and build the transaction from the msg -func (ctx CoreContext) SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *wire.Codec) ([]byte, error) { +func (ctx CoreContext) SignAndBuild(name, passphrase string, msgs []sdk.Msg, cdc *wire.Codec) ([]byte, error) { // build the Sign Messsage from the Standard Message chainID := ctx.ChainID @@ -126,12 +126,12 @@ func (ctx CoreContext) SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *w memo := ctx.Memo signMsg := auth.StdSignMsg{ - ChainID: chainID, - AccountNumbers: []int64{accnum}, - Sequences: []int64{sequence}, - Msg: msg, - Memo: memo, - Fee: auth.NewStdFee(ctx.Gas, sdk.Coin{}), // TODO run simulate to estimate gas? + ChainID: chainID, + AccountNumber: int64(accnum), + Sequence: int64(sequence), + Msgs: msgs, + Memo: memo, + Fee: auth.NewStdFee(ctx.Gas, sdk.Coin{}), // TODO run simulate to estimate gas? } keybase, err := keys.GetKeyBase() @@ -154,13 +154,13 @@ func (ctx CoreContext) SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *w }} // marshal bytes - tx := auth.NewStdTx(signMsg.Msg, signMsg.Fee, sigs, memo) + tx := auth.NewStdTx(signMsg.Msgs, signMsg.Fee, sigs, memo) return cdc.MarshalBinary(tx) } // sign and build the transaction from the msg -func (ctx CoreContext) EnsureSignBuildBroadcast(name string, msg sdk.Msg, cdc *wire.Codec) (res *ctypes.ResultBroadcastTxCommit, err error) { +func (ctx CoreContext) EnsureSignBuildBroadcast(name string, msgs []sdk.Msg, cdc *wire.Codec) (res *ctypes.ResultBroadcastTxCommit, err error) { ctx, err = EnsureAccountNumber(ctx) if err != nil { @@ -177,7 +177,7 @@ func (ctx CoreContext) EnsureSignBuildBroadcast(name string, msg sdk.Msg, cdc *w return nil, err } - txBytes, err := ctx.SignAndBuild(name, passphrase, msg, cdc) + txBytes, err := ctx.SignAndBuild(name, passphrase, msgs, cdc) if err != nil { return nil, err } diff --git a/cmd/gaia/app/genesis.go b/cmd/gaia/app/genesis.go index 912ec25843..87eef40ed6 100644 --- a/cmd/gaia/app/genesis.go +++ b/cmd/gaia/app/genesis.go @@ -101,6 +101,7 @@ func GaiaAppGenTx(cdc *wire.Codec, pk crypto.PubKey, genTxConfig config.GenTx) ( } cliPrint = json.RawMessage(bz) + appGenTx, _, validator, err = GaiaAppGenTxNF(cdc, pk, addr, genTxConfig.Name, genTxConfig.Overwrite) return } diff --git a/docs/guides/guide.md b/docs/guides/guide.md index 8c7a9bca62..21e8b70fe1 100644 --- a/docs/guides/guide.md +++ b/docs/guides/guide.md @@ -15,7 +15,7 @@ The design of the Cosmos SDK is based on the principles of "capabilities systems ## Tx & Msg The SDK distinguishes between transactions (Tx) and messages -(Msg). A Tx is a Msg wrapped with authentication and fee data. +(Msg). A Tx is a list of Msgs wrapped with authentication and fee data. ### Messages @@ -92,13 +92,12 @@ func (msg MsgIssue) GetSigners() []sdk.Address { ### Transactions -A transaction is a message with additional information for authentication: +A transaction is a list of messages with additional information for authentication: ```go type Tx interface { - GetMsg() Msg - + GetMsgs() Msg } ``` diff --git a/examples/democoin/x/cool/app_test.go b/examples/democoin/x/cool/app_test.go index abb048dcc5..487111bb3d 100644 --- a/examples/democoin/x/cool/app_test.go +++ b/examples/democoin/x/cool/app_test.go @@ -90,17 +90,17 @@ func TestMsgQuiz(t *testing.T) { assert.Equal(t, acc1, res1) // Set the trend, submit a really cool quiz and check for reward - mock.SignCheckDeliver(t, mapp.BaseApp, setTrendMsg1, []int64{0}, []int64{0}, true, priv1) - mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg1, []int64{0}, []int64{1}, true, priv1) - mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("icecold", 69)}) - mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg2, []int64{0}, []int64{2}, false, priv1) // result without reward - mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("icecold", 69)}) - mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg1, []int64{0}, []int64{3}, true, priv1) - mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("icecold", 138)}) - mock.SignCheckDeliver(t, mapp.BaseApp, setTrendMsg2, []int64{0}, []int64{4}, true, priv1) // reset the trend - mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg1, []int64{0}, []int64{5}, false, priv1) // the same answer will nolonger do! - mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("icecold", 138)}) - mock.SignCheckDeliver(t, mapp.BaseApp, quizMsg2, []int64{0}, []int64{6}, true, priv1) // earlier answer now relavent again - mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("badvibesonly", 69), sdk.NewCoin("icecold", 138)}) - mock.SignCheckDeliver(t, mapp.BaseApp, setTrendMsg3, []int64{0}, []int64{7}, false, priv1) // expect to fail to set the trend to something which is not cool + mock.SignCheckDeliver(t, mapp.BaseApp, []sdk.Msg{setTrendMsg1}, []int64{0}, []int64{0}, true, priv1) + mock.SignCheckDeliver(t, mapp.BaseApp, []sdk.Msg{quizMsg1}, []int64{0}, []int64{1}, true, priv1) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"icecold", sdk.NewInt(69)}}) + mock.SignCheckDeliver(t, mapp.BaseApp, []sdk.Msg{quizMsg2}, []int64{0}, []int64{2}, false, priv1) // result without reward + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"icecold", sdk.NewInt(69)}}) + mock.SignCheckDeliver(t, mapp.BaseApp, []sdk.Msg{quizMsg1}, []int64{0}, []int64{3}, true, priv1) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"icecold", sdk.NewInt(138)}}) + mock.SignCheckDeliver(t, mapp.BaseApp, []sdk.Msg{setTrendMsg2}, []int64{0}, []int64{4}, true, priv1) // reset the trend + mock.SignCheckDeliver(t, mapp.BaseApp, []sdk.Msg{quizMsg1}, []int64{0}, []int64{5}, false, priv1) // the same answer will nolonger do! + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"icecold", sdk.NewInt(138)}}) + mock.SignCheckDeliver(t, mapp.BaseApp, []sdk.Msg{quizMsg2}, []int64{0}, []int64{6}, true, priv1) // earlier answer now relavent again + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"badvibesonly", sdk.NewInt(69)}, {"icecold", sdk.NewInt(138)}}) + mock.SignCheckDeliver(t, mapp.BaseApp, []sdk.Msg{setTrendMsg3}, []int64{0}, []int64{7}, false, priv1) // expect to fail to set the trend to something which is not cool } diff --git a/examples/democoin/x/cool/client/cli/tx.go b/examples/democoin/x/cool/client/cli/tx.go index f502f09e14..cb65830c93 100644 --- a/examples/democoin/x/cool/client/cli/tx.go +++ b/examples/democoin/x/cool/client/cli/tx.go @@ -8,6 +8,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/context" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" @@ -36,7 +37,7 @@ func QuizTxCmd(cdc *wire.Codec) *cobra.Command { name := viper.GetString(client.FlagName) // build and sign the transaction, then broadcast to Tendermint - res, err := ctx.EnsureSignBuildBroadcast(name, msg, cdc) + res, err := ctx.EnsureSignBuildBroadcast(name, []sdk.Msg{msg}, cdc) if err != nil { return err } @@ -69,7 +70,7 @@ func SetTrendTxCmd(cdc *wire.Codec) *cobra.Command { msg := cool.NewMsgSetTrend(from, args[0]) // build and sign the transaction, then broadcast to Tendermint - res, err := ctx.EnsureSignBuildBroadcast(name, msg, cdc) + res, err := ctx.EnsureSignBuildBroadcast(name, []sdk.Msg{msg}, cdc) if err != nil { return err } diff --git a/examples/democoin/x/pow/app_test.go b/examples/democoin/x/pow/app_test.go index 2c1df6d6f3..e8e3ed12f6 100644 --- a/examples/democoin/x/pow/app_test.go +++ b/examples/democoin/x/pow/app_test.go @@ -72,13 +72,13 @@ func TestMsgMine(t *testing.T) { // Mine and check for reward mineMsg1 := GenerateMsgMine(addr1, 1, 2) - mock.SignCheckDeliver(t, mapp.BaseApp, mineMsg1, []int64{0}, []int64{0}, true, priv1) - mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("pow", 1)}) + mock.SignCheckDeliver(t, mapp.BaseApp, []sdk.Msg{mineMsg1}, []int64{0}, []int64{0}, true, priv1) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"pow", sdk.NewInt(1)}}) // Mine again and check for reward mineMsg2 := GenerateMsgMine(addr1, 2, 3) - mock.SignCheckDeliver(t, mapp.BaseApp, mineMsg2, []int64{0}, []int64{1}, true, priv1) - mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("pow", 2)}) + mock.SignCheckDeliver(t, mapp.BaseApp, []sdk.Msg{mineMsg2}, []int64{0}, []int64{1}, true, priv1) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"pow", sdk.NewInt(2)}}) // Mine again - should be invalid - mock.SignCheckDeliver(t, mapp.BaseApp, mineMsg2, []int64{0}, []int64{1}, false, priv1) - mock.CheckBalance(t, mapp, addr1, sdk.Coins{sdk.NewCoin("pow", 2)}) + mock.SignCheckDeliver(t, mapp.BaseApp, []sdk.Msg{mineMsg2}, []int64{0}, []int64{1}, false, priv1) + mock.CheckBalance(t, mapp, addr1, sdk.Coins{{"pow", sdk.NewInt(2)}}) } diff --git a/examples/democoin/x/pow/client/cli/tx.go b/examples/democoin/x/pow/client/cli/tx.go index 92f97d4e0d..49527c8c08 100644 --- a/examples/democoin/x/pow/client/cli/tx.go +++ b/examples/democoin/x/pow/client/cli/tx.go @@ -9,6 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/examples/democoin/x/pow" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" ) @@ -48,7 +49,7 @@ func MineCmd(cdc *wire.Codec) *cobra.Command { name := ctx.FromAddressName // build and sign the transaction, then broadcast to Tendermint - res, err := ctx.EnsureSignBuildBroadcast(name, msg, cdc) + res, err := ctx.EnsureSignBuildBroadcast(name, []sdk.Msg{msg}, cdc) if err != nil { return err } diff --git a/examples/democoin/x/simplestake/client/cli/commands.go b/examples/democoin/x/simplestake/client/cli/commands.go index ede1efc756..895384454d 100644 --- a/examples/democoin/x/simplestake/client/cli/commands.go +++ b/examples/democoin/x/simplestake/client/cli/commands.go @@ -87,7 +87,7 @@ func UnbondTxCmd(cdc *wire.Codec) *cobra.Command { func sendMsg(cdc *wire.Codec, msg sdk.Msg) error { ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) - res, err := ctx.EnsureSignBuildBroadcast(ctx.FromAddressName, msg, cdc) + res, err := ctx.EnsureSignBuildBroadcast(ctx.FromAddressName, []sdk.Msg{msg}, cdc) if err != nil { return err } diff --git a/examples/democoin/x/simplestake/handler.go b/examples/democoin/x/simplestake/handler.go index a94da3d5ea..6b21879e92 100644 --- a/examples/democoin/x/simplestake/handler.go +++ b/examples/democoin/x/simplestake/handler.go @@ -1,9 +1,6 @@ package simplestake import ( - abci "github.com/tendermint/abci/types" - tmtypes "github.com/tendermint/tendermint/types" - sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -22,35 +19,15 @@ func NewHandler(k Keeper) sdk.Handler { } func handleMsgBond(ctx sdk.Context, k Keeper, msg MsgBond) sdk.Result { - power, err := k.Bond(ctx, msg.Address, msg.PubKey, msg.Stake) - if err != nil { - return err.Result() - } - - valSet := abci.Validator{ - PubKey: tmtypes.TM2PB.PubKey(msg.PubKey), - Power: power, - } - + // Removed ValidatorSet from result because it does not get used. + // TODO: Implement correct bond/unbond handling return sdk.Result{ - Code: sdk.ABCICodeOK, - ValidatorUpdates: abci.Validators{valSet}, + Code: sdk.ABCICodeOK, } } func handleMsgUnbond(ctx sdk.Context, k Keeper, msg MsgUnbond) sdk.Result { - pubKey, _, err := k.Unbond(ctx, msg.Address) - if err != nil { - return err.Result() - } - - valSet := abci.Validator{ - PubKey: tmtypes.TM2PB.PubKey(pubKey), - Power: int64(0), - } - return sdk.Result{ - Code: sdk.ABCICodeOK, - ValidatorUpdates: abci.Validators{valSet}, + Code: sdk.ABCICodeOK, } } diff --git a/examples/kvstore/kvstore b/examples/kvstore/kvstore new file mode 100755 index 0000000000000000000000000000000000000000..76da38d402cdeb4ba3b9fb1d552f777eb45fa614 GIT binary patch literal 20701460 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 z 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Ξ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≥8BS|1Y+HgD<^z0wYP)ta?_VN%OQ5J(-yR7L(iJv8Ogxb(Fk*!$Bg zXGVtwG!ED0dRY>onNgDn#9EI3+~DqCb>AZ`p?7YM_bj<6zQ̕cU|TuAAhrDF@= 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
O08Kq~6fKV6SoXg!v!F3w%NOE;&WR$*L+jEO|A! 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
;bJ!O#^UoG~wTizY=dRdK#oSqP&M+UH)k^>`$}b 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%0AHcEJG`4*$?>F%>8I~9$xuz-Q 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

{Qv2i<{QqlY{Zd*2 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 %gKw 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 VJMJAb+o+q`x^jm=$eRAblI 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

NAL@pAbdVUpH}EX^R&B}i4x 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≠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®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 Dj~cvqCv+=p2y2 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%0AbpKF8=ot$73X&bo5UCv`TQB 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 B)#re>NsGlBj=?5Z%z~ye>>;&$;f(c((91uIm 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%0AW{%(sf&E*!TpcEy8 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 z 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%0AbvnmvD>yEfw@+7TxNp`ey98Q$>;J}b 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∨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 #9`hU^Hsk*w3Mn}ucSb;0_v`=L=ZqW3Oy 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%0AuZq{x?GZToH(38De)tRi-=nA=-)`ogL6SpW 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
  • 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

    9mwWwjOete(o-< z39?~!cVWA9{B$3=o!_h4*%`^Q*}rRV`(VJcPlTo-BD!|=M+#@3L$oXLe6N;gaBO*A zG-P*&#j$@EH?bG)BS-s(HkqIKU?#uJ9%&yOMXi3WkcChzjp#>-E{IKPhumAeZW$E_ zaYj3QF*!K=y(CnGbP}?VPC}Nx*yEADuLA)#2kM!<12|-WYhz;Bn_HQiI(Mje2k~G6 zA$VbB^){yx`UoS)p0SRHIIKr8qUtXDrn2Q|N3XTv9xI-W>m`3U^cJFJiEuvOr62&S zC2b{Y$dA_6bhhG57c0T3!Cm&kJ>(ZNTRnS-zOrWlb98^{)17Oa>E$F$+y#Ol=cV!s zTFFz2IIrL4A*Nz<^eE2X#$6z?O-;8-B00=rZf!E+;HQ!;iR|y)iVS%?VZ~xJeJq5k z6)m<`{`GF7H;3@hH)|gkclqzsd--=LA4`&M*-j!lC8ckAgfxxl==K(g$N;y3hqQRg z0o)-spK#m^16YTAwmCy2#aNA&Sy3Er+3~Dthm$%<@XWR*aBip4lnIYQEw+Yr4#(~-RY@wPxZo8H}s{;Cn>Wl5&pT|W}-gp*1(8e9E^q>*)N zU0*;tHsT!%KVGzQ)CxI>EsBP?dIN;vcHl#1YsXrtK@>={7O4(!M1veY2Q4Qj$jxWt z5dwNWN4^n0VOwNo-(2|Sr{nR$cck(B&Tnmx$0RyFV@FbWU$nv&GQ$du$&1lxM1jXX z1*^TVk;s#A%xMHil+q3+MjPo@4xC%U2s4d=VuWAk^VYBLY|ixSpDCY(y?8ZxLEOPB z+djk|JPg`)sxpu}aVF~a7&lfRtB(%lLLxxTBZ_v)Dl9cNco?Qxl{Wu<(;sLD_mJZ zBtTZSd8XNJ?Cf%;cX2akZmTaXLciSI@-yGYPaF=i*~;=yZqbeh99jq_+6WK^an6a} z{JMjk^xE|saW>ksDG;k5{Wqcr;y{r@U3}6@0JU(h@3~HZwkR%)cozyV=c_1GNYVn zNaaR36NfIP8fK)}8R-mj(L-mXO6R=D(c44h^ySz6tvV-9A@WwP60_l6HII|__~bJ@ ziW$iuE6r{s_GVh-GcM1FB0{9N=lQxbw8yA8SlPaV<59MKA(lTWaRa$EAc$98sLGbVPYhrGLTi?6N#rG z{(>MpwWn$X?&vPsrbp;T=fXI%HBp3NzgJOK2EQewwd~)TL;PDfvF_Zt%>uqN!SJu1 z54TqDT(%Iqz+*$E9%Hpvo*6U&kM%^RYz%yMUWYc$Y)>b@KR!s$=BMh_ozceV@OWbz zZ9_v{h)#ww4zKgR{JVz`b@Vta9t2_BB;Jo(o{+0RnjVO(R~mN_J|#rSfGS%|@T@K0 zY3fBHa-5DM0pzz9euJ4(K{&7eqi+zb@eX7r9UxAKzQ#QS&q+jIkX^qLuSCGcZ>XQ= z5gkEYCYpv5uo1&?M&go?jfyPe2@~PxYK#>UYNmRXAdSI$J%WEc^~pK~3W^7T5Q4bo z;4Z%;QIeViJj#W@qQXo*yhXsz9m>%GLjOv$-x!6y zX=M6Xn`vh5H3XOu=HfD9{!?cK6r!vI(R|t}o2e9bluLmh=O8bbQ3IWB0v~L-x1?^K%B8N8Z&pwb=$u z)8EAN!iYDtUO|gTYX`A6gk%)reqB}MUm<)wjQS~89guNdVyR{vYLt4sixfH|Wk8PH zgQI1w3Tj7D8-2(988Q_p(_R-)at5iUTm+SkNq5Z!UHAzDK`B9%(+U6L`9cZIFb079 zlJoiFt)4Ib%#`u$RoJ?pdR|EGUbJQ;G8d`^kJE-!oV$4>5LTxXZRGsx?DUm?V0|*V zrEz8+#e}RJz{N+=6QUj{ovTJrL=Fkj*Y$^gVlNEA66E1y>1%7#Y+fIu9ZL!6;W*jp zxIi@CN}33Hgu?o`?H!EZ)!xJP{$&K2!Q&_e5+v~vnMdM5=k<7s^+^ay1ny0#^X6!Hb_g2huAVB9cl;Jc)BpFsE>r9LUH>1Rhd!k9Flw(=-wIKl`3(Z~ckyA^`^IjW z(L~(r!M(Kn7t%6HojE>`b$qLY5bZcj=mpL!;3$ie^c{MQXT;4m+c`3(3?> z5Jo$R=w%~Y3&`GM?ZHSMBdKg2wqGg#mUW8i%u|PJFs7LXu{IfL%d$qM5s%DeS?;eL`Cp4@P*D#;X?3s`Ei5b&pfTt94QS5MYse>EdmbciEC-F}2Z9=? zEfhYjJb;k8hrT)pM*X>2~n$HF0TM>UAaFW8DZ!|^FJ8GbHMe3lg~ zu3o~48WZ;ixjxM0QIgBQ+lqlhT6jzUg!UNCUFLM(Sfe#ke9S?SIV`8v>llSVx14j58s`7SM!GIn0v?74!ZZD6ixxnxlIE?W$O-r2PAjm zN)6Wz>K&ZcL!kR`m^gR%!PWD9Y3n7f`i$MkX^;>5CYK#qb8S`ETS_KZx}b1BNbgni z<$3V=%Yba^FWXx}{qvIn4NfjDrVO?5HG%?w6h5Paao(?CJ4%S?W~~X{Y$r4!ZJ`u< z*_;F^n#k(DhOZzDmI~kGh_{wKb7@3exg4Hm7L(wLK_bO|`4F!SH!5ZZT@97>XjcYn zAcx5GGE@{~AB{2to9kF)R zq1SU`2xGpwVm$~X>mZ3pMr;qN*peRP&&g5u9)xsq@J$cW;Fl)cpbz-5ZVB*17;#`( z<1#c>?Abg7E}KI>DimcmBCke4kvn3n%o-gO3-b5X(GFITW+^M4Z2bv^Wg-s$&q3Aq zzLBjF2TH`H<_&q`%KFeC^oVqqt&1y?ci=uC&uB_tOB~F%7~JI6H<$8tJVaY6EsGls z^}@Ll8nF#8&8venY;1N*Xq&8xZp&Thwp5#HaHH^xGW4NG<&6O;Y^p)LG|ms@xNnek zu4#li#Elo1WJD*W9?Kjhs8WRu1J`&4(yxw_B|WVn+ku{D`?G;Sn02hJy3sp>|KT+~DOxfEX033qb| zN;^=B?Z`L+-c5xD#V~0%hC(9;OM|-crC)UTP6`vAz96;S8vu%%jA(%-?_=4x{)k{G zsr}4(fczu1fCZO6PRAt&m`b?BfA!i3xLhsm zC-9s z%K4D0OlJ@cSs`0tU|-f^I1gQE5V1vfmv64-$Z_+jqj4m1bVH}mcvQ!#NB$xM zVcWqZUGsdQ;f>R$B!HF4s^emNiwIaBK%=A3nd%|n+O=P(ccWqp<~yf90P?w{?hd-J zKPHN+HzpF|jOgQs$J_d}DAWoDbviQst4GaEIa@AUI?ScDV2N>m;0hV@kQa&$!o0ZY zl3^Wm_xLD$XaPmslL9r6)&52A?qsA8*n_<7!zw+5N-sp_vGzV8#Lli+x1|6n<}oH7 ziQ9yf%LRS+P?lLgLDV6J$o=7fPx3i-Q;^b2;hPL)C`9ReQ;z++3 zkku$bYO5@OOKa27EUXv}3QgQMR;U!hI%Tvze2AhZkiE}YZE>J(o_)^Td0&1}VNQL! zc0jVb&j^Ym&da|D7c)a*w*8`_m{4IF9$|xO_n$%`e2TrMTc8@p7`I^&r-IF9987)49UAI><}YZK9|2 zvfYa7`X=eCU$m)Phv&!&&MsBs-o6LikoiiR}8`i z4RkY-+Hb9_`n}cGXQbR1jTB51c~=rTJd_}*YAE7j=R@3D%St3@P@~9D|3{;(F5<_P zp~Q8E&&8Mz{V=%hpjJ7~L}Nc7_6?3n^0NZ1lqsZBkXB~PGPyS8L0mJ1>!7%&#}5d_ z)g6pg`If>AfXG}S0UFU|%Zii|B<;%^j2z@$kdcBhZe083!nc^HEmRBd9-&%`cg9pc z@re_fbX3Tq(rNSrfI2z@@8aV+PtW3N(~s7?)qtzh|2Fp&7?e=o!EC4@?-O}w6loD$R-ns46;KtJ$v9b_tMar|pzLC^w5$>QffUeO-o{o+ ztmKNAm6_+`5JGepWI4W}Y&Cj%+F~)ey{QT)`~0Uta{Vcvo^rw@*YqyFQ#sT9sHA7H zNiQ_AfM%rDSfA*-re>uSEhYcc&BN+2d~HF4*Pe&`+JXkJEokuC9i%;;ZODe^Ut4Ne zIXCOMp2fNLI|TC*(?w*!;(~weXu$zCB0dwJn&v#u4{!NRNs}NZ8ZX^9XoZq%>EHVAX=F<|ju80qLO8`9QdM zZ)CJnX7pQpG~Q!%zX9Wc)gN)$@+C7@yD?7Y)Vs zTMBB40GoYRQ{bZNl+oZ2DX~Lo`v})bMpGDy zhl~lyFN$k}Xs81M>ZG~~A`6PzQ!I&0UV?&dORgYC$sF{;WD1(Ga_>dtOhU-G=U@}% zs9N0TTW6q*7sJqASRiVJB#$N?9g)n8P7n zqf6q&(`0er;2KM5Rfy3qD)5FFW5jP&wE!Zi3g*@o^#-b3pX>HLlF_{Dc{{Zl*yopYpt%4bw2 zz&Ph6Xim>D*K_s>{kROco)hs!GEAgVWTjn1wjZN$tSkFfLW;W3>PtqL4DMTe%3%zv z1y-9C8Ec3#y9)hZRuGaPeFoPmZ4%Q^P$gFlrFS@|f}s#y)?-=}#@P_Bn|mK3VtGeN z^!}f-z#mFbe^`tQ3uiw#>8J!lv(Yi~@~N56{+Z6P(_!%};l|_;oKe;Xo;Dpwv5I;BCNwbyOjOQyKEv#LYC; ziJg4DkM6gg37@lm!+AR*ddco9u!|qJmy`bF_AcH(`EHjk4zfRR@8x$qU)NmMR|H{r zcu0V{j0yLGX|OG|*oF@4f*S(c!|>5XHv|^lT!9P5+*}uJ(6C-?fw4i@fU%SP_etxP zboRq{zn6rf`j3Jf+8}rCSo0N@8D!?L%pqgU&X8?3@}ajHt7l0IZDKZkA32A(zfl(j zl(}SrFK0;Rj+w(Ud(0fB@63{IERS7Q1{q@~$H9Gi!987}OX3@5DiJo!h9T_ae9MRs z1U&nioac$*iSrO*!P33MoB_hBo9mpsFx1#`t1wD@f%GzvEnMy)O>t~rQR7&W41i*wNsUe&7Gn& zrrj*5Fyj1Uwr9+Czcx;Xrx|tc{K>>`@GPpI!Y#7qq|Ym`R#RnpMoj+z`|SE{-|JXD z76L2J%^fTiT=`xkKRqA^mqUA`CbN=hPAaq?S*kVY`n22 z15o`s7HFn57r-p1N`*JyU>pd`h?v%Y>Z`zZTcvknk;h0;yUc0%wa%&z z4JRG>o_m|W|C~-YMkqvv479bvAvW4Uw-_7lC8-4+&zID9it(~tIbh-hi)EP90%w6~ zVK&?w7~9lGt`y?m4UBk&Xm1|t#zEeTUKB3!9$yF)9K$`#vT{9jhP>CSv>eEdkATXk zc=ZWUGx>ZU$p2q~I)%9>6fM%@a~!Pf20hHHqqfUEtYlXI-og$$zW7=DJKD3zYQ^rB zEQuYTIR?+iC;GlrC%#I%7fdliYPOG2oM#?GsF6rOp%LA0L{k}HlzpIa@JZaO@fT4+ zp+iLQ&^%UasQDN)Yks;IFT%Q?{mDf=-=onUVOq~Lbv^#{8(!LE`NYWaDdVJJ+G#h3 zQu2*tI_SoW@AbL20p|Ye#+vyM64N}6>SvKIqzf0lE%10YpD}Ov2AB^G46zIf&F8}m zqq8ECiS-*~-6C)ZZ?Lmv1mDG_ZJB0rPh6OC{tWq~z_A~nYwxM#CSIpw%UCAWEmF_p ztLWycV)?>t(DgxP+@Zpc4ccA<9Q4y$E7bSK<_rgkZP|d>bO!UWujX663v1s}d}Qcp z?ho}#Vtl3UyIHe{Aig#>O55m8t(FkS4y2e_@pl%#UkbaJd0h75;?1)bo$KkQ2ReV!m=?Oe$Eq1?%@8NSf zMC;T;@I~xW?U4f`+BdBj^6H&+;E=y;^Makt0HCm1M7U33IKfDFJdcH=ZypQjB24`f z;XU>WwzVvXUjm3W<>O_@gTqGDD#;M-@FK0U$0>=i7oWH(MNYRbP3HFHAb*QSPS;qr&3t%^l?= z>h8r!W!u#}_RN;xIgEF!^{v|5(Pt-;r_c9@Nd2&5b-%%U_iEGUD+}`+CL22@?K$in zzrj~}Jbad_=GDLV@E!Ng$Y~q(#=Ga6NlD}(`}fX{9(z%m$E0ni zn(5vSt1(%abYb}f^?ZFyzRa>Sytdm&kO|!U=S5L=PdIJZIwG!047w_a@2< zXFmFEhPG?(w#Q4z`hIT8j&J%7K2)j9QU;$wlt#)KBX4QQ5-`Om`8lqqOiWB7+`gLyH{na>NmQb zc*r6BZrh1V(PQ1xy$#Ea+#H7eJo3r*`1syTFZXG?mmru`A2$;pF|p(@s5<|N z>uUGAIk8w%I?M@j)-?4xtnX#wJ^Xw*SaLn8u&8Y+*vB!Hv(ygT{$wdj&%}Aqvl#{D zRlPl*!=QQ&Fa55un?7-ng~bv}C24OGd$4{8RfK#eUoZAS?b+%x(5a2-FWkV>$I6YC ze8vu#(W;Vm7Qa{o)-cw5P+J&Y%cm=3>DW=y#?39QtJgOV);SYFoKMyFR*UXX>)*`si7} zJk5HQ$c$Aa_dSh+;8R+DoEKeRac_=CMaq!tD)^8pWCE&}OzaU`C~^$6_uyVPtvmTl z6Rmk*k+D&-IoB;P9zO#7W|A+#r)VAOXJH>=JEggx-LT_;h`T_+S5`5w*>W9rRv+p4 z@+HFGDaDT1FM015enT6q-}$XQ{!Q@L*;}%g+n7bx5>zPN8|pvqPw#XIJ`y$|YK1;- z(F|a@Z;Q-99ADS7B&OU!`fMr=3)Tx(Qy4>Fu}{#C>G^~a2Q$|um?BNqC-ZZVf$Vid zF;iQV6P@yIR{itcG(q%k3ZyH?v0n~8om;LxkO@qDs|wO3!*MUJ@a(G3Ty%9F)Gx&M z4$EYn)f|gb7ir-T9~j#^ANJn5g-boLcwsG=2z_G}2Deq&&A2x(1Z5oaHJ?=lrgnxo zfDLkAE$jL4OetEUlZk=dJm}XQ5{6rvDc+4YVd-(cF@CaZx4N)8Q%@9t6V`zBL(#ZL z*|N^s>Ng+ach(;$JE7V$*7v}3ud+LRi8=nq2TJo1I=c1k`G||Nn^T;RDz3YpfuzVp z<{5)WaTt6-2`n)5lu@K+)A(gv2~(7we;h1w5}lQ0O*`L%t<0_`J}?3f^s3=IO^ir< z&9;aYGggt8`7MRb#e{{v;czeiZrImkXT?%dQBE@p+Q1mG_rj~GnPY5=q!5ZSWd+dB z2#X-uPR0gynDsl6M~+WByEVbt%xTjmE5zrzSwH*e<}a!3GrOytFlP}dC!VE;X~SUK z1K5e@L&HHRDOALY&QCs~JtQ|WmI(XE`=WAGXLlTCJHE~iOj@==i-fuGO_Pa%v0z(* zGir!J4QyU^2BuLWsk!k~y4klDPU)G^HaCvQXS)+wgif_g4dRX%5E=CTn0!V3Kwrl)zllNqS$U(=(>(eypwgd^dtMq^~(Q4e6a& z(k4%HOe*4vNM{l=5nYM8tNp4%n^OKMUAM=Jxgr?KR-FbZe=a(Z+L8|`J1 z*SHT3#!pXtb1;X-uu}`Ql6&P_jreF5C<*mGCR%Dgm})CI)OdXoL8HR7&^mO~nt;bp zhqc4LJ-*I1Y(Cc#xXsKC8=kR}Bl#@GuzhKyXO^I|Ef21Ru`39jML@th7pHm_b(_j& z&LkDGoo5y{7j&H17f&2gd3*D@1DxPPa!BHk+hT@6L-S)wI<6-~A3Btmdf*xxPCd+8 zr@#`66k*K3;cwU|{DrFaX!f%IlvJPVEPep3Cd`9&WclpzA*S}RHaA+7$eIJ+lL!&IOQE}I z+0E3LzeZG-Q25W;r`jL)*EeA@v|B5_@%(_iDH^-R!phuaoiT4(a)=}!ePA(?d0Wn5 zQjK^Y2^#P378cG$$sE=m37Oor19q+mH^C>K16fzR|0|FUap!nQaNf(%z`jeNfqn)1 z6#PS;DNCKPHb7e{Sqk_ur57+*CLm-E%f*!PNwn#ATk7_%1r9c^a1M80;#97dvdU-Z zhQZFF5WamtVtv^AJ;P|J^e@^(2|N)s5@5BNr}zU*lS##37}S=%9~@wC=*4 zofxd&sTc`^&1{lsuK_Qeh}ZzU{K+t5hrs)hT)&H339#(28Mp%Y@%@^RIB=N^?vN|* z0tp8?dAq>0v1X79ZGLhh0wqCohhCZ*gR;W*bbKH~M4{a^VhPfDE!AaeIH%tng#WIn0D)&UmDCM!feV8g=SU zhYV%T{k*+(XQs;!&g|pLq+?Klq+R0pygg=;|3>oya|m!;30 zNHr07BH@8RZEQIZ*JUmc*c&zB2^T2;)!do=0_V=-8$@lHbILT(i-*he+NaPj!6{>AZ{MCEKLA{Zjrt%9dze20 zEW4e%_@gWD0JS&Ka}LfgegiN@yzEr_57Uy>1KFnxKvbau)u!X59_l#GO>cd?!Wu-Z zUAa62o$71|k_m&&W%x(^NQ$4r9;}_vPL$B#hXk%2sW#8SW+dD>*NdvkTtB+Kg;nVw zRP}tz1$BI|?#Kx}yv6K%|!bZ64^8tO3cNeJV z)E*lBSk+GAAO4}aI4pvx%$Y$_ErO{Bsz1h5pq4p`HqEK;L0?6T%Q?kPv7eLmN+DEE zB5V)^oll97_5ldpzLh7WTKPSJ;|Pml)uD!J?4iy@N}+9eYMP_hAV17*TsgbZWIY&C zCbID0qANMy!k}bWs&AyZOB~eq=;taWMVkS3;YaGF0==rNJCSP#?qTU5m_ujK8;Fw8 zoO&I|T6OSz$>kb*pfVd_DPeojz_!j^>Vf?NgpE_L9d`d7r@l11PGXaKU>DWX10`-L z7DBi{51h36KRqzk&eosNOIEp*W*ObSJ(7+#BQZ#x(!dYwhOR1K$(gYLGK&)4RG_*o zW0@LA;A}4#EIBiHEhC{4)I##x=RJbDHiHbbwdqe9S2|8l!`Lr&AP=OHX@0PFJ7A`H z3R&mo02RaKR{NX+eXW74FPjQ5TDpCs`=R(46$6%U#FhaG|L1^urq-s2E`%&^&+hai zX>wUP&}`|FO(kfHvL-frti~B&s0a;op4+yE&D&#t(s4$Hspw1VH@e;Z+l(A+Nc8Xq zA9<5r@jV4f>$oYqm4Zk5V2kumFna0B3{6ciH+`)1@}CBnN=!Ug2gWfi>o*-3FT?Na zv{v1&lYjSkSo;qPoC|PkplzF^9PM5+_jaqYn)KQ{?8nU2?NddiP|?CCw+iGv*+4dh zTwQl@$?w_iH+x{bmLA@cOTtgP@tVcf)$kYcG~O>;q+4*JN-UM2*6mi{Hm6f;Bi*uV z&@y=l&UCD201{2c0KIfExAW)PW^uQ_9-$Og{wMNc=J1xL=)ujFrcJ}1`WRnd&)EaT z7;|#~Ub(DKj2k&pNR^jJw`&HL-cYsW`bHJZBpGd~svin4UV8xQwOh9v?w-Wx}npjadI>pierqyi+$i50@~H#sfOr%RK_ zrlvP))}hbWZ{J!bTxSkkZ+^EPr;OQplHhbA>3+snI2jmA`SCUFJ-|Xzjbc;4Jn+sm zK-=o7`~bJdu^Ub)tT`_m9<%~|>DsZxrGLGA4NJ}TZ_bK;*<Y!7suI-~}PTr+6~LB(S@4jImLiM3GRQ37fSm@vPqD=+rrX zMvI>7n>c+bCk1GqUVBC5$q?xBJn4e*9Yh!?AZy__Bgz7ic&t!_a~U!tB_ut}fR)aO z;NTk*RfpAc7Wl=zl@5#u89DZ^J?B&ra|TX@$ndK1-7OUp45XrG00}PXJNOtT3EI<2 z3~gL(pj?y3=pvF!2@-QM?U!Lwo9^%>nf#Y zFuY!xHCXNQ*NLgTj@U&J!m+NfA93D&_>0k8tc^jwC!N(5KNA>|oL)hzZSQUq10gN> z4ACa07#7r4*P%d7tlOKUl+r%{@yN<;H&&{ipSS>kz}d14$35l5An_lM@dowk%$*}1 zMo}dMfb9crh^dR(Nyk&HX{ z!Yc1R(dPit5uF}1|%q7VRyf(gGXCdj+|yf|g0bGC?et$_S9!IV;A;rFk1qN`Qy zI!AYA>YXyOaeD`%+-^t%C@|9RS6P`U3xs8eI3x6>CqDuC zZX38+@(E-gOwh`7FEf%k1MEGLZl4VwDI$nV*~xvejM_JKUX;}|yjuK_On?~s`5?Dd ztCF`cIC;83wAL>5M-+)EAN4t0bEL@YN1q5pwUHHMbFYi=5x7qQbxfC|N9Armw=?$s z+ykO2;s{h{L>peUX%kRReU5X@xEQ5akm-jE zU;oLkk+kUaKQmxP2E}KN(4f=)?y?=YuG~qGag<;;l4bHc2_`2!&x}H%_hZ`(&Lo`? z!2CW#LV+A`K53O)wa_SQ+BsWOP?jW*wKY}v_PKr{B^EoMt2l?n)pe`-!9V9B&2xy~ zFI*>=+gk)r;E3e_2TM)TY5zx`gFEas@HwG1+*V8*}Kp zUnpJ6Ijjx`H+|@!JKtq6Ly1~&5?}KI4 z!CXlzz}&Wp)8RtIyDK`<+L}OZvH9w*j7Pcv6=^$%FKmOfXN+L->C9MfHRi1wOYlnp zD&hZB##J>p$pYxQ-C$aBVn7wh1ezQjDc2Z#tbYES_jDBL!`jh)h)$$RAMaJcA^id~ zHq2k3WuE9+B6_F>r7Z+*;T;=lci?9!jb3wpwVZM3#$ z7V>h0f_`+lIgBe4Mxf=1t-KdPubhbH5PCACA<$t=gVB+{NG~qHXxc2Xr)36vqwjoP zh2lu_iiEWq=I~x@FVVc-b7*sB8?9H98G*5rEzGr>y@Olq9lwTirl5oatYJ|Wp61KLo5b?+ENoqnAQ}hV)R6yiqY`W$loA` z9do~-b8#U(lol0FD5cxzyXMd*C!;{j%X)$}`DQ6N*+R(z*>oHWVcxLtc#j_^1C74x zyL~d>zpW<+VG91WAI|gUcN?JDLZ)r%$K3D?i4J7R{qUvqgJI0u{1LIR`WeWQHH_3S zuh6-S-$rejnYFAk(Sib;`Zni65tWwRm2pQcv_OV-##gAK4(7AG7@dn7(0VQOWY!d+ z={@h|7U`iWsqWp27DD{8%%TK_nN_?VIw*&TDQ74M-U@~2atesI&@QV$AKhws1%%2o zg!0#Nc162F=|{$Ho$(j19<+aAK6qoGGTBz^%(r;aQoOSuhD2%aqQY{b^eHf`QGSIS4Nv!;Q{M-%R!I58@; zEu2lUm_yObq*_F~HQlVNp9{*%igxp$B|?85ZA5xrgrV z4Ao(3E!6sKvonJ#hf;h@)H97AwQCgBXJ=eBy@V>jVoD%4R`I>aj-g+R{9HetJlxwo z`h9eJ#T~yFp**?v{`e>I#$>FzCAjg0Q?VaMAYEgfFGc)2|Tx_6-;UwJp`czw4JK{c4CCO*!mpfP?eP$uXW zyCF^{d+kp2DF&9@c<3$IRPV&O<cn`DBqFX!Pq7{~vycz#BXqQHVZ|*HXTa z+ILhDh4VxWWnFUC{x%-Wt0)#ux!7jwId2q^Bztt|F?wU8`s<=%6J_XcsP~o!ltS9{ zNtWb|4RY@-+=4ZYHLs}MlU-!bqKJYxvsKS~kq`nO5%Ffce(mDYG@@bB029BKkuNL+ z5~Llke@;1vmq*kIcrRjKSZusaqd#=gH_^1kVPHrJ<2}}7diV(A{=v>1%2Ges=IGCM z?MlY5&(s;~KP(zmzjyJ;|>{pX23;^(cR>Lzw^yHG#K+e6%ygD6)?s z_&rDY>>kE}L%v3?vC{8KLt{w!oFlx7GM|pI^W)(2DJ!*Gdo1iRtmYaI9Xg-39$qhz zet~rN>KS@y3urBL_s}+%Hg@b^C%Oa&W1c5<3teaqZ^i*CuM7-QHcs>rs%j=(;n@4lXtW;kvK$r^?65!$2`C`t9l>Z8Li3m#_;K*4#KfEIESKaJZiJMo{Zz2 zsH71d(>-sX+E(>jz);p|Vs*TSBNy;V{kPh+JEZ$=`EHDW?Xp>RE#QROl8y5iBXEae zR|rQ(e2Z)WgAisyB~b43+S;%zpWF$QewgQd8l}q+LHcfUVLo}<4wPYkJVU$Jf7)Br zZpbTg8ZX7G!x2{HGGTOl zBXYVtKlA9b@u)p-+huW9aZF&AoPYcp0*j_a$g-0@0`MfRH`Dn7X25WF%HINo8I zLkl%hZ6xT5xui~O)Vwy`_fYRVtPtq5gP(zR3D~y{do+%$H}Pw^%**&+E$n-HPb>nb zgjo_}H^UdN*qy9S<9@J`y?pKZ%5@~Cp0`6?cg~>)*}vwsai?W;;u$)$6~-wvjp#1Q z(6yVW0}M}~8xg}ZXknvvmho$>6o3EG2kB5e?93ZU8K}0N&BDa$l%?2^h+X=gcL-L=Tov;HHO1n442b28@)*)NTWdFCmx$tWQ>o6iKONcrf^jB^iE}YSp z{&#+BVn6%lp3z^PK>0Q74&gNQx3G5~l#SS)93J<&Y=EGj5gxO}RHh^dDPC&6fwtHb zqLj1)3|>XZUWaWg~;xk_K~#@agMjj)h@t{JtkuFm=i z!v0`q6>qkrkxWq-FK8EM#dxr5 zwZ;P@>XCBfyocyz1Hy>WfJ1vD$it{&UZhTV7m?$PnG^w9{VXiB&|+E8053;?;d^V3 zNY}+4fHEUA>uevi+t08fjgof(9lUL1+j%c~I)_8V2EgmiyLDl8^LRGSd4Z(Ge`$qy z>+ZB%z=8hkqveCGpIz)_26>NjX#}LPwBr0_^dZXe*uD2q&ctDK!+VOmaP*w(t+;>> zydy=M=&TwMjV<%Xd!sgE+uRgyht}LQN)Vd7=l#>~@5$WLg^YMx1aF}CBCIFI11PDV zaOk=>%28-kEu7#*yx}_6xijjb9dTS&mJ#Bjw=Co607M!CRhk&Wff+DYmgHLtXV6+R zP{O|$krMyRp)>MTF{G>1&1;;hyxY4`dOc%rP=hXAjQEH%bLf@Ji6Yx7*Nk?5Jzj4G zF7;wD&WJanb^7hjq0uhiLepoDuX&K+a}Lx3oi!zc!7b@2UfCE%)=MN$l(`Ia_aNqP z`sdlPY5zv_M8y-7+!3mvh`GQ3jfVsF>sv@jRoQWbqE|h#poA3T0h-VKJuh`@Fr##7 z`Y%sq;iM0!mYD}VxJdYUhxP*mK#>%gF=Vrnei;o1`}#!D5o<)g>y76!i4e{=ex`Su zL)*?LjUNhmvOAp`Oz=jad*W8Ncs=Moa3FiBv)PJzwhT}>O*G4nEG*hAF}%au7HO1+zW)&sKN7Q0^pPT zST|Bzwf+_mZtV}|cLL(h%o>uS;m()aQt(G7vjPM>rIY=<&y~k08X3UV$iUNF+yl6{-{BGCCoein%874z@uT^!%C;{KLMsX$#7h+Xj?f7G zTZzO81f%|PXE3H+|FGla8G91@bFr{Xcx_QiL%-Nmb* zC!oNr$4|byPcFT?Plj+k$-BGi(x9t~``rWL(jbTZnaCs-Xs0+h#0$3+(MHL#1 zLV@B`u@r_;EHFLGnp|NMhRgm=8FW`I%C4e;(R?U_xliWJHe9;H68D5-XdZ5H3&1}d z2&Me;KOBsc992IYjFW^TUT=OkMB7>a%c?DJ;ON;7CSJEo{ncPfxNF< zt@I)K$#*0W5!~j;I5Q_iBPWs{B+M=+s%^3N=X@LcST$lFsfUSe&dPN#4`ZW{nWuvX zc?87m2gbxXtZ4-Wm_s*_qjb#lcZ?dt_>2<}uIU zu7$3hstmX@dbZ<^YNUhP*~a%X1ZhPYzY12CnixZk6EWB!nqm6=E<;dQ>DhOSucWfl0)0bpqy<{D+|kA^2HRY=ps0%G zMp_b~n*>!oKjgIxM{M!_Y{wE|rG7GMtzj}|P=128rBlZIBq=g^1s-~~#ICdYghhvX z$E0Co6h}0_+m=%pu|q)njhk!N{rhTU91%&L2$`%_aLh{gH#;obzx9B*aw)il+IJ)q z8gbIR!J~NmA-DHwt;}fSuCXtheXo&%*BMJa*#4O>Dg3*&+5bsRkXZ&c^tla(_3;GU zePX{3L(V?*igL*Z%nE#Aw;-UUV0)K8B{qxh?ZK8QY1`<*&Q)|X0{41w&16MGcd#a> zR_?)*wCBqpntYN5`xCYYbf_KY@CS`xhG3Af&a1#y_mg~^jOB?yglrr5%H`kAGHM;S zCW#ETgSP9Fd6VC9*UNNr(EVL-gz&WI7U|fX3~0zFvCpR5HQ(3J3|W6e#!vdH4Yq&} z2@KRhBR`6{y#%ByDL$rt(x2-gd1>9@T_fW5%Aljm84{D+h7HxwbR&ip{PGU&Tt^g< z-EU;Qyma$0>eInHo7^M@{dLrKEecM;=BhRvPVZoU_cG;mu;n9CmS@$Ipg}kzPt21H z*$G%rBc;E^4fWt;=V~_c^VsklV4LbUlJ~<-7?q1lyOB~_IEg|Np_cb_nG#KU9SmWS z$;Y2_8hK6Lca+Z~d{PnTb5{X8;*P)@chToEP%~5XfC1ZKLW)gK*A5=Uw-z@K)(_MH zZWfOv)=|p?H`2lMnA4&9Nvx_jf21~&9lXxosD03EgdJ0KlcRd$bxPK)x&IvfEbf9M zs<6FI!8YMnm}M8-N4wC-5rA+r3iUwTE%90!aZ8_>-+0-|~ z)zjzZv$0p^NBn@P!lN!KG)7BZAC_j{;zDS|-0r!%96sH4L70N`U1B@XHInc~28;~2 zH!@$HTiTXQYJ}iSgS6Md%dkZ~`%Srg~@o4r@OBm6(r`w~8 zpIrRt_U7*1!^yJ-A3dB6w&LE_!?B7P>v3(dp5ib!hYM|kKWC&wQ33vdnv_v-U^{N#lBJe@K1;u}kQ zfqP}v@`tz~4p-}S=t!^7Ys^P2E`-+;&hl-BbJ!lfBO~GO{MO^~bK)1?Crlwc|61S) zX45yKpB31Nb0XFliw?;r{4boUAlO)2NVXf=c-dE@luBUTtG`M_TAiQB3?G@lZb z1}nBo#auRRwF!m)~wC)lBZn_u2cUm-4gKEF&VPoIKzo zAJ*PrE!^;WpK!Rfg~qxu2ggOR2TWJo>oS!ve|m6?lD4}3-;})xl&05N9$0P33kDn8 zad)e=xg>8=yH!%Rq;^|!jJjLhQW#yo^*XH`GdT|g@LS`n*nS=>T zLJnaxGr*8Z2%Jo|F(wFx1SV`5!ZL@&(Xa(L6JQQFh5(a!o_D*;cfYR{9lNXQd*8d? z``&lIG>$i#Og8hPZhY?4ee2ZQ5F8G-$7?6(J2>L!JX93IyHk$ecysh{QmM#A*Jjeo#$y@0&hC^E?d8N&3 z_L+m1EA8P0;qIEB-9h1P*;Lg%>8V7gl#-kKK4>M)4rV=Z--UO2Mv&QaC(j-~bIMr@ ziZr5>K@J1PwbQc*%K(w4bBgVAeTw;6-)fnM2Mz+b<{<4{;nu|22hqkv7rqMbgs*}! zQ@Wv?D}Wm=9C|@q`GBOtO!v||kvNCB_1bkL+13y!Gc3wC2dJVyT zi!qCj-3z|^-o|H0$M>QVm4DC)cmypO36ak`Pg-{8Qz&mmme#@WSlmX-KVy z9}2<;>=0P#Iv}C|&(74;UhEpP<6|+L*TeUNAx~kYBq5J@wBWmPX9XuO_zhkxeJ`0Y zen*}Gn{&9`Ms`YkKm1U`oF(5Ib_)64Fs;e=%5Fyk2EQXB-j$*<+wr|&@F4z?p8Ah8 ztZ{;Wtox_|zdzDb|D)A-DgP1wgFW?surgD6|BqGU^?DFkEu3O*v|#-gmE|f}CHda7 zE-igD@L`J=KD>z0=J#Xmc|MYv0B{eht{?ahKU($Q#`Q=KezKfqx_8v`D4zmxLCh^C z_^Ob+!h< z*N=tCD*Im8tmJ!G3%1}&rW$tnF4J?KPF(YDSxVn!+Hi4@fs=LA$7(7glHg}57QOWi zKQ<4~jaq;NU+gx}N+7sGbZfYS!)gub{7s~(-Sf$|oC*MOP zo;NQl|4tcxM(i}6l2q~KI~IWwJ|%a>cSTqpQAd0X7sCV>vy0#mQxxz!R36(mX7Xq! zt*7+S(g-Bt`}E|IKKb_)sj~;;5|uc%hqN2k4Erv{+MIzZTun%-RgLdz{y4RC^Iv;>A zqe_miyNC);y?4AGJsi3La(w+he_grCXctz`wA(X$n{Kx%1wNEbU|<+qjvpDm-(jW= z416VJh=iZV&dBjib7z{Hz!!CoM*#-DM3_sW35zB-{DTN{M~}u4_wC z{N&~?{f!x9m_;h4?;16k=Ew2%d#YdD)<$>L|X)lG9}C^Ur$tU5^HM)T$o)j<0%tD}345dAoW9++L*ZVojm}H7Uz? zb5+Zq)QRsHkec7-B`1J>cj8GJnf25Aj;^}-O7SWBF*CxB+0eO93U0&hDf#XOEIk&S zZK&RWk9&9(jOmW#32}u|{++_0cyLRzP za@v&<)EiVgq8|IcGJ29ZOL=t)za8IU!2&(N{-J$3;ctyZjtlzf_}c$D*}6GCub%Bm z;-4Mg$F*bQBHK@+S51HXJ5&nSsascj`Cf~*Ub-X#!SSUuj`((1h4gXPz{NS z=DcYvvDl@u#|8Fgj|(hqj-VyfCtvgL(C~`2d|?MMzQ@-g$L>tMMGYm3@)v9+d&T7e zcL$bJGWLSbtip1!_vHC!AV5PidB?V8mIhRHFq;v$0uL%H?) zxyxG}yA$yvJq^t;SOU6??44C5GzPGd-Yv)L2D6is#~TsPduJyT(BPGf;68W$8Pp*akbS?-%5J0(z<{d)fnIBNLLY#t5LptLD_jSPuwv3l-xV$PZf`= zbQ|9_BA)igY%1`bb4wdI=18^_{cA{97cap;X{V7atPl=@=JuZG&@T^`P&JD237ncjLB#x!;ghK}3ow$^71J2skRtCvpQ5 zC%!A`EzZm9rp$cvR^vtbkiF7 zm@-c9o#1H=TV1J0=o|4j7PrFKirJ3u8hZ+(k3{Ojt$vNsr+aZ9(HCD9!9rcU5Hi!_)jgdf28E$+RK}u%2u>9=HUvJL^)B=!8 zq6HuqEen7&XS!wp+D!dE8h;A;z_gJ79RASZN4w7|1At5`N%P1f0*l<#6andbW(Xi4 z;b%FC062R1Vk2fj0a%X_*|5wNpMXanMS!BShU&&8jYEmAJ12XU%K^bz`7#C|X}DaU zi#Com6|n$(2=)~zA^$q33P2unlTy|RK(pQVCIG@6?;7cDGNt4( zxl)3hGd2R1rIw$^N)*;Lk-`+ffX3kK-7>?fd?bZw!vNjL8Uk<)@PY8sS)YK0C$cu4 z^eb{2(f|{{C>=e9SyjU;RROLlz$O&iDZED%K-shM!c+hbcCJ@WjhC~2np~Tf@V!;T4O-lB(ZF0+5un|S$*gsiN&l+0B}{DlZ!}r z0($4|OFH{ZwgVHm&tJj?`I0_?p~8%@D$&~WA4GHLj)OO>lu)%g7^$n6*3h5tbGw$m3jpc|aX&OojYt6?6*<DVt7IkoENDv760jpnEUaGvkc}8Y9?`}nWab4cz#uG} zc2mmR>Csfad3Tj;kX-l{wGuXrQ+#~pS@{1%8`>rAx~hZ&=(MOO%BoTToD~sis+&Oo z67DQ3;<{dI1KV!LwY8V5kPPiW{3 z5Sn%SC8oswRvq-=qp9%%fajE>gzQVzt&2$^0d|*>J#r47bvviQ)}#_-g7wMkY8*gU z383yS0ICY80VG+o=kmA`8{j71#pXdDA&IT(5)I(<;kJwDuAeiXnhpTl)XXJTRkj>* zo}+|sp4E-2aRtm@SN!VR9IKrAFY4X}98IWMuDzv^59CJ^-+1H>M}$Vo=4 zUL`)ZYFq&R^s}{L?aps*KC_5KIjMw85uL`tT4}VeiNM?p9N-br->X}1(OpK!9LGzJ z*lgD-0JUI{bj1nJyL8FpzjD9?A|13(9{7+-h!5Mu zggW+WZF6OLePX{8#;iUhkTMu&s>i}?7|JaNGl`(8H;)@xK#td&jBGZo68BnHc$cp zu}Cb@brH}VB$F)w+$9r}jrZBR*SV+389Ed13x*3l)=QYf7XVq8nM;tSw{M(ST{(rP zuoy3g5;*`mM+MdlvC{2wcEwu~!*@zv9Y+FefD-Wa!~mk`$+w(g%E1 zE|1a62#b*tPC&^t50Ab_s60&6%PC#0b-%=Y2AlYaF&hD;h37IPy$0{C6gk#QRXCX?6JPrRBu+ryY zgz{9v`_!PZaFP?SaPl-Ai_edd!?_0V4CDX^8LJ~sBo+ZDNRC>Ht06sF0Nq^Y6DRvJ zM$FcBGdpUL))BXaAk=E5CTA@rdE{!JXfRwo&@oP0*;X|qMOF4Rse%=I(84X zK>!X75M}c`hpa+c0wy}rLl^6Keth^(%M?F;MBLHCxQSXSedlh~0Q| z%hVS!Mc@1;3CBaY4aKa0#@-t4bQnSxuCEUS_Alktl56|jp&-U%;(O> z^u(j#AM^?()VLt`58f+24V~*HP*?$gmxYs`oB^6OPAzV)QCS0W8|H;o=8?5GXET6* zr09hbRK$;96xxKcHVg)AoB-U~ohMucP?!?1n!;tUL=6z0ApuyS2jW^AS^~!m>NyQN zQ2Lm>0 z$T@wJga;p|TJ|hTfc2qOgOo>7&MJ?d0CJZ}ieC6UDWC?B2!g?Zq1@G$jFK31IWshm*MT^ycOjus@a?ln<5=u#LxFA-6p%Pkl^2 z&TLG4NP6Gy77hXkkJ5{?<7)`X;fdNWVIHos#KE#(9nxY5_aC&^hr+b)#`678>p#T* z5O*T&^?sz5F@_8=hez07q$2EoaX|VLQAqx0%F7`91whdf<>tWCesT0-lsHUHOQM-~H3~g}&D81}I|?@oIkfNLUmq z2+b3nG9Y;3S?vz^sSM6Fx}3}q38HF=K1gl_i87h8oN_`o9(&qPEUjRFbBNL&;!~O4 zg`9(faRmtroZ1kwGRPj6PkI5tu4SYNow~^|#G!R*V*<^t>%wyg=-lZiL#b~NT2ysgbs?e^ z%3b-Rj6vX6wl;I}{K@EB9E7CUw=xl{0|zq9_695z29YBYYIg|@a0s-4q63hVAa)Rk z@OUNt*8QnA(F4qg7*Ndtjunoo94?^(sZ2n4Q29snO(3H4)MZVpEfC)d#mWH^qcQt} z^%{_5H_}J>41yH^=}&KxrXKj(g#9D>=ENY@uLBXvQnaIcN}eXEW=A2etPo3>^-Upk z4+E`K8<|05`Q_@%_KswJR5dY}!JSPHH`s3p!Ayfg^R@8M>~-RGl)Ll{Q#mAp_(12& zGVaHyN};@r3VU;+=qbx=nKQW4s?>vRl>lM9SVSJdyf(Q{GfI)l2*e)Ni!#~0tTzU4 z8Qq>#rsg9}kaN2e`ZKPtPLR1BDvKth=$iyg(AEShC5J`!sJ62V-^I&PPr9=V!ph|% z^Z;UD@V-sxUc_#gDD300RI6DBD~NG?6F7f)ufb9v8WF|^bc~r$_<-2{gK`WQpCJY( z%G?^L(uJg6Q=cyRy}&8$+?ch$SepcC*g+JJMY$u{148h$AVuACCxQ!L88=$2lI}w4 zOFgI|sRs_Bbfi=59Awwnz=Owj+^A4L0+=9}3pl8N$H8Tz_oB1$xGTDs?#h*kGs7Mz->vnDj4cQ?M8sl&aJ7~1o)gIjCkQpE#>XLI zeBjE3gS|r}@F5h3%8yph8bHJCd(_9zTbgwLG#>(cgnes5pq~RoED*C!{!J=qLa=-J z_#Vob;Q$Zn?OdkhF9$P+z~rWi_mek9RMMw1a_&HQmBtVP{f)mr24;3?W@&W=8UTTm zRt26|TOWCGcMDsYt|x2Kdz@PK+U*Kio-RD#NeG2G)o_@WPq?8bM2Ho8z%n#7(B~5_ zkbHqhY}0^v0xeKHU`UD6c*+Zq5LQ&@53(!|Q|6FMOIxS#Y#|;6Qa(PFxdxAR_`h$# zpd}R6uSGhbOGTmm#*{|Au=mN1dvq%EAqk#<) zK}F)uw|I?LPHKIq&le{PG#yfXzdzIK3m3M)8SX%s^0x_@tkRu@D(1S3B_WpDFr!fC zLyX+r25n!*Gi9I%SE04rzGdo-rs$tCjWtxr0<|QTNFh2L7*%at)cFEJSM=s1U;7&mm}x-6{&Vt(8OTa) zNZC&Uv3u#0;7%eVo4Ok8CqX?vclNMK+I*>OX&!b(^negOGK*`(H~|VYUgXKDAtXt# z0~q8v+@;5!8E>pGB4mt2)3hm|jKo19e&re7c8mh!GGZUNYSZ?C-Rn?}?icmx1ZHeg zYG8b{Ul4K)&Mvf(z!b4V(~UBVfFP`Q9x8I^MeUm^X9UpCsd}NO+A+%9M~N@$4(MUIPM_ z14bZ1)}Wr=-J<)AbaFltUF=8dC*Hi=NzWm*(F(fHKw^}^8?ShQQT>|=C-(hYyg@KX zs@D(zwPghsOXPN6^Fe~ro^sIXarVN}NE zPfgvHyU~||$!$<=fAB;2FS$Icy9-Mp`Hr$Sq0b_@YQ;yB** z4=1R{hnXO9!PLp7^DC@TfP_n4rYNNhigw;5g&q1%xPy~|oTId4~VYlaZ2x&mM}3*!wTj zdxp=)1&E7Tz7W2Lr3y#vOnV!k@Ip5)ZI;RuyP`o>nveUj0EshE27kfZ($}86SNlOI@6Sc1GjTOk8eRTb8Y*2~w_7 z_y&!AN);-I6xn2+0GY{5$&)064v=R;fd}0w4Pwth!VI1w`-4YsvL5nv0MV-8K0G7R zXO!|4_4jYHQdb!0ZEF@JGqFRo&6jUnXtwINJ74MfU zGf_%J6{f1`c3zMFaZK0K>KdFDMM0*!75bGblp`KOsAzAk8*IK-M`s|!v`GK7x1_zg zEiCL^lAH-#Mh$!>^hG!$Fh*-@brNyes< zNJf^f+k&)8vi8XwV!cn?Ft*1_U>w;a%%%YLs4g{fhL0>~(D;0*mmdjs(tQk{s1)XPw2FmNT z&O0b4m=(zUk)=ZJL(*LvihK%ta~U~SZi7lOea_Nt)SxWmhJ$kdc~!kr)u|8ZL^c7=jYEIIlC$51*&KCMJ9mYLHyj-+UDYt?lI`@ zFp+Tdzh&yp;ln(c`Vw-@<<$3CpCg{AZwtBW$=daRg20hhniz9AV zPJ)_&Cy?ssx(-ls69y^3o>?&Uje?SnQT2slYiond2lY0HeCEj8sZjidKDs!<6E#qV zZXyQf_%bXI>;|-n%~iftUmg&*)XY~}y>Q=|wH0pEn$zUA%eVx={+r$?IeVimxabzD z-s2NpHh|!yi&;X)8Ga!9czYE_V)CMhZAVbc4quWGqG!2t2*SN_3FmpRTV(u+$#Z+V3H6~AX_wnbW4>WCJK2D>cKUA+v-__j$$oWp};(Fu%DVAz(dEO zC7P59B)|%n(OjQa!<1>}Zee?6xm=?rupYgcz=Y=?>8?}lwy=o_CcJK;9s?{_`-%I$ z$EXSn6WVeZCalkumoU*=H5^$5rf)b_j*2q&i*4rtg^>+XZXG)5l}YeUtkduC+5}6O z((tZXjxZs|4O3dc)DN{VrV*CZe5E<9gyqJuJy=`QTQ!tr2a+==LQTa(lo1rzyBxdB zW|6DJSuen{9LI7{z#XVb=RmH})BO-~&w+zD%gH4(WD=VD4}{{5DRC*fCmmb{Gc8IB z<{nTj7#U3N^%jiGj64z*PMFc2YwxmrZ3!kDU$%zGZuuD81@HX%1vkD&xp0I`E{YjU z9UjqDHN#}{;#&$gfJP!^utuKrs1wc>uzJ7`S1DaF*JJgARYsBwYF4LhdWyiEF;F}a zKb%?nB`cT74Ir`5rUeW;SR@%!HmLr``kAL@2%VS1bW*6=POfufJt*u z*+^m*b@DQps?XH5;1oAyHZKa(1B{hWmryI0RHC4At|2m5>B4AEe-0BTMo!0gyWVG_ zoy%n`s^_d6J|`WV9;Xsk=h;Z*4ncir6CmrHm!oQ~bb?IfLWB&xnZuAPVt2#bq^hy= zfKkGtgi)8vv~=F1=*!mbrOEE48HBN(S=_4Xba700o(iU03rm}Vm7`9F=?a?AVq;L4 ztLn;mahS}x{t5kT?-f~!( zOSvp39ATDEIWJeglv=>5e9Jj(Bn%AcWVbIPJqX!(NMpbelpsRslhDBgOT0u;Crq@L zaTr(vdq&oXca^^anmIY(dSPBiz-po+YDqn}0fX-bk`-k7uLGq6V0GuXzG_vSS~G|L z1G#<)J0i~$P{4GfWPAY#V5OJhDWtBTRgN$!3lv60k|67YFp>wef>rsKQ#n5_^HlMm zlDu5%q${pcIZEt#E@m&sIdwIU->n9_pc@!_VuJ%O>NIW%OG;nHa$am~bx@b|g|Lf4 z3RTSy5BBrty*=x{rduKFDxry5&S7gHKk1!;5+?eRnPuFQbZaPJvQ^i2ubauNfI*ph z1r}23+H{{~mzz(wP$#cbS6Z1{ysu&|$69AOYF9fRFbd|eo4Gq9U^KIZP@X5(I?$u7 zIs#h}U|F&Qh(VAg;Y=op5CBUqg>yI7FTro?)8lQ?N+npHj8ct)2{sw8FXB)xgGCdT zSlY8XCsi^-!b}gycnC2g=RAXNo@rjr)6Cl>zaX&}%5|Rsoy9eS%muwLBrixX&s)sE zbVMn_9r=Jb8J@=-1#ik#QSs01Zf!xg&3^J6jFJpVRl_cWC>k(04XrNU$YDY`sj83= zSy59&xmqmD%Bd9AE~l_eX7qBQMhk_Sv?t>$)L!XI%3(^YhhVvu4fA4kYPkgnx2_fI zz%sR12bSr@4is*N=93-wv`9yb7Os7RQUxBbhi@L|Gf6<;X)!@egSjJ)gEkgxqAR=sm!U))RUyIm`}iH+M%Q}5&e^g z$tz6m!e<_;g4J)Cdfn_2bL4Iue(c^&Q7$g79YPr5V-G?9bYONe>neQcZWq_Y3sqmv zJOGUrE?*p&Tx$X4B(y>vegAe-XNkRD0`M`uu+V?0LMLXiN7VkCu#f2rJ()6?nQbOe zCmkr9&r~rqC!`)Q5#vfHvw%U;7j5C<+H=rttbSUK*;AVgAUhxmXln54Bay-8MEjO) z`&*Hdw~l`&i>~USc3$2Lrdp*eH?QiB4uCP^V}+R04fs!AO}V1c7b*@RF7XLN7|{@e zvAHf*J?=p$x0TO?SRVfXSweC8UdKSS1fYr$HCg=fI$humj=fs2OfqC$jEs zk1m4)7LQJ7Bh7VDVH-;bFoRBSbNdEm^Odo@!QwD(z?0bVbiAa)?CdhU4^b!b)uILU zOJMQ?fS3q@PS6L0DdVjsnnVnL7yIDqn0Mpta5X#pa5ENFfDiX-Jy5dHJ{4*m1!4|b zdL04wDQ^VGdzTkA-WMvgFaYM7BxPW+6`|>s-sZqE*hflge{}2ON{eU#0*i_hm#)2}rQP(I^Dm)p=-lCzG; zUV>|nE&$b|E35;VPuK0Gnn$uGgr27W@;rlE>jC18mJv)0OO}-E_JiZ4Ye+URkyo&w z210yT7^MNki=ZHyqnWKEM;@tx#yj385v@EGN!fFID3?M7ktERs#GD_RmY_8aD}@-I z0XW%fBeMBS*{B2x(;x4B0TScro*z5m2;PAKXPDl@2Y_4 z51jdU-)Nw%q-ph%MFLe9yd7xD56zWY0eKErW{^*P30eaF3c4Ia5hsGASTP>ns*OF8 z^hRkX1Q46$erBT0r_Z%Rnv1sTkOL*SJ#-}2rfgnH4@gpde+^Wc0R{@@9K`gFskMut zNI$?8AjD4oRXev;3*ez?*DtBwEe%D0{!gP?It=M{2&vzz^|Ju)DgQNfs8kb~zlN10 zq4DgY{GE4XlvHwTS7zNIo$6X`Wz{;+7|V|%{ybIdKn%4YsWLAPWM?L@VdK`SOPaot zR|2Yt-fBq!a;5;H9A9)OJiDNRY?So2RTF9@D@{|m*uEU_ngvHA$1|;`3ZGQ_sRpyC zR`m?=(3v^r-EM+BQ;m@m5~`r=4TmDK@wj-ffEp~FTLG@D!78?9#9hcq29$lvYSkbq zl}EJ#WCjXt&O|0_Q-Ga(nK=;mR+%$12T}kKrMy}!$~F-UHo9^HovFqtZC<0H6{XCf zD@vMq#68B!q3n#d;^|~pf_h0N@yxYj#W?*5)>-aMMAexbcYEl;a&svd6e_}QcZaTt zimqTJL8PTa0=%}!@a$_~2%)pUi;s|~cg9YDbYE7;D*Grs*w{j0eNnH&WkpwN^>0zXQ%_T z-sJwAsagk$z)8zP-XWePMpnp0N`};c!lH_uNft76UsA2|T7+oj zz<7X>8Q1)_C%=f2LDev|+Ho%#Gpo@|Uxl z*OVTyx6T)@FykP7j-V2VBd8Mq?I&J8!LudwE=V-Nf%;Rw&oX5?tBpt(gy_>miV^y& z>;RUEB;)X*z2Q)BN1LyBMHowQG`VC9%Wlwr)zAq}^dj^$g;3_7J_r zGw3vAbcmA#CY8z<@-FsL(y8P?Y=kWg)D zlQX+JyNhd3uP|LErR=GN`Y}vv|~pA$7MG8lR%%t(wrVP_uxbJbXlTFwLZfM<3|` zam?tLv;xibmI2XbBU|7AFse-@>uO&&^?H4y;m_FJ@YuaU{V=z8cuKm4-vgl+4j;YP zPI)EJBmJ^J${yhpHf~XgR>h4NP9D#zk@_MHxhfOw-7bO(d-o4R{BN3jn$} zW65$T0AiPHLL1rDwJaYP0S&=>K5Kj;ltdM&QP}4!R*hklnvYD*J^L);grouUTR15L za;S?vEvOtE5h+?w(tw$HCc|n#lfXaEK*62Gb*K`e-BOisni*kwp&w(?trk>gQ}qzt zniZ<7Nk9=;3Ed;|H{lt$l?_-__||;}?Svm?P~M~IlC)bp$|`?BB}IrrdD-GVEJviz z(u54u3oURghJjtR{5D2R1QS&t@?0y z8j+lC6|>kW5NaH{Xg8gG^4Ia2x793NP5Ji5REVUS0i{4*Km3!*2EUxW2ky}H>$Ft83Mjgly&+^Z2b9y_Io%F*dB*frRoOyw5Hsmzt9R+^ zvT|N<+SJ>r2@UbSfF7FGl~j2=t%9~2x)c4g>Xks#YILC9cbUq77UN7hIO|m~$0C^2 zXRwq?YA7e4+CmBE74ZZ!9qkfI2Q>Yel}(!!9$H08FP2TvENhl%Cwie`Y$~CnP@@PT zgpMk&xtrpvfM(VPP4ksQaaB~QzH+E=?^(yob_HsR$;oj>fN0qxGnYkAqzpQ29dSEz zHgNS~w`{J9P!&E*ykQAdV)Hy`CD?S)e5;IjhblhIOFA5Rq-K_t+wnOh=NF6qSRZmo z(2ic@G9v{9(cNBV)P#2iCp@3rh zl)+;KRQEb~K=%x3LNhuEW>VB6I-^1+8&D@1d7>_@ISX1Vl65Imynh;+mkioay<|`u zPp)1Os47XM(~Um6m5)1?!dW>YgW86heX@e;1iMey;tmX(Q2%oU$#?@Aq=p6EYe}KS zU^-AAOm-2X6JE1HHHYxV1ksYTYE@9#p2&n_w?_rdBm-63YOk#3>g6f!SQOA+f}@&w z5(9-+7UWyfU)>@8$M!OVVl7awy(&hc7SuK0tXX*&oPdd*+R5{mu^H%HB~bB5+QDs& zEKssU;I8F9B2@j3W__lq-M8@ylrOD(`N_G%R}VjmF4MXgWu_BL<(}dLliPuBw$8WSaZ5CAaC1y{SkMov+AObd)bJD&V}WrENo|G3kIt4}Z+LPjQ3G;~r70h&}KS$LJ}NHS;^VHHq& zIze|oGD}b)qOn{{h#(5~6J8&s9}2V*cR+{I7x#s?sYRJ#-YbPJDZXK+Yb87#nOGG zsiK}8?Z{g%7&o9er*NIApOcW6Ht?WDl1fZRGjTD6vq5MPTN9fmc?HzgQQb|W~OZtCz!Utt( zbNj)SO(@z{7B;t69=!e_i0gx^OB;(*Q+FO5q)m56QV}SZqo(4hywnk>{}Wft6dM6n zLEm%;eP9#00}LfoD9z_1iC2Ji*d;@lwXJNsYi+BpiFIFm3e3`P{smUKvGWoB>Johk z4nk0a*)!EbB_|+AIbJ$}abv-MjtYwmtP*1ohPrb1aV1Z`kQ4@1dHu+!TmB8~LbK=* zg0+dRg)YDpmP!%2V4d3#{i1S;IS^E%8s$rBaL!ewaT8ZmVOGi5By=l1DwDK_C>3B4 zL#h0sINAYMZb{Xo%66?dCPvg)kp>wsiz z(#vXK0S55!(GG3N!4#1PO6RW-*ubK+{u1#~HMqT*yinn+pT_NAZ$y7qNDfOK;RM|7F{`4Mg-M6}X#SC$C(z8hHo2bfMOe8~l_?0$SR^ zlV^Di#MH5L&;)t?PE`m-Cb%S@>}V&D17M7lJZtdVxHD5voWjkHwW4M3oMhZ(<;K{CoeD3EvzUlFGP?4L82hPT7jt$!HQ*hqKeW4TQ>x&Dvh(FJ|XS4&2JP| z#_gwQaIQ)RqdIbZc+qx%kz<($(Myx!(u$k%w@UJA9$<7=S1@U7`0m=lxey z$Vdm}7M4xkeFa#qFuDt8ub=9*!mcSBW;ue&9Ng@hg!Pw(gzmF9c?#C%d9MmXVaa@bE4UH;Re!e zy9exTH^9;Mt^HYQ)Z?Q!=Zxw-?%YV}ps7)bib+>7Zrx+8*gyKW+^I>PvBprK;*3gO zA!L@3og84v0eyLQ1Np{mwKVSM&agRz6d7BVH}EyO`e3sNt=2Ze*~j%JeLwH&)2HBA zUx$^x7cQz;zz+@`Lc;wKMm?)~NL|t<91ku&a_rF$9*w}C)eXc9U{f!y!8Qi?kxZ-7 zQJVlxn?`R;4B_{Rh9l2s(^sUU3m20 zfFx1CgGXwWFF1mbp;CF*s>vjD;VHQ0!K{rlBgi_yXeBLArWWm`lWm7!y;$_=j4P|2P>fO zOr`miMw7>gcQ?w*s07Kkv2ps=KY*As#gi$WvOGq4dGR^XP5kUueZD9@;E5?oY(xrD z?+@i=Mg3BGk68N|oCEKi|A3Q_&7SLrD`G#KwdV?+x_!cP4NnW6t9UAS$G4(_ORku7 zKw^Hq+h|>vUq1v~yVdaBu=>5*zVPP6QIyA-PCG=lU)nz`j}4aeYO3NQ{Z~OoWGH2P zXLEhZU70>b{WeMe$({2JXSSaR8`^}~;{4|B27-fE;gk-U>8^%u0G>%FfrR7E_TAnM zw)xEB#_BSB|FXD_yK?P7!=7Kjxp}H!iURIugQVR&916HD%EjE~--L&o1jk1y-n18- z8#Ac;q9}2z#I8TQh6VotoK9(*Sx&L zX(>;6NV?^fOnEMn4qUcF%16?H7i!K%`@Tj&zc{}fpB@2?h)%glQvK!3xEG4TMbm)^ ziVLQi-$E0jG_Ytthv(IJ|8sb$X_5Aux)QZVD4gyO`gooNSlc$R`ZJ%C=Ke6h5{ISQ zynNp0ix8PNMl%rn=_RY}+uF<8)#o=;Rb;K$*(5|(P_r+Z% zeq@eWDgj}#nVUgug?ihS0|hzKKLIB^%*K@E>W-)V%xN2!z@0yTVd5ZD7%e!lHmv?vYY|@6$^wiYdkiP~6BtaOG zfPipxPy_?Qu|XLN2p4lPhYU>N{7!^)jWwh!A`IxbWti*&_7apGT_qV2ERQARe2SkC z#jqK9U5cWM2)G((E<_~xBBR>J%v8hh729cd=R*+3L^C`roaBAR8VXU3d9Zm`CtfKb z7#pEnUJC&PN&7pvNj1ro^P0*T6GRPOB0aqm!na!w@E8 zctzq>F33$du{DB8WJnMt9#t&_6Ukg=iy9z$moDw+89bHMu$;f_on=>x8kF$WFA+u! z*fzow971lWjl)b6=yI3U;F0}@BF4WLffeOeRj)x!6Z9NIm;!fHT|;D#4Abmbtv+5u zk)yyw6f~Ab5wE~_sEr3=dJRJ3G8eTF4-6sL*2JKe`ymiI40c^Zhr=!re8XiTnjy&H z=)`N#vTg`nm^&;uLby`YQf!9M(9)zPWC?Z8DXBQOiBIH{tp-7G76{7;Y9dEHN01e= zWs)O0kDDY%;Hk>4YSanYE)eu!LROHy2Mc`2de(TnV_%W>&iIDA z^?_-swWt5wGwZ1ECc`ULr&^PKqKg5E6gy z3ZuLU8$y?ec^?7+or$U%HI#>|fuNIw1+vKU)JbbX?+wx6(F&8zgCU5BDIpwcT+|vw z&S(pg8G=<&Wt(gul%iZ0K~^=%a$ST6Av}N$TJN&^n@O_)6i22K_6WUWL39t!N58{ure_C`sP~JQ~y-nY$hmTAn zzvSH}m*C97O}|$5p-@M=ibLx;nJG)>!3#L%!}9c_zo2F9^r-WwPfhmAzU z7!t$Sk1(^Sdbd4(Cq{kSI#rI^_6l#whc6q&cc$mf=`A8uJq44#+PzYcNIge$10DRkc)Uo9M% zzX~gx_Nm_Yl$&BpSNk+DG?FeiV_8o#4E?n;V~&wg0R0p_^@6f^j;{IHtd+`n93&`P zTjA+s7q&xO-<8QW8=Fru#jIqz<&0RRMXMY@OM%fLTL?-kt*tiw%5Fxa~el?r00Q^`r?81jmBQl*Al-Mexj zsp;fdU}T+sF@&4~qu?vk%3(R(NTeSTP9pm-=z13;Z;WHH>Z0C!zqr4-OwU|dwseqQT%OjZ=+J{Go;&jLFkOflr& zR7YX;YhuKd3nwm84-Q3MhhcO=U{foG(Qzs5U}Ptkd%4j{bv_+KggXqkB`0euj&ZRe z2bUOrv|fa4qdhNLiQ(#DcXeJ?M_}ahZ*{n5@Np4V%s04b#W7qY5}XoaWZG`tF+(Eh$`A%$1E^JGhhzFXBM|+ zA%7xQ*XiB0HHq8pOV0kT6dK#(a!QP|o4EBhmXN|Y2``$yesdeGK;FPt}SPtahmRE zI+q7T{7EA+QK~>e6!YeC1EomltPeGc&vgh>cu^ad4Q{UcvYgs5R)9Nm{ve^G+t=LK zx+oq~hgf@MNIEE;k%b@=4do~@vIdG?K(;V>#=TUFqo|;g$wPf8@wx)n$mYdvI`_%U zWTrk8>$4CqrDQkP>=(EMl4YJUUkd*lICByh)CWMDA;=;D%1?AHAL1Wao*V< z;1wMuB~o(CV8ILps&75=u<7vO5Pf}9Ls|{Re9ioppUcewfntQtQfpM| zOIAx>AoV5j`~KugJ-g0xh-1CvQow6xa*(2ym^f_ABJXBeMqeN`m7Jz6B8(;0-9X_T zFnjLoxO?m!r4>M2)B+=5+BbD~wH9l>N~2ZPBAYzt$mDV1%gOE5&Lrw`r?a>mS?&5 zAS(cpIgd@}JhOHkY)9dLRiLovN4Ov9$r3ksfr1SQcA@k&;=E+cIZzsoSOtnM=EX`w z-$W_hv6?8Q8oz}iOOh1%EtE=?-$HRhWHL*E(pKk}D3HvS$1`T~bO$X(A*b)AB`mP< zltQk2b_K<|fC+>kAPgU-J4fk_J4+3DCCXB2RT7$(P>Kc0Czj%e4U!!$cLLE*V33g%tsQ=fgo!wYLWc3W?Y*>t*TCR;)*_+_#x zw3D|{zzQfk(2ue@QD^^S{U}?D_JT%*5|2tePL-u|}yu z2Thm0BXH@Prku9BPT_HaY}0t3bG-EB8}PbAwwy6?z;Skg@^Q84jhC{=D6_oKZzYp= z9lpL3NJE>;p5yt-_{IVxw9RGs{_X2=n#__p-*YgRG+JWT)YLr(FMRN30v&L~g-=OS zTN=No7Wz7ldVA1TE(FX|8_2*(JTSF{?Fo?^iI48dyL{?8-tVOCQ{-)vk}8};{|m3d zdtAUlhJrFWBJsU}leek$g+!KcN^vU}$pR$phTBHA*XA`(^X533wd{1H;0!Pv{ zn=sJvxUzauS{h^f(}z@#Fcv04g6F5gD>!7YM{qQ>;E=r3ddf3vfEY_c8 zB!AVnm|P6>pK0vNd|DY=FfljCR5MZs1d8b_tR7CGQo=f~WU2>!#0p%v*vz41^~gB< zpISysIN9VJ%vUD*gDL_?x*UIH{c+om^h!2cXAYecBf;-HXJq}+%LtW#dEDNV2&7Iu zfumB`nZ?PKUYv}*NxIRht@0qk6`ii~1x{vaQe;hiQsL-%@ZKF%eQ<>%djvAa=C(vq z(}A-6-2I^+$)Qv5Or`nvF|w zctFRvVjN5UW?MoH_|Fkfa#Cwz6z9my(k@>sfIr>2Zn~3ua)C>#BtImb4!Nzs!AM(r z^%|$;g4V%lXy0p`Scy#kUf}480ICz>8u&I2Iv*8s4zYzRYf`qUZB4s4wNqNFo^tWp zZPl)6T2G&N=6jy~Ax;WTsY6{-J!y~NTokf+iIZgYRIB%yZRPV;hP|YEY$2q{TxXKk zV>sC)>z5oyXO5k%Lts){Cb48^0QE>1OdIFO%r(B}WT7x!oa~}6>JeF@SDe;*1jp%b zM-t9(Z1CMwEPXh0nJnDJDTRvbLVq~1-j#V88xO)yZew$XzpMMB)YAwfD(44X?fA?& z8-MsHne=;_0)ykwweDs(M<40O0TV7Sr48Xs##@=ta8H)LRUL&boks9%;6-z0K7Uaw zrYTz0vkNN{=twwdOC_pTs=>+Yo)=wcrnZBEuVC-&ok$bU5?w)ki)T8G))k5vgcQ*mlJBl%}M6orAwGbenSF*6iYW0sft2^{jHc-c!J~;}1GouN@$M;STtp9jnWB#;b|ibuG7ow2Fql+RAChDY z%xjVW1`lPh_?Qw&WD=!fDw_lcl$v99*BJ=Hlq~}6Oq4f=-5Xq(aJ}&tI3!1sP_`@- zhQdy;^Nz%ez?-SKvZ$%l-gwWQA+wr7P(g*_ttAx?AO#;$_bF;JP8}6xF*Md3S4A#K zaH(oL$b~{fO1F1MKu_}|{q%o2tiRPHaJPphdxQ)x<_So&OzHib*v=BEYfg>?b*WD( zJgB_`=Y4f_L+tOTG*Z_3q+Apg)DTI0SLx4GlbUhlR!z%XBl(RdXnj*)g{JRoignf} z?}j#es*)utBuDm|)pg8}#GlhcWz3(`|BM+|HpX|PZJc^PITCk6@M*(HFg;3oav0AS z*VAOOCa$pmR4s=~+V?6q6|4{`Aw3UN;UIItj=QZ0_gv*FW~m5>l<~~jCN5s=?jW^% zq#8)>?vQf+7f3S1hNo1G)O41rk>ZT!n%x4aPoZ5P=>~zLTIDs>Lh3k9wU9cR?-o+V zWUJ`VLh2~U6-i_e<>d9{jWTv5Az`{9dV$~Q#*Y+8X(mx3{_w5B=KK%~+giqvq?&vt z8?hu^q+pQeBc7yz)Qu@oBw_3G&X#gdhGd=6=_+z|bdj<}(PBOY(wrW3lVs(*14+c1 ztfm~PlxrGDahhl5@|rFzU7C6F#0lg}N0N4#aeP?11nn;4;H*#Ol4t-5`UAm0MG0xH z;gE$FCa6PDpR5u|RjuMj10KPWA9-`7Ex0lblkpRd;QW}uH&@5V`o~wWcSUPYhpo9& z^Q=jGScdx`+}?fADRZ=uM$`H}1iIdj#77$~WlTTP26~f;Chg|7$6ISRMViobf)Qb$ z{mlU`wwW%{C2<0NeEK?VIC1K#nk0z@o~j&Qe|#EmceeYKBdt&CUyEDQFWxfsMl+90 z9Vj1>IAqBlAA1NA)4g)p&w3{$FT)5fC)v9oK$^fdIkIGpWc(tdLL|`}ke}W?D1Tjl zkk8Kz6rXx`Uw%C~hYyMm<DS#CMNXwHASe0-!Ud#LdvGsS5=CsCYJI=j37d-Tp z59&sE1Q$GBWDn{pJB7=6jiF4XSoH2B7IlbY5_tk^fY)R1%}A1ww659Quv{z=W?vbQ zJObabuuE$$&;JG&<5;;O9kNgUXTr+8!a8G(x`O3W$0TgfOqi;%GEH?BR5E}CnmUVP zrzF*SAJRemfwZ$)z{?-3Ttz#m*9uY?DUFdEXd)99%5IJ8Q3y1PDExURwfMes!~fV-+h?A!a1qH z>h(`5u)L~{Vz$82buu@yWTmcpUtrB;%GqXJ9VWer)p1v9VRb#0T39XWo6WuTp5z+4 z5jGtC&>mw()CIYX)%9L#^{eZ^)WQlPJyJ5(ZZWXJjj5>1cw^kYg>#PAC1Q>09hxB* zT33cOZ<0e1c9F2Gt23?8i-a{4evx58yjOF(92{ZF%N1h3(&_EW!Kp4?-?nzR#!{BN z4#!AXlyLh(G7^?;u8g{*u#7HND>S2n)dK?|y7A zU-+V~!0O73QkSJ$kQ+J0`elYo#qzC50{-msa(l13T!pQi);v{e{mQVC3Y)5Y&x)%p z>Q&*F!bSa47}w{w7m<5Xv2wvuccR`9b0#_VVY&I4hlHGHLJabK7^-IQ z0QuyTbY8eRF2#rUILqH`JPaL%ri`33P&J>&k*cW!M>p|oH49guC8kZ#(w|@iv)U5Z zCTQu;3@x@<#_vbwuvA;Yx2fEc*tiUBXLXI6b_J?z(v#}ZC+k}X8+!iSPd_qXmuQ)^ zQF=|)Xqdlbu<$mbZ+=CQITPVP$w@?!S#5fvlxisFR!RwmhPJ4zuL2tqYoE{#O}nD_ z5|iFbGNs^-6Iu{$R2veJoU^o89;}Ys3OSjtYtxI&Ompm|s7*S3bL!j77n2&*(x|4W zwo_Z6`8}iOHC*>>q=8nL1$t}a&27pt+R{Q#R@CMvD;uf_MHO15r#Z-6Iw|sMy%G#nfT?!{(Yo4QMH3EIkF@$i;Pe+h?g_1!w9-=Q zBV}!VY9uhA_H|FS+1v&jCDh0L-4oh?&$~A&Y?+CRO3jNEDsu2lKQR^# zr;V1B-$;T*MyLmEcV{x*$yCH`w3RI|a`uYzKyB+8+IoMZJJUiZ^l~Em^%ewDGwnHi z_b<`CpOW@t_b%$k1!OG3S9sn3ne*eT2(DPldi%nL|sSFaN7qo>%gNCJjBvr&00}J4I_UR06Pa9d=E05Gdrj#|On96myM<@Z zoYHO3z$;bmjq#ekx*m?R#FqTm+Qlpy^C!;6-Mq7g2R(C6LZOz!6V)@PS56=^{~Aqc zhUbi#1)TCs()iICN7n4lXgq@67V5T<`2XrXTh@2Tqm9E>;+o_d&szk$fDU)smB}eb zqHLJ!iLE}pRYLiI+VpA*j>qt%4g90744GB* zZpPb9A`W2|VGhs_O}tD1R6J_&i}gspF3~RQqaNSzlz)>ORrDhry}IF*#%a`B#Nf(4kXuSN z$&kbSdkc12%9t=#`dAcr=yRW&MU58{Rh6x?z;kJZq#G5Bs(N`9MoP|0#_sE^ftkiq zt&Q=5{mSJXXgis^vxygspYvjUcwG&e)+f9s8iM*koR+%|%n6SxNlq=zd+x-nc)}k7 zFU?BL<7Rk+Y^mT~U~)^Ou7nSn5ZpCR%?eX%;X4c{LhpIB)q(6RC>hdge0sb@MG#I9bn0Q#Mj?*?YYBD|K0+j#j z!xJ>~nIlfs93u;-lCfI%=MtZzRU6sgPvYGdy|h)dG$G@s^4PBA>Y_r-$d}r z_U6@99_0)iEA;%<;PKK4f^$*kd}lex&H+DSE?< zx9736o7?g(F8Szwf3D)-#Kj#yD~B zbIz$#pkiSHv5(c!B&kuO-4#ykc}ei@@V`OatVUys9MHK<65=IcUWBB;@K;f7oGN-w`}zx zY7B-|X^m?uv(!a4>fl)GUxGC=M9d*sd9qXd$wA>k)|vC?PBPq#yp$mdFUs|fq;v*qqlb0gyW zaR~JH6y!=xMU2|V0X=Asme88^U8R(rjvaRX>plje7?~ycu2cG^pw1wo-N5s%ck%PYs{FYA+1#l(RrmpZ&e`r z$!Te>3dA8(bBQ=$ZSFw~nJ<*I1tO-RS8dinRN<^PI~Rx~xrtKo?G*9;n<HurH^fA`anB%Bfa)^j&X>qo} zO=D}4#q337>v*T_>a)m@c~eAxLtzk+d(#uB3?Yi0QN1=bma*MOklE2RWeX*^{WUHl zLm5*cP=**BHC%J>SUkPyMBwSKad$&SmnHCMVEQUV$~|gAMmaTyIxqj6Hr}BtrZ8ywP;o9{>POXdbW@%$`W`Z}Z^!;i5D_!tbXYg|5j2m9J{3A`@mWODB9#^fR+aXL>yCW{If;-36uOJHUe}M=I)c%y=e3KY(kr zFKx_>$2UwWw`@dSr&o0!$rk6mv+gCP@ycFI1KX@l@}`|RG{@C>z7iF!>)vo4Fzt>^ zY4QF{dE;D~Y`VxNir&H^#X8fH%e~a=aQgm&7t>RR4nzIHk&}6my9D<|fr)(*tFJUO z{;V)vZfx2@i#l}zFNRiZM9Ig^p#|ok>Pa!fsH?tN$rlX0)rP#Exxto;&^7DinAXW& zN3+y=!fZR6CCqZ^yAEdwv&(gqPG>`yx#O9SNLU%`s5wA(xFf0a!a#IGIiDAlErG~- z4!#&L#dwly{)sRZST@)?8f`HtvTbo2%iCtWG?FAE#e+t1MwaP@|x@HOhMbDZiN%j;{sb%Lo$no;9w+9O(q7oMJIVJ*d=-NsxS zFJ2u_NM?02^!IaP3G*aRJ8ob=PoC(<#Opxt2i}1L{5V*kcI%VvtA(#pf1S{QZ10e6 zX8A7KbzaAOnr3{P=c}r7PPdd- zH7!ub4&ef}toxijyIBsqK=tc5Y1)Df(HX_HX0@h3ee)fZbjDP1BBoz{FHvX3XD*9e z0U8__c3}d!QPqlc3*^rvIe=tHZlfl514ea<#<6}C)%#j;6ZQ^dp+PKA6FU)4M*5Uw zeZ}1S*Yq>{n4zl5YaS=3SN~-l2zCz>Aj;w}X(w)_gBq(8zX<=8I*@9W{+SuGG`*L# zVpUazOe8Falxx?T@paLT{Std15$k^MO6!2Mq}@zf%Bx2UJ!L`-_C)&_e}+KOKo!Q0 zS@HCO21CRX9DPOGSv9)xeSw_;w_2SPHRHuh18S&tfU3+3DnC^7>P_Yysk0aswWi*+ zl7btm@))k@b3RkGfv(oYn*%8qm=A7V^fe*RSqh~BwadQ|2J~9e>Hc399Lha0`Uq2t6+6l>|QA;kqFM3(D_`rJx^G zxh#D(ahnNaI9b?Ky^NW-9?{Ck+q4&TXLEgRhW|V>zOGi(HtHofv|;N$K0V29-ZpB+ zajlP#8A-15HtJ;Z}pbiAQ@Yg77Lf68(6*3UXE2?<27y+s((py77)yUNqwpx#3`%$E7OZDn7wC>g|n~FYa)?VtVLRi zFtDJver1VHDR6O~d?d~wcrvHXJOHQhmy7@OA1qo7=9#^Ly<2CkR#UWMG-!4*R2XywliuGgx(TE0ut zS~!mXR9vsvGW8bo;3E=dG*^kD0c7Lt!R4;>k`N{MX9rj8<`kxLeWY`ER&UAMq@7Ex zWQ57z&uiR|&-Co%>G}C{N6v1lj-C7Q6rGUpR28^}`*Y6mCMLlG*Ef!GnPO|iw1HL8 z^g0Eu&S!3%!$r!DXqKHOuI}`X_N&0XiFr_Q$-my*@h#!r-1#lxmdgQUO~(PQ7uRV{ zrcYK};fymX(q^~?x3oVRahQ`;I2UxDYpg3%rWJDMI)wYJuZ~Wb^=ue-gf%;l%xcO; z_TtK=3ohR*P`b~0`XIP)LwGH?!O5x>w!dCj`ON6GI2o<3npUpeUv*2U4VZ1*%hSe* zF_Y5F(@du%XQ(wcW_AG`%o6tX<8DmILLPmDZ@csGsxGVD2XN_Ndw9TS>}P+y)Z`&N zj?ZiHGD1dDIw{`YcsW9%M#RbH^dcf{m*zL;kX#E7QG^Ts)ZLZov&byl4H*vI8-F?2 z(!X`$Pab3oKnDG<6BYI7;1oHgf0#kvgPJpiU3G^olpJ-1tdWssOm0V7D~wZrRQK}0{kyrnAYc# zQKuJcCsR{~jBOfMq}NqloT=vgj!ek;*Hp9dv(8T{x4f}>okCe+cC63A{1#|l)|EIl za+Koq)M}iBoCQzc=MkxMaGK6u;4@?rPYFz4-MInPC%khp$%|`z_;h>b+$vwZPXm-87B*5oj@2ln@w;wGR<8=ZY#M8jdVVC>32dLC)oD?=$%- zRe}wARB6pb=5Ef@r0U;=S5-nT*h}RFYtJf07Ix|8{9T58a|SO%u4cKx;q@cilH_p? z2M1X(nGtLPgjVxTA4bkptT#o@Uke*V)>z$ZtJ`D7u`P-Mtgjmycf;2(Gv2L@41FP} zpZHIcbZnp8x!&Im8ZyQ9sdh~|mi8lWF~?+i!uyf8k(b|3@AkEIW{vDeM)peFxw=VB zxltjDHjpO^?Caym7_mVn?(yjnQcL2O3R(Ts*jd1!W1Q?RL!In@Gcfqg!GKJLd98=x zYSus&)#9PhG&*|*W#hpfhVMxT30P+s?#9m`p$apS7F=8U;{!wdTa_DsYU%?AFGzwe zRa_4DyHc47{oU>{MM4uL&&dmH+*-c==3;~qj7F&!Kfc2(VaXWOB{uGY*}eC+^x zF|ZZOP8t{+*3 z*o^QZ`asTRW~^vixzxbUxQ&ZNA`q{e9NvJ&Je<2$tEuWm)<6 zaFqJC$z-NsgEdlatHyp~i?nR3!q_ZsZ!g}+7@J}23DO*lZ;H*hQr(seE!E$2by_{4 z5=(I=Gr1b8-II*PQjM1JSZ!>HZ4?Gaxj05o_xHpd*RuOloY&fQuWhIg3U21>Zs#C> z^EL?Q;4x?hJ+}=maMDS-4Mijc#+@7BSw1k#v!wMErsV^xlk~-%(-Ee+xO74#Y+Lnt z$ZS(nhvebQ*Q{a!dcmO7ilfS0OLV#Gb@5=e@i+CFlJ+5I3^M=bgUI=AIU|Ho$#fcl zo~yF@8Ht1*N2A5ksIiYTV_Zr(VpASg1JBS4rlza%k}NBMj`;y$_X{WeEI#8>w$3Ey zv+i%8gm35KbLvc%vwYA3 zY4a}o46_y-UW=hjwabQy8&fUmDy)_&KdZg0*qn7{y){$gX0@lhD?ZA+hF~qMb{N68 zZ_I3sSI)y@R5=T-rr+H9Gu7@@iunSfq%~g+IOg4}k&P)_0LW$bB95B`59N3I%{3qe z`ptD91-kM(9t_d4a}A+uY3Pbmz6V85Dx^W@D$We%u=lD~Sa$pNqVv3Lk0+aJ8c$)_ z!rJKI%1%OP-x#k|v2AViiM`M^t-)4qCA($n)>8;Vn|hycJ0R=+1#HaEud+V-u&I(E<>N$9KKHw}Gi>H&Hy{}9&p1_P?~RS2(} za0&9wEZVH-e?^)4{ad1b>y3;)O4q;C^>>M}+?m-6ZFT*1Pat{xW)^?^ldLf9b_%ZxWkf(kjL5YJR+4;%5v+N+>mepK%nP!Y1n1U2aSi z+<~{_1!tFV!UW2)zz?aK& zMuKhT=?txZ7Z!&C|1}sL6rUGYf!ynRq4;8?(B2Q;bbC17rU+}k!6Cys!~Q_u&6v1{ z!b`Y~51kmom{JjChjsq3#X2`HuCB>6rEuMUCe&8=`KwDiiwrxWi!IsprPZsec$uTZ zS65nfN0||0=Ht`ryY^g@>gtg_lW{UjCwIZFKRf&6u%4W6H$6}ZhBl9dWT@Y`L#C!? zaPoyF>ulUyE|~EPOzCP(Z=FQ=o@NVntrP?gI*G|lmn=D~Bpy|?Q2_<~#ohz~ydJ9y5Xn~s&wQum)B z0cvJgT`UFknHfwuy=~MQ$FOHmPnqIOlg%->E;-X}2Ctys3Vvbc=J#z{K3;IIp}<6x zPuvHC1w>PeVJ%VPkx9FKE!axZBP3-A?QdaO)Xi%3T86oc%-rINnBLnhTn5X~Fv0b= zu%5FFDHBY80UQt0l0QDpFefC(cFTIZOCS`+mwOB6#TlR5~#W=J66fEwHbGHqn&e z6J)P9$4%-b!v72rR*N|KxWDXCtQnjnQgydnTM1|}mC&3~Hk_2XxU3UNwi13d5)(zc z3e`plUcazK#ub+R0!Sv#M;mnsPA#b{`7HUziL8~tw_eR^bv?d@5`HO|(xX{IaYk!U zWOdafR)VJoG-ZbNiYKuo7=eG%gV&iW2RBO8mXV$|cx~6M%4AJVMTy!~)@Ix8M%MIu6AItd^4wCswru@T5`-=1(R)W1Ix0epqsXpuRgZa(+ z8U$0e!ONS1FRRb}`1}UNx6B&L5}3b^=xAXF_C5%-2^LsRg4kQaowimXM@qijc?fHR zB@)jq-Aw{*yN%H$_3TeBXG$0P+Ze&%nkKru^V@AKZ)h8x7j1e+PPGATz>F#(GdzpG zsfFzC)uiZEqN`O2pHFedo1EB%?=c+LwicIC6fEzXTTYM1Q>xm?G}p({<*_^--#bmd z(takF5KS7T_OANqSDh)EaN=h*cib;Zw}8^#DvfA&~R=$qmsd@dXehbr6Lso za!gSqox7??0%S#!#`5X$+S;bNd%(nnRG;A4U_(em%Ua3ExlxjSxz&o;ZIq{%B~b!_ z^!ugLN`Da-D>_BwrqF4;soRouth`7H*AI|62D!|fS{tv!M=B<{EaKOH`)Y5tQr*DS z?PEn;|7LFQ{wFCzCz0+$Il0R*JsHxRP^xoreRC|_!3A#G(x&c*MvMOL$6f z3>T?^R^SYRjyygM0s<{hmWZ&wV_VtFI$Q9ReGOyD28?&$v$?2Rp@1;$)Ne9gUp$Ww zM)@9jNKHg6av0<&7Sr(uspTG&fp~0j{0OezUFWXI!}|HH@)bE8^s@9}CXocky0$j6 zz!+)x7N@fuWwPdO7M^5ff-p67CINF!vMv({^)DH}YGwLK6Qpobr!$}EjOV6h&dznp zU}p(gA>H=hr#YhWv?QrRvDW<0Mmmmg<*kmAQ9B$5fW#HO7Hwx!lQC z>ZgG+Wi4pguY*pR-R(8innRyx+9bEtbmmQXOJ^u;!g>=-+IXbQeBwv>E6kyET{*e9wRmZD4Q^xz5s-6=3F`2e+mSw2 zr>{(D(r#z6FzrbJ!N(_w>S-O6i^=l@63z+ecM&F_~|voP0$Nal;rYPf0?V( z_N>ImS21Ic(-@n*=lTZqteCoAuFZ^5JDm9#&?R|wClmv3{5T(W+uWGCuP><6qHP{~ z$WoR}O&uv{;%g+NN1VXr#PMd-DhibrkKw?8osYj+NVtkEK-ziP=j3<*g>5V*ZQXyg&R^>GLulC3gp zsZ7%N_%z~wLR-2Pp2lqH;e)iiVv{PR^y*2wxBH|&mNG+Sc?zrhu1;2DrFw4jw0BE4 z6f5P%nM`$69xb=o@R&poWh1+8@XGiGMSx6fG8xZf9-$J?8t zM(Zu*rIp1v+ZRDnwZ%OVVYz9w4i?{ITq>D8wKxGq7v(Buo>ooOk-M{0Bqp)8w3IoQ zoZ47AfxUgjk)3Dp?`#W#mnMvBGZalSBc;?7RFN2pafxn}I;)3!=uD>Sxu)sQbG_AI zsU!3_%yKCOd1{v`ULVDwrmk;tWi>(y+oiDULrdvN$#AI&2doqzPXFn|=d3SYXVjt! zXltt*b;{XxTbpZ3R~OgJ+x2mzL%Wv#>~AaaWY#T+gsuSZF9l+qma0MG+dcFIcA%ue z3Hp^>wY5G1b=}5roGAJS6AF)|IZV-z-QONr0cqd8ge!3U!O`YqeREQm{5orIoT)O*dJ1^ zvSbBWw_@!pLX8t|7qCn`S^VYgyF4ij8qsVcspLG7utbg#8oQA;d< zI@h0{JyG1IXhZ>K9_w^c2k+~dVqc&pMOm&KCOA`OJR-!s<4<=pRof%4kxo~-vv#qH z{>|Hdw^jaA*R9x}t`C-f z%eQ{ye{Gfji&p-HeOCs{f9;R`z<<*!|H|`P?1^KS2g`r%mmmCatNgLi>tw_)z45CD z%YWtEh2L(KzyAN~guVI{o?guU^Lg{1zy8@@cz>(>IcxukHx0M{+4uj-Z?(#Q^-pS} zFK;Xlw*R3gzvNu2{QqO?|H>B)xBr8md-oT&%D;U|=Wlv;c>I6(ec!*{D*rn_q5Xg9 zz;OGEE5G>3R{3wR{R1bn!SV0RFaBt&{2%-+E%xefTpBEY{fqw1Uucz|w)K1Yw};Dr zwgmi!Q*u!}B+P z-_`%6RsLAl1(3if_YX8t*(MDhRr>leIf9TZN zztbxJy-q*QE)AAH{q_fMZI$0^^Z&|C%Kybr|L}LV%763!rp-QaZn*uQIrMk`r&jr2 zvHknXDLhG^{pa)UKR^4Ux9zmbztQ&J3qL)){;%Kv$;Vse*Npx=aejFHfA=k4_{**G zU+(ntcZbi<{Re;Ums{mueuM7cmtP#Ff2SADzoS+DO@4lVYWVz2f8huITC4nRf7_=0 zCx-98f3o_KPq)e+wDK?g`QiTG`O?O6tNd>o{hK;9Oh1l%-5+nY%I_HcpZfd5=kFg} z-}ld3<^QskpFT4@{%`w%lTG^nrMCVr&3-b{OoZ5f9YQz_*`rJ^RFoVe&Ih2@82_fe(UL0`QJ18^YTsRf9Icn&)2ugf7iX* z{wrTGOh1mEe?yah`8uaRUo~9*H^1dyHuwLV?fg&QI!r%)`hWbE_qF=}_pJR_&kV2s zpZwXqx3tP1bN=P)htKaD{_w@W+baLB?EE~jf4Ki2z2}wY{k>}R|A{Xi4esAx+Bvh< zYX57k{L63H8Z3X$`Y$y3=byL!zx+TnKKg~w|6ls5;r2iFoqzR5TIGMn&d;ki8UL#@ z@BKep<>x=6%l7K+!~E}O{@T}lU#t8bH?;gq7l-@*LqGhTztbu|^$9IMeSVmJ{f$rj z)h7L4vHrjEH-^{$^ACOJ1FiO-@%v+8xc|TU&Tl)`D*u9&f9Zwc^6#3w)Z|~j-S5BA zaQX2&{;MBswf`r!f2RKJ@cjM$bARiLTIDZJEC2D*)#3JcfBlJXYnA^Ow*Ovw<1qj9 zr_X%#AGOLq;OFlfhx`AJ|6`l~J7)az6L$>LpY!ir`g5)JpLx;F@ANSJd*!q5`G>9Y zKV|g)<(riM$oKt9Q~vxFEC0&#!}9+}|KUcP{;cc$|I&{Suiqa(@q^#r>i@S{`B!dI z{*_~U{#mR1lRp1HG2H%l|L323U90?qpV#@H`pMz)&-}uvJYk&HE!|V5r@BaN0t@2-G=Xd&NhWXDQ``Eef zZk0c0|}${)A;`-!W=^8c5;{@=c(RsO7>|GzNY{wKcnkAJ0A{#%{@ zzBb(c%6EL_UvHHk8~^vpZw%9~`7fOMg;x0&tp6|l`{D9G`}+_7*;e@-RfPFTAx?{(EixpZMM3{=ef_fA&DD{B0&bzI2oFw|(Sa+|w%mmu&nmA0MV) zfB3Jyr)j@_kCx*+ff75^e-d6iR?ey#O!{Z-)^YVpO`LD74|I&XPF8_~z^seUl z|7IKi3turTe|*#Sp(g$M8rL7(Wc(lfcfZh-U*G5J_lLv%|ASxp<);4bhn@fbli~6k zfAILfY|YiD=!U~|J=_l{-aj=CtUyXbHn%N|MB&I=U=zVf2GL}um1S3{_JM*%c~z7zW=ZN z@_%ab5C501|NaFfM5e=by|w?m@E?BTWUK$*W#{jOpC2Coi~sCeQ~$i|`~QVu`aktu z-}lq4_CIg(#|u9>Jby3m`R-qBmH(if|EXUd?*AWt=u1A;D*qgww1K8LkMVg2%kc%?T#|3k0dZHe^VY5iHR z^7T{I>%TrA-jDpRFXGQ%KDAdSA-;Dd+*N>=wCl%)Tng@Hr`fK!h>Yop{u*B`8c{gX8`|MEm$KkugFeUSbx z8oxG)=i8Qg1@F&}5pS8y^L}C9vLgK<eRS_0WIQP5;m3`Jsy% z`6B(#roMpR{x$Ld;#<8+^CyAH3wZtUHLJk>e~LMO0zPl=?q89wj7i1^X8+ zG=3$L=i6@k2ItSs^xtZp-&HY7J7j+uvR{tk`9bRoS3-PC>fc$`@O-Cnx#9bxwxqAE z&3}DehxjO3KbnBwzIYVue??LKt{>#}Qy*Up`ycyBUpdV4y?3u#kL$i`rpAqqeP5oG&mwOzrL;OWrKT;geS8v>@ z2jZPbUl;J@8%%)pzo(y3f9WTA{o3Da!umPEjNj8d|7AkPSIGX0wEmwTWTkkRr3={F_+YY%wdx?pX6#II^f{(H#t>7GyNjrgB5ev5!lIXN^J;yuWI^%1XM zedJEa7kp3khk!qM@eVvcl_y?$!s~lg$XXZKpZy^9AD{DlSOW)GKjptj_P^lyG{s%v z{fYflgV$g2{ID=T|r!g7s)+aiia*7U z=Vz6WXCmI+T)zVTYP(!D5I@4qU-rEI^7=|P#J8gPw`Ab?usmmeB0l#f!(Vbno=>?s zt~uiC60c?A`4QQE%|iS=s-F}Gp0D?`DC}Q-BVH5m2^|~5_n#x)8|OzUE3YrI-y+~2 zW}iC^jei%-zwF5Ce|y>}5b-U^|7s4N-<7XrZp81S@vFIc{?pWM@cv+w89(`WetVwY zEs=gC^)FQczp4AQ6vU6G_}2^Y`h||1hV}0>)Bb`yzsi0WJin#CWUL>x2+vEIHF*9w zY_8v;JYRKp8uZ0!_@l^w(PsPz_^v)B+9BSxud)B?rFs1YkMGq&{HT@& zua@We&GU1@_`h!2pO^pq-1;fe@cbV~`;SzC*SDUX*%;Zc4l}kL)tTovEbj%^e|L%> zr6SK)EB+e3U+Yi2?!xn*9^KxA?4L-ywGz+UJvzM>@x?Y9^Jl5T^S-zB-H4YqQ~fRA z<5POV_bXN041KK(|Ni7`uS9r$9e&7|KTBDj*LpOohwPtk`mZ9--&}78>)#@+$bT+8 zpXX$`_DKIK#h+G*=j$EYG7<5|sDEV@@WnDsgZ+y+q;IXv>u;$%5Wc^iWM_Kx_RC#q{sjDj`#SEQ6EC~+`cs=EE=2k>DgL#ZJf9<-FZ}$+3#$LEwRqnCVc2D) zzl!2luFdoA8*8jVd|lIi0lzrGdpqKnUZ(X|hu6Q6tyEgXx2E{l>hk>NmAx+_{)oB$ z1pGJ81F-(TN%3c`$LrTz&<@s*>+TrwC)elscE#$!`-{xU6u$!gP3l&#|M76sub(CSD?Gor#2We*0iROv6Rbboh_?#(dJ7a+ zWWP%DCwJuSKhgaT>>qzmru;A9Q;+(18tKQ;{%sZT39UNA{+nV?>!%ZMfA0+~Y9f8B znSVO-e9Y~p#Sx!E=P!#V&qqdG)ev9jvXOt}9y~v|#%9>RuqR&g;`!dHUqPhr-i`8i zZ=P2YUJph5!ZNh}`tW>?3teITq0|0j5%BM~bv=jlcPugN*93gOw+oyQzwt1QU%-Dz zHGB@@H_`YlKK%G|X5S3^@3F*d0=`-r>vW`Fl=7cdz|VTD!TL4V7Ro<;dHYlQ*unGH z>edEt74SQDmimC~|B{B{$CuYX+V=yzzlk#Iw*fqV{b<-mq(6e<$130pT$>(;_{9`I zmVvx}o6I4wesdxJ$pJjSKY0HJqPWzqB^S{A&Wfbi-8N(D*mf_di%edHskv@B1PCA?eFuJb&!QjR?f|q58oh;Ju>` z!TKfdLt1~~yne*fSMdBhp7wuDz(0TR7ViINO#cb^V7DbOe!rXk8_e5Zpi+Bye;Lt$ z>h~c$-+k0Txc^o#>-V8N@6_fM%-^oWYXbhg{gTIM{x!-U@-SY1_P1Q!5Z~eo&HqTA zZ(elNA;e45sD2pD^HqvxAB^~UbbiuQp7(4t*AwwBR6kfI^ZeXm;o}jX*|dK)&)+`2 zKNRsJj!^zv$n#oc)_I7xnE7iF&-Y3h1ke9d%={(b%T6fK3h6tV^_PI3ldU$qKbS@1 z*B0~kTLzyig7oj0=Vt+*w@1uN#NROA??v$Xz4GGwqr5c#Rsp}ho5%AG76Z{b0$jl!CzT%)Ju>SC+^Sf2Ri|Pk$89)AuZ?eGi!<#Bb{*ZK@ zZ#KLT^nb)rsvlnQpWk(!x@{NopWNNx6@h+^xE*H^zl{7R#q#zC%Ik(B{uG^`Q~@9L zPJ!$15beMEXElyf5BoS|0`#BzE012aR1q`%|6EV=uL$^7^YHz}8;U>qH6Onp${fb` zXUi#mm-GC%BJZ;z|8>?4-m-}Q{;GRX-sus)B|X*8@%;BcU1?hTI^v&yH2kkD=JjJv zY(IkdPUR_ntMT`zM~hB{^Y{6vF@EVM|NS4v2eb`v}ATnqd6Z zMjeCwqqG!%x*+~v+&KFk=^y<->;D%&|8tA)|BCn^TEE&9p5HVq0Pa7EIsb3@`45{^ z6`o&4k^htxJb$I(EtvlkY5%c4=D)uq`PG=cX#C45esqC;%W(A`;&%|QtmN%qSGpOz z|2V(Qh#y_R`;O}uiS(_+D;lp~E1@(zKm4HmQ%>OX->D{h;r{Jr=5JsA`%iWzRP2xJ zzfAM53-pVOs|NQ^f6AY_VEpSd-h}6eAj&_Mi~RV*t~Q0AA835vm_KC|@BeXy8Z|@X z?@9iXF7f&!;`hP+{eY{K|2pycGx=cDB&2`2sB!+`c76E>>6d$Jj9;6^=dVlsli~iSPb2<0pFf)RYXa@xIM%S=dYPZUffOLBOB#mFa!t3w2F#x{5(P|ju*9G<8<7}~BNPlw|ioY`a_b(OB zP-+k2b3~K>1^Y+NRhi)Vr2_GKL;m|SU(ISd66wd0{ZeNB`#V?VS_%8N?Y`3fdx5XN zz2@lf{q&}IWBiJMcO03f2D1Mq*{=%tLghBW`xAM(VZR#5$4~vT9d09i3yoi%&ac0d zPn*E^BP%KXEgt;$PgfiDW-Zc}!zlg|dHa{POn~o)?os?p*LeQZ{qwN@=t}zXJ3jx% zl-m9f*}v)si>l)$ea_g8!1{<)+ktseoOT+*uyvcLUA^1pz8G2RvSKemy+-iXgX2cI{E z^Z#Y0VZScWuk#`&JpW{$W$@BP-hT^6tt^JdKO^24zarpsT)A2W@rP*sQ~`f+WEHr7 zMCGFK3;0@F2QNbU38XJ~=IftK_IbJ>zVbR_{PGMwe|^olv>)Q#FOdIl@%ckvlpcQn zPtr}(i7^c~i%hwn$u6K{FV`)_+-oK%UkTZ%`# zK)fXf)!%~g4@&zQ-v5>fr}eXp-#@MMoJ%16*<`<*%-gSBYd;$CcGswW2;%3j?uZ#N zh)=cFuwN6bzdJt$!}qHvDF4cD`1xy*eLFlq-ZJ-(LA?D%-?W4IcP;r(7x=H}!F@U! z{}D5OuJQ9XY?o(A#CuOP@|VTR&tJ{Gz2N^_UpmC|0BjW?2E?lvxY9amkCSR66|1|C8 z56|Bb5r)1l=pSTqz6IYeIUO^2C6cc{yQQB5`;Ry2{!_Zd*AHJlI<`jR4>Ru%1pL;y z;iVA&%G9sU_rGn=cV;2}A-&&GR`Ta(sk3zn;#ImomQ#5Dm5pu<&tJZN6#pIg_1kat zlBr1lY+8f23i8*Oy-r6FuV}P>qImnmUw&zc_&B;h(m(L^(`e7V@cbV2*w9y^dHu=T z?Rz497YaN50iSt6b_rj_64H55L$(TP?pg%e^ zb28#9ZZ-B#J&eykx3+A6??*N^AYS1AZ?3DYNI$I;*)LeXRq|zl_4_ee|CV?B{#)+n zXn23&O8%EW@bMG8Dtj7e|41YLw7Go!-tN)QB8Z<&?+^4VeE!R^xzho}FC|{O%JW?x z*6)t^GGxE9h9Cc;x;^3h?={pv)&+dz&zfnGeoa&VF~9y=ol6{y_!{Q@=UU$WB971C z`8~mWe<1PtjnbVihx8qLQ2rC>uN>o074b6ha%Vn&Un#Ww9^zY)|Kxdm{N<{6XDs4x z)A;o!eE(qS?63le|7^Y=TFJ*>iT3kh|H?VHQ9sE|`Th4(r-$2-e)r=>{*XO+{&sj0 z%s&S+QvMmi^UivzHAsK|4ue-pS&Tq1(xGI2?}z#4fdMu1A%5IfgV)#b`pX77JVX5W z8#Mk^y;*&c{Za+q{?PF+;OEEE)BT_PonL>=zMX>S*K~CMW)-Y|?d%9x|5r8dKLz#= z-_se^KMJ``4d?eiyPj_*ApdtiW4K*jz^}gy8S=yP^Xu#se?xiw3}FSDBK>(e4PF!Y z|HsLPIT7F2)!>x^{QR9>76sp*k1+XRy!|sbt$U61<7XK9`a}NrZ)B>swgKYDog@GM z;O+l$`+*L%r=iL&-wai!oC);e|?7R*GlpJuQD?Lo*(*cqYX0^ufKKL(1B?D1s`cz<(&@|UuUpZ_ko8^iuXl6n96 zljo;=SPbt^zMJtY;ESDF_ZW@;9@#HB^Yz2?!KGmT$(8)C3&#K6>Bdi_pFZALKe{0P z-IiR0=MO7Qo3fktU&b|;+>m}_ntw$w{?2j9=@5U6-rreY@bRBeXgKVjzcTwL0{aj9 zjFOT5ceDSnmaiW#KYm;h@fwx=@-Ni_5h{rvOJ?M3=4 zS5f`9m$!e-w>-rWubrm)MZiA_S_|(_-6?*QeY}46E8XGyP2XU$|1IyoqT`o*MfUGM zLH-x$54krJ*56ad7`z<8*AKhX-k6W{v(fu6eH6d{SUWykiTIL^H2(d(|7tokNJ0Ek zvR@bQgI^EJhg*U$f*A>|d05PV@Jk*Z;9}Q8{FPIr6_H zh37}+j$eWJt#tpQMe}_6l^$^YEH?cosDJ9@sPY8qHzNC$HN5_Yuess-k8Pwcec*ZD z4c}n@@)YrMA;J6=np6kbA6td;hhYBGCG~*w?@seCFXZd52UXUDApMxthQ79xU%%sY z?H1x&nEC%8KmM;tFDfIx7Oh`(G{63vPH6@2-x_@}_Agc7|BUWS^C0~RosIEJ75Vxt z@xrY}h)<&VvkLTw>^=6>5sD@%O*B-U(~hKn-qW#Mv@V{vP zQvT!qr3>^$`9^Do-Jltp~~BHF){qrARw|FY-fr_`AF@ciAL>JMF@|N3LCVQBxe z-(u7+R*CQbcmHy^G2*31wEqd_zg^=%c>c1`_XlW#@p~?59F6ofdcUIz=09zVVVPCiwnVv!nN`>-ql8!3j&@{Y%qis(%IX*FRT3*gsXw`q722AFs@xJOYh> zA=Q7dR)PQZ78l|DQO8EJ@oD-ak*AVA!v><>zl&E&ThZ zyy*T--oUTlr@d~&_uJXc{{062{%-D`X!!m$FWtXc1ncjx$9DMrm7etZXT`$nUoCD4 zK=W6}%)ejx_gl?Ymxx4sd?zD*6+!-SIWYqE&(fRy7Xj~X7jg~hC(!zpH}U!7%&L>{ z`}0cD{;3K0=9~KWM*2~aw0_d?^|x=06!`r=mS+YpZ|3b+^JE%|^t+xgc%>-6{?lzP z3*SEuqx&0GVE^n@H{kvkK<8&&kbkZvX~_O7$0&Z9@}ECV^7#tyFB(5Fcy%Mc z{y+X$S`+C{r27j^V1Lse5xEd=G4Bsz`1m`Oy&|kXcl4$GKOOHsw^aS%{g)?=Uvl8* zzo2Ily#M$@_g7LizJB@<9hDW0-=Fj~f&QSqSq#6AFyS+~v7sRVJ|65+B zmaJL%@fUCMurK1PPcigWN1ngkpi&s(cToIDTlx6gFwZL(@h;ts__aFm;}2C@!uJc~ z==)DJLH>Ji^V$WZpC`f?zb=U12Wfl6A^s%2e^UkdtN+^!_YnVp-rs54`1nuTYB+qq z_knnMJI_z8wdp(3kEii#g7tT8-Hs!OzcktKpC-^>b>9`%uhY!@nVz@buk4w{NdHw9 zL*JUj*DoD*42AWNFWsL?sdzr#ZaU2Wl9~Sm`J>+9T?(?lH|2jNmd~H{o8N%>D~xzu z!1qkOJ3G>!eAPJrE5~^Kw{BP9{rf`VRl)dUj)iSP`cBct`qu^e*SF0Yj`(`SOX>Lf zAu-31tB9|DhW1Z8e*SxwJP+TGxRbuNgOA?_X%k`nQ@o22zm`0F{;l*NqCT=e=#^o= z635TqJm1yu{j75iLto0v>&J9B@&M_-Gw*K%^IxdwhvSG(q4yt3K3-qW{CNrDT_#fe z2*y9oJ2?UIKd679UFYXNaNu%y{#{4!|D@Uc{`I0!`IbokBz^v0InK|YQsML##P6if zZ|efS)Xqn<5nrUDQGZ!d@%wl9lD4}L-{vai-w3l2VB{0?-JSVo1<%hJ5dW0Ee_buk zkAGlq2iQM5MV}wkJMicKhViT5`EyMMzgmQk-wg-s#v%KY z&G$zF{d-{&%%ApEjrFI?y#A$%hXZ|3vI&yJM~A^SC&KV2~YM}4lt_se_C&+iGwKXUCzX#Y0S zmzMGIBYJ-7l?g2mlKihmiEXZG{i}rto{Qq+|&0lAJ z|8~f7Z#Ck#o1fnm*#F%*^#a7_qyCG0me0R;PS=5-Kkug*_REL(^|P>C19<+F0}Wo< z%Fkb?;X7s``_s|+S1H4F0fHtRMLt&+q%W2i6bWX#Bds z{@lsS0+D`4>c1!}`25kM@(tL380A9i?+72iBeSf4pP$W3{TrzUUqAS4Y;p?Oe}U#t zJId?N_%RLoe?Hl-X5`n;hf$;8`-3HB{0Zj2c`AK0vVWBM`Hz*n|7VShh4o7{55xbO z6Cc0rVm3!0{W{eDQ8iw_)9yrH#80R1A5>2B>pxfX1h{@KPdDsWGx7eP`7ssbORP24 zk9MA4Kf_OdcS81$GQWTG1@FH&x8v^+Z=qwWwF1w_q|bB_@lJGqtM}mduYH4DVE<|>e*F4g{QK*lQ~yR0tiMS=uI)wkA0mBA48Q({xO-+qd=U9hS;fa+lQWqe5dUL> zG5>l`-hYi#->iZ7WycL(isbcwWGfVo_#j%p@&(@imCL4wpWpC`q4*Wd-{5?gz99W` znP~sX%IkZaj)DERP*cAWAHN?eyTbm#B;wW8y#LPqNcSGuf0yjH?C4Dsf%`x2a=33p z{72%I%DnwCTc2-1{I-WA8^_0Q-#I?l5g$jqRiHmMA`;%;Eg}C|vheynCWaqE`YkKc z{FmbMZ@R&U;roLh6AWI7;^(iS-96apWL9{)}}0sR{hI>S!KVzgHbY z^C!@cwGS_X^mpAg?3W$+`HP-6JsR;1+EV;w=IfVXRa3$D7e#3N@vN=kiu|t${NK5CVOT#o((hl; z1^P~|kNl8+iuwDS1@XUPY}rzXzfi}>fBFu7{=0j>f$`((pXSeor<~>exBBMxD5Ssp zg~96r-nY1|(V0Gdb@!36er)56xR0 z@mW0$`!xZddD$;m|Ecu;-6F6*?_LR>KZ<5E^yTcl{TV(zdX4NqcG4KX9?jQJd3`&; z`;#B1Y5oQJewA;)^Y^ywH2<~v_&t@;bp^6Ne7vDAW#RKz$>}9v{gXeM=06ATzb{9p z*(3d`=KF&>y!{KV#6bTCQvW~~%zwQI+i!{o`R{lX&3{=w{MX@-+v-sh$N-Vay>{%hZ-I_zHzH@`n>HUIsE$Ma@|`(G<7tzSX^ zq|xGn1(5$cQ2#^D#^=9U_j>7w_g_ovPvE~X-*-!h_apzw_4xR67#fut@jmqV1Em~4 zf1MgOjz#>g8HWE9LH-^+{vq^#(0PMb1$^82-R2?v(20islz86$$YFKi`v>!5JDS4# zZ|9eNuz%Zl9nGIW|JbgHFK22E6}@-L3o#@tXPlNgMh7r$p0EL5Lqlqox-vv|wCKFI#b7ij$m^542Fs|O=Kig;CEzvI~aR}i279q9}B zMwwrJM!X-zubh+L|MPBY^b_$}a#Q@&=HsVu>q#XL|ApdTZOG@}Nv*cS&tDZIeajj? z|Kz*T0KPx?TEzC*imHO_kH#NG@0X;dy#Bkbg<$^C>DogT#P6QYRp9%_%5;9v1^n~{U#B4ZCG-CFf}nnK zud@j8Stro8SBGDJiDlv%AbzZQ|0v++q~8ehe+l#ZV+H)NUYFqgU9B}#e+u~V?N-A6 zO@*^G{<{45chA~W4UIp6=3f!;iw@VXjQBU9#`;$UeDL<0wGrQw;z!HH=ikTAi*!_40wk%O-v<{V!G>+hxX{RdKce*M>I`yA%q zbE^#dExGylnX$1Oy#K0~)renuFHlaHVmjlRtl!4tWIYCx6mcF7oz&o0bmV-)}MN4*?%sclus5 z{#<0ga*5afH7Uz&#Frvo7x3$Um3BmYtU3Pz|Kz(((1Lo@(hV#B22aK~2x| zTJa0h5ih+m@}H7{=l5n9w+``Tf(`qnj68p%u~!h{Z&#)93;0WE7Vkp*yGVmqGx7Q! zxxT>jt97%%E17wI{6&u(NZ(-#jXw*|XWhN|E8?%y_Xp?#e!#BQ@cde@8;#$A*PqxZ z9`-+f*nX|R?;j;A&lj#<#ft1NHG;m7)31$?JE?U!y$Y zf71QAl8fhuS2_smk7xa8{JD9)>DGrb($Buf;B^6iwq}fu_%*9({CRl&ZQjZ7{M&%^ zmApLfKVdNJUo4EH@#p(*ye{BRc9mfLQ)wcNKR>U3phv1b$bUX$zfyqb+xs?x_mB6@ z_%F!waY zpYeGe-hZpn_yv5@BtQ86;zj`)zs&19bbs(2*?*e+uN39^fc|^dAU@R%LtiS!^MkYt z84&N%mc}pOk1pGtjQEbktHpW!*4wj}M*I-Uze)+7KR&E3{QQz+&VNasPipfr4(Y!) z^Z$S3)l$6vsU9m~|L0~y!~aTYo==lycz0xf!I3ooWq4ksuM2pQzFL;o_nLDOzJD2O z?tkTYzU}_aThaJS?=|WVsXWiuOlq(Y@x{&cFW^P?t4_Rr$7>miBK=k7_$%=I=u7!C zBR18g;Q48ox&ABi`YDgr-$nY4L3I9c;rS!4D!|VV z7N+x)REg&kqrbrV`xmW0UBK`0dI`_}?sWcAEA#sOc7rzm)1c@0*Yto?jZ8>%Rui z+pj5~9qErT<6poZ-<)O=;=^eFQC)fcNbhE_|F@I+4@ym*uXkc-dZgdXoc~%p|6!XF zgZLp7zq)|`xmz!T_@ZTv_)}~1`ps_cDu(ztia(_e&&QSbhy6Rd+m!$7^8DsrHxiJ( zPW>BQz>m3ew;ST0n)$CDukX>p1;$Sk+P{_hJm2`#iXupVFXb;u;rXo_5@HcQc>uj1 z7x1p%o5A|Gv5TA+sFE!%%C7lBXBmUH98oz+w z5P22m51ss{HsxatZB!EqJ~_Z?}Dj*UbDU;DblJhvz4&+5c_H>vyw1 z3gh?7AsT(w8az z)b70geWfmppEtDsC_Q+7+U}#lNdFY^QcnS2eh|EWZ)e88fPeeM9)5l%fa+JZ7q2fI zzlG-?7wLEujlW<)ihnPjZ>(+^i1YFvd(in?_2KnX+BJsnuV#_`N?)Geo2$$V zHuEpckbcBZR(FXJU?B|0q?(t zQ2y2h{1yGjUZg+I%>RRV{f`dko*;e_tzTsb&!;Z*?mgn?oAE!C=kq^14f~fPY5nQ~ zzRI$aen@{OQw)Y=J^qO_2r09OY2V;@M}VI`XD}q z?%!0E*I#(aE*0XF&HKMGJg=8_9EbR86o1lKp0ArlIfi)0Gj#ta;5VFq6o7aq;?;4y z{*!E(VEosn`BTR8eEhFEp-A7=_AL9)&jgep^IuwRgYP%{jH2;BdP}Ff;xh@%&~jCwzYs zP5zUg@_fL%9Psl~vLo65jOX`EpPz{QchiiY=RCjtc)Og4&r-wCx4z){1)2B1MZ62~ z@++Rt`Z@g=#9Ph!@ios^-|{RS;#Km$_3eM;Kl1#{@*kHX{aw`mmp}9TmVPd7h`&z# zL+dx5zuy1dPQ>3c^Y;&)&l;32HR89DzU3#+XLyt?9Pz0OQT#~!_m@;G&;p)6^Y1hA zza=%#=V)2P3+V?^{?_byepE!E^oajSzdyp7hUe|uHiG%HNO@!Yayp(bKMa3==rzhe za%P^dSF<8~|L;xungh>g{k|g;8o!0|k2NdLA9z3P2I2>}8spdU^8C^lRbl?kSlO6= zxd6|1&{lm%`je^t(hBkXPq_@-zaq&0*1|mReLo$%zbMdz=D#G*&mWboKeGQ5)qj>! zJRi}k(|N=zG=ExYo_Fk^J_^V)^f2;HS&v=*nNZ;GEzb4PGEc2le;(h7; zj-?jQf7{Uxo*!CFrTTk0|NTSzmS2bcqgjQG__wU!`R2o`IwSkvnEhh`f3jS$>xlo^ zi`L&tUO#F1^5KZD=w$HHDxP1J`@k#2ww`~yLwUfbH1^mW18NQ#&^Vw)v%DZ^| z90iJGK>F5f#`u-pJRkdZoh#zqX#Z08^8Ca_=_Vq+H?2RbfL{?)@FC)3$^XheUccwQ zGO+)3GLGhdKhH19wZ1IUcTc4F74Yqxn!xiz35&r?vAllBqy~?X{sme;@-d!|X+9Ue z-=0tYR|Wime!kFuma`PUCwTpcy5232{W)yk-}mR|6wkjO-X}NW-?gXt6Y!fJcTGaP zR|T3s0so>^uW^XaMBksUp62a;{{C5Y#J8mRx18nqgLc>L5I@<>ALn>Jy`!Is_|b9n z{YUXU@BGze2jUC9G3H-7&+|3wq}q)5;pXpO5b%3zhr#;Q#ou`UBwyh5zZPBx>z^$9 z4f|CA?=Z#38`*!2&TsNnUcaZ;-Mon3Me9eu#`7Wa0J#4zbTI5!uJe59BROFI;DovU z@9=#5?d~~{{r>d(Z>9SD_s`Y0?%9BNANu}Dbu0h7U}CWemM`Xf4f0l z_}{>nQ%>rkY>!`wf1@$q*!Wj?I`7eA$Idxg(G zT?V}LMEYmRe~N&wysrR!e|d*^ix{;WU0!TLuZMEmD{UO%~fgV#tuiFmagub(CU0Ng)&QvD&f=lMlnPemd9 zyEOl*Abw9K?1lHQ?zC)lf&QG$uRM_c5sDvO5I?zHTDC|0A(}rWk&nNY-xFc~JhGxO zf4YF*6FB=l(ob4J`%gZ8{oKet@Ezi%p0s|h@%H;xaITGbN8)t>pE@zi6U5um{-r1J z`d!{-O@;U}j|}@Q9(?=_%-$0AkK8;A|7-Vn|5Y#fdI8dJNx#2Rxz5|a`q4;uerhqw zuwNJOJs*v(i1giQ{K^epf6TSq@coKH^JneI`|nYYbg+L}^_1a1IX~~e<=HZ)M)r@2 zHO8+A_)3?K!~1uKAGCh@@xQ;}VuQyWkbVW?`STX}Ps+;s zulUG2Cy@P)lW6`5@Z*15L7sy6#bm#=EARj3CEpc9d^`I7SGf?cf8yMjxrkpEK=J#C z=dYZtR|@e{Y5hqJ`1qhqL0{d6obpM9*2k$oQR|NjsZr>W7-}g}bXg7KL`)q3q-~T?O@vDw} z{I}oTr5>_>h8h2Y_?vR}odxlY>HDjdUi|#uZ1(&!;s?uEoIknM3=R63fTW z7x(h8|7Gc5%%6IT_kU;Cv7eCrN6q-T$?yM{o)wQoe3Hp~@&4QJ;L>!&&mjLPw|M=Z z0~*VS-SHh%dCt;I$`w{+qk* zHH^Rgq%W7^=ihBt0*rq*`u(}`Q(oWmXdQTev54}&)rp@!pU@j2X#9?Zse=6T$nhh5 zKUHL+v2822d3_hZudsjck$(S+F5rFR1L6D8r{?*s4F+T0@9_S=-TN}U|G0MA&{utU|2f>4 z*d6INU2X7IDn3?ubk!AufvI^ zE0Mk<{r+uh0Pp{4pA#P;z7N^22<-nlKM0;*s*W|{M-}jE^fY6U{$SEq19|%|Z!8M; z&#A=g0{y;g^1=1r#I!%2_y7GJ%f2G}XVdzZgLwOuX$Ro@OU=w5F?{{&U$hB4KjloM z{__Ri{+&Bh&LR6(*w&x?J+-7J@VrO5?C|};HnQI`h#!B6Z&l&_?>3r0DHnhK4(>lL zAF{t6&7Ty^>kqn=VIATZM;q}gHR9LrqS6Z|B7SyngI5H6on{5${ryAQ|5XA1seX5R zq;Gjm`XT)I-+B~ki1<%*|7#WSKk}EniTFe0e_7`1mv##~!talWCtmmG_uq!;3U)^N z$_tvm3;gddQ|BLp_Xlyd{loe@{@?NX19pbcPq1V57N(i%HZXSyneZX+u{8~7{$Nxkms|tS_bpq z2pYfqi08j=wo{P(K~(=qSNZu{v?B)I-)D{@|25|Kzt;oW!}_Zj`A-x0-{oQ%cz;#R z##?RqPkYJlAA^sjyN|{{(zbufKW%paPW#A|_NdNjYWBn@v{-WLaN{Amo`Bxdjub)u^gW&svY_$IL6h8lD zd+h-8herO_T=@9EHTM_nKaQsQMHP&H@gAi(8h;hjeygDVEb#``Kg}urt&e&81K-8K z{zYTbw+j5f{$!vxvcDVYt3&zu+g0*IeZ-HY`L|T!?N=8J>4Nxo6n|=>FS~!vZk-YK z|8|-6!!X|dV&kj9`3s=&>w$dyZA`x#zF+A;>rWTxSNE9y1&x2csUO7aXKg(OzCW32 z*8lzZ{AHPT6`sFmQv6$n^ZpyOGOiP{zYWztQd2(vEUQr}E#mtSuMgtKFS~q%`FAb( zPj2AP#!sOEu_;L3O8cjj#K&LJ!9{l={s8GqdHMCfrbF{Xh`&SetBv6OpE2$;Jiqj% z^{>6+_dmCX-2;&RFmwJM@aLb_E_Y!6YPLCl0{_)5Q0*7epK9)3Ir#W}nG`t)@snx% z@@szlwPG_lBR-zyPZ7lLr3<&8B0k*w{DpHLHvUe>$t4jl)A?T$*ncYZsZ)qwL;hEv z@%cB_?J|77xX6}2tiMuA%4>f9%RHlc@o#;}!)={!y><>$lb6#yyaJJL0VZ`^zLGyfFlhf0?=eedXh)>v+%hNdJjh{|eS$&QbMY{~#aT z|43ta|6OpZe+%j7tWM|WD*XECo|FNeAM2C8wuSHC>`2wR7t-Hi=D%kA{yDgP2Y7zk zK=UWvxQy+x0xi ze|4uD`c?s-xpLBe#H(ihy3PAk+@5UxpEBn+!TwW% zdHx*7`)}vt3h@2!I?~q#_pdp>uc?phKWCdii!FYn0(}14Y@H12-|m$E^bkJ(B*o2y z@mr48uUw7yf7TOS;QIw1TEB{5{dr`Fh3BtBfBBD(pJ7iI!~WfEihot0e`B$8IP!l2 z>C5B!`Hxz9uo~hoQT$p3{mZ#NFIypg4)qVM0{_2DTyqfd)6D!mk+;9d$&9f7wSstE z;6FW2B`2gWg&O%oe#ysA3E$Y`h`(d@Kdk)xACR)oM7%%6uXPeX{_4s7(jY!9y+4tf z^ZQ5SvYasgeWdx<1oc<7`*(68{SM=e`cIwA+wXRL7_2{skpC?;c>iCHY2bnM?QQ3+p$>*M|S(qI~`Pvup)dWWPI| zA1qUO`yFd8n1%Rj$%g-wwqHOn;h|gsEwXVN^Q~@9Gt(za>C(!TT)W7iKf7{*SfcR~9Gyc)n z`}5;>On(sOpHDP@(l=iJYf8#(q~GD1;XlhSp1<196~2E`PZ+$Cir;^39@%vs>EFGZ z<o~#tv!OW+`?WLz z{iBDjBL6w~x&!gCS&jJB zkMQxkBvrjnh<6-leE*0gFYiBJ&-bu@6gHLo*M%SdhN}4|Fq=vna{!nxO>dM>yV_kXp{;>Nh(*KXV)Q#7FdcwIOvOn7^WB#;!{QTX_ zn-kVw>u(zKr{w4PrK9uBL;6!XQ2h7c?Ju28*^Bt06^!*S4d&sKqy-=91`RCy`loBC7zHk2R#p!q3@h<{}z z|M%j@@3!Y-F~rZmPx<2~pFd{j%~Tihw=a>th1Wk?>t+PvRmwklK|cOkmRSD~@!RSC z)f!6&u|KmR{q?;M=KHT}?UuvOFB~+#KSyx>TYq)JaHPNBj8V2~Z}|Be*Xvpl#4o1v zyLCEW|Lk{ev>fppq78j@2G3Wi*BkC1lg;z*Or9U{ZV!y#L!@t+#q&8rBVhmhpy|JN z{Q0|-LkO(D+I2C`&*~FCe%g6gf}h|1Lj5yoHgEsPiCK;!{~xuZ_;1YLfA5~&1J>W3 zX8-;jA3qKio_0d|p~UN9{QAxBz8>zshw1)JdCL2*;F#;sf6FL-6f57q7(4NNVPyY1 zGkz=b_gC%0XT$!>c{6^R@cy4)?H=qO*{?Cyk1psR9o2Wj_Zx9EeyIiD{|lGD!}>YN zTz{YW`5WQ4cn0!cZn9r}&d;CYZ8szToQ=#7l3;e}eh{cJ?uRKdqcK zc;!7G{{;q1i;#Y$3B(Kh-`nvXJU^#U|4kL}g@=8C=T8r^UlaIm(XB4<^Ix0D|JFHt z{+V3-^g=X#U&?=S3O|1*$2|>1yiTA0laBHGw@d5BTM<7ulICCFzclThdm_Ht7=yRm z_cs2^zwF;v(}tf$d?NWz`NFRs|1PEA`7_@(Lr{6aub(+li(&k&q4j62&ByPMFE<^L z{ZdsLa7#XaIH$~gh4`vw|69Oc_CH}Oiqcni9~t|{&l$f=`SWKz;#C3vIkY0o-_42F z1^l{F*Owsu3k@X6lE!v_*@_>3&*Rfz{6C@ZpHl?9S3h4^KMl)8_ZKhu`G5PU2<-nl z#~Wd*3;3+(W;mnqHy~bp#p~Ct@uMf=8`h-zgV#Jis(hgzh!3Us*9GhEd5vG?5%2lV z7{6scpT9nMD{m3+PrS5%=kMQZP#N*^IzwL-%zyJ#`e?+Dxd|wwj0G ze@$S2!E6O~BmH6Y{S~^v{@K|N!v0MHeSech9cVb>U-D~A+_e`zjEs`@ctr*Fh#&OPJOcmvVR%bucny!uUffom8(_i z5fU04<{c^zmxBWXL*?MGfKb1IKF%RN1HIbY{-U-V=WP}*vH2s)GO4-Ne=eu>+jfFi8 zKg{-z=D*N3C^V$(Z#{zx^$&4w#i6{p&u#eZ9PWGWZavEV`5$cV3GoXFZDjl35%>GwsoXT!YoJdDn_GMQLH_(*-`{`d?iC#3 z6Krz6eS-f*%-h#1K>jzqZif4N{0SX%N{m>s8C6#PquD+%ETB&Z+uYdf{iEj-65`d* zHqU+`Zh>BX8hZJA1$g_AYkU3wzxr+cZ_f7rZ!Dpv^6ym=6dGJx?k!WC)wYFqNSJ@9 zY+E+J|MP#=5#ss=$bW49D@y6Vl$Co22KpQ8?=Q~7Z0=|5qeW;m2eNo{#vGhYU=w^Y{GxPyPIR zTHHqbkkZEfrl+Ms>tFN_)p(T?@iR?61J5@o=)3{(Rov_(xs1IexA=R1>!0?2?|OAS z;@wDJY08g3&9epph?lw={!{bu_BRR2-yZS9ZT`3XwmkNH$GH-u|4k_0V->kR6 z>l1nZXUMA`KzwByzhx)y{|^NtuONQ1Kl!gIZ@=@b%4-ns7;f;EqP+c?MtUqo{1x)Q zev;>3w7!}e@f*nh@-BY-=Un`nBi?Zd5Px&DRu zuMwaBG8Q=80QqnJB}vk3`;TQ0@BeB!MomNf4YU4e!|y)}dSCKGd=Xpzx7ze|0l)s_ z?OBLlW=Hwoo!8Hnxy2X6yWFArrwQ-BMU4t9MEq>p|CRQ9{B=oOx*YNIoN4`y_abwGS$@}KO%*I%VV zmUtlElXxlq@BO)dj(>cwzI74rPrN#sxBp3zl{XMS$L2rHHh#4QpFa~9WmgbC$rgWB z8?SWd?PTr-~ZAbJsXAi?G*pk*1Y{zX)ugG7m8oKIj`>)88-## z_o4btOZ)ftJ^!4)!>d!ZMEou~e`p8z{C9eJpJs?3PWs9We*SZH42?m2q;39x|EOJi zvi0xVXUmr$zVv9yKR*2YH^_PJEaG30{c3k!KmP54yNI9dYv@}A|&vj^F9>u)rnUvJijK>>UD^pN%1dv^SrgrylRN=ZR*eB*MFgI_Nx$|hR%=DWq$sO zm00!)@tQ4vSZw)A3F7U){2+gK#7B|+x`3}3<^}85ArwDqI)49sl_vXYq;DZ!8pYfH z?fEmaX8FN&!B9I#+D+4)HTL+ezAQ|I2^x&;K+3emWT# zhj@kZzv9cUzmC_YKSO+$&4&HzIo^K@h8(Yh`257{0>0tODA>Q)X8JFl*N-ln0mlCe zTmG`z{3n&>{a63axeLhtRkrmjm$&gLeEbdQ5%&}Ej^ux>6Tf~pb$u!!zOHTlEjE4m zCa>Qn$AY(ruS)$Jts+1E{d;!ZLi{MR|I&rG|6JiW^AW#cl###XO1%D_J;y5{eyL4g zvyEQ~;^Q}BTu<2l@U;2w_m7^DUw_BG7fe9<)y@6;EMLDok6l?9@gbxyNAUaC`W9O< zBfhmw-}-z0OY!r+t43?szc^xBKeCgJzrvs2x2+nq5$Wfr{Z|R+{XhQFj$DYJf5)gl zlren$Y46qwo*zC?{HPOo-nH6lSbyHM)z22&_?4^t_%ECeDuC=?XR}|k@#C4Wx z`TNQ9Yi}=u`^RS+Z?W-eBi?_-yb3Kt_Ftp?X>H2$i60_h{SrjumlOH?+vHGsc>aDg z%*a31bA10xRDW9A@%zW@R@-3zWiE~1a*em&64JR7@?UdX{i^+*KMS8f;??fu5r2&G zr*xaw-)!|8i1-uKf6xSc|C?V=BRmKa}J7$Old<5P!pr-wHf`NQz8Cyq7tD&OARQrrKo0PowzL%JBJX>$z9c5kJJ# zufp@zVv3CTcXa;MYV!Oe|1rN1Up3j7KWi`Uj~0XBF`4iw>)f`1N#t)>`uViR+?a{nFgF{w%irTW-tq z(_CJ`^G{XEA981&uQ%v^F=T&c+e<&~cl|Jg=lkv11NBQ&|I9L!=PPy2(g^7{Pp14a zjOVi@zJl*h8q@hr8^iO5YCVDZ=ZP(USbzI}HqYlTe*Gn~KfxA1vWxBfw20@Ix4#jO z_>Yvo#A4TyeC-D9Y@OxYq@tKzzW~=@A^XuVP z4PpQGLK+(XGT#56JCuj_*E`Jlzre@OQ^)dFWd91))<3k(pDN&&xEIWU`0rHz$?y5| zPt?2n@cuaR2(3SV-hUO|6bnK6ZET-!(QNih3H`lTm1Y7P2Ac9 z>AS?*;=i)3{~EyC|EzJd!-#)qd%yDgM-SxrO>f`8`o+zrZ?WlXGx+%T?B1sZ(pPQy zOZ&~=<;R~f&67=t|DJ5?KiGIZn72Q?_>4!0?|a3Fe>H^Xr`Mn4hWI#J{Uleh=|}SU zqjAu~28ho=?+28X{Q5h)V=;{Xre^(=!s{2_RpBbqSL|)`XS3hhnO{G{a*nxr+l_eXD$my)6IT-Hr`Y;mR-6B{l|27w`bAiOx>5dCKJvVii`NLG zUytTrNzb4Ei?5yl>(34*pM~cwrCP!MZHA+C{%+fw-M^=`?*QwE9_Id4gxAj;S1K5d zztAV+`?2I9eEe5Unl%pbZuEZLGKaT6%bioO|2F-Dk-w}@RHAAK`rdOy!<@AMw#te@LZxKDu(^F~oOkL-~6s&pS9d6hZt0(wBem>pv*s zV<6)9+Ul1-`)36{exg#|!Te+CW`wP!5}*I3Eb#jQ_0921{QUiRJAMq}JJ9?|&w2jB zz@~PH&;Q}i@Fgh~&$qeW5a!Q1mnBKAYO8;S^Ya&;GGIN@PqG^R(|+>v_cmxT?4Nc| zrnC{w+dnYo4t)P+*P7Pf3!az#p2Pfg#J2zb{;^!)?@y{0F5C@`{|kNoNO{Za@9&$_U`S=m}U!B17 zBL8b&dHehAx(NFppD6!o(R}?Znm_9|USBkS>UW+O&7b~*=SA};P2&B3*FNevil5GO z{8yKVo{Z2q&Zw@ z|5|PSQ#bPdTkAR=zMs`?^Cwrc@m4*VDWA?JBl}}*yjz6W@+Rs4z3bTGl#q%k_9*_^B`dP`xkAKGW>KBlH9MzBN z4nF<{@2Z&_@i}e%uirm<0bW0R!2p=QzSzzmat&MmXdb_Qd}0&f{lORd{HP@rZ~wr_ zgS#X9BgPo}hdQ6v&-S@(b;PeR?|)D7@lz(LCVW58h5G+`2R?sgQcKiD`iIT?Q^EQx zduKJgze`X1uTq8AUm)GOhx9K~{VqlD{(E1y9kl9AE@=EUDSt@Cc)r7(x$yiSWxGGO{EmNT-u^2uqv853W6R&a zfBuKI?*NaYeEwe{bVLvYM1`d&5JM7r3FYV@Ei~zHm*kQhBzNcCg{}cWA*XXITWvKd31iTOAmsaY_pFU>l7z)3K>(6vhpZ}X@ij(=% zOpXt1)X#rPfA%kFzxE00_}8>aAK!XWDyhE*xc&PK@O4+ew2i8N9G`zTHP-KcBTt*Q zQ21p~{{Yi}jDGwW@cNOp6uzS9znk^z|Ino7`zicD%uwBVH**;nVs1*}SFn^WV?fZn#U~ z+wu9QKs|l=dv+g2#;^Tgzh=;%{}X-tdBFJqIe)Pd;=d2@rY8FMVvcF#{MUA|emGno zzwp!7$oUWdU_Sq}Mc@A3xRge&|Ju3#mL}`lPrti)R!aZth5f&--~NRjtV^z+Z{+-a z_4V8D%R)c5qxkO=@n?-b|6&VjzD405<^9iWpuZ)qC(RUoB#$3~2Kw?p-K)w33jY1cTlM?zE2kS< zD10K%-+d41*MD&LiRAv9P8=_n)35*epY~m*_~$|Y4Y2-yL_dBunLhtr3h#sYbGdnp zB)8UY{~H~?A4TEQx&QK+^zroqm&#Fi>3g;R`&0D&N8B1`5elC#^4GTd{5LM{`#y!w z{$vLINzL{1uNJOD62<=l=-dFcXr`;GJdDQ{)+(M zO&j&)Pq=n#BgKCzk6%&?efe8|y_bCcawW$H4D|n2?9Npb|MC3&sOC%h?SJ~kqMImu zHMbCDE>A0{tKzKzWyr4_8{lq>H*#i{7nY`$cR z&xie|?9Xq2cfRy<0)_X%_%Xobe_vn!4=r6x`oDC({^8HpkAFKSkDo~K&*6B}aecg_ zr2Q8PKSSV8=;IG~XI`Q3XZije-+KN27nAKG#}Bhxs`FQ-cm5mRXMlg=d@(YAIW6+X zP5S&hy5{~#)!)pYAM);n`&PrScwpFaNOnRUte)BZ8){E6?VK7Mc2cn`(@ zq*y;csgJk3pV^zjU*Y;Q8{l^&%w0&~yTbf|+!Er~DSiHz{yIfIzqN~xA53TT@vXj? z-;?71FsvUce{J;r*LU`jSrooFk3Zhc`uR({TGEFUzAfKB7TB);{N&d76(oO|%P&{b z&%d|jJ6cox;|0EBm3Y`1;2w{53Itenvn4Xu0RfFDd+S zK7S@3*Ux_rw;e?0j|aeivp@N)zW%mpAO0Qs@vHQo8_D@^X$T+xyst0+!TvTf{>F&$=UM&v zzlyPTGJc%r?e90R-;zTclkY$LSnR*qsW1PoQcM1z^f!b1PkE=l{;nVBTA0Fj4*DS@K?F~W&`=VHpn8MzqrlY z&-a*q|6SYEU54VnjN6}Sguef5*zD<43O_=uKN#Sj^$y-g;awbWI;(HLPp!**h{ETJ z@mrd{{QrCT>;?+|I?rF_YWn(HI%7Pkzg)h5)N9q}|L5ve)+?s_rC*&y-BXW)fWDL zoPPbQ9!woa@t?{4kGa0S{0V&~9is3pIe))H-~PWYQ-}0_^?3VB6ZPfqw{!WY6#tvz z`PByc^7opOLau)|a2b{^RzJL~{Lj8?V3VoPPbs zbm{UG#os0DXRf~dC)WK=?td!{^B;1n7|DdrhsOGAk^a<3ihtrOs@pWr)93&4;xE@z z_+CG$&###)>(_tW$N4`~_%7dw|9dQ9?qv!;5%Lc+#1H=hegD7j)|m-zghzpH-!v(fPb zIsf}2vmYk^dj0v!*xjF#lWcKe_OUY81W}TmJ&Q*8tyU zyN%?Z2zVdh{Ra5&CdW6U__v4s4*|eS=zMTo{|_4a$@rBC>yNSt>TiI**lp!HivKa5 zKTGI*d(6L0)zW1DFTH{l0{r`R&$yV^Z*a;(lLIG~$<8v=$-*%n7{hsx;h;HYuIF~?)eitl5w zXTT}uu@0vvz7HI#tRAfGt}EL>d<#1Uyet0@1PbZn)U%&so#|PYjQCFQpI}^|GhfX)=qK4~I`9)B(Dk^vxr<^+-s-r3zKdD{S zxsXwmpwdtUf})Dw#yZ*g-tqn5uxRD@c5AjX3(jqi@5etxiOOo&q!Cw*s8cFCiCsM~ zzAo@nFS}UmX<2Y0H?QN^#)-}2``R+>7Eg}L+BPf0;j(!$v%{1XJX>2i`<(%UM{9>2 zRc9Emer-6AKnF87d|T{M*$t_>2fScpCo6yGei?5$&OKAbIM`fg{2Z5 z$EI49lh>uEo$NgLl$`VyHB!cTtnRq_abQAmb~qBfl~w#I&SAGY(rXl!O7~MG>14BJ zrAc)xZhQR}HQ@JfhPx#z&N|kaWlObr;-HtbXc(7fO}D@iiTa9q}>nV`R;qmI}_ExvkVRu^xfYn=FPyv4Txg4w8Q#T|n z;-t6?g-TtSedV^gY*u%CuN3$&+LDrG4MUD|!Z&@a3dMHT44b_jJ6RrZ{0mip&^JM8 zMW0rfsruzwhI*tr?4#q;vm6!=(~)}cJws+&obf3+siUl(AuelrmNnHA-wzlKgZo2( zP{RhpVwElw-*K$RYIlR)I#}JQ0-2fS8lq@`{nwzA3%XSh9d;jluA9dajvS(@c9^0Q zRf&B;6^cqd(3q^H+}$0Pw04#(i#^rahd0Uy;vN%+@dSQ3 zsUCTP9Oi@i@a9v5cSW>pUk|uX=7b7>WNm15b!CAR+=Kx#&6<*v(cL=Qn#H|Xn%&*Q zk!F>dgf@GIHqUf7cspnowI<+v<2zVW0oldj7}Y7qo~n&>dn~D=6yKt>Xp(HVj>(W? zT{+NmphIAuUc#p+~wb zS+bxnZY0T0OPV~S*)S!%s!+B4QU4P?lLZyjkyIstEi}{ie!}OmNEnr*gh7RTnW>o; zFt!}K+mddLPj*11nH{pe10+HnDFhArsNe@BL+Ed}jn#C3T;L$W_ybQ*f^~&1?6Hnj zydWz>TH;EP!yKbCB*BXS^mDSrl9j! zK_ZdjTvfS3a@rh9?q+34lyID?Hw*b}4)ur(hF3b6UjQ`vJ7}?xz>3B61H+C}Ty4Di zk^O|56SLt6=Nr_plH5ECU#E`?CYTVAh75~UzG-iDd2H#nRB#R90*AR!MOh%S9sFny zt0&Wu*3CL@7_%?#YMfS=+vfIw7GY|l8R?ZES%Lm1Lq-8IH*5gC#^JWHfF;MWj?=J# z+H+Jl5b4ltc3C)aC7Dc;!LN+7WM{=gcLrCXq*XLmj~tuDyi!_9yr-Abog_n+6}-_2 z(lc$Y9yP&MBb%ab7(7_UIdVLFEFn)SEEQGrIw=t+WDP zOlH-E6u@VKCj~QgdZ3px*AT?=p3FkK>OsKzEgnd9lH2#QWT;sQ`b`ikteQphkUtUr zC02ahR|)b;_747_xsu$l6h-}^nrs9?BF(6)rWt)4Irg-EE}Ij&D8s_#=|rIxYEOxek5@(z~Hc8 z%83LyqYelI9JP~z>Dsk>Dd(&-Uwm*Bpyuxllqnat>J=I`2;;5D9pntjff!T?orNi> zBa2^<9z(ssxrCx`i|_$VC{+o{pp0X}?njJ7T9BO_Mg?F;c1TQIo_IC4SLZ-nFgu{$ zW<8Y#+tX4YueXfOinl|&?a&UQHyfftF6~xR=q8P{!A_KeCdoidcwBXmhQMrO7|OGA zz^_8!hDjiKNP{NB1Twp?(_-%qSqF>5g*)2Qq{g8jJlX=I4o_TI6o%L-LNI)cb7Vu- zm+kb7gZU8+aHCKN*91#ak_bPLPNl&Z5?n2tx9e!n$!0@J^%6RR$1#H4gFzh|SEVU4 ze?hcJ8V3rk+h^He0KyD5WG0+id!kQG5QvM5@=`%zF`*H46OIB8V zUuXu4*5n}Pt*AV{hdO}e^M@)+^_zA|+6NM;`LyWN94)$pDCuDlSZ??XM^I~O-Uyvp zn1tH~^9pRL1P^+GzsP_9nnVWBf{xac$ljIC<_N+B@r+XLfT_dSkS7kz$Z538>daEp z7gZ5;gR|9cS86cZ1pnXi9^+@G#hqzOb-0`fnW>Pnw2U3npz;03fR@74wdN}n^NpOY zP;RNS6&xPfn8MgYWkg$x+t6%5IGaZa4O#e~`P-qYn=FsWX3G;OLfd~!kb3|;2VbcZ_ zJUHLZCfx;`eJ%*RL0pi#J{*!0H^n^&he><4;Lbira;M=9L)`BN-n2k)C11t=wYo?D zmEov2%H~O6|FRqzl5`(j#%#4G=^q>L?p$+6*gmCo26 z(nqOjs5A0BEo}LUP3Q=NW}hPsIvKK80w0#=vHVux+2;s+p?+hf<{|FF6$JaTXKbAE zZ9_o;ZiF&Lu`Vsjhjwjb`&$|$Puiz!2rGGOu2TAos{0eAcEgoxCsi#=P8 z!Y3_JpAV4o)#n4X@UHTe>r?pI*LlC==j&t(X82{3MI;{ae9pmMpu)nZvjC2X;us?wp?JmlJvre<;E2H%1S*ddJ z^-|lPTT_(%nCrLuiozeVMcR)R{$%XaY=2!8|2&QlR8ik=t%c88-j1~2uEkXTavy#9 zcP#$v0>ysY2k;yQS1bTU(L@q5a&y2 z;d76sb)@hEd#Uo9YODQM3;*F8V=^fGO>RHtuhjjiTKLA_JywFk&*AnX-fypkkC{D^ z?eC4!-xvJ(CTX*}zex+!R?RF7Wn$RloiJn78m6g`dUk zN4(!rOa3BzJETzfPeuRd?|0O~FYN!>a}<6C?5|~iB7SM%M;yOI_8+&fKmL9%Eqvh% z{gWvEr^Wl_dHmDD_ql$SJzo{2|LlpX|C0IpO|b$1NHgOcq*+gg?}$z ztFGexe*N};@%K|ZDZGoz?;onq|Hmuy+4B`q^$+m)VcMt9|9rf} z-mepd-wpjQ0P)j%R^R{swQ%M+3ZEW@uuh7D$ef4XA!k^>uLyVtzG>^)k5A0jmkiwgXs`VH7mlpmz ze<`-VJgWYyME=Cj=h4DfDq(+>!XE+q^FjNG@sk$*Yez%&d|nj)4~75b{#y%Q&QyWD zA1Df6{Dz9~a{sM`|9Q!o7b$#Q?mvY8)xy8qWgx%; ziWMp}HxbF-`!|JOSjkLAyu+r9xM|GMA6{s5nUG*W*UUo`D%1q#2SImq9~81HXZ zxDfZzYp4@ngM;TJ*vzR~iBdW5Q%GDQz=2K%3B zLiY2*QIMa&WBnan8^0d-&%*NW2L1a8JZ}H5ljr19?Z5UBs6TgZ z6$(ER>?a)WzeVF;s`Kl66u$DPNdEqo>U$0aUs0BMKbDPuqU5hsA`NrH;L^)?&jSCdsUtDC|svb?#Y5qSS z`-07%Mb+O2{v%xffzIkYvfwMqE&H=r{uqT1Y>veHr>XC`5I9kOve*1Mh5sAlXVCaR z{(9nF3V(b>B!BNIbsk#q73CxAKVakUDEaroo}%#j`)AVp^W6K{`yrz6=Tai^=4v$l z_M!ac6n@o9k$B&1y8V81kE==HM|~8DH+j_eY>0Y`GT``)&0j^y|LBfLd_V)gy-*7ygpMpF{00U8C)% zW6`JEQTPq-M)LP-@K4$^pd*F+nU>K{2s->JMzEsXEguVE*?_>I$IlN6k0Rr5lP?ke9d#Z~$Sul8inkq0 z@vo2cAJ|3L-@J4<8Gja5jBJ132Q>cU&c*go{I4VXHFcxyH+Fv}oBxQ?zg!}ce?X)D zC#&ypQ}}&+{zmja-!!`a{l4Y-2^79a%}D;H7cG>Ghrz-ihQlZ>HscM8K{hN2w{cq%7Au-Z^eJ{}b*Hn1A7sdZ;q<^1A{g?IXNb()kNrFN(kPS7iT{UZmTv_b0!~6n+xo?|*@o|Ba<)GJiFr`0MXN%b&8VYB!31AvFH; zcTwMyBI1@P7ga6C_Af=XUn1h~n@#(#!}}yM|B?{iREg%l@9%?uQ2gVkMe1MPPup*y z{TsX#K7huL{)Ke@@<>`2(*Hb){I9nUt^eGun@RssbbVz1_kT$DpX31#u=S59{hvYk zx2Z49f6lMlf1~hgQ2#UUq4_VgFJtRxQT)BQ|MjE!7qtES8u<4<+QHU8qxerk^Czaq z==^W+$TbTneCY#`_G5C<`QPCSKmSDGuc7%5^P{x=mOk*!TnhgW-+v|YAJbGCf4Xv+ zB@|vl@yFL%J!eYvTTxzLQ*$zfe+2a(=_8td%BN@ZDST&)A4a$T#5Zb|q44ui{_cN? z)_;!%FBYQkzo7Ah`54{*zv*LLN#TpU650Op=QRHN$78Z7ya&l2C_~%dk{0vW{-G%Q zH6#6*QfU4CHTT1pDExbfzkkmNa{SYI$CGUTWfcDmH2&~@MB{({Ksnzi3Ll5!N8npC z$^X>4hHU>p6n<=Wr2h-V()`bFPpwPgFMJ<~m!HU;Bs=o&Q_ZB-o zrtp8_`fK1nX)%2~gUH|Xq6(3FE_aptAHSh_q9eSC< zFGBvyr-6U;%#URMZ;Sm$0xkdH+%<A1cuW1sZBeQ`NJP*{B0io-|&GEG=9_6M~_qWZ;s->FP+9udG?!h3cm`)PhSR& zpKzngWeV>@N0k5BY58MElx#`yAB)DXW(SS0Ic2Dg z!cW8Yqk;b?aFUFF6_NbrF*N^@KhI(3n?&{hv#9@@$I~m&X6k<{;Oul2pb^zLF7^Qny@_(klZ(ny_zft3 z@_s?LpS#+s>l9vkH8OwjpQQ2ij#gvO??u_~!w4^(qVZjh9(kX_|M7d|_{rBXMG;8U zTa+*FZ%OVyIDq}vKlJ=V+mA+7ruZL3`jg+H`L8NbksLqy(EN@60zLm`+4Uhg|5##W zr2WfxX!%?Iy4gv|UuSwG-dm3zzrQ~JhoKbSiR|C6fuHyLY4(2ZsP2G@er2MS@4^#ZtA^zTfX#B&6ZG9;GV8q|2p?~-FBjo&PpWc!BmsZgA zKV9(#x&Ge@wZ9Zkx8D;JDx9a}ABV=DK8g0f^Rlm#`F~S1{*@n~@s|1*$o&I8H2>q% zz`F{6$IiEivY+Qiqw#Mcnt!!nkL{rFDQNz{r-2{%zYgU5%R46!|H3r?TL~*JQv7S8 z_Va1r`(@v~Md8mQ|Klx0ufOao{^}DHe&~7Rzq`@vADgPpnN8s*qW&ZQO|M@S6mK3u zBaR$DJyI#M{=Q-~{*lWA zNdJEs$sagP&%d9_Fp=|TKcW27w4c`BYyT`J{m&_sf12N++wZ5|+2r`O7V_V|RN8;v z=|7_t)&5BcA9$3G|1XTK`!a0`S64%B*|%)gr;`}1qyEtSiV{bwSwKlvc7zdLK!*(v!)A^Vdz z()QD(Xrlmy&qe)DDo*#`%SC$jqww!0NBTe0E42P6kDgeH!p}zb@BN9kze;JDM z=Og=(F3|CF#J=ie{ad5{D{ZFvx2w4PA&S2j^&f938o%@J1Tz2k;`(o)?f3CV$CKlq zB?vEXrSV$^R3!Hw?#J_=W$5@n$i2QNRsZ?VN5&uj7P|hsB;fLRe96y>qqy5i{ zmK~Z?__mAH^I?PIZwX0(tq`X=TFr?wI7Q2Scq}AD2J@eeU9RvjOH(-*7W%00 zabYfncOtx31D|o!eTBlOq4_hv2EOLD$I19}2>WmT9uJ{6QM!k&dYa;Y6Sbe|IBmZ( zUdkLm;Y**7^q-~^G``4i2RVQ87P3ESBb`4N6z|u--@bK;T>p9j?O!wh}zj7ryf6D0j(rJqSkV%pD=X25dXKl;r+7$jIia-97wEcEW z+)B1N8Xo-;IaK`J-f1e`z4ie|{x;|M^vvKl=C3_V-umG35NicgX(b zk7)eg-j7KCcLU-5hiLn2&}cguKl~_v_jjlFf302q8o7S@5Sl-f+SBoG{U(`QKfH$d zXVLcadiG~ksrJu8{m;bDNfvQOl!tD_JWAoyQTzL<)BUH;%5okGe;4&%an7;eE6Q#) z+Bc){H_-UOw4ZMOCes_&qVSDy|JT4@d*|RW3SS=eAL#(izr;?@T?*d?@fYub6!jM6 zn_1>!6#hXpe_+<&|3jPj#uVO-@)wDp^DFp@a)Yg1M+!d)+m8l**U#NQq3{b3Uc5&~ z@D*k06F-ve_Zq^BbBYB{l#}|_{+#0P9TpjX#5u(RC(4&5{gOf9YoYZkaZa(oiL!jD zYd0wT8WcZGiFEwx>HelDg+Gn@zto-f9|ax%iE~>jQxqPaN>qj~LA=KE^UuFMi`+lu zNA=fwe!j*Vzr<7g8*GW>FL$M%f1Nw{?hp$9_PYrGE$x4Ps4<8f|1QJwKRR4dg=lwC zmVB)!>Hl6v`jb8M{_zGMck4~bKcB}xp?^~{ZT~AP?D&?#%O%zEzrdTnp!r);UMJ_z z`f&d(@PVte{!V`Ft4Z-s=Iajv@6Dm(|ED|lPp0s>sQvuw>G8XN!|O2=eh<>0JcrI- zN-l0$fx@>!_4jtA=U?8Pd#5{vAH|{AJ;;z2yF{cToS4V`%&P_O-Yk6#v1f{e4Ag z`|%B&LB=mB9`%3z9%IpOMY;J{`caDiKZw6{g0`Pi57j$P;eY1&pU|IFn;ySDR;w$i z|4qn$NPp1#XYBu!B=;|$;q#}0zx)l2Up%M@x&QYj!uw0o`X7F0XeFxtCsF%*uhRDa z-s%?ZDg0Sn|8}(ghAwGF&L3XF{BP3yi`99LTz~llwZCZr-T(3qn+j9%x4RUyKQ9ZU zzPj}Oo${4FBmLL4kpEKfTKfkpuk5{t;y)4jFLM`~f7Onq$o*?$`TUEppMZ z`~M0(zP=2FpEV=c{;c^W-xb<^&Tj5Y=D%exMAlzx|KN~HwaNT@A=1Cr{prom7F1 z@v+VCzDD6MT~*gVg7RzZpBsDY6ViV3QU8;w(fptPsbf!ye}$hS>o3)!@%~ZHYZU(Z zTL}LojlaA69WsACS2;5OFg-=%|D63c=|5V263O3NhsK*0zdnePf7G@}{?a%)|17Bd zlE(hK*$3$TPd&Fq%J0+I|2X}-A}1;N|2Y_mH$6u8|MorJA@^Tod>x6`+CTVJ%da<6 z{13hwiT7#npE`LJ8UJRW`kNo8Cq4VF(4JQ9d;k#h`ZF>GVY1`AKDSV)Nr2T8{ zpStvR74rGF^GJW*BJ}+8?5dZ`QT%)LiPXO@kFNjsZ?w8Y;fwW+#QP7>_VdKe@|`KX z2gg5+{Rb~sU-Bu1@APP-{=_*BqTNM#{_T;|DEv-{A97lZB>cbEPmlk+D<4@v;s5$O zvi@584{mS2J&D3kNAXKOPV0ZspB8feU2POUePwBU^_tn_{)e8WBIVawe=pZ`H97wM zy+Ne@&2{MZpKgN<6Z+R$KYu78b_=CHAIg8U*1xM?981psY({vk_3v3Z z3&{PKd1(A;(pY~yw9`lKA4}S+)?CzIYyEm~u_4Q-`uD_mjrHq~3LUFJ;V+>4MQi=8 zbD!Si^WWW(|1$A&6hyxhWvjPhtQ7wZD1Y(u_wWmxC_jyV#N8DCJcQR;|L9!%RdW5;kMLUSAD`EH z`#FmL9@PJ});~s%nMTI%bCXd2?MCOn%lEEXPVvvrj`Y7?4ZL3b3WUY4z@Mu93V)({ zS4n!KXRZ0v`?nhvgYyflF_O&RV=CVNt4bx%lC+t^KsQ2&xa0K{gNAt({)TEB={nb(U4)FeR*&dC@ z`Wvu(=TJ(2KmP?|en*UCeoNg4C+d&!)fTm}QTV}M!r2Fa_q`s87xIhp`j8du{nah- z`=@6PfcJlohWAIWxqrNG5}d!XF%pmEf45j-eM)}mBD_C(3cUaPA9Wlp>M!IL?U!_O z^c;{s>iyYuL4LCr^uH;RKgOSX?Ao_f`Fzq}vd z0|XxXpIQgM%m)84BN4rS+{5a>D4IW(zux7q+EC{o%mI9Wz+?HRnr>F1^tY1ne<_+j zZvSVT0SmN$)cKR0q5T5{9`pC?t=55R|My-8{NiZ-*nVe?$a(_sQTDs&A!xs4(Ri$X z?^7?Xqx|<1l4|b!T!xJL;Q>_si;cGkMTFlp14EdzncpEhrkOu z!VW!`244XAqx#PuKY;$0L;PH)AHO;rzSN(p|9kBGkrf5N|N2&E3SYTD#IM&te>e2w zmu+&*G)n$o%0v8I1NuXFQEy>?ZBG42p1*VVGl*aPOGM$Z{x7ecPv#G!6QKXD1N%k% zF}`<&Et{zJGr0l33FKcNseg>$z4YUEDg3q|0n?Mx5F4;?fixf6n@}n;9mgzl-93x zr0|X3g8CD9tpB6qip!w?sQ7o5$-mQB{z=EHucP>PcoF0;0Dg6we=kw^(SSGaisp~y zpHcLyDU|$cKL`0gFveFN`sR2FU*$L8UjY2AWwpMb@DEl5{S$Z`e`m!w%Tw`p>?`0u zmz9+Q*VLXa{GKR<9iAL8@@vpvl>hUmfdAVQBfi-`tMCRciv3kG5=TXWflPcsQfbv&QF%h7LmqgNA_RL z|FPAN{6V$fSit)VfPW)z>l>8(I}U*TlrJLjWn4+rKco>=u4zY>xGDY5SPl6XfyeS^ zKR^F>O8#X(0sjid{BxWOu2cT+Gmt+(;4%OCGuJ*u@&A4k=&zD7|H*e2#8dUZxEK2G z?vm0R)PA`ATaGXJGSz?P-2wkqt%xCBI{6fve~IdUW41&8m5uRF4rtSs!k0}0`JXHz z-84A=a(d;2J`}#t>!AOqib#IdOf>Ch_`5gWqx9GMAo$PNB2w}Gk@k=6Z}h{DzeVBG z03RUmxc$rbbF%XTqx@f^X~6$!WBzw-`w}Sr^MJpPz+?Vj#CPpN@n7}^$X~CBl#Ajo z_MgA3KXa5CzvqJgm*b=HnE#>0``r}(3ow2&6L@UD&2s)trP}{SBe384MWo6G?RRi{ zY#-2H)cir|wNU>?(ReKX;0m)z`KvPgk&;pTvHWkipL~Uqe-0aeG>+zv@ptpz+)3e& z94REpO^or=*YOpa=6TS60r0QQexn}Xqvl_x+yejC)L8yg z{Q~_c{M19B|GlN6^pD%`v6Y`zrtGh0W6*z#X#TkW|2`pm57qyU0)JntXgqGeBGRSr zDETij{`;ck$N2F*hCD>+{}OBew$c2t{4+LAJwVz2CTM@ToiTpYkkMaJ^|yWs_3s#s z$NJAcQ|J(-|8J)Q|4z|(EPuzq@Fo=hSAoB|b2J|7@5MeHKcw_u6!LF#mm+WmwCeFh z{vk?1XWP(!+4-YUD&YiFbf^j@7Nxtmn+W{YSes8m@Q2zxbq~hxIQxK2q z|71DuO{)GeEdL)`MCxMX|EgOKQSE;K_?rp5sJD=Rh7kcr$^={cl9O*6CFL z`@AjGpTJ}Oi@th>^`9vFy#(jS26XU(&d~!y9|L^U`lGxK>?bw4{#gDGdR}`Nx0H0n&@)nJpKg0Y}`+v5U(%+?6u-}X#Qea*r zUesIkpU(3?AlIMcRsw&(%USyP?zwqOu%_;dmy9w=|8I8yC z2V(nPqxd^vyF!4#OH%6$n>lBb-OJY zR(HJ3-Q8hHYiEHUr&{}1-A;$yZ5=_}>o?A64HB?9;s>~F9;+)(2I0g1%Yo}=aWX6F z%CR0x${6K${O3UeZjZ}m&xn&FOF*Pq-Kj2{)8lZ(cd}Wt(mDjMlU)vvBS?TTXwpb! z#7bVTI*K@{mefpZ{Iiy<9BW;msa|%m*weB?RbT|19;iU@g945CuSui2a-HD!R+r1+ zs>>wEwm9Qca#BZGJwwzA3{%+0W_mo%_`X)xXr`E0PnJ8ry~A#gla>1_f0Y2Ba#B6= z1i6!7pCr4i&MdVWLxwS)&FaehLz3)vrHTuA5|e-;FeXEeb&s>B#t*RAJe^&R9A}c8 zF2{~^JM8gRd#VFWtrN7qJgKl$9F*yFxUDX!k&~%4B`3W_jg)a7t2?fFoWtpfvs<#Q zt>7!=M>S+dqeYG2wU&Xl3A62j*nftjUX~*xJ=>F@7Fu-0{esb_?cZsI+DdKI4!{)~ zCzKi|r#Kv0+=}p*b(JsG|AQ1F4VMw}*s`th9dcY2kIeyXuKob54}HTZP_36L$GURt z3XyEZV4>BWsj|4|c3SN1vn*~mYk!(Twlj=`YBSt+ljJnFM~>xJ+7#e79&5HU%i^)d z_v0UuDFPlGrxWYvDsSqB!zqg=!}vcYR)J3ZrS0EJ|W zC(|8Gp?-*hll?+aP%a`VC|x|7LYNGrnG+Bcl#4J5!mdPVx<~s>ciSBvTl%;J@j(#M zDDRcN)0&lK_1LTsG#vFjj%=d{Q84@;=8iw790E&?HcNYz7(HAB#56! z#1~*X&Yfz>%8KvnNF8NKOM|c>q70WJNJ4c`vEZEJ`&cb$y`0R=xFJ3Te-ZqENIBD%L*JnmVfASgC1yd6Ylb85>4)jM0ZC zJFR|`L=DHpZx@h0>HnC2$^i$}Rx1NhJj0M-!7du{k@Y)B2$gQhXiynMnjAaMlARTw zW>s>%B-zey*unKCK@fMjvaEKNu(J$6gGP!Rn`IphaXTfxLpzp~LS7k}_+`kWd*nc}lO#jJW3{u2_pmr+Nd1R^1{*dQru6jqj^az^r%HfH z+tMsBc#)du_zAFT^;e>Egl_25i0m0!G_-BFU4i;XXbhX;NpZ!(f7azSwF+MSNdV|1E4Ak zOccNXSm&=`^uzrh%jOeu>^9~x5>jkwHXZ5(ZC_3LcE|ro`_kh(Hpu}-1VZu*FqpK7 zyevGC6Zas05+6ffL(;;DCkhidL?rl3~OTSflqF00#-1rvurMRj1J zLhl_OOq{b zd;R!cDI=|^o~~)Y%m%YHF4pH`I&~8lw08g4hKHq$I&2mXwUKfwLN9&C**%uA;j*Z7>W2}6KnA}NdQq<;Wl^G& zp6#-jgk(`}g=C5B?H%qpKCm^If@h%jN}m}wq;4)}LS|}~^3US-M2Z}7b+7cZEg3-G zZn3#o9e64bK{4{;Ug?L$A4^KAErBUtFN6LM^m+VIGQ>!s!>$TOpNqf&0 zljh%lq3>~7?65iqlP*#Rp5ZFlX&*Je3QtS>ICAW1{a{W5X7yNt%YUb??S*C-1(_h_ z_`V*O)sh`HO&FYvhzCZ#5i6_mz5>L2>BXNUjPy^?ha(03o8<0 z_QBK3=~foBf;T$ZvLN#XG2~c97MAI1k_lBnkx*TwgS;7*JcMR>{gt@a9tK2G>rmX| zemN}gu^|(39?Gqd^MG}>j`p;6Y`%d=Rl`WZGVq8L_A_4mL^Ar&jP!c`o@Mm+?Xu-Nxs$b{tu1tC)sMkeaK46(2kHpGGP2>+STPuQKp zk}jEsq4lva5MQGWyJJA6QGv4s}E*%Gcuk>+zg9Udb!|w>oQ~y0X2Ysr6z-3L(g3LX>o6VjU z2UE7;SKwT&u5=5`7EG7~-Z}g-6bTR==2}8@)T?ly5uMR6o9=?S-)x7+n(T6nw!vI0 zU|QBwCMIITzZN@A;?zkCwjuhQ0kSr1 zz=8oyXAEqQ=;UytZ3!5KA2Csl@b27#-+eIaaZb26M?)dxj^Iab#04 zG6m268^KogEUppC?GehFd9e;Kh_q$7rIx~Pi(MCCeL7A3jqnTnGQxEh>!EJniKY{l zAM-6ff)2loq{CymE**!u(kSTg%L38~^TPj$PM911Pjs4wJl21r)9l{pB*VA~M&G)6 zW`PraBlOHKBlWCiErk7qO?;_NCOGrOFQe($QVDsQgn|MC!f%8;{4$J=W}3^tDF1Oa z_Wsm`WzqX5o|4pki{2^e%9cG}1NHs4M)dIa+dALKbPM3?ETSS-J#3?ihfV7pFo^??twhu{^&bPl|4Y|e*~v* zuFvTYy+8V&1RiAXUyjm`JW#ctfTXss*>ZpMdsUmm-Y*|T-#SUvzrPT-pOpKfU-prv zev1CjeBZhG!I4Tu0?*wa{pq_CYEt_5@&4sAsqzQh_eXzkjPp80KZ`#%Al{o8;P2nY z{>A8e*H?dSEEE$H)xR?5sz~u(Mf14(lmEM2udw&uMbYk3+S75fApUj zRF}O!KT7`0RJDJZGq`=;C;d;FZSP9SKLzv?C<5T>sK~^}W8nW%ozF;Vb>;Q1rKn_{GnS@-4qV z`Y)Bw`iY8)&)ijlaHms{VB*E>yx`(h+~XPmE;x$;JA)4$sF>_K)!q#3U&V>8F18xX%^) z{4-KN%QWPeRgcGSTfCi3>|I{pTV5&*$;c&(8%8@c54Lh#a(;dS@9g%glR;X&LSG>qP$NO_qOx{5U>hJXb@oXc_#Ze&{)Fe?w;f z`6xbaXs>p393PG7`;dQF`|X*&jJ_ZFhk%BEa3cBe<#Xu9ne)qwGyNnZ|CaxSDu}n0 z+J6IM)c%F>h@4cmn0lu;FZ;|m+lJXsBDbFa_s`pye=Z*FpN;76LHhZ~=9l+>o}iotvl6a z^v#_9!<_yx=)VD?eU0ej?{EKnDv{Zz3EAgX=)ZD_=>CiGSpV(NjZ1&F@G$%Fq5gGR zqyHMwKY;SbH$MqfWAgiu{9l0mD1Ur>A;w=AkHnRJK=wayMw3lU{$ynTWz*CjV*fJ% z6GYbm-fvHfemtk&A=bW5-o8>HHNX0v*+1wXkKZRFdie4WB>%okhf|sSP9%RF4f&1e zPeBYP?s)42)4w0--_PT(IM+?g4`VzcCrP4xd0DDkt5r-tVtkP-srtFf?Z-4#J@?Yw zTJ68yD1zt)qVJ2X&(2qfqF=NFZ{NG>xrTwZ1*4DoKX|i$Z>FDoq@SZ2`oVZ4y~NY9 z;O&f_E9)}<=|%oC5$1<|U_aP@8q$v#y+~4#Cx5Q0$bT&|KR0pvktVC-7c=*thV+Yb z(RrEUuFcMeDVKj$rElW)KbMbBrHOq0nU9YQ=_C0wu5GEq>^~pLe~tSG6QBPH@cAD@ z`lx^H`R0kaO#c$fPyXffaeie)AAeu;RF7_y{hVd~pYYEZFX2C7|NQ>Jj+fZ^YEk2N z6JKAz^CyP%k^YVB$2?87pTMgH>t7J^ls{2+zB*+vvmYPNKfT;PY~7^_BF;tinN<2y zdA+p?{C$b$=M?{T4fWrjdH#&^Ta3qi%;-k$<^i>t{`3Bd>|cj9#z%a14N(bQ;_u&j zyWtpSKVBsN{JAOy&ktaHh%)~@zv1WQ=-#$(nf`OR|JlUzllhSU$R#0uq5P+y^mlOj zg&NN8q_i)mUy;+l3HmoP`e=UJh`z}Gb9q00aYn!28GVr-djD0&cQ-E-Q6w-`QRhE> zFRAupMBmKi7De$tJF@dHquRIV=jt!SxjAM&{xYJEzuz-?>@=!EW z@qw3BE8RK4{AVJ{AD$5L5zP-9(Ko4T4RV=co&Ow@Kk?T{`!Dkw{|S;GN)b$!;%w1`!|fo9D1S~%ctcoVfK@U?5CTC{TR_-iRgE^^nH#Jf6@GE3a9VA!uu~@ zzc8ZjMfUmho<44-A1Bh!6B_o3@km^$@&l1~uC{BNrt~j9|0c%2ahyKRPv%F$qpzAr z-dZ(ekNd9CV-*Nj&2p>sJl4>CNYYvTV!{j$3`I9u{Ux*2!YZqFdY4OJVuNeJg z6dwns@%$Y5pO+9ld|3wF*uD3UHmrTkNI%Oo;v>c*auWW&NXfZAivBoZpKa9nAK9z= z2aLz`lezvy`OVNgW&Gkls`^jQ9W{Q%)r9rgQn0=-n$K^{Eg1a(XDG_klfGi-w*}*4 z7N0-K6jRQmFZ_eTFT=hOYnsm6?cK9~O*kM9*AKAJ&(9N&%f;ugI`TZh4;p^i@^5gH9zW+*X z%6=Z$0R9>1zIcAah`yMY6l~HGPpo75@gx82 zOjG+W_RmWNP^;wYQsV3W)B1eP^m7gM-)A)ZvxM-1jwo9q|8~Brr1&>K@^6DQ{M)O7 zkVeUuXM^7!FSWf6lRpp1Uk2J&E*;&z7#}3WKMY1UhA-SXm$k1GweKE{_BEov4biU{ zyJ!n*-#pa5r#OAwzDD##+A7$@q;^SD>>tsu@j3qm$`3JK&=IAVe-LHE;Tba(|0D84 zzJ50l`Y-##^GjuwyE^~z{8Rj5ev4sF#Xq3+kwtv{PF}70e_ton{}|CXA^Wse9M+f7 z7wdN-f4I!`Z+=-FU(3A2Qt_?5~1PhdNr|D0Sf{p0rC{&=dgzY))m_2ln`^`24l zXY&j9M*pT-ed+m~H~z=u5AgW@2aoTG(0|R~-*9|4(vO%Q4)8p2#ktdo;rdDB4)lGXA1|Mu z6zj7_^u37wjUPKUr|f?)m*3Cni}?p5`uO|zCpGS@_-C|#yAI1wi1>x^NLG@>t~ z_%h|0u_;VH`6#~3Nu%|XhvdVTaftpSrpz6T{xwA3r$K)UCWx+Y-h4#4Bg#T=zVQ;+ zXKydhf9ml4fzP}HxQz)(ephUUmq6Qa?OWu6r-mzWK;MH`ega zA(eYo_zXB-#8KaTkV!WUu z%AMi^FL&kIhA{fq5dBQq7z5C?7`m z-@ANgHk03nHGRKh)RoKSuP$xL2?#QfS;Urk}D% zKV3BZj}iSnf-o!?lSr&MBl72zl8CT)FkQh z6OniR?KeVZ`p-r4hm-m9DPA9+-?OXv$pqAYBB|Xweg8F{|Eww){f`jCo`27;$@G(m z^fN<4{}_+RNqGD^*LC9v^FMg}JL@+UiQ~IJieTi8y^)ua=QF#qf60vGU!);F#v^jl zGIXQr!$Uq|@&}Or3_yPFgZ_*2^YRFfFT0}~vxbdQ#;0CnKSMSAzY+aJo|o6*<-QZm zdVu`puJQbKF`pmvfqnukeu?>?T-APz=;QC}uO0Ljv!Aj^|2B|cE)(tFFdnHx67E@) z17iKDAb)*)zWpWe&t{-6cU9L%e05a$d9^Xw;I*JD%7NdlY)#S6=l{Qj{u(j=5W~lh{Q1^VV}24Ec+Gc2j{m%{=bR)H}Tw^uSdb?3%a6oy?tUcCBM0XI)L>a zQR$kK3r0VY%P)%3bw23J{DbfJ$o11}u>Kxk_L;@wW8Z?&7jg^wpT~W~o*!9={lf^J zpGf&C-9Q29*WrXk`QqIXEyDF*gFnAB74#!N1m{bC&*zu=7fk+4PT$PS&#u0AJe+<9 zKEJn(+dqE(*U0|G_)L_;O4WIg(f9K4Z)q-nF62LEkY9R$umAGre~sv4{m-m9P?;aV z`nSUPi2a$a^Yx421=Ej^Ta*K~?j1$Rzl7%xz8KZN`S|n2M)KqJ|E(p@DEX~)EYd!= zvHh{2AMXm@e@7Nfe%yaIEZ#afynRLgUBUg2_b0x8tbp{f{uexd^NAmkv|6=VM zV^dUO&Muhzg1#sNs~V+%{Po5D6Cr;EKL2UnsuXvm(gENAB9Q{mqZf&H^T{Cu<# zeOW<;&imU@wGfMs!T2laOIFpt;pd}`=qGaeq8-Nfo3V`1PvrV}oa_HA>%X8Mzl%TL z#OJq-=nK6FJ3X)?MP~G!X#R6F%g@V2=l@3Zh1^0FZOBK{s+zo?Hge}&q2Iv+pc`FSJx zg>|G%x3*RgPuji##;{a9Csh2jdYr=?J>9v~|VyjJ_YyKdnI@;}JROD7uk5VU3H? z4z8POMV3%2u`&tuQ; zER?TA=Kp1ZKKsM|&4@n!zU<_6GnxLqNdK$2|HS?c<5ej_|BnrQR6af5ZlSV&CKt{B zkLKfF?0<~tXI777u>5lRJIw#cXn)Q=o`2%~1A~QQi6j%e^37B~F5_j%yhe*y`+9l% z28z#9THXi#K`tNNzDD%%^I?1Y6#bO>=RBmJ7c}&vuKoqZjrx$s?}*Y|`28(R{#slAToP zwLL4Ce#)Zx?X?>EF`_R$9LeB|k2Wap$8e(gpFH9J(eq7GiAX%Y+JSCdm_7Yd)_;9m zKVp1(9PHBv`jJklen;m1rxL>BOH6DoCicfd`v!>iHKIQcRp|C-`);%LO-Akefkyip(SIMc&!;DL{lolQE?OT9 zaQ}e)8^$AXrJLwR*+zdaRQxBR-vacb{Gt31;}JRO7P^t!W2%GE_aXXSH0WbIA}9IL zjdL@1E@1YPjQszzoIZ{(l@T6a;_uhw&zr>L7vo=HpYLnL7mUaBW$u5({p`0Ay~_9k z?JxR*+YeqJH=^%vty0eAWusb?^O^nox%~%}j_>3pYCry42&Pe9 zLhGxUEoLhFi+o7`e&K&m{(nb5Au1SQHG-dq}>*qM=$H(MH?-w$pkK|9RVfmVp|7BR; z4*-3ipYM-)zJTqE^#5D4NfxGm@%*^xzgM~c#N+pSm49T(QXWeFyPQ7uKZf*?{$E{{ zr|kd1`cDJ@CO-m|MgG}{{vp*YBvF1IAM-Ht4`Ti~ljr}{?x+t!$zxL$i2{RE{Xfd_ zT176GUzG8?*Q)zJx&6o8Ri96Z`4;RS4x zE71hj2jx~3XZm+ui5&lSv8oM)$B$J|{SkR-Eb?!e7tSl|Yi2b5TFLc;$B$JF=;QIh zmQ0!LA6S@-?0>gLe31?42T+AZ$8B84=qDoj8@T+~e?E@z_!58L+Fj}gW(Gs{`HkOD@_*F6QYX57jp#px^ta^W4OS+<6Uo0r!~QWIi7TP)b&~hR`1*`~ zGNOMI^dnb{jxQLG>6hgT} z^j}V2tgn5-_2c97&N6>LxebS@}YSDNupV?2${cs+lao9Ta@3lT|S%1FC+P<$b}^z$RCio z`~{@%fk9j!XAC+D(`a=JrynZWZdpLcu{`i!}`n!?*W-h;ZK%7EDFx|6kUBK|gqZ!oAY}@zlwN zjD9krAAs?lkI_G__AlS~g0-)ZTa;^yw_eKVn-TqMKtI6fpHS%s3P@k*Uz8U&6d%gy zi~c3-zs`A86Y?oF|2Omf6-N3Iba^vK>oUhG`sFGtO4-kZ_S@Cm;$#3U062`#U-9>=7}1wGT~W+kyP^uvk9xkZ63^dEVt>Wbg4qwI|3~#Jttk3cLI3ij z;Gch1XQ~4Qq>ugck!DHlDF1wu$49@=Ki|J$q#xXWU#h<37bZW>Pb$OsUHL=r=QpB{ zhA)zQtbbQ!e2VrbJPh{3{_yzJh(6X&>ZEdaDg9LA^u6f$N+bGMKeKN(*+A(hj?>5E z7bE)k``4%b-HGMriAX;I9v|`i55}un4E>MgU;NhlCn)((=BpSJn!h!okM~zpX}mOt zwJ+XZ(Mb3o^!^qj`oiys8cn*9*^IR>o}Yh))5r7YM)a}$yzQU%Gm}3L#jld*VgCm7 zU-NRle~<64Frx283qZ9eXFtg3UqkaVWg&jCKWzX0QljQ`=|}Y6&;E1_(~pFnfBZ^} zFS!0?{(huHH2%a~(Dc0Y@T{YX|H13y%|-v^`J32BUlkKX*MSm|H!`a~If>b)AI%S3 z2K)Ch|B3S3mIm^-Lf>x>oI1$*S3Vm5{=n@Y_b-f(lva|iar&2dS!c~FN`B?%_A`*r zk6i=$0gxZZ$7+}$y55DZo#oqCVfG_kjhtWVs4@RwMBjt-^FgthUnu?)y?=fvr;q!W z5&fG;{to9hPF4H^YTtNH-&|aMK1F^_jlV|pC2u5yHkbch#oAXw^2@w`;r7M&NNR8; z^ux<-2W$TW_E}EM&pY}2xtaSP{QeL*iXggy=wG?sBZH#v7VZ0!y8pq)pMNo=FFh2& z(Dj_x%-S~}?LX-R{!Oj|>w|~*`~yEq$25Nozys>JB$q5gFxPtD)Vu@TgB=y#MC&_d~7*{riBv zG*$Kg@`8fN&(kvLCU580mfl*!=m$7`Gxra7nSWsNi~KG3-slT8?X9%&4WJ+Oe%d&m zznSOp_*FpqSpU^8H?KnJzck%aK@8-1aD<;Ot(X#EA_CHyD) z7r)=s+)X)OO!QwdK7Ab4N6bJU=RZdD{fOV)0e7o0|AzM`>=6AIW?om{qnDLJ*dz}{=bD- zpF;Vk5&cgP!&5~Lj%E6BqWJi^hW?G{&qwxSncA&Bvwt6oFBds|93PG7FGKWyIc4g| z=m!w}I~w$Bp!(y>kto5fb-R*cpAyplSdH~5)mvbyq3g9s{xe_K|BT81|7bf8_$Z1l zfN!V?MFIkXf-XoeN$4Q$C?efRM+7b;2MMH^geJv9Kv7UbQ9w`*6a@t7(iDy=qG%A1 zDxQFVf)JEm^xM68?~;A{mfbx+^ZUVE{qMUsZ{EClGdmMS)~A(xMmSiipC@xr>?54N z!#DT6^UxrbA5Hi*4fvJti$-O%HiDlY^IE8CpIKynw!{`C|EAc#FGTcTGW1`Sjkxf7 zHKL!&J6kkT`EJrb-oo)6j8E}=Iy3$$a{Y0A?u=FKUnce28uUZwAIo=UtuXOHWkJ}EyHsy7}=@2!^V`IW_`ED=A4 zL;wD$(tpY2^!;yD3M9|z`=h_AS4Qo>GD-V&!uW{xU-bI~FC8NKuQ1}<0jhr7ME|J< z`Zwd__!`T@eV$g&XAIo`6%P5m^P`0z^n7FppQzY@=k4K9V<_kJIXc>}f5>mN1AaA# zAL#s@89xfRSZ>+#q?& uD=}68QPvQ2KYJe!Yt!Ki^x#S7v+?-b(*;E!kexKOO%T z4FLmNEb^0{{?_=YcT`x@JM-21vvm25t2llq^MhvcQ+~NCueRp+;fj9LKRW+n#z(zl zS^lT*kE!~XiT*1q{?ntjFLHmVU4CO%J^%b{6yZlH<2#?qC-Wm_e5e0c=lu6=`6gki ze(3&Vf57=oa$S+1_d)*LjE{P$2A61a%zwUWaRB8sC=J`yVqt+GjlQe=|O{|7uk$4dCp57Vy2$|Kk35W_+7F4J&G;qA1rLs$|GZkibbqZ8m4ttz@q-zk#$VNXRZUXs z*FpNnX~3uPp&4Ha*ZzQqAM?nn{<8_c55x~t|MdG>nj~Sn#n*qy|9FZ&L|iEkiBEiC zsb^IAeMJ5b4CJp#f#i8U=vMLN^@ongs{MqM{P}u=_{WS-$EQ7B@3lsiKby$^t%3Zt zP%wislNj*2-J_mX`EHVb8-n9svObf>-}Exspq~p+ewufW+P@cfg8%nIeA`W_Umw%I zL{cDqj`Bn4x)$ZXzaSO(*}$);#6R-mivKw&;wu^E-?9IrSbR?3Z~0l@OR9a+{cS!| z+Lu$|Q~RXfM=q8QVn3IYmwc_-kB8XL83X$<mM-x=bG_l;A8RG(B40){X5n#%KwJJ{w-$w za0Em7=gz%jRQ=HT{b~@O(EPa>-vL}Kqw8Mrub=UNe%uh>Hdf+)`3c28koez>F9RQo zBWsp#R^?ws>Niu#UpZAiSzlzvN4c>aF-t0>)-T#W%D)8iV|0DHRX)l;#nH{5UqU|C zZ>m=~D&H%RpNIJctNg}rf#O*oc2wo}f_^%K{{`=Qx`#KGL8vmQ|>HCvfmnoWoq8YW+I1wejbo zO2R&A{BOpm{paiJ-}RrLNc;DVz^C!Q8NV*k&xPpogH`=!ll<5frG8~~Gi@?|M88jP zIU5&&q0UNd(O7L?IKGhcz2Wb;z61HC)^Pt6>|c%Ze>yI{KpI%ff@}Av{w<5lUyLxw zf12`10~@@&lzM-(ZhSNu_|*PQ`6RxYUHys8s{SPsUnMK{>16b8$|v&2zwuc$PX1^m zKJh4gYX4^ZMpzF}E?Ka@mMVWLk^dg}2Wmg``vfPUU&hxvJo(iel~2zP3R@1JAofYW zj~pyF68$$^5ph(+pPs^E{>};WcV_%iz>kNr?6kd0RQ*WMzyApO_d4pK|Ebom5B$#z$j^6D$43`gt>cA*@&^54_#PpMOgw=bJnU{V(mm%=pwkcV><5$=PQV@ZDtnxf!3@=Z9s& z`*H27xx)7-`ls=m8K1s?;N8pq^EIe{=mYjo;~)BcqHc+<|6RK}Jw}ZmJY;_44)$MU zeUur$8M)w&BG=MX{b!N*Exa<{|C;fs{fw9t_N_lYB=%Dc`giFaF@BflTl4?7$OO!5 zH^1$s)~}cN=Q-g2ss9;B;t!$@Wxa~_l|#+1sOuZ2uOj@9fluv+>Q_sXq$#j|dlZx} zcdy~!A5}Ua#*e-{VtjO3-QPp8Pq!D^FPz`eoC3-7jZi_Wpu93~(hAl8gah9R@xxt( zFIQCV|9V~M-v{TDTIJ(qm%QA6nyMce_~`$~{*_;HDtu>|c+o$?`bjgsk$$2W{dg3< z@4C>B2kgg;k9mKT|7K!-fB)zt@n=he_!G7b!msPfY{>gxfbx~aul=Ly-vRPFAbwt_ z#?OlU)c?2C5w$P8MC>#F{j*|xLFVszf&4W8V8*|2S9`q`54|x^ZNJfEe3S|O3-xdG z`&ydv4BH=+zgCL+LDdhAf2Y9u-YVdKX#U@!18QHO?=M*WQ#Vz9nm>#K|Li6E^U&{W z>B=*3aCjev?@ZDqzx)v2%6Ucm9iYS~>Ysb1uzwl$$9DK%eZYUA@E(-C61_K7KIS)M z@DE8?zvTWzQ@$+ttKdd~KcD+U6F>X%3;9o-5C-gyf%Q4C|CK49*k_rDt&9Bq3(1e| zK>tkocQZbHzu@10RN?Bkqtd_2PwMkm^!pP1L;Hl+PaSURKYtVL6aCvPoPQ+wLsLHZ z1-$I-xa5io|1C=x&P#`ulgpWccB$#eSt&~-=uRONRP`Qw03{SW;qM`y%mGYYHUKXAt}E*t*vDNl@Fbli2?v<$N5U%KusTHy_-eMVb#{0%cU-k$BK&{d)iYKXm>jbg)pg90B>U zjza%d`FNeCos0YTXFxu#zkLzn2k&;l^}+r;W_QYWB>SpLH^2&Uxr-pY*?N+wST1ZYpD>w(fM~Xz7zOZp8BQR$BO*LQ^9`T zh5X4RHNR9zpI@@d?*rGF@YK2SD&GzKY{>siRqWrX@=5;3j9&z}SiE;H?W}75^#1WV z;NPf!HsjOxSH94HH)lU%LI1S>rQb(6u|&Ja=fCY3px)o7v!6@YzmWLKj9&@CP~JbV zsfel{x_+`5j4$Z;$c&G9J-p2Kn|}1qA4QS)tsC&^{Dm2RH}T&)o7c&w>R%@OJD?w` zfBJot6H9vkQRicI{rA5_k^IIQgZQT%f(%M$UhNxAVonANqaDpHKJ=4z793ADD$zus%(O^Y6^$Ujlp&l*zZhRmT^_Gr@nhhV^4#D*Ev$_3Nt*`9oMgX2wUo z;LrFp#;dNs(#^e@ZQ{-v_Mf3eDshwJ=YwAX%> zzY6%*zL+Z?<&QZ1tbzW8=0DB&^!>x%ANKFxn@!@wDF*!u{XW(s zmNoDJl<7xCO;hbtCjKqn!2g@^dk}twXV3cA$A%OCFy6rboAG7he`=Ll@891hi}?T2 zihuL}k@XMs`$SyHP5PG|gC?lwXH9ny{m(-ELw*MDuZ*TZ@|^PL)RtCp{7N7{wI4G+ zeZO(PQvUl#yhK0Sz&@$}r{5>yOKy@N9TwX0rfNS?V$kHF8S@B$7;jtE_tzJPgQ<5(SKdA9~$5G!Y>+>)k3vz_%hE{Q1$Nx|B2(5#)^JCs{cF# z<7=27>8<^`?wJ^E=Da+#McHt_{Sf^}gZ`bfVEzU67wVJqRrZksUd6K6qAF_sM7RES zs=@ks^7HlAApT)o-0@y&d`0u0Hy}Qd?!fpO)}NU2$p=c7QuMFRKa%w)U0|X^eprmJ zJ+S_Sd|fAhIC-U7`!QLn{+(ofX`9*5zDRsx#t*E|f$K~ywWE_NKd#R~`#IMW;;Rsm z-*d)`_{xm$CGBtM+_WAl-%I+J!c)Zu-Lt?xE%Ifep9Vv>obbzkRhwU04*s8xug&DA z?|;_e*o&(D(EArcl7%32{)K*@h%0%?3$@1dDX6yJEYg0*cU0z2nf7bOcLRSEls&so zYoWF;AMkHLe05B5RB{!4d}YR$fs4iBDG^>y|L4FFy2<>A8Q+0mC{G<2pq@XgoB#R? z__Y5uTnu)$cCFew>PaX#Y#UPsG*bm)bQg^sd@|X?|%<714g__}z@}Bo{3I z#wc-q3Ta<^fltTpW_s}4p^V?g3`bHnD%AHZ>yMG?!Q$v??6h11SeG^`fs=7jfeg556RzN1^KD{oAI+i?|Y$aSZM!QRsZ3je>doV zsG@(ls@}i#rvj7bt4M-i+{CWERsB0j{4)yUH?sfXa?<}1yhQn1w)DNl@h=;!|2N}@ zLxL_8%E3p&OQ`yhK|dbQ&#Q|3PDVd5RABPF9jV_{^Dhrm>vt8Y-_TCtgS39l`0e3( zShjvB)W5zF^OKq2AEv|nuh%K|e|9z${s)#N5vg;YA{SqYobr2nML*M#kMYkJ2Kf^+ zekOpYK-sBkyv5D&Vx447wr4@?*Vd~dR ze)@igsB$5ye{d52a1zJYWc*IQk9x+kAwGa|@0Xu_=#OuS{aiEXAI zLisV>^Gfpb%K2Hpi2P^tCNVCz%P;lxue~|`<*iD7vR_X86V*F7zP$d{S&rZCkkWT; zEE0&XJ_5gKCO_&O%gMjLr><|*>HqtY_z7@W6~#WI5|&i)MDO_RS+@(R@wtva2qnjXE6v%?{X+2)=iz7-!q%pExmC-Csy2f3+kn-}Ak=kJ&DN z*8SVxar~VVw0y@FA;0@wYLQp@-D z7Jk|;KfOd=H9w=%{~A)iK5uaK8@(rcHpiDkwemZf2dAHI`C{^O{BKHW`O@X!_<74- z+|2Rgc52&~d?+~k?AdGn2OPgW;d{FX|6sR%t=gyWxm3U1+vQtrUtV8u?aTZ7jP0C$ zLeFXS@9Zk#6T9+9WVv7C_*Dqs1M5re@>@^+Vt7lW`Eeg#yYf4iHema&-K2hzZ&&|+O?+%UCw~*7ALQHB&+X&Q|K|7$D1Vvo z{~lN;XjT73%Kbf)<2P+i>NiB3gJf4fhh3%E{&yUa-@7xo__O2tWm)_GgT!y1^P+!| zSBUvMtNOXyzhfk)pLREh|0yKK@pko7uh8N@IsPNBX!Y-CAmRtR_FtlP2{t}=5&4~K z#W>8a{3YD!{W$sC*V5_-?}N81|G}O!)clyvKkOj=3-Ub`gdJI}-$@U5P}c|Q_(wx| z`SChd`5zsN8qD$MOwjV(kcYFY|F0Ie zEyA`hC*k9L#&-3yYyS*3ev2rbS8~Rx$!bv#a>?M@?-Sd8euvY~&%{3QoIShphopzA z=O5|n_a5cLKC*WCl}EkCwy*ZzY5kA1Lc}MY3PMj-?Z+zL8zjF{h3>5U{Yd{JJrtaO z`&0gv&7aJt@p--A#@DCsOl8}zi;Ukrj|OL-pBA6x;Oyt<5^eoD8VA?EEcmg|TO2={ zNCff5B54zRv$7koX+=cKy$x%|qDuGi#`}e+=;9JT0sKr}4=*`f&13 zq3!F>;M!M*MuXBh{zmE_c0m5t=J>Ql%`@uyWS#ye68+;k1-tqmS@xwrIR5*DkLwid z^2@dVR$YIqlRs7If5o4uXXM+BA9|cDwvOYUA@+~!AneNjc>6`WIsO$GAB9Me4n8c_ ziMtQm%MaJ=+;;~Gy`cQ= zJHhcwcFO-W$A7tnupi`mn~As|<3y|e;mP;C#X0_<-hz)_2>DoA<+pjbAS?fYC$)UX zBIv(t`nTUNyf=@N-%&`bAGw1#hum)c7O8wqU7xSBpB80!zU}r^V&x2u-=UM1?>#BT z?RNQnt}SEZljY}${X1aXXwyIMI^U{1Cx5$+TKOHVg5#%^YWoPspLdhUKPkBQVbT$) zA;;fL`OP5ix2d1Ui?3GqXVBSCfstDMpx?yOYWu2r`isry5)U*R^0d ze(p&1{xThZYi(XXcJ<$G%lN|M;E~ z>rkxnThvref@Sp6x02}JQ9mfRUH*W%zejWY#>9Vmn+3N%pK}k_*Z#{bEyl)I!zsVN$Zy-_C)WOr^=}Qy_`+Q(xb;g8IG6TK)ST68)EFzrFbITrt-~j^7CE6XQe2AfX=_^PmO|0R1MGhga8`#_^Ak_|SJ4 z?8at%mABYgb$@T2|0x}z^$*@hq21c#?;ZaoyMC`0;Y*JN$KRScnVp{+Qb;SmJ4k-P zZgtf2Np(6Y~9&pK$td=8R7TKPkBOTdLo$VI048j{W%gxNgtx`0;A#18n}SXO92z^W~R< zlmEhwt?zR3XT$s;>L2;;YT!qeI^q7%FJRd z{2`H(-%aWl`8ZEym7jj6_MXJF*yAfUr{`bE3Pl~Y_#Y9>pN?( z^Y2q2e;%k`Sig$v+^y=zE+5w^Tjh6{enQQ(k9|_h8`d?)JL%YYaP`jCtV?!Yg*-PSyZRE!jpf)uAF=DxR+9KF;6FQyILH96;~$!JhaJDnp!{({ zKX%9OvnFSs?fs*`2~K`5$dBy{^<$S`rJaMFtJKaUariF~{5>*A0<+5BV| zk{>|6{4DrUi}L?fdNI4cv`{x~`$9hYAp^Y5|IEAiK^3lkE9UfHeiZVtw90RnI;a=N z?~@aMYWQ~jL*7eK?D%CHjsM>hdY7-lJgUJDK)b~9(+xjGaq`b3?HBdp_`n{2;LUzd zar_Df^=sF^4Lx6WE5~1BAiv%IePh*S-*NoE4BD4e(Vl)Datvej|5zO9zo33S6JVai zV*M7Hl!0Ts@nJt5gX-1!w@l~rr8)Um8Srr(oK^n$T_3RPbM_kWah;k~ z{`&0W?E1Qe2K}!y)L#Cx*od+Qp zmpJ*8p?{%#yY@dKwZZ_7pAG(#^6kb~EA|&+*Vi?L{#VDhY5%`f|9uH3e-8t`UHk7e z|7t6azly|f*suHAiT%{9*6)w+Z(!H=CXx6A`F7{;-f0lR+ULEq+WBkb+wFhj*2E3w z^z*HOe(d(Yg*(Qw_pco#>vK?k_iB6jt4ZY^R`*xYF?m+Q6E#)sZT z5O>xjcJ2T6npRyo`8OtO{e%1C;P_ANpTYWn z_esJZFV;U`KWWu|w$}UkDkuLN3$=Xj>fq#`n|~;MkLL%jW1t|+yJ6XGS>ixW{uLh(exKmh z$5zi@gq?p$SjY42+E4jaZQ1zhuSd1@>je3+G*FK&zj5sPzSlVYJpa6w@3{~Ci_Q7F z52k$l7RO)pBH>?zafMC()vyli`iCVKwfgt`E#$YW|6^OlftrRIw-jvXUM8ar{mYp9lJ1;LA{2m48gda?f)7 zf@6e!L@g`p=aCyB{HRsF^YPEv`L71V|H!k&xCKkA{LX2gPUhtALHOQv(7xWYmmfZM z@KbjGho_He?O&cNQ-dz%ZI?4vOe@MyEQbkVwsz4+wJ@rgq? z`Kzta^5uRQ&2K+Rj&r^#&!_L3IP4efC&w|UZws-lGIQch_`7dv85ntK0&*n4htLOjf z<_Bj`|L}$IpLY3a8GD;^{Qk6kPm}bj{nOf!N>OHE-d7?d;iqhWrgo^{2!KS`JQmm|GL-On_sxIwmvI=f5>kK ziPKW~uymG|4=;`5@X3zX;hEf#6* z$ML=3+r2-c;1gTf{PPtrncswQuif>f_g@;%u5Y|U)~DgR9J}j(#-uq{ar#O8fS2EH z|F!aP71saf+0OIr`iH@lI=sipKZN)P)Q=QtFF#hZ{C;--pPxwof_z^sd+}j%qkZiC zK?R|I$NXV{Z*%{UkPk~<=JfM7xxWMX&g1s(Kk}V&H0Jm(k^TkwcGu6$X;zob&;Kya zz8B4_KY;r2`Rt9qK0b18Eytf?VE=aS z-&t9uMFPjaX<+}}z4pdmsgEBx&+!kD_5Y}!z&@Y`6@dK~mi4dyd4=O=80cSWW6wYA zn)DNEpN)Uz?bB|4?9)wcZ*uaFH}cOm^J5qP_=~mA+0cG5en9=p9x=~spnjeG7q9%) zBu@TJke~ALI#&7P`#s6-Z{RCT`gh#l`xSfluk9|;j%{C^N&N=awb&d#W`%ZA&wtd# z|J8{9LB3u6OsP|p-+!R6&^-1p$j8#E{ufT2&aR&+PV#$h(7)aFr5{fiP@U6HILXf= z-|qcK2MZQw_eZT}z_+{ps!8L0!#Me!#C}kIyYW@adC$Gg@hg$~MZVqm>Vwzju<_dg z(!V3$?)uxdU%v0<28wG z4(>mqe7pYt#~twz9KW!G_%}HB#qR#7Z#%wb=iir+`A1xrZ+CoA=f0EOU!^h`KO*0* z{kx7;l{o$ECH*_{?b`o=Mfu8c{2^q12lO0ercX$Rk><-=5ixmU8^6owfaov{B?G?Z$5_2jyqwpGEG^l^+4QZN|?V z=JspB$)A;?^*=J657OVB{`Zx7>P?Q{1lA{@{|WF%+2g+!)t2=SA+SDy^5sqT^23{V zh8^eRk0tSyCk@8!HudkE8uAs#&)-FBKgh@Ps;%1R=P#~f^E1Db_A7OS`B|ItU%nQ` zu3xQ2{2THEc53hgFz&>%_me&T=JeB##6R9c!fsGc26$cnHNExmu^eBb^N+A^quu!D z_(&gne@b2A-@Nn1xElA#uq^+zdF=X!{O@Ypuje%Q2b=eoCAwCy`N?P^zh`rB^Mhsf zTutTlU;Hht{d_{`0w+ z&A#UJ(}Vbj0N1AcuT?I|=07ut|3^NSR{cZ#(2ovs@^1wD!Tu4sSX$-pe)Tza{pV>? zzc_Apm$f&3xmmo!F;0HDsMbFO_%_e4X@B#xPdI+5IR^X?d-vy-x!Q`o|8C(o zw1nfoP>Bn^* zVP4JV`mRwwZVlu3(+t|L-TV8N{cyJq$N$kt{&M!lcZHUvvH6GhjQBS9$LqA`Q`UbL zY{mNryX#}i4(iFSZ=6ErFVKGM<|mKsf0=E+e;U|7=IO24=ZHB)7jpGG-@rd(p3f@3 z*y`um{JidI==vN+g;ySePR^5{_Rbp{?X?8gw>y}VdpoG8R*~c{$TYs_Wg#_ zkHa87x4S>s!WzTa`LAhke>#p|(0-&)d*h4i>mBU;Yzo{Tt?=EdDIy>D$u=-gU4AL- z+|O)$I~weV%5OKm`t*pCoxf`U@f+paoqtUJ=Alkp{iZ|zNcrv`?Cmdl=giyha{MRY z{vgVCtg^R$X43FG?K%Ed7+>r7QTEm^{WdZmyTA09yMnCae`PQJ*|atPGEV-eiw1m~ z^N-b&K4zRmt+#=!FP zIey{#B!2J-x$Wk+t*)>30^jcVv2@)sw>bHWga5?wg=eQ2x7$5G<(V&!4B+@aGQJ4( zyEgM<^UCjF*AI6*E@~F#N50+h-G!~6u>H$0vc4VpcprmR|DXKYm47(>BtrY8@?$?^ zmH*AR-F9;P(5_nhMEL`y!38j`!m{I*UtZ_!E0v>!*v z^KWtdAtb+ne7p8@yXEy5j{gJE5AyBmf6}fOr*Ql|)P5i?w7dWLiOtQ~{$&l(j|66kKlbL|m&TRp&*{fa;!nJ<&#rz_`+Yx<<9mpGBHwO&mFJb+ z8#sPwq}IP7->!X@-@lK&zx7kH{|WNtZ|v#+t)GS*;N%|({s;SC|W;2(hNw#jd{e-OJqsxg&63dSuq^<(w^T;KKJ)+ZeQ=6N>1 zT@K=N)Q{)1nAf!1f4%X^qEJr%BVhiQ^3CGgGEnbWzmsm}TTw7H^bu*?4*v~7g>Jv@ zFSA|OG;F4S zCsafqC|8A4Q0=EU*6*M@qJH;QS9GKNdGm>NKR!5r4ebfOt}C4IidDWRzu%^ z`uUIe?xG<7tp7$o&W8lwW09W;{$UD~Z-1Eacy9kQ^sewfb!rIzL+xLTTH(t~VV6(s z^Z(7K_VfSd)A}{zdqHO#q4fPy$dOzB$)NxD4D_Fm(RuEdyzs;-pX%rT&8PY?<7b2X z7ohCaY2Y)t_0#yCu+O|Tg?&={5xqQonJMh@seb<7e5xNazASDFm&!mHx;IPBuLk0W zd!V00&=2JoV04oEB?mmg@{OoJ_UGoiA^!a6Cm{gdFX*c({2RutxtX~iBNxko&s9<9 z2LtjWzgY(niFgZ$`AoT5aQu5wzpD8e9ltX09qq)p#TO*M%fu4#96#(Op&wlDDOV3p z{`w7GPUraZmJ9uOei!o=z99K+W6H7hTlJveJ8FUcYXm2MW1p`hC;zR%g6}L3{bP{) zy+>xL`)BIv*K-!+cZhtLCrJLOr87@+{4-mie)GY&F(NqqnANX*3Fp}fS z1}DE+{rWx;>v5bx@=fcv4b*Rt{A+7VsOuke_7e~G>Fp}~gEJ~P{S<#YWdX-eo-6DJ z*9&{<1jpajw(km#KdUm>{|hiLTQ4~N%7$0wa{QX$-@NU`dTn2j{FIZ4FLC@;pnp#R zvEEs(ADsN1YJI5QAEB$?Oz6Kno54PV&>b%FQ_b!11Df zeURVqGzd;VjpCX&=lB~zKkoj*Klp;=hkp3U6^@?;{!{KI?i-XF1}Fc+tA`cl_&7cbpf$?Ay7M3f^m{&JXJJ-yP#m z;5&olPpeTwU0^z#c; z@{_APqn@v%(|;Vsw|#|vYn)cfOf{J!ske(DJMok8;DI(O9jzjXXpQ2tbi z--6_~KfACR$6o^V>n$YW2Vb!KKgO{3?}q-}{f&qpitbR{p>>fg!u($ zko+ybwYkml=Yafj6|nyx`Mau5@4@lC7=Mls^((gsPCu_dQfWBHe-rG}{i=vRJwfsd zhScA}@jW5J{=NOhemuUG!O5R`N*c}a-5CFWo8TV^_*w_YH|t+;y`5s06I|rw!!J=W|#e%{4M6M zUcmZ&NcbOTko=J=cC-5bcDcx^xgQg9JD(0t{vx%nuHp3a3FzNjPH;Uz^2g8qQC&Z* z(|vpb&&jz4q53%Bxwgy{I& zkzZS^$Co==<9k7@RZtErJ>{v~`uQ8?e;uG78OGJVAo)^c%Pfw668c|H6Ct&Oz$GXzV49?}PZk19syHlHX=Yxwkle*cT#yCHDsV=@Oj$-{$+`GROD4 zAsPtY&+QD7->S*qn(;5%&pxnEyr0PzB)@-&uxw8LOW40m0R40gPCs9|)~0d%Ebu>g zzmzjb{>2|>YsT-WAIA?u|F|AXe%6}&bp9v(!vV2M`7QF@ zlK8{2$>k{;{dk~%SqXg46_FqIJZDdSxQz7W_D@zR`qA}|Ga&wP|1IKwpG7{kpNiq9 zvpD<7>I?qoFBqS8wb|{`d73d`~ZHdl7<|I90py=9hfrXNX|orLQXUaXa%u8$4)hh4CK zBOdxk_Xrq2TI4%`-x$g>52tA6_emSO*3;T4B7JO$vYx29nF0s5;%v~b4{OBL% zgZ;~JZn4KAKOFd2O#%RG7V=zCf>a88r|83FAp zx+B=nU!Wh0d~CnBpdJ?WdsLGjmSFwNC6Hgb4&&2-!Rg0L|L)16{d$7ro9W+oSIF;l zT9efd`G>enLQ0roFLS@MTOP5d?%>emPH1D>1fi?OC32iOf3UshZ0 zQ|w>o-xkWEf5CHSow3&VZUB#h@{zXZPvmZ2H(>qM=h(jBetnNkK3=Cw`SR-iB!T`5 z{pTt05AOV+e~WyFXqHkGlocNS`c!Vd?{Cq66^8cf{uJgf;;iYXG3W)0eDzYBaq(dv z%%6M(@n^g>zKmcftF%xu0ZjfU75I4GrZd4B-%a@A7c7Y2>}M3r-+5)2Ul?kSkM=X^ z`Cgj%2kmDMjxXTcN9QnWdqvG>i5T>KURd}*c7k0;5R{vDurEaj40-p^gXXg^ulz6wM8 zwaBOa%kmyYYvkr%gZSYD=J#sB{6(@o`O$tB-MBtc;p_bW0GPj)*1-58)gmAIE$qii zw*4?ExBQc!|GEb4*H>4_?|IQ0-wlFexoULpw{!E+|4#tE4ChM9Y1a5M@Uh63efSx! zeWieYWH?vSX_1d|V>w~iv2afQA<)0b#bN$2-J1Lo^jq0b5BJ7DBj@I~hyE)K;(zZT zv3^y~u*e54#-Ck3Yx7)gKE|ITVSMCh1@>u?PyJ8zKF{~z{6oPN;)lBNT*;Bv|Gs2c-!;k_pUU5H+|>^_`FCRczaIRvMZQDQ{=GZ*aDGMqy7s%K zr}!N1M~Hc7Dxa1nNiun%!O$%yIQw4?`E3WBYvmkmO+OC8U;k02IzH9OzY+Mj-=W7M z-wk{$zl!Lg$#0{7h=l$f_dCQqx|x2Ei{)EWhu+9-|Hxm3@p%@kzkSJ`ejJkc>lbz8 zT5dk}FEO}2XQ{~V$zy`!7x+{j!tq`0Mf~qr4*ALdi0=WuCrJLf=^y^U$zKuM?`J}O zUy%IOomQ&nF9hN@)c?+sFh1H0`X3vd{s-RfQk>&IkMYlb!S@8om%siend3hW{$GOg zzI;LQKdCmnEyr&H`ga0f9v7T``evTeMAx5noVjz9PN zEq6KoHJpEh^H}6ptnpDVSgvV*B!$zDCs4oOKdtg1J{bk&OUI*r%FR!N{N6oWpLR;* z4?Pz7vR3_4nWrB4hU*_UqWo~KhR-6O_CMbZeq#+6KjcCG0DO6(HT_fm?P&)GaQy4I zerXHDCl>j1{Pj_xa<6jZuVP@IPT?$N~O7~g)2|cYQc*N^bel|MbNC1Dq%9eASwMyujZGW!3ei z)bry4{TJq+Lr;kYg8Kn`Eb>u5SeD*hL9>216~=evfbZT9^GB~)lOMU+Ab+`D8#U`g z4#D{M9q3;i=|cbV>(=;g;9@x<`Xx>MqW&eEf60LHsYSjFd@R~d8?cS@53fS|^*-bD zSA_Fzd-7v`tY`OWn)y4-j~!Fi*U44#Nw{ANuCt)+ALTSETTC1+bN;~#@vU!%@DILs ztjX^n7y9XwDHjy`)b(HWaD3VU^fSjAUncy;QzE>a{?Fn1L)^FPJ!^a_|EU85)cuik z^8W>V+?UE}kx%QV#qFqdoc?zy<0Ge1zqr2*u5+Q^C+d(;ek?0H&TH}m=s){|{&Bx0 z=X`7W!S;*!0n_}|JK#Sp@==_o)4_aUk1Ra$Al9p>D>M~n}1gJ=Q&g; zp#R1&-lqK@%9&HP8OGdVE4` zN?K}Ud~BlsUq;F>S8@)JJhIDAPaRyRUgXe`F^L(jw2`iujCfaCQp~^Qr=$!?bVUqF zNsLJz5|NTNByvbvYHVa|nk&wgoRJWdm@Y}}Y78Ep99ykMoGU#xEg>}{B`usOc6&xrq3 zkaE4@u^I9hxt*-SQZv$;%4u?q)R?q%S421Ex462d#JQTv>2i$>S5j(XOol5WJwy4w zshkv(HcVE&Bah1~<$pRYEhSBAnX3MZLBj_>RdLYh3|D%sI<-<#GioKrB)OWq)KAp% zf1qAPd1!h{@>3PXYbi+yDm!Cz#k^8jhvbBeHt{hD$x>4aYnTH|P(C#ryY-&bA3Zv`>IYOnoG6pKusC-Pwr92nk%F&Tf z^n~Hp?G}7<0|GFnUR#3Fi7nVl9Ch~H2C}X z{3KV}utb*u-eUb4`1h3LWLIoP!ia>7(Tb(i=vSwH|A0$%jml8kd(ZTkAuf4TgQzAE zPv^YQR8C2VlVj48>qI;|XsCkd;O{2}C%Dq&aVkl46$(pf>LViJT(JpBF^Sz16JlMp zWYuf?UskTrE-@u0gLw&EJdl)+XDFYJXd_DH3mKzRUFi|sTrUoHrDr@H8=q2Lt`>MP zJvAjc-KD--OZGeI>H(QdNF9;~GbHs@9ZC5WN?!;4m2!2(B3x;MV`5$Mm~r@F{^eSt z7YoRQBrFwDy}HU*@pSiZ3&YyF5)($a(t3=Nn&miX=ntcE{7;BYor8V}tyCOIXYA?0$>$?8W4NxY^ZMW>8( zr7@&>IlnAb{Rkn6*R-Uxlo2k5R6iF<{Rk!bU(=98|D)Gau0Y0Wzk&Xy{lD)&)V^I& z7613|`RTDSiW~cH`2POsfgPYV`Evs6QIW~6j7Yyml4BAh)rOhwN=tAl5q5jwHnG`j zOMCvHJsTRQDxq;&N~$X@L%Ci=bl_oASqaS`cyB7lxd!`vwBp@VXKsLsm21RjWTZwY zv~(rvR6KKXQ(5({3CY7S(7?loE)s0YesyHzrRZ{v8A*}LpMod~p^zig}=s8r6 z7pin@YNzgcU~H>&KmHG4M2gQfA!%sml-L-5M5+su>(okfrHZkH@~iwGLKHsNpdglP zmE-dUCya8%)vKF3O19FNmEnzW3l!C`zFid8f;-ss4`PfNi9ah+88|6Dd1Oqo5`l1k zcKO=zx4-=c97G4vz)WI*c8Q98D9w$86aJU6W0xdrtmlTi(njl9{+DyJu$kl@$SSs) z92b+Q3<=vP5vDQ@Pge%5sr~%Xazu1WdjA?R>1s&ifA5*Jl;NqWH5Y2_8j_IQT5UPG zM_8f*&o$~Bq<(CmzlDho-2a0Adx0LjP2hbYXr}a>yij0_~RK0AuLP3A*p?(Tw3%rm^HbcXKH#+~n>}PmJLZT#f76zo+ zMy^C7H|kLafhM0&#zlY&WD((kf~PMjxP+Jyi4n?}x3l6`J0$zlhf0j3UsJ95OK1_)RtN z&TMnZNE_W|cv_m$e~8qoaJZ_1)0G^qGP;k56>qmoNK{7WV!TXnYHuRrFfwVlG8S(t z$1BlV;I$!v^lL^;LZa?vwZRl@6&IK0N>7*CY5b9wGq|K|oO%^@RQ^iJXx|2G3&UBNDjXo@l(D4o)%)Xxy<@Kud;-TiT|2)uNO z#azQyVF0;vxZ)N6H*=)xCA`oBr2|hzq{CNpOIOekmrHN>MSpGOBt3;7)*VEb|CfL8 zCo}Zk=>Nt~awWwL`Vaa3A&n$;5e|;Jp9g!Sb_r=lE(v%hF>RZ8SM0DJqtsT9nKO|j zgEz3<2jmk8yo|J%WaV>dO8AwL=88$G4(Tr4)fA)kPyCQK6d%_m$0@mz)nQ(oKl`Qh z*^2w-*gZP9L<*aU=TJ59bTC#*44! zv;~|u#Cq?zr|(b7{Nbz7{i*o)+xiIO% z5{Z?6Ro7CIT)Gru0wv{tl5wIb$1is#MDmmmlWrOC<-w&S#{hGFu}`*k;`pA6A(H$= zm{e^kFMs&(Qj$B#oL_VE%!fFB)4a<1&&M17HeR_5%{7Q=avw8dUHZLuuK2aLQ4wPb5QQ)bx zWMW^bU`WUmnb@b4tjwQR4wJmfLLbil<$Fb?RX2*}fZ!3`e}C+ZN8c=%FW+Pb;eUQe zk{ngSBu8(p{HPyCy$C70M1+n{^}p`+jSigt%RH1v@>JLJdv#LIyqO{>*<)(!__X~_ z$oFDHg|BPB+jlDMtEQfRJVinNQ&3vfB0`cY7|V~pV_om?5M_NzJ-WZtrBY)3vLuNT z*N@T=db&>OB}z_Zc)E^U_q4kw%}v^TGh|n9k!|aYwGO3_aj1n z%6FKYV~2K$WyPC=)%D{#{)_Xq^1JT{`2%u$#d<2U`dw43uzG)_j(_sLI4K16FBKH~ z{Ni~TR_pg_$DZo_**d;7RLge<$-hzln!5j`j$iV7t^FY1_e`SSj;zWbQt2xn$3HMj zTffeZf-BDz>zS?cKiKcc%klRn2>pnwD1FuwVjogm59~cF?wdEO-;gz>)%BY?{rvT$ zR(?lQu?`s5D+byDxd7TFmS-=7F6a37e-rYf{o}d7v?O?)|EW-PcRh~p^lIe~aPgeu z!@`f6@%!BW>Ndx}5A}=o?`|#j5x{=fYW>!%TJs%_U;Q1e{EimFZtU{whA->K@e^W2 z4F&WcBJ_d&-wn^r^b>b)1M7dD1^c>4?>^OsbH|$Gc zCV&6J3x4JJ(~14a-N7&P5%;rLmH+;;=Z|yz56@}s-`h#}PY3XQN5y?DX7b-S_(5lm ze}eQcaz5c7?DmhnS07XN2i5rpUzk?^$VdMW=x4|eK)--xY^OZx{g*oaqsz2>Jck4C z_q59I*tEL3e~*sebGw!=!8rlm9>ULAt>2=~J#789C-NiTxmNgPtNh1DrcL7H&w~BW zuzkrh;hY1w-`T2us^2`I-k++|&xP|Meh^wx#$sc@KHEF}{Uf$BQoTC=99ru0FFF3{ zsapNxx%RX)<6ru{iF$vbPX32m@OPFtZ!A3<#5lu@ zUuVeC&pH0Ej#~MVOG`8UAGHd(Iew-IU#c(sg&E)bNpW@m2AzIJ5&xr;+hY6~-=w*h z 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 z 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 qzk>XfURULJ-p?Pki<94?X#00r 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%0ANud$%w0$k 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�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

    Fq&LBr7>tt>kF@qb;z|$O%S9=cXIFl#5X5tAm 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 cqe$owc-hnQbkdKwrnQ0 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

    1xQ@Fz#N9__V0rbvi>u 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

    2c2K#D0*5D|H1EE?oL~v+?$rC5 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%0A2Dce*RTCQ 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

  • Bmbw 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

    |i8*!7X7TSi=#2h}^rtH)5uIzS z-85@;CMj~1?&P>1Z3ir{M-dM8_$6xgT^0kB1FO}3QH7D-QMBm-vEgcwS{=IU2X z@Bsuux1KzfI?-cXE-3-M1kp4Ip=f0=b&$(PpdyR&N6Dk1xhW=YZokV);&$J^rk&?XdUtD%>jMqUC&=5_(@k09cBTeYDkeNXkB zdRF`9RabfG-&No0ZsJR7wbCecPcAuhvR;&u8ZRXrv0pIq6EbFPwo|syzCoq9x4OBP zanSv(0)zYQb{`^g(JJ8=6_{tRI=%N}|5F}{gFe+GV-uNA833FEC6rHjRKlTj6-GzK z6|HIot7^4Gy~SV)8p|UA=gkMXpqW4P`O~i`$-E57qX+lu!Q(ub)Sh8kl$KK|6QTbZ z?03R`9>CGM`wQ{5wwRRk$nSrTHT$fFcug)Ei1K)^VDv)u#~fnVu7j3MrL8 zh{vzjoa)$a+l28J>w1JONf$&=%}&7D9F@7LP$QKBluaz=p)CA+3^aMDJ2d0ABUmt2 zL}gtmXrA1WsGb^pf~8naO3?_@r97G>R7P#Gowry+`=M^cRH^X*^}7%#g)F!+)>EF6 znyRF!Dgic1j?!pBUL$gk3tl!aSiuRJ_tbpddu~2rbW+R}oYFs0VHa1=Uuw^kur2B+ z4ZVr0)S7;aQqk}2Jkvj1%0O4OzeU&dfwC)NZSER6mf33$WnynrP=eo9yC~sup4Pmk zZ5fzD5S7F#5r5^K(Y$yXU&$$0fZq>$Wro0^a7D|(a7|0hO`@cp%w(|ija;AQ+PeEo z@wUI%k1w~pLb>eYW4kk(=3stS~><=U~ddV}4$uo*FKT*Cwof-Bz;uCa=WnQMoz2-l$Ss;1W66I)Ib z)@Q1DavRumj|{|6nhUU=BAb9bxX77wlAT$^c$=xo_Ze$?^>Oy`nO4^^P z)EhCAz8x3X$=2zAPo~gXw^~IEY@}Z8H}M+X+!@~B+J(C9T}4|1RB0BZI&@1WOB|hM z3GD}bwcU#Kup4N42L`OmZwH1<6E_YFTpB49SlM!1{8zK0#hAK9Tx>Ml-4<%&OIR|KRLzScj_cT30>m@3|N zYw|}!oldo_Dk+%2Q)8@0W%j5+ILD;_ z38ZIeMj%;TVTrcVP=Uy`iK9SV!?23sCfs)moOE(;89Dq`8JC>{n}p@u4nc5Ac<%sT zTD{Be9ZQv{6XxxJDkXE9f{`X%NUspUrPYV=l;3${D!2-a=~$L_J7bEhNn(Wn1a)fg zY{>f4#rjRstTV;>N>kFt9D_bkk*SZ%T7@A4< z|3muw!R+c_)-I%Z0uoyw&AsM>o)UbEUUd>UgRvP77k}`>#2VY7<9I}45T(W=88TNQ zNQbVXC%>I%8EUy(?FCv+ef^*y1OFjrvm4fFlB5^c&yy~v`z9@T=HDp zJ2)w@ikIcwqg}dZ;5U~&K3e&`5-{7{A#TwgAfZ1*diC|DiBbP+^%Zl#OK%XXryjw9 zaYKWN1n^_`<6v9#QpF~b-hfm4cHFeBNea2!G3(RaV(Q7s&VAPT zkITiU^D`xZh+*i~y3R+wVdyIsb{$cPAlA(z0=U(70%vhR{CXvbC&rLL#A=GP z!5>*;soQ8=5DJK+9s(k?81;~kKB)H^*(WsDqo;Wd|PB(QqJI`JNt}ahr3bi;&~Tp4bx_J$kI~ zO%IvsG(X?0ad2~|8@`Pe1#09|jw6QLFOq`@sO+`l(N=FESK}{l9yS$%(~OaRy?sH0-<^NeJn^#3GpS546C5ycQ_3=iB8p zm_7eLP7mBJ2E?AKxzt48qa%7Y;r9332h=>265F1!Y1A4Mi4svsEuSW)>XP0NKj$h=su-dgurud{f# zptVh>!|uwLv>>m8omtV|fPd+T2ypZF;0>mw*gf8W2`>7x-b&CSv>rpM<66g}e)vUj z%U>Lrf+YUHcB6q%jKXKCk!-hb3B{U~@h_EbgB)J;pk5DLhN4S&(LR!lm&lZko_>=e z%5)r*0EkwRPR9fNlTIc4Wrl4|^BHk43FYy&l{~dU-b9WgZ__DL0w{j%B7WJX`)%8r z2WSiaDQ(+YjQNF-H(`k_R>8+!$qL)MN0*Wiv+K*3YSHw z&%4WQ!~`=Z_bJZ})w`T9|57zBdev#VyQ*91gPe0+WtZ>d${FTu(^L$4n|k%95MB-k z`EbzZ>h0mj*B`Hs{qsOO&1gPybyuXuq?E8uRq%@k3If=Xk|*sp0uVCJ zR19x&_8TUmI14wth|tIHb(W^C<3xIc^QGQs>A^iAR^DpS`HgIQ29oPTyd9Fv77tS%c@lUz~LaV|?VaC>%G9gG3& zdRujg$#zK6MXN+%Qsjp3d{bRkAk?}X#jm7bs)7f|XOn`#uG!L1*|lUBhE<>`7)B*5 z=1cCmEbjkA?Fbg;*jOs36sFXU#`~iwS6c~@@k-y|W&gyOO&mW*I?J<(G3=)Q9Ns-+u6CfKc)G^$L`!MhA7 z``ZH94UNkOKk=iP69zr;qsG+6#+^Z;bbTVVwoz-UyY?KA7_+`HH)U+_2Wnv|IgqXs z>(P7bCw^t!w?S=vS7yk>E7uKbOl@u$v;J&<$am-+$vEoWkrVy1NbVi-DI?FPO6!?7 z>^S#RplU~E3K~HfAu}1qD~6V=?QUUHYsE8 z*rvIfMDgJn<|khGA3V3E=W&`ORgeW7v&W$J0tTol++)zf*|u*sVh7PHNvvs zAHOc(PmDOq0^L@>IBI$y^>=qkEcA88cJ+p_I=Rt|plONPeeosb#{bQ%TlEu%fUr>Y zbd#5y+vO!ux`y=Pt1jkGe904H_b6bBINWH!p-)V_6|?m}V>Z1as5T=Tsu={>i@?cg zH6YRVnJ%TFL9FRQ)?5_E{X6#H! zNU^Y~h!UB*c^M?@%&ZM@mxnW$wHlrm_@_C0_O?8k{n;}Y)KxI`XDSAj9SbW#hxsLO z44&H!_4e{M>(T16{>McEr4Kf!5Z>(#Hh}c&F-;rdH)zIwb=hEyM1k?TP#o#j^2BdY z{t9({jHMTY>N>`sKw4UYwelqL`M*<@$beN{x<<<&m;Qifk_Xwj1dGRgtwhv=<#u)E zR4 zNRcwRn(#G&Z1L4RZ_QNH|IEy(u&wzv+3Ve9iKH$7ERC>s*fknl^e{e7*$r*^Tf~P3 zje;zK#_{2}-q08hrQag#W_}~DDz!S>j`sPe)h6v@wHfPKZR*=AzwXsH5TE0`M)S@> zv#ev3H2)|n->q(hYKh#Q_!1?52tbdOsVvZ$hqRK$v!qky^kad&cPt~-c)MPN=PA=| zhxFj*hXFS|LE%``EG&mFbtC2Fv%o^Y$BGyP%J`vn$NckHTnw8%zF@m3>&a5%C&WJX zs?dn+_3Su)Wbpd0dUsr`7&Sf>pCz?6lQ2!Ld3Hbcbap@W$rt)TzCKO9Q_b86i#gTS z$)qG-ov8pPMwdStud7~Z1j}Hh(N?u%0ED?!(g-dn zM0S`{2Xx5>hp;UkUZ_Q&jScUrwA;qzO6Dmk4Zc;b+N862-4uFNhQVpf1KR0bxV}61 zg5~b`EfGgBy(l=2IaF@qQfUD;lz<7IS$HW=R+o)ECU4iEe<(pTYOTj_(wAn!nklRw&51CEoyr>i6LkYl(H zT18^GX803G0k@djp8RDWa^bkG6(nRvm_`UGk101Uw>JmyCOGSPnCr&~jm1gx_Q&=s zc|ut1BY!-(>#}(AF1-X#Gl>=qYPpcn%?d;d%`9r37$xa-5GE|qS>;w`0 zs)aT|%Tl-S^zbeOb;3nM~uk7f)`j53-y58P_2wz*lR*f`c?aHfAZQ%yd945ZxGx{7OiYk_F@XJ2w2@#BguFp}k+%!#~ z^(jIXMI*D^pmxGtym`~4n@)8RH05Ia`kFUpDu?!eQ5uY4K0WSG$-MRk0Hk9Yislcj z98ybIH%rOUr&0gV1kf-83tE1g4cuBN`s^<5luna zTwVf#T&$M+>QqRv%+&^kBcE-@95kI|tayRD{P1ZwQYUa0abypEc|lazFTa@9`l*V% zKQ>vSPeL}iM!)}kHaSV3_r)fsEbYlAQ!4&1u*p-;y$3e==AHkq*d+29zGS@o?{i0X zaq!s_j2k}fF3X;R8#F^$#0`b|2@hq1iw6!>#ErwXOiJ!@`oRycaQ7BH_b*iPJX>_H zkj_MXUBc5SDZfdJida?RJSknJA>#MmR=u68lFq74(}w;nTQw=N)&2q^vAmuV*#RAi z@t-FuLqzYg__ggkl0VFnZ8U!_e53WMJ6|H9Kc?{0m76ZpUPmnO(0F*!9+}Q~a-`Z} zT{4S02VFNqn|vqAOKGh>p6q9@&aJ+LO*jr^x1inbix(L9CH%AZF`gPy&Wv7t{8|oa z>dyR81404uk_98927al>+QZbJ@YB=`1;raq4jcG})s(2drg8{hbth*_jXl-`VDkNpyZDQtoAcTd7 z>-ATGzfo%oduNR?ehlJIJ2@XM9bKhqCv{T)!tU(gr<`c(7Cp7(E@Jk@-CLXSuG@DSKeEGF%`*PtMwfBRCibi|U~6hd zfwPX$UI?r@NbakSCl8?_I2Ils{`fbqR3PBQ_XOH=Bk``D`SII@hvcj9{0vEo{=oH3$V{Es%Yw?8Q?+~B zM%LHMqw|OU_fw&Xk<-WboQLxR$7faIvr0wUN1Mdud7nzB3L;*bx5FS$8FNaPXJ)RU z`YZfkEm=eL75q3lI8R_vvT)27F~6%cijf4zY%6G+X3fn?Xwak1Bv(yd8B8UoIMd%b z{yqGMfl{JH<7ugcRyE&q{JcckPQxk9joeNNrZoDiv}}V^(5+mvhp-eVzmIq0sNIQD z7M_s27!FPdj9tIlR8;t3I6s2oEva9$tCc$9zP1){+kz-4>mdv*5#5BCP~sh;aPjts zO=jx*5iE-@IgcCraUvi##P1vawS%uHxx67YjOATZ`crddeP^}|+p#U-ANAC?t|(!- z$A}Ru--zEJL2u}oc38hgCTIbr<08(WIz&dulks6b0Uq)aXhPuvfR6#-%xu~R zPHS@alOdzKCZoZzTcY~A@Aqml;ZL?ujH8pILqx-@>W;PJwbAPa*PLp8&JA-NlHHLf=kh$Mzl8ULj5TSUD5ggU#w+lzQ%s8hTU zL6E(fxZFRUP(AM!Ci!(Am4!h$)s|tD(H;D4wCTr}+~wn&P!!VCc_*`nzW6MnhQ7eu z&ycy-A8-eYDE@LTcvYnBWvUm>NH=V*o*^|snduWsw$O*95(o_N-1x14<_*)f200p)clKM&``z&mNx;}PC9 z#^WJ!Dthx(Rj}kX;ayrAKtr9YeM!}|?5+Ot687g?)ZKk#MM->d9g@go9tdRV2@Eju z3ai;s0_N%?U^UvRx2=1M)d1CJwjgG~y&FLMP5kOWd<7c##b28e6l zj4#<~FGH2D2PY1u;rk~1c?gO*HU6Ln=vGPgp!$xoN;WciyCH>*z!}+Vky5KUxu;6| zE9`v28~8+c6nm;`^DeYAYadz5JABx(E95Gb5pLVL;9jwS5(-ZjK?w}U{_+>6B&ETi zw}n@mMQ=sIzxnOrdFN)utLK)A?M}~0{PYF}&4Pu-?)U~8v>XNs_>jDv7;LL;aH zrQ_gcYd{YcATMCCa*$z>tz72zuTO30e5EXYFDVg2ue-^ije@zt57^|0#c zxaru3Eej7Kk3fS@hH$BswsnJsXrduD4ZICKD(aZiANe#1&42~pbRCM+lj8H;otoAK zW3HO)_d)_Zwb2nER7B<`<^uiS@1r94K0=YvpdsW!I`*p@LI1JF^$7{p@P$^n0%jq0 z3bb7=Ti}!VMr;~A-4Jz*1MEAoJ`goe=nfI}`k&qd zV0V4vKStDIMpYnccwg|mstrLycrJY}@Qipjcv8cvgJW14B|}`!HkU&ph4C5Nvm%E) zG*(VPl_lWlyAYn`WgxWXn z1h+U?&pHw*LsvA657O{-g#z!?_q??4qj63ism|Gso&Sh1OOJBZm=l&aMoK9<_$G&0 zd>>M6)wQYeU7QM}Gnvz6d8i>&Ef76#q;F6zP1M8HWd}@iBe5+DkLnmkZbvw-jsT{^ zJ*bZx=c*n4^Ywxio91j;9!6Q-uiYpZL+}_FILjM>8FFWKDW>tVsG11teVN81`=~A) zk_noK+huZtb3SMzvxK`$beB)L%gOFi<1S;|`E$Loe z$>ip@_d9-EB(n92w@r=OY_c}R3vippX#8Si7sk!z>X(}WH;9fd362X72M-5rSOmb1 zcsH6T40Q!Sh5@lN0n!%G6waS8|Noxxq4{R;@xR%BiI1mN{QrXwK?FWVh7@{#_&6CL z`^3i#Xaz!NXndqUkOPWKux*||Qq3>O2d((gBua^6MtoEpb3{q-`@ct83yy)m6t|%e z)Fm}RI%}?YhXiHz{tWJBM?yOtKF>Zq`1Rk1NB9Ar3|%soY@R=dldN>0#uUBSG+cTUDGjEcui5v@(UI z!%D^`9J=6;3ElfjN?N{4x9U)YYFNny6BLfn(c{U4_R<>GC62idWR2Pv{xH*Ryw z!L55g8gKg=Z(5mrZ2OXa>}icB_h9Z?iCeV)mLFI+4$o}nSNvY)0{xk6$5VV*=IgC{ zz7SvXTO58otqMsF0UoAb1}9fDWNm@}8UD zPs{1pCdzX~J$OW)6D5VQh(+K_DT*mao?o5hYzc2(8CpQ=RsCCX@N-Sas% zY>s|3@xu-Q)#*!1KgiwKZS3wgP_%ogtYIJv5mv^1+uvFA(*aUMvC9Te^t}!B$=w65 zI;~zi6qK;wv*i(}`P-WeIX~g@o~cP)->0tFRYUmoQ&(U1m;8Px_jFzO^i~cpVROdp zjb81p_>za^qm5ziV{er3K57??(7I=C%fQqd;Ok97$cq>YSClLql6vEQ0h)P6VdZpe zhy(PU8{Y?@eD)aSA^z(3^I7YjmX<-wz+&53&cHUxUR>C+v6|9+kd3qxL4)wRX3yd);+W4oK3S=9o4$0Su4O> z;%!4|B-5NPPUK28X>md8o;fNsH{KTTK67@y5K%=H`neUlJO_oMi#%RtkH40CtOP9{ z&vy{S+YiWBG}OIPE-F~O;ReHEE0_1oCCGu~+H`}h=gZ}|CAV|ZA4oG{*HR2EIoB*; zPSctj&inGW;_Q3Vlsh@Ls&z%ZB zUtuO-wY!|{F3a7e-d*;PDV%wcaj9ADynXN+*Z|fRn;r`3$w#@JPS|2oUH!YlSZ6p_ zlHAoVzVvq3N6z(~l)z{Z-(;u7mGR`C6$N6y;qJO|Z^YZ{RVul+G=A;f`sGi>JVa5S zT#7{Ud5}(+$W_+5rzzex80Ais> zZFuc#?HcahlMWe##iBf3NuLrR>z&_4Bg?3J767(U+dRejly1Bn{1q-MQ*TI|r@ILU zGy^T`5j~!4Yv+}VV}VYX)-y_r7*dHEl-pQ5STR+)AvXX&4sHrjFsxiSYE@}!1QlDa zYSP%$2Fa{?TvDpC*m{RS=~cV2rOx@x9I6q08iDPSk=_k#Jn@z_21ur?sP!ndwXM2U_yZH2 zT;Hv#bnLK{3C18UMYISP;!;PSv`ELcci4v;xxAkb3l(3J<+JAS`(w#{4j+tFdMdu5 z!8vG}sC?TeRi4va@9&|?^xfS;K(gx{W6EH}f?m1}U;F_4xkPGR#O~|{824|{cT8{G z$yGkxk@c;+hBjZF@Echo)wS?|25q{GbH#j)OU8idnIavzb-930RzVSSy5)V}wdRXv zdJ`6b(fm>ry2&@H91pw~xOryw22O;`aCB|={OTDT`~GmI`|#5D_hGQ8+~{O(tH4{P#!P)Wlw zrU(ba*|gc6i;mM_c}m<*h1RslO#F8GNFFjwOnDY<2v;&}LRRo0;0o zP=P@>b4Dy6e|$b^kWX-Wh7M2BS@m77oT^p98}}r%$7}7D*`v>h-#4WG@_P359^m=s z9$%V;DdDg;vJc9zU>9j8$#$;68SJp(4wx!zAJ7SLNcEb@?%Djff6@F$&PWegRM7at zVdKB=(fGOpqQ>#K^8S{sUx}k7d*y?}PBM2BZ2Wnl?`==+zIe_AzvB{^nV(mUobU^A zo9~Qw{1(KnAPYa-#JbOi7A?r->rc=ubv$XS5Yj_`{S{6LL?)+t>EXY$-wOVuNB&H| z(Ja9#sYh%JP{F2F*H6cHZzl!BaA0 za{E3zZuXz1%QVQouk3V0T&TFbcJ(as9M>~ByPh4DDZ$HgF6Z=uyH)*kFD0Fq05~(w zkP~pQLYKn^l|hHb4G|P|g5oe6WOjsc@j~pylV7v;v9@Ba(DS&Q7|$)8*+&_w{d~GZ zQxj;q!+x7~8u>;0Jq>pxebU+X+tLIkoMOLOcLA;z+V2oeLRy7kX?h`iqu(2ry2Jsv z98Kx6WQZhiv^IyMAMie1_6;y}&msa({YvKBF8ebhOu^i8W5ASWnDW^@sk=LL9WMuW zmBAFVkaD2FEMcy9L)&bofl<1>QMM_hcQNM$zwK|j<(KYqhr8VFE*Ja)74sJw*8ru5 zyx1O3MKN&bI&MNYqO$PIQ0Kdsi&=+XZh+AYUmeuz^4sgEco<5efs*u9-r3Pr$2L_QrFOvd9XS* z8VHzTk6UHy}Z1+E!?Z>M)TZC&}6%muvbS*b?oB<)UDUf==F{{(==U@5@D2(&Vokdi;bZ^n<*ZHN z*~VALW3_^tUvUVBQ9==My$ZhdQ<$L7^>TAgE9QOI6|0s8U;sEl<2P6TT6GvJ5=mfK z{U=rZolz(LE%*--`)|tZ2mUAT{7>O`^{?q0{;O5}e&D~PH+~#eq>r4&7JkYF|G_!< zd0B(Uj$aiC!{ti~gu&ETh`e|1pz(BsJg&v~yS%UV)3Co~ZXC|)l@?h0EI9tNJe>uDJcNoziOKvYhG-9|(#X&mVEEQ|ZV} z@bqH!(>yp8=hRtQGcpfSS9-dM%a%bUul;<|0vM{-JNiE6Q%<&ybtqAM0xA zcg;&E`N|Uctd*tFQGfRRzX9)xJiMPVx)j5EXm5DWC*kT{;5~GHC0odsZQ#$4jh8!s zU)&GC#qeIxH-6b|L+JB|fi!76e;BbUDP7_CLi0|FVV*GWPkLF1;~)JPm~SekXMC}( zTPd>FsJ4N^f0bnbBzH}if0?J%8xWU2BW%`eoR=QYOu;iPp9G#qA=kV|N%wBh5p{|6 zsM$Zaj1t6X{}BZn6$MSqnukN&mfOIGJKe__Zrz#>;%fKbFgpk=-DqspO_*LXfl1;zOg1X0Dfq@T zU%Jr>sBGjN1>gB0jCEe*ZWPPIoKFEOK+He|;s3zSG*JMnt+%&klbsYJ^XT^kyHt5O z4nxJt;8Rqdy(`bHJ@x0msQ=^Uw5VHA{gcKQ)&Df1%6F^(GT<-r-xN0F)Cx}es@>Rp zh=M!7{p8rr9bWubhsBq17Iw3_waypw(hT6bnqR{mt^Pk@=*f@O{w7-eb%PDlgQiJsV1?yD=^Zyn)9dhNWyfmvyn-|zbB0rFL?HSNKgn>-k1$fl8T`k9r z?Hs#~1%E^nEie~GsXC&Cmti+K8iQW0)JbXTS!&Azuzg8(Z5UzFrwqh8xs-Usay6!A zIjDW3knP9XSYvoKOsjqgU&eeTN_%sYUufhg*}W&??2tVWM-e$GrpNt}FT5ngJsEEw z03h*uIp;WiFmvcdh?|~A9H&sRuTVT5VNGEK-}V4gEcwh=dt>cmhBcXi8tVPHLgNl_ z^7~HypxU&jytepz*vn>y@OjEj)y6TLlTHIubsREd<83 zO&MvJLKrrGpa=%ds&I1oy39@siAWX6r;-uPklp0o{m@LUd&jUGKC~U+f-~7}JJXMs zJ^24t$N%qW+H29Pfpz4r>g~G1|Lz)lAU@5Jvwq^7POLFa86i=a!T7 z(texGpDnGfkj~Wc$Ap7-P+Pc%x^U!ADQ{yiXh+aVdRR)n7wI{hFWn?5h?uOtd2%J7 zu(pKoCp`9o*kND1{YY!VHo@N|ICD|*Xi;yt;j}-z-%z1mUWih|{o7nLT^c4hIU0K8 zr6}Hhi$ZD8Qve(L)+@`?vG2^>i(YcC9dm8@yx5m=N^$Z>9%b;tz8|()2gUFGY&mlO zaS_F2Ap*Wrts(zzMe=QKP7L`U5^=Kek=txfi&-jyt0TX?0Qj~?3}}s`r1f7GOkqxK ztw;t&jc!qaj~EsU`Z}>vV1zVZv`VaiG6=V#j&uk24$S;)hapSD*pT1-!4bcQ69GK0 z2tI0Bi}|{?0qNLv(=4>WKIjI`fXqdvH@FF&c^E!TglZ(h(CvnyJb6vtkQCSSg*0vS z9eJ=d%{+h~WrJ$in+OV}%@k(5T}J^3KOfghDMd*OyV@GwM_ujEy&wC{kWdUhInRj! zI$j)Z0ZV52rF&ET(y^akBzd^HoQx>9pLz=2#rmW(E^%D7_Zof9N<>k!CLOzm@XO^{MDXcS4E8eGk7_FD?S z%+!mf5ZyVpzoJ6;kUoa)H_~|&|E*j|%!+;H*(U3S=ZB$Bu~krcw!=t;L;#@0YJyO; zpoU<`)h)ZbGv73bEN4MXt>@aJEi)U%WU6hO1q_|~nyDJ*X6~>@Mc-TqEFxZoi1%rG zU(B~`^7~f{&|OfWNP3ePWP0XDwmPCq=#_d3W}`JhLS`z@gO7X*OgxLDTHqg8e7%jv z`tT3!?9ky=pOuYW-+Yex;v~RKm{DgoL(6C|@nK=2#(k8XVjs0Ug0o!*q9eyow>H3V zBkdkYLt-y_8Il2f*4vOg^;f}*A$g|AkbFY@t1AS4g8_eA z2>fl~t}iFO9qVC8tehE=v3&sF_8~Lfk=%X{(F_eqynU&)5WZ5=m0?-5U|V>e5{wmO z3{nlRr4HmcjTYNY708n@f+y$g-H7Vo5rSP34@^{B^=Q?|4Q1Qxq$V|faz|VBIC~ND z#G+MV6|+wf={gNIC))aUZFnD|8lH9j*x$6(fm#~UsXRSAPS?y=+Z1oNb=k;Am8wr6 zN`9=SF0@hSTNR;=8kdeeajv0cmPj)_v{5}V`;Gp2%o>P>+2cqQ%VG9LSIv>CW?Wc} zH6Ow_c9R_$X0LdY#;7B25zb1oF#p^`>+d&d`OTL2a z*8gm6qLXMrKkvMk2Tk7o?N*bD2M7Kac59&su8;T6@^2YUETRPS$}t;_V-KU-T14AY zAae0wd7a_trN!k4$Ycq~$(gMfGBbil_BMi9GhMv^SQ^q!9NYo`;utm;NmP$(o(93p!%>j(Xu@m}_jp(oPO~1Mu^fpg z8otlX58rdM-u1bC!xj5?%_~okh#p7o&0e7D=z% zSbKLl?9sEUy+b;ZYIP0vHDjv*w?Fc%$HT5Ys@nSQ8frJ%8^lE>TK4tm7iv@v#4olL z_Ny=$Ks=|a2<9K!4iCAYgcfK-oqIwBZ@12wR{0k}iQpXpQxudq3O${@QIVodjj>}< zfPr)4y6s)9*}kFxLySkkOFqoU`o13i^PDgB;g3oeAaxv9KKz+8eg~IqY-U)Db~6*5 zb4^dUCMUYhYY-+5Ovw4Cx;620zH;zon$NZy!x!=U-Oj(9@A!R#A?U7fi0!T+6L>=4 z7T)Lh9ZI`6Ur#4_3oAG3*El8F13knRUV)#l4afb{72-QzEICt3E3Gr) zLB>EKmB`;o*G&{sA8lz6#m2r>*Y;NP1Nr*Jb;5L|eB7gYF+?sV9%e|(q5=hDYt*f#tRgAVRI@vO9Y-iy8)`p7NXG{jB z6v&6Ch9+l5@(5gS%M3L6knt2-09ai{Ybb)%oPK8;2o;Z~;)`EUvwf_&OM6uwM=qqe zq$gLB^ImD&xH+edy*M_;mpWyJjhDF_Ex5r;4fKpq#WojZe#C|6f2cAA;rVHpY5$}J8^nr; z?L1za3m}<>rd6uA?Gk&+QH!zP?kW`0oRWHUqwuu65f=rXsZ`A8F#9Gt+e=U){bJ@~ z1rQTY>C9t4c0p7(Ra807^(~2Cj@@0)6>EWc=1@x~&{&%`1X9ar0y#vMaA$rDCJV~j zkQ{Pqmurc**4W=862S~+C`>lO(6!WG#5{}!hOXGDF3U=ULRJx6@??QGzrxFpli>9M z8J4mb{l^7|{u*Mt6VrOClX=4L+Tfo`1AP{DKxn?J%Q{H%C<0kM&U+oBGVv12ic?-2V|-s zn0Hi7AI3D!TdAE|Yt}!J+MwLODjgSbur^O){tS|$aw_XnPbQy_X{}6~oTK{q1JCx0 zU;7h&Hl!Y@Pp&K7xe~=)(p*+gx`!;op!fsNm(1pNT^T2NHOKWuX*_wfK2ARSPGf3C zYRis>_^$@m$Cq_YY+KhdAbprE*>x3hC^CT9*^}a1xla!~*KgJbQ=2D_-IQ9bg`FIkA&(woQIk0cbP}5S0GvH+=L+Hq zCC!s0jok&gXh-lgIO$Dh5#aC-aM0rrz8}`LtABD=X-nnue;QZP)Q)(Uxe!h-EoT8! zclIUDIU8w?$ z6`&6<{vcS8 zp8b^#SK+R*YJ{`AB=~f>n}LpIh}BM#yuHFwrNL1}r4W^2&}->CJ=y5B9ikVo(dA(o zcHrm^2CHw{4$_HrkN*AD^$!n2V?p|7gc_&do0 z-f99j!Aw^ZPN8|K_<7lTZwx+JRMU;Y(LL@DFS-u~UrYZF*kAv3upsnpQvau_|5F9p zOfybj*E{Z}dnr18jzvWQOJLWzK|s9iU@K$Wm)f3wHqp(mpn8?#Tver`&Q)`ARg?9+ z4nJkISqLwMb^De@EUZ$@t>sfrtzrQfF=`IQVvjC%uf2c`Q}Cg>o-GqM&qO&5N{=i# zO`(N(gUUJA{%}D$7uW`s>(^w1`QxxOXLIRIa5`zA*%vgSfa4JR@f#OGF4O^prAOv+ zBG{VKsR~AOM2kK$dBy5j@|(^MNu5)b9)4Xtc5_op+)JH~IU>1hOJ zn~|IYBeScYr?8t{ZTWzn0-;wvb{$yF4`hP4Gm6m{`G)dPWJML%S_8k4BtG)~x)8=~@%GomgKO%< z)FnaF3P(e{w9e-70w1@kvw4^}00iU7=XHoF88Tig6w-g%1|?qFY2$L`%?q0$)oYCE zKhjP__E@f#RZ61U=UjV{6`08?@q;}`*DJ)R+x?Tq9C!Qi)kE84|jUE2qErCSWwVnR1p<)u(3N9X7b2Iy||GAO0> z>PH#5ClZ{pW}Ra^zMtO;h_?f2AyaQEoocXzk|6J!wb{h`?v zO_UvCj72`t8BSF}8%*OPuE#!?C<5D1G5f)K(GAq zPp5}Z9d84QO)bNXGBRzZ<6hI@7VD-ZUHA*%bXQD*?nwh!M>Yp%*cfok2ss6Qqedt{9RAJ|C z47L>A2Lm@6^Y(L>2d{>QS4YE_p8R7&-{h;{eg;^De?aZfyFVwOh)ICA+w3=CWA77T^ld86+OfE9`O&n3)kRCpW-cDps`1bpZPa2Le zWzBBLM^thc7kE&QlGDDIZ$uqa+GA|8cEn# z^cnDmKCC1))pnYHCi8iFMUX;NKr&GZ3G@MqWmt71)>x}F%Y*Z;ESQL)mvm3|02OOW zgggoP$$-a~8EKow)E;)$Z%m;kf}j0pANy8sNu-{z(@4`J#{eM~{UUFT97sgrOzWW( zW$oJeSCSG-6n^AI=ZXPOO6bBt)kzDd_#;*~q+>y?y4cw=8q`Unf_!OG0}3+>{^)esXJYsV$lD>aB9OM6|twzf%Aqgpe1n0 z04}zY2a*uB=vp-u?{&hjc@X?b37bK%`cbF<=E6JcbG#!}RHT3A;2jp_hx)N$_eqtY zZTi2g_Gcg&No9hbNLAStJ-M8|IHvFDhQ#+g<$0ux>ta8K$8H@X=_X%Z)AmF1VhXKqC(| z|0268=$-@qui!QZUJv|VTHJr>5as6z|8KGr)pDTd6ub@}{*AiVX1^t!%|lZw)QMrG z8zP4{ha`h2Sh2^DbPX_MQ#k;N@DpGBE$RY>(ZW%c^hcH2tTUx&IMVRH4t5?kK|khu ztYR4B9DtA*uIK-xF@v6Aj5bmrw^?fQi(8n~nfGTeg`GV34dGtRB-w}xgkLeR0O3_s zAAJA$y&6@zkF(2yhg!g&wuQ)n|3|*tz0KwCR;WSx3eNIbyG8w*^N~LAYuIf;C^XV&+lF3$rqOD2`&%trg@m3%;r310pY#76Bwv;ZFpf331R{X?r{_5B#Lo{e zjA z+q*JVOqHDK`Jbi~hmCJhvUwO>UiLqdk9P)c>=B`f?E#gA7VY`e;tEKS>#27xTj@`(& zgm)rrV{|4_0u~8AcN=*BOK_mzz2IHoZFTS#=o`@#ws%9fadKPSnm-Db1mF9$b03XL zlyYupc`)Z(_Z&RCwP+Q&cVdl-(fat(+{dU0R9d8Zg6Ure$}c)7d*JiueZn`+##<(z z=?lxf^zmMr^~w91r)lwJ3p=(EW@3|^vuaqS!K(AZWxP(?F&1MH0_)h+gK%Al>t>Z8 zJ(Rh41>)$YB0Xv-dzYKm)*K%=sR({^q2kQNWv&grJCm-AD?qqvC`Y{{JHatOGe6H1 zaL*sz`k%u0*Sz}f@2~t9-=9+aeGhydpus^={2H#ib)QmyMDd1#0mEe1&+mN9`8|jZ zowaN*7IknwHEUl$%v1>+B+ywBCVJEpt)1ZmzS5YJo=;bGGgW4;NIwp%!_-qa%u&nK zB=f;9YJz8iOEC%#q;wr^8LAbA!;7Rw@uh1}aU0$O?~v;54f?`h9c^^mZ_~jWBwJ+u zS~M8#X>a0-lMY|NmiOmv#m7>Yn8=`gX*Fdudq^^T7VlJJ;q(Q7bWe3F%;b%ET!%+- z=33W24!(L^$Ck`Yls@W4Ib$|hU!8XiZ4NtOTc0;;xT8_Fb`7Qo=nEUC`>_4` z`3GZwh_ThKn6oHjiR88G=Y2#2aBXuWA4Pkcn138*R*3+ipW41@0rACH%PHnYH-pn1 zgkG`_Yt-)v#yT%GA{>&XW9O-u5$B%s^V2NDamU;ACVf)7U4Scluh2hEBY-+l%*+0m zW%oPV!>2`EbZZ<0y%>eE?LDVWpz?`gl4wFFU!Mc-I2EU#G zNdIcSXotS-DR04*O;m_a`M;CGF@*>W-~2hhWyUG36ggdh|`m`Lj}YM*RAVSWr-h=OziDUQl*hm{k|bnFYY zqUi81a?xURqORc_Eex0|hSx+ZO~H$|XehPT7QO|yV$3pcI>{=g*F11RKMQ54NtjS2 zMkS+{QOW29WTF=)q>2tjlfqz`?LKcVy^uQ5=9)!A(9*7jYqz9HmXpWMF0P>mlHNn@czFz$(k_BjU zrxnY|YzRR1T6FhQGjiU_#;-=+%9$HXXezFtzaM~dzCXRdeLCYNIzb0p)n&A6`^gr? zc01y*e8}$VD!d6Ll!*H=-7`@*KNgNvLxra^^L}GY5^5Imxo%gLIZYF3M)#bJhd!*_ z1jBsPeD0gam2Be_X|uGse(o6B4%iwle7$k}A^0@3qL3+L;X zN07Jq2Gr&|Cn03WB;H*}W)#ldA)w23Mb?^7I0W5bq&hE!!$Pwl^#5b-Ti~NAuK$ye zg@D8xlxRfIMWZGv8Wc29s6j#Q;zpvy8WAxn(x_A;CV&<&VH3z2R;a}{Dy>@I&mthA zCO~MfZS?O?N)1!o>gtV9T3$bj(#);e9-9!SR0%#HWB;)W49X!*dZYq8jGejWBgS2PQ zV~yav!f5(%vF~Q`o1B?PC`NHE*nnL;-NwUPqTL{e@BpI-bbb0TfqhHV$Gdp?lbB$- ziKQ6hTrEOvV@fJp^RRO%EA+Ej03@zaiAnS*e7uD65d9I|Ky~$vT!Dbm)zURQ9pB8$ z#yf&B$fs8pkbWep3LNl~gBc`6^bU+s4AJ|8xeTdir84cM)n1f6zB+*zLSR>C^VdCW zO!3$1@uFz$=<(3n^N>X>Rw~AR8Z$*CV*Lq-0+EDYs9ih#TEbI;m|*&)oaT|-vU34s z1*0PwRfPr;$5IL%Nv@k8gVd}p1=OO3?3~RMgjW6vLy)K!W$`2z9A_XW~>u)-mL+Bb=pX!JE@@a)Nj^ zNc4UDydEe_0f#36KXHEITVvxz$}+TC`}`b|EuYn(CG6$G=nRF6gU3G>LK$&PnKX&7 zN}Hg@zLQQ65}eEeBq&!T5YMVj8Kg#iX&wE7u=%=iAjTf$Bt8C!FmW!c@;qJv3+3=L zc%&sK$qF`3I}8mTp&C3=H|Vz;6k~(=WzLq>!%XHj3JtX9#xM_)DlncSRU`chXrQ;; zy;sv;@g&840-?2^)Sih*mQD7B8fgHqxlzs|^ciPq_00BY2_MMx{7d%z58O2A-yUF~ok{H=d45z)!N6r%HIB|5g0_|0ROdIk0N za)bR#-<`(`^X_8dGLOC+ug5U2b^m9z_}AE&Z7RrIKN18zkW-av3tMiic{+OBxZ4YP zd8@+k;sqZVwWs3yN~~wVE>2uCjP?KFi_^^T`5E=;rynL`=QvEdOVgv)1N9iNxF7Sz zsuFhi^zv_fB{Tk%M;J0Nqk@*pHrc>J44_2wnvi)UWFg$^y~hD(>_}XrCsuFd&9L0u zTsgoDBl5(XXd!(nZ<2i0mJzNq#g@hcchxZ>0n*WA<-!7d6+GjFS;etr0BWWEu&spC zXV9S@7^r(&fLgr|n9*uxXK9r#e4M9M^rs}J4}0s>HcaoLeEEE7vT3dt=+*sfppS4r zH)@_0tr0dEX8rl76dhRGsw_T*sw zaEw$T{bh#CGPR&9IWjH4LxjU4Gcd(c%dhoe&Y_QBLQ?nTjLU(tDoFD~WV$d~3qiI1 zf%MU)&p5w~lL63ai1={OU zW4{>-{LoXZm9$?PE)lozaJewe@bHX!Uo%Jv;zP{{29_X4e8Xfk*fu2U%sCoTHwmZM z>R$(*ylHK_2xR%*c0_UUhD-;?^@l_@(LTfzI2B?B;y^+UWY24NRH&9mv8VwI{hp)U5C90|*kW<;j+RCBq<4I==eY~38 zpe8gsFPFT`?9T!$SRh1feIS^#e`&{Fa)ub)jyKp~4~S8Zn@epy78#?oMZ1Wt9|Ekj zRRN0lY`z|+qBC*?6fa4fsj_QGH5=7vhE!vZZYi9!SUoI6rg&7ZtitsQt8_FZ>#QFh{Y|UcFr^2tTgq6tPR+x-Yb~g0D|Qy&$Q*voVo9D_bF(;{ct7p-T)_ zvXj%)%?zzVN|J2uOt!OQ%RWbt$9CjGxP$d)rv>W|2uAv(%m^hFafw(eZ-+6dC~jIE z>Sok%t)IR3a{&|gkTTE>=?iD|dI|T(bxT7ILnU&TkiOS+lNsI_41a-aWzJpPiHuF; zNUQVcv7= z1IwoXn*r7Ii)%#cWf#vt{q0ycS2`^Jp5-al?Pxz zFZD1%?i$Wa?ZCcWNLXxa#<(wBUaI7I1L~=Snn6s&*GKS4#V%&zJeb239!L8>oFjuI zsD|5NM5Ir+Dg-ugG|(QEfVD8Ar$dSOaVZ-p3EDvj*1vz&2F;-R)*wln*0UTU6A)id zyAm=xjYE>^$PEy!3`A?Wk&vLtXp=Pl`Vi%?zox@>tTCMu);Dk0u52lmpR(38jswfTH>o$QW4N2Q(su4tKrtxSu36p-{1Xw z=+t7nH{Gg#@*3@R%zQiM>%QCHov-twyO*;9^L6(>#rjtH-p0dZ%l9cTjQF1X<_Z9m zs^&lU0T|Z&uMp9IA7T^0=JX4*nJ9AJfedzy+92Bt`_9Hqd_L(%&*wY@#kwf|^X~Hb z0s8YFMbdmNhs)4d0Owu&o7Dp zyjVW(r9Y>A0zJ=ApYIIDe|}i}=gIQUhsU{hb@2cWgOm<@MgVl zf%+7oNctaeW0h}9kNBN%&tsLaS)UBN8KnkJtB} z;ythoqBQs{eeZ7GyGPyoqOYob7VnKv_d4M{YZ7nlqLxJlr|`z*yzwY*SO<^7)d7wZ zas3C^*X(_NQR}gj+Mmj$OR;XlR<%mXVfJ7!CLlDUo>=$%7HGG-Ao{n<|`HTn3dG$!Kd9H#`W=z#iJN`V5Ypl|`LRORO${DmqaHo_;nx?jG1a zJ+erTnSXAB9+7j~qlYoGoPN`z9Xm*mpRvvEKA@(9J>t;8B&POM=v>1c%F1&2af>(h^B zf!HGts6jW_C09antlo_Of}7AX@>A#r3r?-XUj2tREwcM$ZhNvH!QF~Jc?_m=7)--O zIYZhqA<9U&;LWMO!zlXXD;Uq3a^BM0&Us51C}en?yo&*wnTy;|_Bf=o0l2cP5o`jL z`Uz$!(x=K0ezTzv7is{JQoO*mnPqs*zHg0tNZiX4#h@2g%C!OiPF5b1^Twty`Q4l{ z`Ft6SJAyZI77@nDmF-!YD3MP zCJmGKkO0%F%CySg*spb&gif3cugAY}L-%Cem z86$0sp4|KxFYsD}ye4y5GCU>yFbwLba1^})Yj-x@1SOFwfsl^-ckIV+C0;{cXI84z z1gYY!DQ1`-Q*|M^g{&sSD$q5Q@r_awv7~zTW+K6!0>PH#S{%88_OQgys2PGF18e#! zp_J+*A05#x6U0a;MKIN~iM~b00vJk&e=*~>I>C~LRmM7q)&s53dYkS%Vq&mL#$6Ey zujHN3&P-#*Y=$`kHRI#y{1q9|gbXWp%n09cv?DU$p#Cj9Gh{VS48(#Tb$HClJOFST zPJv9Wl=A@x9ao73D5ClH5G-Ns5Psj$Plj4jD!XB4|9!>}KJK`Rg-+s$avc(pV`$cj zoWtIcKDkE@n$ev)KLc@*i-NCjET_6~!SWO@F6g zpm#Apy9za8w*T|9sdO-BPy;2oV$*1hfe-=~h=O&=fy4z}3K9;km7P+3dNKJ={+O(Q zbw*EMM>V`UiUB$C>;O|wRB;MncJ@}h#Cpo91(y7efMmJ(SuYV8|_4Y=lkXe25Dlg(?7s9R?I(6d??W$s+@j`@Nb4xH4m%yeVvLqlKX7X|z#JLW3wfmjA@IF;ms*E`tQ8otRl`h$TxnIXd|D|RhDLD+ zxPSka=xHDy(&4*TAb?p1Fi&*B{3^u;69x)m$zC|FfDt+!)(u!3L`m`U9#Bnds)r5c z_^vbj7#aM8RI$c-;yN&7F=WoV|32Z+m;i44-gOyq{JCFD%yv{e0qr3k$kS6>YF{6~ zc~w^+O>#zj{<`V7q(ADsN=daTR$ZTdl}wi6O{;kWo?`t8$%WV5Rh_=+v+No^g#eNF zGC&;h9kIz~n(yOeQbSBQg@6?heb9x`#e~(G8Z^()L~QtL)To`<(w}Bmrato-76luO z(97fxElRy)dL?6_AT47fV&7?}8H;*%tJ*!d^549{@df9&T6b)rn6Zs)uaP|0+V4@d zswEErME;5xGR?KVf25srmiIBOAkiVA$ITSB7!9ZP`husl+L(R{C zYubp&qT9q=dd4NMY4gqO{2d=59lsOeh+E8!pPRW~V?Sd5#1&0t2$B8QVLf3Zwues5 zbE#l%Wenm*B7N7Gk)e122&a)a8T^xF)dUnd`~)e7Ps>QGa`F`R6H9!oukR93-=>QD zhXQLZB6VDgT*TqOTj39yO`!4TA8@Lajg;62QotAwfwuRkdAIT_a;gm9*r{*juv57* zRH?_uBEHc_sll;2Rt@M>dLpuDssjuXAjfq2fF0;@0C>c{3NujxKkwyH6M!Q<6Wl{7 zx>C~tp{<*QO@Gfwa5RGw09~kvf-4~&D8r5ozM3K|)$q9hg10RLLf@B9>d4{DbfubbbOYFFdZuZYu8S~v@Wz#ixnu#dP0(G zjN2q75iO;qEOQ@P*>?&v-^VDb>>FTnkxfC?@gJwV?D1w-NuB4H+0UTb~wDde{>MyG0-rFB7FcC<(Kk83I~Oh?95+pK2^qNJ^R<9KX7- zdqxUma9{4apN3O))9TE9aaCs;@NeCbQJ$7oH!2OY4vkRp)Tv(@i?B#0)PNNn02U;SrDqBI7AyD-ORLGj`2voJxT&UI_?tuyngB%?TrNsZBH^f*Ce}#6IO&baMt>A74 zo$5+5Ru%S0=CSv%fm!>>nToGW1GNV9f`u!a7;PE_I%NQ&3__FzI{7u7z(Uj=!nuc} zm(U5NU(>5;s)h#iI$1*oe(Nu+-nUT?Z0XnXYb-WX#sjpm#v-t-=c>ZY{p42IJODtX z)|u$+n!Y;oAQYYJOzfU!cBwNDwh2l0_Ev=KKJ`n0EISCu))yT3ZI``+G`M8%+`~MC z)F8&_gE4apyPBa^dJ04HS_FI+@8^kVXQR1(6(+kyOl5eJDp?Ar>)v8lC{z;g)7F76T?wAJ9YJ%94HrwGSnXX=Wst4HwHuq8zh6v|&1u z5Le7eE^cT8Dh=R97OH2;$UxNq-3rJKx#E)OPw^QlU?L1W_+T|mfn&EVY1uyFV73}l zz}S@9FL=J%^t)bTSG|(RB9BOo0n%wT$oD$Q79%Gz)&OAP)&Rq;zft(D;akoqlAV&P z-tPZ{D3QE>Ip0Up5uxHgp`!*4^OKXwMLo_D@g*Iie#++72|#2e-Uk zbL+l}V>B9SAjc-UW&$w3Lm*qZ00mYU56woEAU?Kjc0)KQ6uV&%fGo1j9uit2fXsK; zs2CMnqjfy?Gi`f(xh8uGY@j01iL}Gj+tqgCk1KLRB}jIS!Ui;GVDtH{y8KGYq1mHI zI#|sZ(se;5v)cWSFM#v>8sb4IBq>=@14@dPpW2ArYzX;0+3SfTtnv`(5-m(EoQyZ; zsZG+cAZs9Auf(o}+=1GbWK_;~QI}Mj$4c>xP@=kK-j3MA(+UYKt?G*!y{|kqS&wdt zGDF2psS1&Zl`(*o>lo0l6qEY=7;48jp)_*Y!t5XMlbfHNhaKlCi~6@Q3!0;b+mjLmfX1Ic@eR!4ckg zByo75780!>5T{%YBJ6KQxF5gt++el~i6JHFVSxuT6tL6iGU|?530@H*u&p|IMOk)` zTxjV^Muv6xiLA;|c4gcfDu?jfrxkM3aq5x-bmd_b1Em6*!dv-TJqc31vI^H=?;7ka z3RX~0_>UiKm2#dQRQA3t%RZHkm|;8LHw^+HPQ$Nk26xO^z&>G2we#Dq*4jA$JjMTU z;}f7#voaPBDPy51^muj^0fe!T5(v-bZwRG>Jc(z$nMPzKpce^s`lXOdx;CRWgVo~Q za$!0}y@WBKiRx5+Dm3KCFK%baZLk;2fq~TGlVd%0f@-Ibnvf4mfrA|=glJlgZeGY= z$geHX^K$Y)@t3dQD#JQ+kG(wvDghx0ENYs`ohJFl6oOdFh7ltQ#6;KbgY&9HDl$Pd zsnUgS9}OP_n&W6xfqRLdfPr5#Wq692#Ap>m4I7P6uE38xEX-7Av|!=~IpGMh)F-F~ zx%`+oquFtWaR6DGf&g!3S#O^lJ6aQ)JgCJ{q!tFJiWOC_BzuuHgl3y=)o(1|6Nsd| z3G2FqzvI5}ylTM8C#ux*N-LMvc5Sqws$n&?8Q-w=b)AHQH>lz|RUCT)gc;b|1}e@z z$xwI9dnI!T?WI42{kX`Hxw}F&^R2FkQ6lD+vqzo6V0iL@% zOquY6;tS7(fY#F^wZ6yEgKVMDmfFgT`4b~)&8Zc6sBns^&=Zj-; zOi2m)wWShD1Z$E|0T)hB(e##2oOhf$!AE%lzQ)$#zM<#UTD@Vd&jWQI(WXLNfJ zKUdj{A)SC+_4cm_a`f}{dE`R3AB&mDdDg5#GAHFs>IC5M~C68YVy znT@-8b72pLc69~0Z<|Z*{r5ww&N?|f#N6?vtfOz-m1gFC1G74e;(Gvo9eqONHA+Hch9D3*tA&jrII#1DRgyB8 zx`6Nj&O0=mCBy(Ps&q^~p=c9>GJd^AerR8uK@G8Q;)lGk8E=>o^(OfNQL+zc~aC&)r6EVytV)9ka#EAH&OZQd_WyH55qivb8F6{?hyT{GcR1ue}ZxU~b za|>;Uf11F+M*jHjI6=EQXmnaq8oPXBUW}{5fcF{3 zqKv9t$5)0hrHg$W*Ijo4=ChJpFwt1c?FncUs@NhlL8OG+{_7~l0m90jp~k=el#Uw*Zszx82vd(;fTtKcS2aAg!q7Xe~{br?#rKK)z; z^bkB}0z&$LjFdi-kJ7j9OY+f|zy-}rWz(oPhi(V%1#(LE!K5mF%LQ0c!k4n>gG}*3 zPNR9&HMw{fuN3kgW2edhf0||^X7@tP`>Nz_K13yPZUf;Z*~mOu&19R6rC?(j##$Ab z@!Woa)Mh>MqSj*aeJ>x_2bsEiVWdoYk&nwunR6LLBUrgVsEM=<6<6>OBpq3AFROIISYk_Kbe z#*DS{(tI7Pt-xG7CqfaD?08qAk`VSHPKImK3&%ps@dlRKqi6rFjDR%l6AXVD-cZDi zEY~rcBNAe;hgx9pmWc^qtXdwxM0W1-K=>Q3ShhC>`U=z6X)ya~#_SgXWKCyu>yuM! zQjiByUy+;&lQ=sQ_mkfqTCm=j)eV>CWp7}qvoUKQfF0yY=M-ENVK31k;qS2HP*M1w zf!sHW!fyw5YzZ{(IxX1u4KtG3El}|8jc1<~=~;-*=ccqE{$$h-T>ANoOkCT9EFtVd zk-BMU_~Rj=PdlmY`i+_+;6jGxejHk!8toX4q7^11bA{zXG zU(lW<;`{3jCBPpNgxLzTMWF#TvbcSy-}=W_?0~wtX^8)VvJXmp!#o%h;H@vr-@bgaYYr_XQ2+LqU?||g$?o!(LCcrk12#9;w%PZ zm(y7pEKv#GR2ai+j^_;@JI-U0Fy+bEvYbI!72cs~64$`x)-w+m($Ch;;T+glZgs!~ zSui)~p1^)#F9U>f@~Lf(z>@{6Dk9;JmT&wJxt_}>FtYEnbhr#0Tusm&0C^Ldif9ud zfFJJ@(j05nFn+1*X+?mppcw4`%UGNJb}(UmppQe-{sCZZWupL-o`wELh+4gpv{pH3 z`jxmx#IU_jt%}LQ=ze{{VfbK&!vs@W2a$%Pt&sc+^*cO-X#sKliAgll@#}T9R~5cP z4%Yxy{v*SLQ8o=Rnsswj^Q#UoNaxW`w*rwsVD}U`0HG(LXa)I0QCn7kyUR**uz`Zw ziK0*isR)XZ+X5duj4k2YVlNLR*ez8Nt8_vlCFlYmBlI?TTVi1DPy>(!LTIa%dnYB= zz5#Lp(+zr$gc0B7s!46xe`$g_@q7Yjtb&DtJoX@}I7>0hg3gVK1b1Gk(vtHXzVu zyzVyQ{Swk3pGACkT&Rq)d>!%iPf-r z9vvV25s0bgS|72?b;NgoK)|~Z-_m3@52G{JGIZNH2-bP%2)j}RYbw{Pj^c77bOEbJ zMfrM@<9%;eMlD}h=gP(SF&?>qV6wX#8AYK$1Zb_9q=Z7|Az7Q`w1^l*(ht6Y62ZP7 zgGKgdttHOtG0A{V%gF~wd?B{6kb2u1jiV@pU0j%4mP?*-7N zH^$tCrbq_qMI@{B?ms<#$eZnX=M-5Puz_MiKHzpBz3YR`h|m>vTCW zH9|Aby~d`Stmh8~J_8VXQDRACgs#o0mED#=n38bXQwCQnWmR^O-`Hn0)O?ct<0JeS zX#aQ%KMuEltj3Q)#=M56mt0@%t^e@2`sLkkUVYWg^ito&(f7qR=nK<5d%iqt_8XB{ zLa)6vA)zO}r3ekHE^&>MR{PM+UP5;fLhG?3zcr?hA~fu}?m~mm9AEGdl{P&Ap}B)w zt#wu}Q2R(t?KuB6>C!~9LnQ!Lq)q@UQZJgo;VQI~Wlh$j@xpySHB&?Y23t%phiV=0 ztaS$=tgW-T5<}l#+&O&5rX0cw=4BK;t z(hjV^TAp3w6?NNwQ2)bljW2ce00vcQ{jT*w7Wgr#4SxK$;W@6`Ug0^WEqEeBv;VXF zki(GC{Il{yzDifn3i&ZG&=8j&66?}`z+;$?bMO#&*s;Fun8CK1kbq)DWMZ6^ ze2HxqdktyP_F6;+NK$SnU!-{sptuEYX|@M_S($9e~(`i|Gl@rPdn`!Gv@&d$RMou1n>{~ z4N5YG2sIy4xsS0ZJ#YPsSg}_*%oYX6gcb!6iVSNu#$6o=@Y5V+(cnW+(9uu=0a?g{ zy5~zeehDH6j#-W?(w!MxXMHy#DehHkR0h;`q!VV?;aB|lh3u))D!)TyAC^j+jbe`e z970TSM;Ih#MsUgCJ;5c*%JZgt$)H1xq`3oS^a*yROun=dCPu-##L(e21dx z4%|JQCm*N3rtYri-5K0NZKIrCWgTIFTwBq{iqUUlCi~#vFA#L?w^pM<;0 zp^5;PVG}CLI#}m3fgbh-;M}}nBnHdtePacj^ov=5N}#)rUA27|%0+yW&vKE6s6m3P zg=^F(DNuzQYifkV3EsZl4-@b7A5k#THvCm-`Qr3+)Yy+Zm$0$1i(7A^r0ZB$7Uj-%IFaCN{XL?J)G zdbU-qwP2y61^@aRsge05il%!VEm*DYuHoG}(SoLG>#**i2KUi+Yy~gk@ zPJktVy(?opqe2I20e(nK4$w-eACm+PZAYLVwz}&;v5t@Nu7oI}Lw;&gDerma&DVMfYeI?ItcN-Kr&MbjmqSgkbc%72i6 z5(@&VrWYJddgeiqq-Rm!@ClAJP?PG_-Pyc5M`==>^?5hYZX;?;T`kOob)YnZ|-2$M^!82Y&M_K+z1I8{qR676_EFllB15-ASFrw7<1>NdO; ziH5IigG4v0iszv4kf==Ey@Gcg60PV85`7RaUh(wO`UX*$Kz{L$ZAwjtNMd=p$k&k- zNS4G~S_cb>OO{pDPraf{PYpky*qmE=1o-&L{X&yZS>SEZe0Fw~)X7FeJcAFnk@w)+ zDO2If_2lzrnsw5O80-6zBQw)ftAcZ+$~@j{Pw2Hu&r7ml+ZlCKs&zvNh1P9XK8g~1e{ zvcWRz;$}OP@yQZmE8!$a)rUWDQ<)%VrUs8Qh&v38J*~^`qOE&5j;7^VOLY=dK8+?j z>qd?2DuAz{H;D2suRIZ+t$qQCnmLsPY)*p!F;9)N*fS*{u{$>c5I9O-FEi#!x`c~q z)|!_c^CKN&G(@86KyN?QP$v{kw>mCv`+d^<`zWGQL0olaHurGDG}YvlFDA+P*;YRv zh~G~C{b*&sVVk}FPKZb1V}-I%vr4dI#17If&_Bew*YXDlHH932T1r&!CARG@{f^k? zcvz5Uot481hLX~VALD%AA%bQ4p)5e;r=?}h@m9XC{}5Mxm8Mu%zvNIh#`mSacrVH4 zdlH3f*wb%Uck6i9HtZm0&I*u|k%RR?Cy?`buaS?FXW2zOX8#69#!PDR!9uRYRt!v_ zRbO|cA_xe^J~QR-Ho@DDtS+wX2l?wHux6&Rz;~d(w(kh8gnyuqZRb@Nqer1jpF)0v ze5Dsj9~nP%x){$mk~jArk+DCaXu8{xyerk+t9Z9obus=3v9p$^fHwc~(k4NCwKw|o z-aCCBJ)%SO`DDHT|0#=((dX;mw4%>(%i5z)xoYBC6dwAFP zOPr{~P<1Dvkb^i>q#C_TTHJ!7X*TWOnxkThMTR*0@<|TpRcgIR(oW7o>>>oNc z6JXpBkChStXd(rh9Na<&2#AZDLWxE&RO8m#JwLTXAJAluqpyzdKpepU+#OVOCZG%>#QZM zRov}gMpXSbqww@Ef3NPA@vhUqT>cZtu($qYesa9XQep}Tlr*UL0h#wtcF`@A)~sI75nTxvByd3GO^cnFVT`K$A{5B=w1*{6Qg=`0 z-Fh`3Q)B%J8#G6|1847mOdS4+`HOi}K{SrPa}oTv$=^5U34h;W(GGvNpX4H}1w40Q z8~iO-RbGq2!`~6=?peI+@b|%;iTV4Q;xBv$1r7E<`uGM(H@2V8{(ukF^&FN zFx|$&6~vQK@j^t-ZDPFR7Qwig1>S}*OFuCl$f;yz8L5sytp%tpvBNdM{ZY9$Va|G2!6dqLXQg`p>T?f_gu_rS3k>yAG<|h-zE%%-tyv zUreEWM*ax@Ai#GzW85XnJK7}uuLY!ra0{_niGHI>--OJIw{?d|w2AX;vBH=h9GYY??LV3DQvaYa|3O z_DnO*WA*i!wJ6+a#?0|@H~sg#J3|dUO@RSK@9W2B(EIwDy{~6+#Ax)1*xpy%e9I(w zq?r5)5RCKYniOfC@y!F2{P-y#rYC(Oh*p{&bt8xl+21S43}}do9}>yyuuSzv!cehp zwg^|4MLY8Pm*ZSo=kvuh>x0MIkk=zrl}DoR$ZJczG?c`=`n4}YsdPt4?U5% zf6?m!)3k9P@wCf5M@_xepY*3+8#A2`g*^B$NqTu{TV<_m(W_@y#(CSkZp5Dfb z>h4Rt+p4#rI@9iqe5rJ%t)2e{f!pZMcC7z4{PD!}ZKMCDx?1)S0VoG^6XO#XW7%b! z6x|gT#CNmUYyU0%*j5xBA?ptuci~d>PpaZuPc?zZH>R|cvR8T@9B4NEzvG9s-nj-{-TGud|JJgf%A^YWWabUt}~`A#j;V7 zRjP%wVx-kJv}z7p8QMGRNZ`!7Sb)H)OQrM3Fxa|4T62eDf(+z+4;<|hTB(Zl(L>76 z!p1rsCpVwtaMemS3fIu4|1?Y5-h-lP2EQvN3G_ZrSZzUI_>T#EYNTDy5IbW-*3th0 z@p;Ik7|A&MC|k?4n(r18ajnSYkM>GOCu)}`e> z2A8&nF73l6kaDR_%KsKU?;@H%kDdp3vm4bMl`Xm65aEkj!E`f=4%2g+?3ax3sEF={ zrCCQk*d9HvRjpi#!b8t9H-9VCUFaB4P+7LR~Bv8N# z5FHefoywId){0z8kh%8$#GigDz`CrZqXMT(S)EK(RPhBcPwsfx=nPBP>n#$7cGp&u zwCNLBfPu;#xmh^2)m8(^HL|s`vNHKfVHy{ZaR~yEG*xj|6rMoj<0@(H6BG^~6g394y14{g}Z>Sok>p^;P@>g*bHI*7*JKzb59utFasqHo~EX zHQft^4$kmEW13=zB6eJQPpZP+#{%`h7i%vK(-b>o-%ECdj-mAV_r*}!P4Bt)Mxp6_ zC_L#bQ`Ft-dG{6}vXC1`mOy;avOC+N$Lkk=3Sur#B>#!$gH~$-DEIA%pmauI-DUi* ziy{V0l|3t-Xg=s)(}_Ulmn`rd>|h*(CSrUnEWmA=k3F)VvZ9TmzIE!oq)qIUxH}&- zP1Qdgg=aqKe08^kcb)m5XFmZE_BJ2XvHseQ`x47jNBV2$QevSU3O!y4l|5rK7ht-C z_Y*4h{AnT)_ppFcD~scLLDgj-tN{30)6J;EIJ&24eaAeo|1HH;$0+~cU;RGe=WR0DEAx+Hx9_WS>2t( zyRq?C_I-BzwdF$)tF8F!AmtxmwAdk({wxgqKeWKW96={Y1MpuQog0$D$J^>9B(gi2 zvUtY!rp&_VrOCLLzEsooL@@I`7EUtdX2oPSL`z8ui>Lr|*eC%}1Z*sa>iDH~SJ_uW+po2Lk` z-(i6YN@@MeIEGjlGa>eMFBkcIX~{b7ju^#rr-v$4m6K3-#_L9^yT!cgjMqK-K9Fu} zeEAK5bi1GOl0|vJNfEyH?s_q4Q1Ya11ThOB`gy+c87Fbg{3_o|c$jQGcqMuQ8{Yn@ z#rk8e+Nu`LQgp5-R`{n+UxFptVc(4?>U}%!ku82MFvFQ+c^?9aR+Fqh-KMNw8s03L z|6-C=d<3yg&8|;h#ZT5&X5q(?|H_lLj|fKOxz( z=^ks*d%(E|0_In(cQH00OHURME(ST9IbLgeIjJzU%sM=r;!y zAmoP7%L`y#zBTBdyIUmRC5Ii9JU-3mQ|oX(c=c85s@CoCIPM(ol9b0?lAt%OTH?u5 z(voSnRBXNRmTsv~b%oGUv9$C&AJ`+#KOeQMHc(51)r#2obJDpOFZalbea`IZL@5WI zVxBV##$zq$!k0WQ4IF0BL;|`zw7%Y-=geB&-o*&|9b6!r!{cTb^0?WjZ1g*^C1-u%IPD^h6m{ymg znXzR?A;nf#KbqA)Y!fiH{tleqebwS-*dyJ`%)?%`8D_XUY$k02+vePm^>$VpxV^s# zjkkGzw=t7P0VKjP(HY+BE5`7=>WXuXMQ7o#l;Vv1jg_b4x(BX%aGK<#kSuj{CAX_e-YjqtNbB8<)RYV&-d01I*NwQ`Zv% zuhftGC&0ZWjy}dr=@P~4e+1UU_ynoJLy}q7v=V!d98e8a@`RoG0dU7S@g!KE3Xd=} zKMnf{;Ye(>=?{`(7}$f)0NJc#F*`0K!?yDe_bP0w4wpE&u*{%JM51!20- zBTS&-e@vej{@$8C{?_yvinf0def<9!eY$_!ar!KHb1(EUW-e0p14frrg$=g%vx3_C zwk|;Q24~xq3=K86RE|-bFhfM~m@LP`)3FuO7yF!#{mPeDjx_6sfZ1KS#|q;ayo?H?f12f-~DIU_;pqIeZ28M#m~>?I>NuBy6ugB zc^$%U@x5*1x8iggzuX$(UrIv!V9;O*5XnXGKLky>8ClLzoa>Cp?(Rs~SkyZMo7@jD z<}BhMNN9JSF=s3LsiEEdjM{VIAI!+;E;u)HD$ZlxV$3>|Q!&_vZ`NR3)DK9h-qSDd z4P^Sqmv;B(?%MhhcGrrnkEYiYyZaD!XNUK=oNe;!w5~s8$55k(~$hHDlBkn z`cV|3(8bREP{W2HRn1)|8?HP>4eUdRDhn!$U+RlG1L4hP?ryX3lMJ)#2LYbGau7cE zFaZuUFUXVO*YPx69BL5gyC#_2z&8*#c{%rzAN4go$;yqIVwlgSI?>WARiP|CUQ8a%-8XH2y8uSCpFJ z^$7*Iwx!|__?@iKiurO-Ax|LEvFu6~c75$?uGx3Jnf#TO zB(LTIu%??pt0Le`t+NgPc{YXCa$y4U6N!#%2AWs12s3=2Y z_I)Q9>7G`EIHSy1)IBZKcwg1dgC>uG(<%CGWjCBukdjihb5sTBwbMhdyIt=i-4k1(Rlm zj6gMdrj#*W()gKDKH8YGNy&C`ezi9Qu=_QphK*dLwZ`6xCfx?ZcsR17cz#%}f($+*yJF*=Vr zuVbMYqTl*`E5XbX!Tbeb(LulTLu4O!l)JG)j%6Gj{m@}l6z7h{+b*PpceI|+?u(7u zZG2w`53Xn@K}czM5FNFg5JTnTzoR(b0AbiU^(3=kk1^{t5h>W9mAD9mo6X!E0golv z5x`mGmHX5W%CBw_m#N(PTz(Zxf;8Uhm}aOCD|GZr$JwzM3P!lxs4b;>w!%3IO4#cB zhZvks{TA<2S6(KuVu9}2adlQ71~t&A%1&R$$cna)*6(`BhQ}WsB*kV`Y*fW5>e-2^ zI93%$sNxV+9H@#6RdiKFiYj)iTE0`oG*x`AifdF6+umq(bA>9FsbZKaexr(qRFS8O zJ5_OuD(Y2HBL((1j_V)FK!o(Z{jv*X{~s89uQCf(O)D@K4LT7)>~+6k{C&dE{M8ko zgDqw7!k1 z{$$*=XM$Cxp(Fw6DPRn+6{3@ejauq`7u|*)eSP{^7KoX-=mMjMvVp3dg(F)8+xd$2 zEV8@prK-y6*@)4Mmtkn)#yeelBK=dJ_qm?RP`zEo8pDrgSCMWJT_QR7Vg5$)bfkjs zVNZNXzG9!Oeqr_kJ}mgwnA1rfDtK0GruUol9z&i@F17&7&YaPJfs66f~ihMKz{4To7D6yRDz@8 zm;=Q@E&-5+->LyweYgRH#jB$|xZ1F0}P|V5K!f24f8u4|NnlQ?Y z*HqRb2kX@Uq*LR{a4Wju&_vM9-uX<4S@aon%pExco1{Wyt+M^--FRqi=_y9{GF6OG zMdnKo{|r2K~%2ff)OtD8;>Lo)_vMe-fwLSMBO&%v)j9MtHBqtJ9&a$!7AJ zx-r?OnPK1vw9>5AS15}6$#yZ0m^8)d;85s_TSTERX90C6MSUQ%BsGi8aC9H18E>G$ zIjyFlq7wxHHJ9pK!7>iQE5)wbb&OGiZxK7zs&`gmuD=vAALF_aaEJ zxBRqe)S%e)0f6#+ff5%ba-sRS1YP>1rk=sb5NKjB`}{NOhVBC}nyJA!wE09cQjDJ% zs#;^dWGgVvNHTYPP6ZA|QlY$C>F`4>T_-*t-A%y;M@5oC&0VMaqyb}*N-4#zqiIoz zdr=?L!5`uKJU2JAv#Sx3GizW+&c{Z}87)=2^C~v+t(u^yi>?)bR{>@vSURzpwrV49 zLLaBBN;QtdNPAaf*2PkL_fF)EiN5UQ3-QO8CHu8NLrSUgg&0^lRMd}Lr=nz7K`ect z2;l|2Mh`zs{-8nOlS2MjB0t>h=K0xGyc6-g*WfuN$~7(o!*AU;lS(2QCr3ruXc0u> z&h%~86Xm!PDw|_h2EzkWAV9_{a*@>No;$_5^|@2R2Zv&)U3R-82B^x$&Guq8dUi@v zD+~!<^bZVl<%%PLR$dR$)aNs#cvclxErpnlho&a<_rGIbBGG<1%2~x5nRq!=qAI&CNuh%G}2V>l5ZnPLFEV<*s zg(nTUxIAp`_!tL=LQ{Ij9-!K2^)Z)vUy?UA*ax)czDX+pY{<#bo=(P$-h>b0gGOMU zjYWf>_@N9VqKkd^qZ~gpoKjeK15SI~lWNSK11w)gZnzS<`KK2vj~b8!N68bgy{N9#E1I)gyX0T)!P>c0FNt!jrdR*3>{TO z%x*Bug+^pG-qLOh2lN6E{*eQCMP=bQN|qMlo&N9AtqUJWZd{AOgq)@EhZsyHbTU6F z#~%o}?7gS#j3-NyOo4JCQ8r1`Vn-@KO~|fr5oW-8QVWDFMfyN12*hS0SFe$BPGs;6 zej!e&r828?6$vlN7IJ=-0H!Dr<$;0Lt_@^MASE2nt7_tBS?5%i}LAb?IM|CEu zE|x0hXD`6380j=>N-_Tw#7Ta2d=OT31VK2;PcW>iXNCMAhy@E29|q{9W_XYslAdPm z_X%}RMi%MPz&#-io1)BQNq3gYnMW-vm&5En#S9&3EN}uo1*ZZ-!i~H60@^ENEoeVq z%4OMAC`p4-LLVu`TgK9@X~v8cTm|7|1x{4lKsZq`;Vr@sV zctm(&=V8Y!CmG4R01mg@@hLn-2An|EImt;y;m-rPZ<$McQ@_3P;|n&LfgRh?jp$Ys z{vy!$<7vU%j|1Vi@M^}s_%?Twxg=bt{sngYJD7~)ESm!y{B7Lj3+C<$AYi-djX`Ga z29i~2p>p~pzalr3nlu*JAzTXp(-33vn`ZT{G@xzFxrfV{t9Nlc-k9?UXGcT34mIWk zVDoX6Y1EwO6*WvM)h=~9M9>RRj84j48?ZcD41SOZk4rWjiNyimVqp$ z_>u(_f6^ja2Gszl2LUH_b)Zpmmb%I^YKEw*UPjHyxN-@PBj1DJuUHvz4kmv?;!}+B z&_VWQJ%mcoPLna{96od{38MQK* z7r6nDy>85T9CfWq-TxFk>QezfuqVr?9l`oTdk(C)5`TMFjKkkUE5_n)FD8@fIMU{N z2N)1b_&|6!=6yLGsCgN!km<@jhZ?mn0eUlXK0sS{;}xq?Pd&v$43J#N!*0o!CWsRL z%G7i*L32ocfRazA9qtXXNa#cN;gIEpFCDT>WrrVRi5^St>T^aRn`zJ4vMIq2Gh0Dl z)QClX)+;wqHiejO3{ec9y-ZGOiBftmP2qpSmx-HG>J`0@6M)c~3`%vxcVuGlse*nh zI;9o(!AN-m@O5?V2!BE}wCNc^@z4rX6mE)M#~D8SzJuZq<54pNu$~?1eYEXpVML8t zoWYliBeU?D?Rp`*^yVWXsmH4rqejI7DtuyWF%GL@T(z|s&~f`2tG@L07D=hY2)e+n z_#J&x#`t}!o=GSk%DRUqD-A;5LrlDFOI)CY1nrPjHI_&~VvPG+kZke5w!^f^-O7I3 zw$--bw*7tpI63y4GtaH;HzcOSW1p0<4*wt(D!;(Gv}ON;!s5Pmj4s`dG$9WoF1J6;mQRS-=xR2s(}gu zxB^VPz4ZOi8?^dQB;oYngb?m&!By8{6UH{xEz}KAw}DNd$vcEn=xfSvbPMD+crCxt z)kn!rrM!ojGZ>zrW6nVJRxsnVz-60-je*A98Di-Wq+F9OQgh^OfAbb^bXJY4+rQ@8`AI~pT*6SB{S-d&k8G`!93kQj@HW}iL&^l<9& zr`L@--lK?0o1$aCqLk0iZYC$8P$p18%i|wSXnK`@%`JBni1t6?Te5-cD_!?0m9%TV z*jysRyFu=2GuDRzO!Y42-WfIAs3;KH)y;?;DAd+{o*H~Wo9s6sG4u?omlBkY3*8o; zCs{{H*Z$XXTfNv3iug`=Bq7a|yZZj>R>t3US5<(}rC!@1tL-$~=xP1{bqj{KMZXo7 zRn99G-?Ja*OMwgI6w1W(~@V?9W6O!z1EVEkpagreAtSH z%z9`{!3V~y+d*BqxSn4)W>|%nPCQG&p>Std^RbTPzh^YsjAK9FuJo>s%!l5U5ax*Q z%fBU*Ar(M8Ga*jz3SW!WJE^2yy<>BU^o}HR`aQ2DkRW#XoG5Vfhrgx-z0!o*W9&Z% z>QwUpKgqh_S8YDX=Bsyghv*t}qRPzkR4`-C8{|>-uCDx1bEf*i93}47Bv0hE+B&#c zjOtD66hM~8l6^MaUp~0oruzdstU#nY{MPb7V>2xN&d!|aylU+@Gj|VsdC*kjo#h-q03Zjje9g|Pj7HZO6$Ycl?8KJ`O-?6~Gh3rE!cAkDii|93karEI=> z7sslMn(2z8%(pgbBqdBsLG24Vu1~sAAF&vdaBL}g0?~$&*7Gkrk)(~rG1@PRDe-^}|b|1g{YeM|bFHn07!Ghs& zUP-v@S8e`xY`%IIQ;Ch6=P9kv5J^Z=KbYTZ)J}$s1VTS{$0{Vy1U+}G&e$^fNa_9b zKsGx9u|6kn#x&}g;oir4dM(i(J|}wfvcIBSM0}n9lF-hpSYa*JaENGVy=$#)QcF9A zelMXy5dte4_JalXvzccO*iYM}VUM1McL=bh06uR)I{;_x6=135mjhfvV5)a9DbuLU z`4@-O6Z7CkpTZ+zkESpL3v~+1w&d;XV=S=_85)Z6gf&!Vh%cNU@B(+n5 z7|Y1RO;%{3EGk$t`S(E#L)57s#;klkMU9)KRBr|Fr3{^;mw`Sihs^u0VOJvt2?1J7 z^Tl@^qK|(>ZtFxNblFQ$J6y>NcWJ8ta0r1OQ^KT@gv|`+{MMw>A3*?&{mNE2agEv= zs_80i%Benq!Zn&r3k=#4VUD55!*ENKYgnx*O}n^}%(bexQWck}VvH)zQ^g0{a#F700NeVjdDCK1A#rlYQb{Padhs=7H8KU*b&h(%TmZ0g$C3w9zGofF2gG zP1z~8_99`hnPt`&BMA&cc+eFyjA^n+pL<>}!zDQc9m>E*_$9G9Gl_6tEz9M7YyaD6 zaP6v*X;F;-q3IkHOq1rA5GcdDGkouejO4S62FR>ck&J z#)OK1Ax98J<|+ZA=1~9zd;B)_!(u)x)(?|d;&+*TX!1w7+(bg6lt?{hX=jr`m;@l1 z&>}Wzq$Mu0cwu$EMS&0ENLmO6P<1U!Si)L}#33&TKVdCw;TppP6OpVlUhA-AJwGpo z>xE#5NrvD;ST7K8ZrB0dH>vOnAk17Q!j6#+{Bj1ouaNp2+H>@`9pJ59bD?=)m(n~k zjXONuh&2-FA70L6<;<-t(2yVP;5XGpbOQk7(fmMi04>OX(QV{Phn8=s+SPUP%a~3` zzHuD#akH~(-mN$m70r?Q`pk`~4;ADP7gQxe2;o~{EP8{#{E1Sn`7S;fm7S;4%JT90 z1<9cm8>)79ojjMHVqJi-=v@@QRkef~_IOrdgtn$2V>>}LG(E&0ij67$rUT6u95QGx z=r%(iCCg_>ZeBYbcxF`X@>gJYC&>+fy--_(x%pj^UoPk0#Ox8n2EbXJnI`I;*VLJr z3s}#JRTVeO=-Hw?tn~IHOQQCTiW7}Rrxxb#z^RLbXT81dQ^OM(0WT2?U`cA$P^KwP0NWKwRDLQCkN3 zLBB2fI>!=Afp5Spo!kl<&^!V;kkvkXST9C^>A8bYz%K|i7@>TazkwLG3tCya!m5h^ z_%lEb$XguzvN!xMhTqP<7JCdWvBpZnnr8qXO5=sx4lZVEi0ypX`3hn{{&Xzl>yd30 z4JgQ!qjuqspx^5F=S~BFarJf;YdtQBgUn}arXh-u@UTh^{DCM&1ztbfC>{%ePY*A00A?_U-dW_M-6j0q7Sv4f&~2`DgI>;*WIolmH0P zY{|``ml1yeR*Q^~U_=VT&J+Pgj->+AG9e^KIFKp#xHvP8T<788(7I9C7u!=ZL+gUs zV@07v@2=73Li!!S%OU$jt0227LrB(YzHS!mHfGH{0gV={HfBx31!Wpiu3ni*56a_R?$XTjH@@=Y7r>GRK(0bk#8})IsBV_IwmH)<#~cVX_ciA5ObJ{ead0FY z9ZHrNRm!?Y1?~x9L;QoXB%kUw#bA0ehZm!074%8O~2@g-J z_Z>2VTYDO{#rzInsy>XtOVOI}$gKMGoq-pjWanpqzO@{@=2PmD86F9tu|;=ePJR08 z>PF@a5#9j{ z(@;qe`u;Eh!}$XzYX+rWk&r>tOvRx4`8w#7kU=GQ$!5?P{bFJU9jD$D2KCf$5-l*r zPv{odU#ojy)Q`iZZZOKIeT}r%WHQ6Uy#Zw23Wle400~mai-IKX!oYwQQYT$W#P`T? zD&ABPKI2WRlU@Q?NM(j=nWumW!@l|^3lKLHVrcwyGd!ZOZ8_-ooL3GoFP2aa)>yYb zjqTo+P#kQwhj2%dHe$FcJTJo|?j5m3c&LSl9}3S$=%=@Mc|MS}{Z8H=grEm~9P8YE zBno^Lw$MNX3uC3+xOVs41SpNKk*W)lcB-epKt^XSUy!N{5L?2VXF zNAp73I4exYl2O26!+p*Ho^SDn(XeTn7pQ9*Z*Q9AM zczym^LR!Xhkq!i&fUMX%9Py0AZv_kkU;I!m!)B=BdUOpowSoKURJHSz3PLgRe*(qn z+*&6xGTDq=oC?Q@B>^7C*%^*A7)f9M679)+NvWc_q=RDklSTPNETH^FciEehHZjS% zZY64kdcoE(pBmp-6eBL~=!TDQXfQ9CyN#7WSFIgnCT~>5JGO=yi}vH{*V<}+*OsP* zS5U+S4DgCz?3Gsm?6A`jsdn_OFEVYhK)5muU9;#!I+}Xl1HXGADLP)9&OE)s2HsAn zfglT=X+?!Utl-;7M9`$rQ~)*`fK{}UR92%h)eslB9}bWYnXsj3s6LFYrU?t}MDq0z zMiil)eX#Ew>4V@%1i3rl`o95gPlG8UDcB@vg}{sL&^fyLJb$P<2^Z5~QdO zMIgKdkvU{67=AnYh(ZEOCr%|LLOXjIwP%rtp*>v%ox$h*FVM*YI$ph8JnDY|#iK}{ z1r(iO9gNyZq>on8U}QLUzgUGd%CFrBw<{F22-yhO$u9hDFucAfyiq#PAS%-GA5(I3 zpi%pXl9nz)-Vc8Jzd&rGY)&Hv2g}5V`+&>N7+kslm+0|IB6=G&oLhrL_ypu*{wE+G z5(DztyRkeju;ZNoHv$ZOQJ>BcV=KW4D8z?3-Yun91>JHRIWJG)Nnt5$D+J1xry^*l_R=Foy<1ZQ~@JL7M`q_@qm%@*!E?YMfx z%a(aW+bmL^*u$cy`nF=x4m+%3r~LnzMdu;+2ZIl4ts+lv!w;28zYZL=pVa=2>woHf z_nyRzy!1IzWLB{V_w=NB>%|onn36kVF~7i|9Nm2(=Qh!4s=%(HdMOZlE^S3IZHi}W zvFu1ReyyzJ^ZjL@0Dp@VnIRT!0Y7um|2M!dM8auNq>dYzU`sNrceq6{N%FL7)+#2c zJnd%~%h&tf86bGBlOpp47H#2q?{oYjhCh4jLAA*ndz9#x@#r;Vy#V(2PZZeKOOg39 zi?(3@c;Wvqu=gPBj(Mow$r%lju>qwqFUh)ti8+Z(c%+=>ai2-ozl3o;^q>bHvzh@R zod1S4$s7o;a*c8aq~Fo8FqS@jpjV9M0kY_5zFHBy?g^&Z>qAjySDZ_tsorxLk?0#lJzxKAtjU) zoNr{zmF_vGUG`$G zZLjFs?7h%obBE|~FY|2^(ZTD7nB(vDLm6!&*4>!tW$=LK{`-h^jKTj9Um0s0gu&n` zHu=*$oeRvsah0@us@G8T9{Rs96b7M=oQ>#xy_>Fptc#t-;?uC>_mHB>tFbR__ShjD zkaGrfhlF2gt5YbCNB5;5&&Mt!K!sSUU9?! zOFEtoU_i&wH?*YV`~fZL=+->7#2+7o?~>&H6oW9Yfty+jCcQ?Jf{@_l$T{Oln4ypN zO5!+a_hM4meoNCTM~8?bIE0y^ft_t8c2&7By=rhp*Vy#H($z?eX>Zg^l17rTVU(G3 zewe@g0CW#45{#Zp5CP8wfVn-I^oTpMameqMoY7!xpY%O61z296NsJMmui$q;S}gCm z+AnDV%<*Y^9~?&P9?eJE7JRFRSR;A(NgAxVjKv;^yYv8>u!p@8prtbGWdKhTcoPW` zd5q&TQv-q*(z^u^3O#ko=!-CkX*`Q~5zc*?l*JosREpTRZ%C1iLJ?4ai5AR&%CT>k zjqfRh5@<~FYP(ug-l281hmHyD%Ji!*g5r+uw25qJv zTXzK(QMs^q85b4@;|pmbLqcFjmSJ_}n?O?*nY^8#26mU*-raWj5i^Dm0yBCM|k|cl@i_oHd{T(V( zU|zzyFrl%_)lZR;6c<-=L9u>+touD#ChNsr^{*-k4(s9&EZc*Z5eb?@2gD~0>}q4w z4Lgw9fP}L$EM8*ek^%Q7`;4;m<@nad*R-)sS!h*RVN)5G=ewh@Yr|k@wca6)<5Qb< zV!Pm496xkbS?ELTBIi+H!GCv1OIrXu(t=nRo53$QJPey%8;#q(qF4c7nlG-K)kS!= z7G69}Zs6)Lqpr-O-Yn-EF0DNY=hYwT2@OC(C)38U2+(i5${Pl!>>30=!I(e1P3^9sMsSSu zt4}+%vUlG_&CBX(dj>h0hb)W+;zzuMQpnTE9(N4y(?!aW?r*eEz<`YQTd&gh?ZxM? z1&^->kk+SFhRht%LjJsLKpq}^=JOfO{po0G z_suyxKJ8B|5gLHpch3<{?*m=EpMCRGn4;Xi@;LltJk0PZJ^2U~HB@9al(%odVUARI z)fI(|T@|aYZdF|suqy`P&{cuS9kTpaYlen+%@@HH{+o<%5RW0i6yTsj{T%2(ICqe0 zqMS{rF>e48+&!yjAly~bWYo<;OFY*dBSY(A5(RWpu6>hBOOC8^VU77N>F_4I1?n|SIZ7Rgv@k*Ty?ow58KGds^h zFZSpB^b^8E_IiGj%*fC(N(p7bejP7if+D@R6y&^onkD6cENcLkNf*aw(pVMpNo^FO7m zP!yC^6i5D{P!wrq`$$>vj!i_iA*bcHSSuu?NRJ4++f~Czh!*B*KSBE~(0J;8aBSy> zij=@?6hX(TzC43+1gB|X3ygfHA=Jj*;qKU;io2>n3*)*9k*&QN*B9d^6xu_t@Gn;> z=p;)cUk7pKs9^Z_X3M8VIh znA)YpfoDHC2`w;!qbVMir`zq?w>oNo%fi=^>cA>);b-M53x6!D0R(Eb8KQ+B{*Jcr zo4mMZalYrs2WU`{%GodoRCKlBDQ6oPtk+2E@ix$$kWuGrO6M&sd}ma~BAr-xDG|Dv z7QUa;`v}$hAI7rx?16Z|#t)Lm;b+QA1iH*n$A-%?8~)I~;T%|ajP-x`X=}t;q0qb6Xk5;anv$H z<*@MC-!=UIK|F9ccWAYJPyectO;&doKvA@BqNVVIlujiWr z_nYN>vzBI>YdJCDk%--P$2 zVgEh9l;Zr05sM-Nk-UQRh|IFWHDx1L%mga_(5GdEZ=L0kx5XSt7I=4sh?r zNPG3gA4Ud!bT$*SFAuJ*#vPLMeTD5q+L{d<(Elww;iun>!$zvm`pZ-06kE9^W`cC0}jhGPO+&-nekqorAme zFv7eqIk=C8=;}GS*sbT_cB)f3xSu$n+RZ@-^7*0<5PqGi{WV@P`_|)r&nl#t{f7Sa zb*&IGn|gumg!sntY-q0;_P4$%8Fm=(qR}kZd`QW#pS#8xmMR5)u3|$$IQtD%Qkd2x zY?!W(x>PCfF@|OTO_hwLz$<3CQ{Zb=2~KeLAqD=V1~=LFGP^|z{2c+IYf=h4p|HoR zpCm3Eo7j@%Rs40B{xx+9d|&-*LJIsbcqu9HcDJWw2XC%=bX1S=>XD`%Bh}+d^|)9) zhN{P3D$vlnRq<`T@%=)wKkhAZG4M@3_iN>GzZQl_&MtWp;q*HBaXT(1xQU-A^xx7A-E%Z(m_Um zoAMA3>J(V~8g7ytw-LdWwv&f4;x}H75-3K!G^_!6(I+7aEXiNYGS#jB3gs+@g_Bx1 z+0|7mqvjOBrv5GbY|J0fw%^bi)efe+$>qc8{V(zj9Z>yAbT&Hl)bKKr45R*jRW+j@ zwzS+#wPJS|SCgxw&H+ZS1SKLDi1xwz7uSCr%95~{;-e-}a|6lNQUD_ak33AZWC=8p zOcZ*L9t|_M4+=_{XOflcR3tSh0L4zO~w{n7B{YUCPpXY%c8STgU~P?Bn?W<;&5OnzGBqSAIfJ>W096_A!y&zUuMgg`od! zE$I(pXPTkovHczYI|RXf=)E^Mv1P;Jg%ig7J~`GcSRiOdwnZKBcujLL3tRIhmqLc` z_wsIL>ypcGX4HmBix5G(yFg%W-~%w{qnZPA0SQ)2m_ciF9pI(kxDQU%xGZ%IXeq0? zYLu)Te=<3m-^yjl=muN%G--=tJ=wD#C2@d3>-cXmay%UirlzSI|0K%(d))Y!Q)&%T z_i2{~H`ILTTi}qvU$XR;cCv>vx*9ju&IdJ`2U`=*2Q``}=^tJ|quHI%=oVubRBU(j z9|+!$@68Q4`CE8#2rksa%(UgD&rk^Nm3Js*zdKLEAJ-o%*wag+DEDo=iSQ}*r+TRg zp~uyFh^3zxH^sSNkTk$@@b);&x~>8H17FMaR_{4?v;{te2Cc+;VLHQyr$Z2Mk$pRs zL%2V94&t#5*hkpAIWm%cGQoDuq|T6<1F@#mtGc~jTpIs{Y>Vs-?CZDcc0>#9^c zIi(NoPp`P2hyHD%PgjAb}Ou@s$JkRwoUI zn6-%sv7IG}og67aAs|1L){j{$oVmVCwm>B-8M_SLhi}IG1Cdc{1do(bM%Dsp+wQc|Wmn+$r+HD|C{sS;|(U6~cA&3}Mr z@+jq!Rtf|!>+>|UT1;6&ZGjO|we2=HV>rjfU{lRAF5EnL2vwH`dB8AP?`!qK9 zo#?_wN(wfeUD!yK7T7#<{k~zt+IF7_f=y_3@5JyS97)O$7aJ~|oC~T_k(byPnY^0=M z(~uR%Myj;H=9qoNhPCZSYlw|Eh*jbh+{qc2#m7du(b|i>*iz;~Yn~ge0)^J?cWbnY zk9RRiN(x%f92iGSs)aa7@X!H=OIj_-U;8*N zQl$kh#n z`2AX?HxpwkclIoeWWT}~!&po(T#y;ZP|CN!@DEq-8-}cHe{hoszH6x61A20w>w}1P zieIx7m$yF3FWLn~ZY~Q*qOCpx!EVgT$;*=@Z`zOu; zu3;AhiTw{p|ByrGlcRt5SW?@>Tzo}!z8PrDr2A?Y<7ffq=w&uY)&UC!mgFtQD7D+v zhu>MAJBO16T-O|_X3!_G>zN7t8TGl8oWM85?6Zh{;*V#+s*6w+xMI%5@gvQ?<^sCL zIz9rgk8`LHmib?$zlQgKiYV-mdsQCIusKdQhW{9u0Ptlsj>shgB$UoO9_Lo_xzlV}v!Wq1?09A3NK zb|5~z*a0e96u4Str6_|FXtV+a41^kOmYX}ga2TiZ^N?_q|^$Q7xa{5{-gK*i-_3u4 z*vkIb3J3v~zt6Wr#{x&Z6_+16!Kpy}5I_+@0s|yXi&7v$*X3Fy)j&pba6L0>J1mL* zDCIbIfeGh7KRk`abL{7_ztcF-o^dt+9VUQk9Z8_~xRX=q2dR5>jJjcI5i;tigwIVI zKu@3n5VS{~wF{`SLV!`;5SXl)cgMdR=57B`n70O7>Z7;0Y#To&_CFc@d)Yr^pMTJg zDQ)6IxpYXIlLMxt;hD#$y&j=j76fPXjI)U5@Nkx_U3BgMAI#Ski*NMtwlp^CTKqF+zarhSSm(BCe3eSv$y1Jr?PP4BJ;-oPYxD zwTumdBnV&5N)^##d7?Y!`;{iHZi#Oz>am_L%S|h*GY=9(emMdFGZqPRgi34xbf{2q z(Ga&E(FEXCjw0dEqgDS0PpDTzzCNo5KWsIK=*^@TK582s0<& z@lTcw%0w_IE$lfoP27{CQSAM-oVB&1o?N1ABG`d@%;W69PtT%|J#-`}im^eQ9G<=v z6D2K0qvLNN5>StVX1$d^$+Q}G8%FGDT=06{PLGega$Jf|;7 z9)0b>sYhS0IRDx}ar8YitPNCscaFX}%`b!3dh~sW)I(nd?$MXThOC^QAI|=4Hwwpx z;fc4zhT%sS6Ce)5uc7U%U<0N&A;kswtBJ( zh6#vzi>#jOF$Ht-@}NEFqEA=zH6Yy#A%Q*KJ?^-qd_9a2XvxX*!56$p$Nqd1v2Xph z>B}R`_HVkfPugR#fuV795Pj2ierG-vwa4vmFylAq!n=i$4 z2*I;AlXDGE<3XKkzBHS@>u#oRHA~jr(qRD+g2z(4xF*+}g53knXKHv$RvHg9MnCV} z7~Mz^A)G%%amHvhsDTdSJ%u($XOWa(0SAGS<#aWQjR(@ysiJY3YkG^nlnTGCDe*Ic zP4a%RgX61l95+KQlW;VGQ&F6!Can3&Z2BH}ZZk`^PjcaDZd*h~R{KqyC$i=ZkBNJEntW?;TZY|zu+{AV+&NIw#e@Zn(`C6ar!o2*=<>AC1?8hS*oWp)rF5d* z=mH*LT>vorNGJF+YD*-5{%st5V0 zgdb05Z3*L;zb81CrDj0b_8>)a9(x5PY-kU5sh}kP=SVI(zX`9CbLp(V5BQ zkCyoj7f|B|(L(dA(hPJWt{z7_%VSi#V~o@p`<1@Rrg|y&7&SOD#WuVUo4}H)#mMx{ zK=lVlAz3Wk1!kc%6ZVE)M~kBNhcm?F9bF8Qw;Co71`cJhfM(%;QLw=Fc4Lo4-Z`4g z{%!=D9GZ?cGtynKhEX_x6*v2EX)dmQ`g~xxrU}XG)kVk*bJ8ncjO!N93a-gfl8+%! z#2|mM5(9A!mcvFy*Sp$J;xAJefI>O>Ym&bvk)Xd*odx)Nb;U9d9NUg&2);tv>56N> zhKtlKEV2=lK{8dUbUgEuYwgx4zrO;6DcM{-nk)fxMweqHrMlP*Pw<*0pG<~#Kf%Ph z=A>iH@HsgQ7hpwZVcLohx`O1B<(Om%x)9#Ll5*`=Gk4jqVaz9tUY1-KPdZ&5eUWAf6LdZ%Mzb5`{yajCit4rzjcY zVDx?*;!Mh67u zb8srunX+8W2`zxk2SW=M+pnGkS!z9=Vbnj0`51T#aY!7WLX;^n_8dmAtXnI31e>VD z>UC@xBSON~3Kj**e)cT_#-t#Oqd*sDwNMElYJJcm?jM(BTyD!%EyB~X7jPUvW0>PN z;-qyfT_5ecqbL6(hA`YjZp}`)nQaZ%^R29vL{=;mtY~2qw&Jy;-x05f{e7tGs<_T9 z+-h3ku{202N}_q)Q6b`V?q1YT-Nu+!!>ZPK=@>JNx{LV*08}7|hCvKjV0FBzd%-EB z6W+tFVxM4LKz}XA*TW}{Mh?rs+1KzTQ&1UO18L!Zdmd$@lT>-I#p%X+i$ zeKXM9X8cj6bx!(1^b8c7Nhzk!sx*Y9b&}~xX zUlDQOWF6VuPxDLYhsZQM?e9;7IG>JCTiiq?*hizD`g^DtEx3@1u&FKIk`n;!<;l<{!7J-6 z`z$NzZdhHQP*yzH3krrp(ZmSG7}_6TB&@ek*fRB0YXpQJCNyCRnLy8R{{0?rkH@A= z_EBs$OY2pxA@}Ly0nA@xq9q>^`ZMYW!!Jo34|Mp+%j_-~b-IlV=Gh!LAnRBcmXt#y za6Rl228YYX^7o(|a?#&Lb4Fl0gaW@@c4P0gFC8HQg42Pftz!$A=y=Ug7UCgrK4rR+ z&jKI|q!zOh`wf;tuLU%!SXRN__i1-aP1(fi#1J{rQ8oRDhpJsq9Gy@J@UECN)>LLZ z-w5MjkWnL97l0y>Hr7zO?dx@KaBR{~bku*2Fh-{}c zp-$u@nmo&M)U|3hHi1b%wfGfqyINPIj?oVU$do*aI3-9!e9K2ZSehM_@hXvyCg0K5 zh^ZAv93{>`v)Comi0-B2l>Lje>nEvMLxmlTdhR~L?k9|lV0B;}zAY`yI`am1R~Tct zClr=(AG^9eRafKAGOYm|fb+-R$S$f}fRbl%a*%Io$GuB1BA?2_%}`1SuC!UMw*3GV z=R58{!uZn^IT%m7d#y}f=S`N!gX(dgdbCx){i448q#kD!!V2Asl(m@BLAfAE$Lskn zgjIP=43E)0f-zbycWOirGMks-lmY}^{Gqi2LXCd7CnfJsI^V|u=HI$KUudnl4WX{D zaSm&@JA7+C^A~~`q1X+BRH2k`Zp%t&2Ef-D5b@R zDOoi3@TH}PHX~jl%YN1L+yH2RnXRFfQQLm{7Qy>bd1wfd@sXwC5kw03NdD5gXl|+H zD>|pa-xieIPUngT+%AGzBED&j#mi-Gj8-cV1V&lFXp_Hi1wxTyUXK2bHlipF5{v?* z5^clulC9d!Pg z_ci;)p>5iEWODlp(<%mShvjA>Cj8k|x{pQfKGyz{stlcjTyHSy**Y$)^%UTe&O`OH7Z#-2EzhAt}+W3nk5!l$0cmhb6Q*i81&EFvzwlxXj#Gf6leiezzFfajya~UpR$vJWK3@Y3b0-2)~#u$UcJPe@)f=}nj==2 z?cdVr1+=Omj*XzUeKL{F({cp1`%r`uLeMe| z#=00VAa}7q#z}FGS-1`d28fkOh)-ieI%1`c*%gcY+StJ(!jQl-`a)v1VBAP0@Qw3R zh()E;;;+Km0=pi<#O#P7995#v=T9n+`M+vR47r4EWP^xAb;Uc2HP#+y-08-uyZy(6 z2EahB1^qFGfJ{HAgY!YS3Ub}OE)!|s%<$bFkhHm=N`ici8w}aN(K0l{zBoo&e66JDs}+5F47!NUO>F;~r1n2X8o3!(v6D<0lQ;;XH!L{g z13IIdi%;l`BR;ywbFt+Uo!nl;AKZQaoR7YP)S`s`jrtRneVRZVv8up7NTijZXIP&A z6bs(C<->j$=Z_M9bg%UZqJgL`fi9r_SMl@~l{>6sHO}!$p+1le;sMFcvH#3d*j#EQZifdvP!?qan=-J69JkKrPw|f`I0f| zHVG~mJWFrLceYOBBs1xO^aw1OfC0<%ucsEKMMgo(?MJ&qR-V&VDS@8jZU#S#Ny{SA z656G+r}#l+27qdr$+3TsvmJ$m89k{06<9>dvh;F1VY0Nv+#dBKmpChN}P&PEO;)w>8Pz;AOC``mH5=1I56u_ z%g7DSoZbeJ3B-a{nQJ2Ef)&F%rtO@<(ug=AQiRitzV3(xM%W*5ba1GVi374mu6P`4 zZybFW+`cAw3On=i% zM?1R_oca>MsU0}h3tN(Kc^Hc>IPm?4M)&XV{zE=`K5JafGK>#TXa`PeYErSPH+_XG zc(PM)Em)*IWFzzQgW7o#Gv*1hO3&r@Gxi=@|Q%jsJ|d@vI|w%nyZwfD#TnR znNj8mt2|laWXIT zD31Y5exm(^NdXgt1OOq{ee!tml;RhxK3zKSOYo!XRDCmG++CUgBU;>d7z+qZzGJfi z3Tji{@fJS`c&&Mrmgn_uvFy=5^>VUDi`0~Q$D!aKk6IRc2&ywBx>`JYWCY^;_(vC} zMSoD@nT&5p;cF6KFY)zi1D-4Zm!uQ`z+P#F;H0@1L5WtTeH0XtZN-@&^snNtFzyKp zYb;k0ea1eKm<-pLD1eoCwUEbSQ-YHW1<{8PM!(d^Iu!>QyO z_6Mqm*iF~|(YDV%sC`cMLN5?4z&bghht%|bU-|Rpq<7+axDk}KCSV%QJ$4>6qGYvE zcQQ=4OwFzV)lQ|TR8WY$E#=M#?j$Sq+Hc$eRQ?0pJI~+#sL%Cjzk}&&o*r!>M`#g7 zD7Pa&hcGM-K<2kNnv1Y%R@}gwF_3Gtv#4Q68#CrA8;HEl=H_9!YPJD{W#Jg{L%mVu)?PYo@)MqXq$3_(T! z{b|^X2?i09z83@MjBEA;j(2b1G+zyHR-P%~gmb6-9a0K9 zV$Y!oDD0bZp}kr76xX&E{`fHZLP_@nGdN7Iqe&(QaQ%$=U2AuxNnx>_hrD4ygcbRs1bIw4x>~$9sjAa9I zgnc6r4~51I%QTJG-jh&pVCRyWQD#`Y%cT6gqn#u(mvMn-PX+1ZWLt$gg>!#>2fSKa zgXC$|OOmWtz!$DW{*65l`K!@SX-2)AW|W&@XzJ3Wq@G+S%`YC`u)1Nu@x1mBIfrT3 zf_U!AI%T#;>FGm0X@OjsCf=8tJ%bgj+~)oq{?^o7-Mdjp_1kdmq;Q2j7?2a`ENTl( z?CY5AnW4lxdJkmVSE^6cDMubVRXdZQ!g^*uHH{_>S^1|rzu+*+XD?8PQ7-c`vkPZ; zJ^D6iiX~~uyIUUoQx2+IGL=Y^rKEDBV=Z1KTan50f2?GSFI(e z6L2zFO^rU4tfF6nms0iH*mNB_fJiDfVIzZByK;MRU$E&?eiaj7{|nz~kR}S}U==po zbM>p^@XEfENhod*kEo>?Roa50Pob!N5W0x2!M9;f`)Tg>3#I)@@%9gHBeoJ13ij51G#z&F zSuDIu`#Ubt@X!6h1wZE{Vb9_5_J6#|fq(f4sfU3W{3}q@zChZy&%H+G9Hr{fUp-D$ zkM9jo@m6dUja%S^`N+62u)SsrUk`==T7|KaswG1wKIPa0^!m7%0=RK{>naRLHA7Jn zfsFZbINqTa81g^@71*FF8DP@XZ~|2W5fGpf;Q@yG98ZYBm}fu2{h|O=Aj4Q53mnA5 z1)p~WH|}UL{&ZFTR~2bcNq@JJ?Z6);4N~Uw*j?AF&hpIuIoN46W;`U~;EOejU-{m} zV$N*Bp3~nF5yiTjXY%Rs;Z}<$900l!{D%T>{!VdzF27>$s0#5ADoItrea&dWu0S#< zG7HgOXFUsmTO`I!mhX;6WxI48_W^N=1vEexZUDoM62zj7+df2rr5PP$RRyTRU3Z}x zKUxnSENfwkn@^G!pu>?(lu^!7&|~pY>}c0TiX0enXgbl6S9dhIw{(JFlSlw0Vy2*_ zFxDg4T)qOEG=`9(3Z!fP;~*l&xS7n=IBP?%3Kn~$peE9%=Sy&BD=^+ICkPd|2tl_} zxu;f++H)(B4Gfb$3HK$k!tKH&$g5Gmi{PioXO#q}cLX+vtp4sU}%4nle|){QMWwT4JGj*nB?|hXxn~klA^trh+_)RNh3mMqLEwzQlXRR=cI>M${BR$!)0`k@JmjLYCHTS@I9nnY%O#_ifsBrrC^n=gzh!vKlQ+Y@GDZ!jF;Ocmc8x?>-Qb&@5at z&bC}lARh(cSIi_nkye~0x*aU_kgUkmNC5OSsgHTAb-Dl}r#_*}71RwY6#(K1 zI=~DB0Zn&$c;zlz5*QAWdWG1~005dfk4psrvPA&E+Ef7Gst}OEha_1Az(E>-d2A~l zO5maa0q~)Db`Cfc0G$;8xE34$j7S8)5eXlbB?tgk4;%_0oUSSGu-GTn!d-45xad&U$rSK{1pv65ApM-Z$UAxbNJK0M&2$0{F226OX2lfC+uAI zeA>Y9s8`a;Mtpmo)#o^$mThd*YKorW$L)AcyRg*pSsP#BCuLmcNT*MSdzV5R{V+vd zoW1MY_PsxSCkzb8k5t_C4sa+Pd=~x6+6J$TD98G4@E*L8RxO zO9tw>=yxRhg6TvtBtIZ+W0f)eOR}NlZNpl?4}~}j#&g6hm@L#R*TMe^ckmyU3ga>R zsp7(-)UvWi^h%iY!4uf`&~zpHs&Iv-QCnJPKY$%yXZ36(bQrdl%QL7ig^#ZwI>))e zVWAgiAK8wm3JI!vnvtV8FLb~Sp-}S*aR%(2Vl!jqc44^V48x54h)@2|=EzvSL0nL+ z|4V)}VDd5t1{Q5rW8@?h0N1f}!(*!bp)a9F5rmTA&urmsT=WSdZ((xj4}FY`u*l7v zXYwbd(~*(>8uc2pfUNq62dsSfS)Rqn1P^ZG`3 z?E@qrx1Z7^jz#lIG0w!Yz?`y+?+oi17PR^t#<4T_Hokss6L5Od9UK8$36&(bl3 zooTlJ*tf>^W4}$wx^YNdU2Ycs;4f(!hikv^ahJ4asTpBEUZuY?%}TIv>nx((HT0>)U~ z*Ex#2oE$}-W2T+z5g#Crp(}90Jz$YPp*m`v8(Pjfo_n`BHLy1CV4d zt>$>>Ee!MVc#x-g%#lEWpJ1Ks%AsNghpEQ}@<`C{aid`SP-PUv%vp=g=i(+dfhbziC)d)T>Uq*X5Co4c&@Z@ZN*lQx=!kB)QDhFdbx=8eBDaAe9 zR(_OiL7~l%65m2#!he&a2f%@r5p#PrNG|2c_O%xJaAj2Y;ki(Yez!J5yK}Fr*-b(_C zm)&Dmg9*dNkN5{*m~9p7Jqawkd$}lBo_cgrkCi(h<+utVMLaeZ-%2TeKcGjZab?nJ zmZNJmr6J?x%xk{|B;k@uMV>ML0#JRu5qKDNI3;QN)B{p?$it-ck`i14Pv!BpLWs}n?mDd#Sn4eJD@#Sq!iIYMAH`4K{x;eIFK z^1hRB;kgPfm0|Vnby5ZLTFn`QIC=dL{tfo5C1KEyx;fAO3Hvw5+q__74YK>Cf6*~i zcA8TeSNN?`J0e5V!E7Dn#helyWzzitHaITrD2)wNQK$KdGNLYqFzDV9DBBH&Vh3_! zTj}orm?6UGWrM1D5G2Po zfyPb*T487R_lxwNsvh6}1nIriQEidH1o;~`9^)6V7zHdKdsvWk&cyJXcZae$NMnE) z<5oNLLJI}*gGxG-m=EJL%h*8NjFP$bWmnE`{U;k{#{XXxw#CJOIX7}dFj0y zdvn`v#-y(N2AJ~Xm(rfyfPwajjQQ!t{2};%SQ}%$uWi%Dyrxfc+AnJQEVKRF?LUBY zwkw7xI}CKKv3uzzrDO8yxr)#weo`+_P-tcq~99 zDow61u^(aO@9oMTf%Jhu+BM`S;r|%w0RLk0B%V_X{Qx1It3Pn*#~@z!0ZX$v#xVem z`4`iUz#Om?c-wO|9|~AKU!yWUne#Ks^+cUNTqY^hpaeORX5le-Y z^XVT)q7Kfducf&PJ>GKypO$*+PTkw=_()5mXxyZ0Cfi+@-0#j@J1gxZ_#5j=z=hR0~ zMxmn4<;5(@uwLn~m-cWuM(>~5W4@s99L@GP+>E>Bd+25n9|% zq~YO@_Crk5fFeZu}@y; zEQsT)7}R`PL@)IW9)UW=8@Hf9@$}*pu7H6pRkoJ_J%sm&-FFhq(CH0OKP3!Mzut)4 ziTar%ME{Inh(!TaEulkDU1m0O)Oq0{e_Pn<=^{JqGM{LIPtqJFSB901+S)kEj}UeK z$bVYc(tEGy{WE7`hQ%m|`z?=K56UKHtGaC-?h2lL0DDutXbDDdlw8SovyQ;0n2hhS ztFMv(kgmubWBv+a!tg304Tcru2XJsMpCE&9uy8q#6LGeSFDJ^G1R{MqZJ1g3CjBW4 zWe5-2pKMnia6ShxxE;<$7>9(Vn6+8`I)^>)Jt51$$VtlT9O=thQ)s!}`w+wl)rGX4 zkD9~`zR5>|8N^~8dk2(_e1;RvpfSJwt9YFzN3?QlFa=U**o^f`O+Fm+-GqbS0$<^% zcdVXk7KVOMHJ8gQ-E)ZopzJ>dfB_REHO2sNfFT3piH_;MbQ~_HAvqea z!XNrf);Z)7D45d*R)Izp3rC<)pWyWGM2-4hi;@%-jY53Exk)CgEqgD=WY7q#l~n|F z(LHYQISJNg8IRxdVsrPTG2VuWh&W)5J=!eUIcXR|btvw)O53)lVM{~*=fJ}{2$pGp zF&oAX9;_d3*HK1b6x&6?4zzr%idWC>QApf5&+*iN{WBQ4Yn!UK8pM=3~F8 z@9C~;=In1xL_X{4XoI+h%*>xY{L%zB^;JO5f3;?)Pp74&oifv|SytK!!w8LOj?iB= z-H}^X?)zPtafwOX$1Ar(jwW(mC)2P&G8e!UXi$FGGvqO6so$u3f=$5QtV16-ixifQ zvqv0CN^@HY*BLiP_K@}IcQPt8dA=*=cC~Jn#8Vv$`Y*??MO<9lrGQ%IvI>`qY<~D|D%MiKs zm%Lpw#vk%|<1sIMGkqoNdCA_@aOZs>-Fe|I2l;XBw=ut()50Nn{_wCIKm3S5Ka?m9 z=MDyt$Q3Qez8epMVgpsKrBeoP!3+0{V~Jq^V5&>-e3$!t+!NgKNt`cda&$Zf71gYXmiYj?&^OgTX8m)C^J zNdvHHQh;2uw{(&MkpcYGI%VreRQf&`O=B|+m;;QQNDs5$dzLmpmTn{^iveg!$y!Z* zS442tEP8l5@>gYt&VN}n!OO>fXhIopkZOncS6Rsi#YZ^1MibBTSF?^#H?0Ku*T(*TF9!DJ?{X*$2y#T#8NT&f;R)#EkwSfC!ysK;aK@sN7VQIFZ`F+)A3smGrB zd+syL>`%mAWml|%ALH|Tx$pFDvNkb>BqKcYA7@;{A1(72E{08$FEB5O{vS@F+m&I| zoy3x;SP{<3oU)_WpGJ;0g3p022ng4}rC@>`tV@*{a-5DDeT<gEySk|;)sSv>0nem2*R}#iJ@4Yk|R`DOC1RW@B}_UAZtrH*1?wHd-dgjQsXlnMY+SIDy`>Xy7j2(`G9 z(TP6hMouF2Nkc{-kt2j|kSHllbGn8vsvq**%020DRb0g&VgCezVlvBX-}kxlPfa@c z`O>$n*f1bz+v|Z$KZAPo)#mNuKwBmf?C^hxYEgh9|Q3HX{gLY3rOHNqj zWtmUR#C;4qK?F_FDN9IT39hg?`!?ir^8RC$JOlJI3A*LEJKtHPEGyaB%$-IDB3gtW zW_;l~YyMysCVlw9zVNY_8?NWf5U_mOT;&nzS+1BmI902KNZqugVoc8=wUo4f4Y9B< z)ZD{D4wiR5k-i-Mcus#_X@}xZC;k`{1Ga)Mia(`r4oW_CL1t za$}4KTGm5@GQ*zj55(CZ_4mYv@Gq&@@P#)u8`zwkiF8x20YD3>XuGU1f=mb`PuWp^ zuIB)wP9m9s?H!D%JMaUH+Rv21G$LaS{~4FY%BULntOF*~Z49fQsvX##WlU|73KdAx z8}lPm9GS`&_%cfjpVgKHHz1&wV@$oB1woYsBxj&;vy5M{VFRIW!nFv&D(tp`$UMzr zR`#Diqe##$a=AsO&E`BsaBx4UJaC8t)NQ)D2NX7^fW~E`u+1$B;@MGQp?YBAbE*#* zrF^^eFG`t39O^E`Oo4m8oWRR0-LjgPN88I`dT^RB&wEbcQ?l8x@*v&{?Somr*__f` zer|djqplgjAN&C7)&o7$`t#42-u@h))`F_dpz50_hFXDLdB#-USn9XVw*8jR_HFyX zhfSKkz@|K(5NQqyB3Olz-HfS6OG)47DCM^<{9KpphMjf5&7Z(aN;eMn#6(<6L=T`1W{O0Gr8d}HcjDLHJTZ`%gHH3H|t??TDX@_m6{P%=$Q zf~mWXGp61lC9inTx9vl}b^Uw3re9F<^W%JhU%||OV=_6g_vdBS$X&6e>sza4SA`O@5js1)=YVa zA(COb9Q*B^>SiOZ5S~KaS&jxN5v=1t!08*?bi{y@W40aHAQJ%{W2S-W$WpNZ!1G9n z%AQvSrkga4%yg9{s*wYJ0@y>VJg{XNn8 zwx3hcIs$Ju)ey|)?5wtq?H6*1`8XC+Ol|wy!a3EpKhv1{G&~WCxDeACvR#fFuGp>@ z|1zQRP=B7&$@_xmh^ldJRwvi41-5rJre4bytRY{jnmCD2mJPeAnwGA437E}lJj0io zBpeUygoWzC>IiR5%Tw)q8ee+EaqN0+1KI8fs)~A)>@w&c~rhF?0h>pVP<$8j%RT10&d`ZWxe&?lLq9Q;S9`FdBXPAte^0 z5vVkm99Gc+8jNQjbcw=7{svJ<7?tuV-s|KSx1c7*8{jNg5>=5_+*bm>869781ayOu zh&gw;MfU?X7Pl&a$M?f+nfif(7t&hFv<%r6GhGEIt=yhRX}MkXLQHO1OoVpO-EpBU z7LuzS|0(^(^;=U3Z6EmXsf3oz*%zfbLR&7a>vq9lp&ksuJif`78J!}>i8!cESMm5B<5^aY&MBc#a2bB+syskcFb%@-~PvMLXk<0MmEaQcKZ6e3vlZ#9K32rW7eNixRL|2?k zx9y)l(QW(TCrj~KAq>;35^TREyZ%aP?t^;iMNbB>l$v{f56#q{pLa2Jf@12J*>R>8 zNb7rGs%J|ore1z(Dxxbu?5Q}6BKk!5^vD;C4#kD`%}3qj*o(dW_j@s+#gHeo&~lqc zkgeQN`5MK}aTIk)5#8yt;#f+RJ=xptKcvF)=2KE*$>!`izYl70SeSo_ai}9`~uoo$4`NJ?hls z7WEjf9;4M`q}Q1vKNkGs}lYW)nOBk}pP#6u*G-69?`nk)9k^xp{!%$*Vs zkuO*YV?1POY&{I|klmPWY!lAGo`m~kPT5`kr>m~0!HFpT%#3TM?5Mt?`Z{q6#Np?x zp9V@|43+$pXIFej3QC|t@BNh+15|?0OqXf-$z&RrNr2#j7xYaN>5 zHfkP^9wY{=x1i>8sQ?{HP{WDF=w%)Npd2cURD$d%CmI95t0IRnG6CwymyVo|zJ09l zw%Zy|o&%!}Y9!JB0t}(dGZEZIF+T!-Fg#&6VmBCO4%1e)50%$(w8D}daXOk>pZ1mdI zrsjK9zKE}^Q)Z!9^g}Urg1ZXFD3Ia(h5>tYicVHXt`pj;38ph< zuuTNaCg9fMT6|v2?BcqY`8IB-y1(EyRJia0RUFfzg8~X31_gSqjd=r=Q^Sg5OR;Qs|2RFcGl6(H4nc5k7C^GXZecvkykjYjjCM zUCeqGNF}|q$z93*$D5G4+rdkhzK3tZzSP|x@5B;iuo51lX$59*K7*0=#nTn%AiG+* zal98+(C($=Ls%=okW91$Vw88BB(E~<1E4$%BS|{BHL+*aLY|J^yK$@ePv*-Zvkb>H zZRWZxTJXxuPdXe5hHwqd3_--LYWg>nZ#w>IEPxMr{9s?Lp@Jxh1)!V*s@pab5=a-C z!J+}H&;}X7`}m%Ru-wiMQ+B7N%}q0AOc3#QFo%hf3h-w5gvDs!lTkN3`OlF~zP3EQ zJ8(Z0=mkbdP2iGgzch_PBnDF4O-*0S_Ew|XOnX%?HChRCrYs?^WQ9XGgEbT`3eZe8 z$`jk&{;2Q|+D9{7OAAdZP+tDzAa1hr_6iBn{ zr|g!*f_#c=9tAXqN$j0Ta+tw$5yfk31V2YnGlZFwOk%>Gxzo4{Gdm=Y+*|p;FQAvi zR%z94gzHOI6exp+rp_{#c`kY4#WYxgv~YH>Fs#=KT&QPxPHj)1JpJ$+4OBVuF)Of; z*8g{WVR;V0&-NdYFdE$yM8%(Om5L|H&6L^gq|9gx5B)Rv5y);PvYYJ}VA#y?4GB$V z=k2-@WiTnTvj6=!iwmcr683j+0;6vmFLb?T%C6rJHR?Fh8uN#@soixp_R-=?q`#=7 z=kE(*cx z6oSVPOiK_vN+6CQ_#P7S1;J$=4}S3oS>F%E$a-=YA?p|aL<4TJzQY$drVT&adB|GD zoj+D~^Ntu{p5yOv!o2$&2y?&vAeDHSO%PMTnPr7URcs`}wbTH`{Z6k3XxLfRN>hEOikQi(6^-NmnwdK?Y6{vh4J~ zya+-?8;Gk>_XWq6kmtuag4YrW$ZHYD*pp^&y&|dlrzjcDeq2|dt*XDPs(&@x)jNzq zn*CgI^?ynA8+7%7s`@|h(*D4pg+<>GjABsr(LY=a$RKWFqO9Bn8EhOXCK4g~cj{1O zl=IDHX(A$)XROphE6~Vd#R)6--j-E&T^O&*>rz0w;#5`3Md_VhQ83MJY+3c!-xJoP zUh`U3t!r6zQL3to+P1)Tu&XNXHUYrXQdRva-Cb4m#c)-X-H_P7ma6K4mQ~-mz#&uo zu7nT_hUdUo1LT%sQFgU7KrwTa*1pr#fO8!}2#Yb-*F*l`N~oPD(uU`O$s&Y*JlJ(m zh#XLJS#aY3a;+b?GgwS)WZsT2W#SCSS#!EnU?qFB-?qt}B$<;ebbsH)~5T>f? z>3C_EdbAKieBhwyl`26`Y_#Q>x|;N*J^{ykSu=ZJnd5|_7W~ibYnCj8jx?}+TIrCd z3@?^?jHxfDwTWvp%-HkS(sno?s)t5U$$Y- zy8YN09%h89FNZlw%HE{U_|&Q2idsesj1%vy=2I#_V`~73oRRJln<2 zrM@-qu-&&3+QY~?3d{s1m}{vPt7#tK@UFm(wmjkxnwxMJNtkA*mFp!^Uq$lJJxSMu zqdkmg#c?o=zg1&!_!Hbbt(>Hcu3Xa?%ygc38A#tGs*)b5UgY4fE z$j2su%uG3g{6_&fPV5AEPa$u9LJxUcQQcSO=t@*3yycyP#Co}!lE@D|1U2EU7 z!=a!^=3|u1ziTM|Lw%znz`$@q()B(^^YGQJZ#|@2`}D?r(>M6Ld$^Cy8AR>A4{Q@R zLKMA7b}NRcB%D6L5a!Tnv;UE%MhlociB*gOxdOZp^NH60OxVSN1pJNqI-1}V_XpzI zb2!z&4zU)vap6B<`{(ZJQ+uxnuBbj)&Q1j@jR;!OgCS{xh4?i4 zj%G!;7Bso{RnX*-l=5&^%l37%ivQ>--u_2=@dewMT}a!fv-x=r$rIt-W3C}*1Cb4~mN>8QZd>xIHp=k(^?>v-j8NsL4s#B=Pv8?;zO z*FkqMs*->cl?de6hs&>8chDX1i_Y%7B6_f@Ay&uss+-lb!zT;yEPvG)qO86c_j zvJ|Cv!nr}|t@Lq1{m?eExe!#yvF}Y$`cV|Ky)S`V7vqy7{CFntYur`f6=Y%*Bo1By zsH(gI+)+*ag`d$61kV)Cd9}=m^h2lZsaVHlxjYUM5IUKs`WcyGOMxXti|q%tibgDW z5gJj?QNNg@{@-Z-|B_PQCjcJE;V2XYJfM?;=X&;I5}xu_;bD<-LIHRrl*#zPWo;FV z5C(?Pz|cw-sUnQUfYH0y-nB(w>;f2Nd?c8N9`&sW6U_Pqdd2Q{MJuDYOv*nBMx*Xg z5l=SG{EJ)V8%S4<|4BQJ5yCRiju4KH!8(DTAkB!fu@b%%@QbWA;R|4QV*6lTem2VF?Ci8>UgaHM1^+dH5r3lJbWn;VYe#ntsPC_y+DBzEm?C5`(RhVETk% zeoH7`4F`N^l|v2SgU&1X1`|FWk5Y|* zWNY?zORWPRpn_?1#w)u-!Eym$iOwX^Fy!^Ed7OYel0={1(*N4l`d|31&|>X#|J(kb zZLR+j)&B+m|Lc)KXpf2-r|i3$>vknGcV`&;y-O~8>yfoIS9 zGCL|Xdh*%-clvTx48A0NX|G^860rO)_2tUe`VW0AwD=pMQ~%5U?`W<6_NxCQ_tJl= z@u3FxQ;!YEQQgzn5WCO^#CO?xdwPV(JEpznXV|LCR|4PXPwoSJM*UrMCzA4aWX!`xTJ336aNL7O*{U>YpHck! zDiRKK)c$jUJ<3wFg^V#o1KPqLJ=k2@ud3 zz;9mlo8wg3M}6s5G^6e!jobNg+=yb_KS_6oSU>3)=qxreMvIpeTkf05;NzbIo6f=lKjA#x9AQzjrZQT4{7)LA`x9v zqw7sX*M%?Refy$6tzsL~@4VahL%+kHi~c4(+>ag@G1VC$%8qnqEv|F?|)2WhO)Ip_a-8UH^Mte<=gSns31 zoJt;RCd9@c#Q$6Iltph^%uR}%iAnsjrgYvl*Z#%^>=kX+cg?wmD$%p(NA~(p6D6zl z_-b|$_1(X>Gjyru1D(&Z(IMj*JAhB*VBV6FQv+i$~Z4x=U zW*+3|3IYxJE~k7?q1~orxqOL4`zHA;zY+e9_xwiqt&IZzKOXtNf&aYU3je=95%|CS z$Nvrd-|4lU|5$#q75vBiXYl`*#)}CLDJg={+`B(`@y9~(>c4~H{}q35@8j9_{ekbL zj|9GV9^M;#DaJE1HlCfv2vcBtyRpaOP^S#I5Y?;ULWH~UfSdG88ihQL_@I~`=wkmVnQ=io|#l6SLtPMUPjIk&?3FlD^IiacqGXW&e39*ODZJN9dayLH4YP zI3)3C4HissGN!PNpDG?&mT-lpT8;j!mNoMum*jd<2M64(j)b zqg@LAKai6Dd)JS4zfC_L$7=Sz>W3FF{xwid}%-=?z=~#W= zSNh}w#$@`yk~b79ORkdlXy{!627$v-)NzB8{5?URjQS>J4`AFdZdv$WSr*wLJPi7K z6Lg`3$HmX!!izuL&L2J>hTx(c>@}ZU!t0wtD1vLPLO2wwaAo+EewXolT<3TMOg1vQ z*Zo}MF+=G*_~I>l`ZCb{A%Drr@n`u8*Z4!{XZi})`gyc&b~>tJD?Yd3`+KZK_InPN zWwLOxZhTNZkF__)zdyNE2H9p`8nNGG6>NZOrd* zl0&AsZSi(os9b#lHo|N+jb{!uW-Y=QOk|>yrsk~K!_Z9_KVys#O@Ni1WV_!5rh#}}OB*5hp##IMkBO;%tW(pS+gyEiS*Qu!`9p6-=dy^0YU2*?$< z=uH?EsY&xR(za0y*fJw{C!2EU$v`OXGcmWVHhXOMTjqAN?vrZVjE1|lwr};H!&SC@| zb%elU-xs6aEB8CpyKuLdwr=-;K3}y$ADQnZ*f$7N5C#N#ymhBqfak%`XVN(2BlE5o zPNYVXuIJ#ZnV6h?2p@23A(J4g%f5v@8LET_kLZW8?~27@7SImf4Y>B0ugUn`)rq_# z7zG->&d6-$KnVDlAt*oq><@V`6~2kBh7luNfDjIt6FJtv2)K#?_O`n)EYyk8CdkjY zNv-w|Vb4srkI+D1H;^Jyfs05#j1VGi;R7H54vFA9aDa@Ts1h6Th!M#R*X4jqwpX@d zPsW|I7x<6@E<_@H9pWU2lj{kbU>^O_{&_YC@Ni4}xo7;-Y}kxg`ywO>_+P2;=c5(; zRf&ywq{bg${RaHg?C)IgrN$qjdE!4SCH_YJTgrZTX+MhT1K^Km-B9=_AxtRc&jP>H`{xZ|5)JH?h}znDCmkv{#V%ss+0}kd1WFqg0~2 zmqMO$h^v!DPmci^P;jJ#e3^hD2QXyyv_I3>VS5Bp(o6jcCe`?SkP#?wFIsbs#&>v~ZGl?`cYSK~Sc>5(6(w0dZJjG7EHM=r`7mz3dK9FgZV-_R0@rD$*c8TDT&{w0t33<-{8=%%JGCA2^f^Cw;^7QBcLr~o9}59I-e z^fV^yIb4-E0uP)ffCGMNZ~>NQPyvIR*(M(;>bXZ?)sp@E0oVi#sqk@Xs`Uj!QyRu| z?hdA!;I-Yc@bxQ}={bpzf4T=!!7QJj6Ez-*4 zQ*q0+d?R=~fyBLoxEG}9>+WX4b(B0xL3ZA&C4KC)oz;XrD{Xo=5-fPUl9G+_G9ahY zh#V0QZpnQ@Q?HUma}bHo;|nXhb`hNll(KL6Vh7G)s2Q(hFYL|ZNZAV-_R28P%qRIk zCWwUP^bsjD?Sk*r&{>XQ1bf7VfZ{b^5Mr`*ExTct_IIyBQ!Z-cDH3dArv2@=?y58G zj}pGO?CO<--;uwcCc_$!D^M3TZh-#TcZZ>gZA23jpkQEhOOLpAerq1qX$lw_x8^h6CWaL%-^yInbIIpmE9k4a*e&$KsxqmWm_ z?@W7R!gnPjXaXgdCj4T*a4Yaj5kE5O*O1f+K7q!sT%!Q|Ms87pEC4CV5Dull@tQ^l z$Ey&ffGiA7z>!}-cww_xGV<8LH|}VNWviHJrzKzk{G)FCg(z$cCErW<#aFvpa`<^O@)7tghHnk>uv_x;Pp>(+PWV)Cg{rcY<|n@>Ty1k!YaBfy0q&W0 z$As^0j{f+y8+ZGQ24MLAk@x1|Q5ESMXjob!(sn?CK}8z{4GI!eBvH_S0XiBWxJE>c z3y32+Q4(LqNY+yF(LM3B`5P!w=O8T7OP1s4b+a^Lr>I^9*> zCy3tpJ@=2BM>&1Ysq@xX-&SAkL6k75eC*Tml&2;x40%3?eV**{jq@tsLvOg{n}N;& z$nq4ce9nFMsZzmYB@UJ1!cEmVA&b^JC)c`Xse~~|d4%=G39wY`a*0<*_Ix3%Z&KyU zradNN>U`Aftt-X~eUY^OW3CxDx&pHx;C2`1pMYc0Koxx6iD;Qed0Jju^eEBN=4i!E zMAAz05;5N5{9bMg1qKn1(}|2FdZl-O+`Wx|1*Wi9*_MY8nV`fuOuR?tOPLHwM1L@@ zL=q!y_F(5zsv(FK<47m#Kr9y`E*Y2sK4J6NH^B>ZkDb?+)r+oeMA$)o2eqc-s%E(U z{1lKo%HnQPdnGXCgJ$UsLvsS(#QQWz=#_QOfZ6A6Rdk zw`x#a5C8CHihQ-d7nM=mpRhT(d@{EPFQJTyDBzY?-SSm_D&;#vL`su!eIPrb(wv?B zl8XoP2jz9nkrvT)PQbcPh`P@C34umJmz=MvQM@jcW|I7tv2kqAk3uk9hEl7|l{hmM ziU&J~lFUgiXrT5=-MAJZ3CkR+Tow^taN_mSQq790F!y z!YE1@XyOgsFZ#pBveP}wxpS;ycMj8MGhL9;Tuo=-2WnbKE*SWZcJ6)ID9jSYzO0|I zj9497{qxa*TG0?%Tn%=J;BIn}TM^amskj^< z;a~$FQ(%Bb_Lh^NRfTeOPG1B(lpg#vHjfF+y|gDx`9rk8o*Pb|;rll(jf(?w2cN(m z4)JHLbtN3<81ts%i*}xHDd;9?GB?A0dS(3SDrxyLtt2V{fhv*Q_KDv{JNJrzbEG^a z=85tPoQ~a299MhD2*%W8>=2F&&CG2A=p%y|Dpx)0rNp>8l-7b%>byX{2A9?g>K6red_@UWGDUBALE?HX4TUlMoXg%THi` z?xIV*tv=?F&k|zYHI+<;a-7o>qZn^Pm#!E}UCO)?m&OJ`YkZlP%Ge1MDR%7QI%WQ` znIM}qB9B?ThiaBUHL*@JdK)-CLs|kV21)WS&nW)_o{R&R!SAsICK&%j{0fszmN|Gt zaX@b%j)7Vn=_HDChXb{8#*Ip#T&wmr$G+@(o6c*Mx7i|Q3#erO0?EU_bkv?KZY_aY zIV(@FIZ*|PxMyS)DS{@02Ant{H)yJIFFW!^{0CJth?_L0i*_WCp&oY2p#&k^QLrue z8t7WN2sco}CT5^!8$mdx9_|0ZNII7tfm-RI#?+GPU*TNj3>17+TC*RwVXGX973V|g zoS6Lp1{2BwoQ(4;%vzT1%0Nv|$T99}>ai6WbVB5)6vkB$ag2HeE+i~cfW+q`i#q3- z&z0ehg}ixs@+h+OV)~=!p+m=mva)FG&Eavzr=Lxi3FDI?0C+# zolUEh?flzKX&a8LsD^?J`$}Oa6r^?pzQCNxRw10TMqS3i;yr3sW2+EB67_hW=ci5n z83gAC?rzWLQId@H*EnBof~0$?YZab^cz)YhJ^-D$SgC-D=y05g3ctF;Jvye#Vk&=G zQ42ieEL0xNMswt*ozCf(DzkzO$^gE^67_+*?-%uBHPiwM#U%=PKLl#d=Tmfe)|?`* zZ-M#viq0D)XA0NKUYMBcRlNuG&<+xZv7h1^O!z_}hvMABp$K8e(In20x|tpGJi3aq zfsT$EBsw~j7wEZ&2zoaIZ|j^3*D0T?f{6H6uoIO|g&TEFucUO+WiqO32v$2l*L?lD zIunwG!o8D`N)?n;qg>_Zj)K>qufgIj)HdK@e(ZEsKq*NJ-K4Q>F@6H@OKA=Z7u2ol z8ddO_@o%uPV}cJUCAtLhNg{k=-np@B<%{*PEvR+)q_S}v&CFHuRQ6?AAazcC~hE;A@#mN%lxOJIt z@IbMOzP!LHgmJnSt8)f?s6-P&s8x(^e(z)8>YPsdm~I>50qUB@BbBidp=W*UJ<)8m zfg88gIZN$?hJaaBC?b^!*Ex?^X`TMdMSrH;1pR4X)Rd$@au}t(A1~l(<^0q7L#IHE zDV6Z&EUiBXvl(-+?f-;GRS(x0y$pSya`mSh^q4IKC4Zz$_TQmU82#%4mnda{+EG~$o}43d=cAp!9X1M1 z{(Wx9DBTAYc~qs4>N+UZT?gfuyf8S?vVTY>__L=HXs{TDeRqRTm?1 zvR;9s(5q8EGjdSTw48qGQV~}zwfsHP*CpHM}S?1T{YzmrnpbFn5U7)5E(u-)kNidMYsi^c1^tiR+%G zjvX{aMy1^VBDAJd5X-tG?~+qv#E0?CqHT)ExFKxlRtG%z8=Q$orJ`Ob)>|{4^cIf z;^U|(=*hSn-i+fGzn5?Ds@*56&DSg=?b#Yft2vTN)Fvj-Qd z28(#fv^ixFP~DG(F=8K>FM@#j!6;Y8W>ifRgW$|=#DYs6R=9u)e_i^3d!0S;YbBai8+3(t!v8tI=`kVsbllT$5DXVWV;u z0PCC=5Rw?78hU~98EJ<|VKEH?JCb4b1N&pjPq!?g@?(RqEIU>$MEiUn8kHu~SH$HP za*{V7V^@HvqHsfF4C!Qv6Ot}rQt5a_eF6_7m5-`!%#aJDQlJTv_q=0~%)VH&%&sO- zo0aEL4P%UdTOZarbFKRn<|TlVtDH&JhtBoaLW>Jc7oX(cw}5`=FS^IZK?~47D18Ja zc&fZP>wKsHI1hczc;Dcw(pR-@og}a#OaEi8z8;8KfslY~5t#1|v=9>!fdr{Cx`B_K zc2kTP4~ob|FA#VMI{-_?f7UrO5ob^-&_9Q5wQ&A}bx%eK?dB(cvXVF#{|PMFj_^yF zbrL_MNoLPs0_IqQA7z?$@FQ(?3O~LlKi$F^gHO93b@{RDO=Z9H<0<2nleBVm+=Ei< zxCce&Fv*q2D(;xJ3e7*ie1wi|+7G5ZzF#rGjcsy8(Q)i)R?U9c0Tza^hoQ|tU1gxp za`;+R0HeyFZ&p3u@KG|S2gX|GbX%eLt|npCIhocy`7S&%KlvV^DMh6|aW;+x-|vp| z-F2!-{NI=P0O6HMY)3N~EQbzTDtPDLT$WF55EVQ{rPA{qoYmJUhNjaGWbk8XIr{W5 z{;w&|hLYt#$+E3`CPGRmFy=p4Z=5|>ql|l<4?tfDd&{A{Wz*iW#i7s|R1u(7Pra91 zzVTk=dwQl@zS;FsK3JFZT5$Ks*62RhR+;Y1C{rbcU*|XoNoOH23OfuD7G>m?^mOZ9 z*umsT+0}aEWU{0wKAU9=vTU$n)GhJ)sk$C{qkM(B+S6JGN`i%A5{Ng_A zO`UVQb#JB|YrSzUx)RLB6fda(lk{g__}zWq`Q7nBm*1^l+c$n|lZ|ufkMlcOayGxu zlf??I=S%RrpY`12;!)O{I;XvLZ>DToXv)&zDH6@`TgJ1k_)C*gN;N_?1AqD8vLt&A z)HWA(J@8kT-_u?doBi#ui}{q$TV*-*LzNrLrW=FSCc>^`bcx)stD|*qru+rr4PAgr z>1-)Q+0$v*`Y%b})+v7lJ9XnvkMb`~DgRV$wP27{=Rfd3y!@|7`O)!1HpYFHRDD+1 z$>K}t2R2*!Y^zLlPL_3Vmi|{n8b;~Ay9}joW0XFn{kTu^Uy@S(X5~LUUjF(2Q~6uv zs&hJ8_a+B^K`df$V9TX@m;d^Gk^kb9@`sy~|Fn4d=Slg`{Z0APZy!>_Ab;!L zWWXIQqaP%TZ9}*>>8IrG*Vq}NrXw%|waaND z_+Bln?bg9+0-%%T&xBL$0L((#6jNCuZgsOv?!CZrq7FN*2Bz+{MOPiWzGY)05DO^X ztAQKD%BmZOtk9#3cq~z|G@vCgt7IYJ!qtG5IDUnl=qihU?Lo~aFQ!tnpOpF~-M#Xf zbR`)yV5|UiV#tuibn4raDSTABoumkJg|A>K62;~sNOF!F2@wu*!|sIrMhm*mSMyO` z_JP%tH!qdEpOHS{P*h*Rr44w_KV3ivKiNIb9&{mN-NF?8KAed0G*(Mx;XSU3KmP(% zJW#u?bs}**?vyC@F5QidK(>QfiLg&BQ2S?o7xf+b^aYBJ$)~EtvS{PrI7p##1ln;E zFdcI>m=r-rbp-p3pOX;^qkAu0oDs?VtP>U>V#UsZgbG8v?lc<3`QEF0f82X}>_1S* z!s<7(3im7=nzteleH_?BBUhvkjU2~GApb4G5j8~-bfM>G6h<#-QIz*);GWIs2;~j( zNiS^ps`c4R3i>jLPdhu>p>ILNcNKCT#8Uhd35SP!^i?C3<^ICS+@l~raF2}RV=LRD zNLo?!PkRdU)�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