forked from anilcse/cosmos-utils
-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Added doc for multisig key usage #7
Open
kaustubhkapatral
wants to merge
1
commit into
master
Choose a base branch
from
kappa/multisig
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,254 @@ | ||
## Multisig keys usage | ||
|
||
For the purpose of this doc we are considering 2 people for multisig account: Alice and Bob. | ||
|
||
### Creating individual keys and multisig address | ||
First lets create keys for alice on **alice's local machine**. | ||
``` | ||
simd keys add alice | ||
|
||
- name: alice | ||
type: local | ||
address: cosmos1njefwuen6f0ava9kfp4hde03nh9va67fpspne7 | ||
pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A5U2bVyvVH5PHn2Xb9wzjMHh/utMlNTyN+OG81PCaxNJ"}' | ||
mnemonic: "" | ||
``` | ||
|
||
Then lets create keys for bob on **bob's local machine**. | ||
``` | ||
simd keys add bob | ||
Enter keyring passphrase: | ||
Re-enter keyring passphrase: | ||
|
||
- name: bob | ||
type: local | ||
address: cosmos1se4yuxerrn77h4qc2tessfm7lnxdlrrzkj8mkf | ||
pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"Az+fBSOlALoCDmbT/3Yy8F+N24zMONLB4yuQINIAmukB"}' | ||
mnemonic: "" | ||
|
||
``` | ||
Then we need to create a multisig address which can be used by both alice and bob. But for creating a multisig address we need to have the other person's address in the keyring as well. We don't need to import the key using mnemonic, we just need the pubkey of the other account. | ||
|
||
So lets add **bob's key** in **alice's local machine** | ||
``` | ||
simd keys add bob --pubkey <pubkey of bob> | ||
``` | ||
Which will look like this in our case | ||
``` | ||
simd keys add bob --pubkey '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"Az+fBSOlALoCDmbT/3Yy8F+N24zMONLB4yuQINIAmukB"}' | ||
``` | ||
|
||
You should see an output like this | ||
``` | ||
- name: bob | ||
type: offline | ||
address: cosmos1se4yuxerrn77h4qc2tessfm7lnxdlrrzkj8mkf | ||
pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"Az+fBSOlALoCDmbT/3Yy8F+N24zMONLB4yuQINIAmukB"}' | ||
mnemonic: "" | ||
``` | ||
|
||
Similarly we have to add **alice's key** in **bob's local machine** | ||
``` | ||
simd keys add alice --pubkey '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A5U2bVyvVH5PHn2Xb9wzjMHh/utMlNTyN+OG81PCaxNJ"}' | ||
Enter keyring passphrase: | ||
|
||
- name: alice | ||
type: offline | ||
address: cosmos1njefwuen6f0ava9kfp4hde03nh9va67fpspne7 | ||
pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A5U2bVyvVH5PHn2Xb9wzjMHh/utMlNTyN+OG81PCaxNJ"}' | ||
mnemonic: "" | ||
|
||
``` | ||
|
||
Now we can create a multisig address from these 2 addresses on both the local machines. Ideally this multisig address is generated on a machine which is accesible to both but we are going to have it added to both the keyrings so the need for a shared device is eliminated. | ||
|
||
We create a multisig address using the following cmd: | ||
``` | ||
simd keys add multisig --multisig bob,alice --multisig-threshold 2 | ||
Enter keyring passphrase: | ||
|
||
- name: multisig | ||
type: multi | ||
address: cosmos1ka9yykrzvz6fhzj985lzlv2f8ddrastyauu5gc | ||
pubkey: '{"@type":"/cosmos.crypto.multisig.LegacyAminoPubKey","threshold":2,"public_keys":[{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"Az+fBSOlALoCDmbT/3Yy8F+N24zMONLB4yuQINIAmukB"},{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A5U2bVyvVH5PHn2Xb9wzjMHh/utMlNTyN+OG81PCaxNJ"}]}' | ||
mnemonic: "" | ||
``` | ||
In the above command we are passing the key name of alice and bob to the `--multisig` flag. This lets the cmd know that these are the 2 addresses which have to be used to generate a new address. The flag `--multisig-threshold 2` specifies that the any tx generated from this multisig address needs to have the signatures of both alice and bob for it to be considered valid. If only one of them signs and submits it then the tx won't be executed. | ||
|
||
Now that we have our multisig address let's create, sign and submit few txs on chain. | ||
|
||
### Send tx | ||
|
||
We need to generate an offline tx so that both alice and bob can sign it and then broadcast. Let's consider we are generating this offline send tx on **alice's local machine**. | ||
|
||
``` | ||
simd tx bank send $(simd keys show multisig -a) cosmos1ed7n9yyq3cm9nz2swezdfkx8q0ghtqvtxrhsu4 100000000stake --generate-only --chain-id test > unsigned-tx.json | ||
``` | ||
In this tx we are sending 100 tokens from our multisig address to `cosmos1ed7n9yyq3cm9nz2swezdfkx8q0ghtqvtxrhsu4`. This cmd then generates a tx `unsigned-tx.json` which has to be signed by both the keys separately. | ||
|
||
Let's sign this tx using **alice's key** on **alice's local machine** | ||
|
||
``` | ||
simd tx sign unsigned-tx.json --from alice --multisig $(simd keys show -a multisig) --sign-mode amino-json --chain-id test >> signed-alice.json | ||
``` | ||
In the sign cmd we have to provide the account address of the multisig address as an argument to the flag `--multisig`. This will create a signed tx `signed-alice.json`. | ||
|
||
We have to transfer the original unsigned send `unsigned-tx.json` to **bob's local machine** so that bob can also sign the tx. Once we transfer the json file we sign the tx using **bob's key** on **bob's local machine**. | ||
|
||
``` | ||
simd tx sign unsigned-tx.json --from bob --multisig $(simd keys show -a multisig) --sign-mode amino-json --chain-id test >> signed-bob.json | ||
``` | ||
This creates a signed json file from bob `signed-bob.json` | ||
|
||
Now we need to combine the signatures of these 2 file in a single tx. For that we will transfer the `signed-bob.json` to **alice's local machine**. | ||
|
||
``` | ||
simd tx multisign unsigned-tx.json signed-alice.json signed-bob.json --from multisig --chain-id test > multisig-signed.json | ||
``` | ||
|
||
We have the signed multisig send tx `multisig-signed.json` with signatures from both alice and bob. We broadcast it to the network using the following cmd: | ||
``` | ||
simd tx broadcast multisig-signed.json --chain-id test | ||
``` | ||
|
||
### Delegate tx | ||
|
||
This will follow a similar flow as the `send` tx process with little changes to the generate cmd. | ||
|
||
Generate a staking tx which delegates 100 tokens to a validator on **alice's local machine** | ||
``` | ||
simd tx staking delegate cosmosvaloper1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm 100000000stake --from $(simd keys show multisig -a) --generate-only --chain-id test > unsigned-tx.json | ||
``` | ||
|
||
Sign using **alice's key** on **alice's local machine** | ||
``` | ||
simd tx sign unsigned-tx.json --from alice --multisig $(simd keys show -a multisig) --sign-mode amino-json --chain-id test >> signed-alice.json | ||
``` | ||
|
||
Transfer `unsigned-tx.json` to bob's local machine and sign using **bob's key** on **bob's local machine**. | ||
|
||
``` | ||
simd tx sign unsigned-tx.json --from bob --multisig $(simd keys show -a multisig) --sign-mode amino-json --chain-id test >> signed-bob.json | ||
``` | ||
|
||
Combine the signatures | ||
``` | ||
simd tx multisign unsigned-tx.json signed-alice.json signed-bob.json --from multisig --chain-id test > multisig-signed.json | ||
``` | ||
Broadcast | ||
``` | ||
simd tx broadcast multisig-signed.json --chain-id test | ||
``` | ||
|
||
### Undelegate tx | ||
|
||
Generate an unbond tx which undelegates 100 tokens to a validator on **alice's local machine** | ||
``` | ||
simd tx staking unbond cosmosvaloper1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm 100000000stake --from $(simd keys show multisig -a) --generate-only --chain-id test > unsigned-tx.json | ||
``` | ||
|
||
Sign using **alice's key** on **alice's local machine** | ||
``` | ||
simd tx sign unsigned-tx.json --from alice --multisig $(simd keys show -a multisig) --sign-mode amino-json --chain-id test >> signed-alice.json | ||
``` | ||
|
||
Transfer `unsigned-tx.json` to bob's local machine and sign using **bob's key** on **bob's local machine**. | ||
|
||
``` | ||
simd tx sign unsigned-tx.json --from bob --multisig $(simd keys show -a multisig) --sign-mode amino-json --chain-id test >> signed-bob.json | ||
``` | ||
|
||
Combine the signatures | ||
``` | ||
simd tx multisign unsigned-tx.json signed-alice.json signed-bob.json --from multisig --chain-id test > multisig-signed.json | ||
``` | ||
Broadcast | ||
``` | ||
simd tx broadcast multisig-signed.json --chain-id test | ||
``` | ||
|
||
### Redelegate tx | ||
|
||
Generate a redelegate tx which redelegates 100 tokens from a validator to a different validator on **alice's local machine** | ||
``` | ||
simd tx staking redelegate cosmosvaloper1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm cosmosvaloper1njefwuen6f0ava9kfp4hde03nh9va67fyy4x4d 100000000stake --from $(simd keys show multisig -a) --generate-only --chain-id test > unsigned-tx.json | ||
``` | ||
|
||
Sign using **alice's key** on **alice's local machine** | ||
``` | ||
simd tx sign unsigned-tx.json --from alice --multisig $(simd keys show -a multisig) --sign-mode amino-json --chain-id test >> signed-alice.json | ||
``` | ||
|
||
Transfer `unsigned-tx.json` to bob's local machine and sign using **bob's key** on **bob's local machine**. | ||
|
||
``` | ||
simd tx sign unsigned-tx.json --from bob --multisig $(simd keys show -a multisig) --sign-mode amino-json --chain-id test >> signed-bob.json | ||
``` | ||
|
||
Combine the signatures | ||
``` | ||
simd tx multisign unsigned-tx.json signed-alice.json signed-bob.json --from multisig --chain-id test > multisig-signed.json | ||
``` | ||
Broadcast | ||
``` | ||
simd tx broadcast multisig-signed.json --chain-id test | ||
``` | ||
|
||
### Withdraw rewards from a specific validator | ||
|
||
Generate an withdraw tx which withdraws rewards generated from staking to a validator on **alice's local machine** | ||
``` | ||
simd tx distribution withdraw-rewards cosmosvaloper1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm --from $(simd keys show multisig -a) --generate-only --chain-id test > unsigned-tx.json | ||
``` | ||
|
||
Sign using **alice's key** on **alice's local machine** | ||
``` | ||
simd tx sign unsigned-tx.json --from alice --multisig $(simd keys show -a multisig) --sign-mode amino-json --chain-id test >> signed-alice.json | ||
``` | ||
|
||
Transfer `unsigned-tx.json` to bob's local machine and sign using **bob's key** on **bob's local machine**. | ||
|
||
``` | ||
simd tx sign unsigned-tx.json --from bob --multisig $(simd keys show -a multisig) --sign-mode amino-json --chain-id test >> signed-bob.json | ||
``` | ||
|
||
Combine the signatures | ||
``` | ||
simd tx multisign unsigned-tx.json signed-alice.json signed-bob.json --from multisig --chain-id test > multisig-signed.json | ||
``` | ||
Broadcast | ||
``` | ||
simd tx broadcast multisig-signed.json --chain-id test | ||
``` | ||
### Withdraw all rewards | ||
|
||
Generate an withdraw tx which withdraws rewards generated from staking to all validators on **alice's local machine** | ||
``` | ||
simd tx distribution withdraw-all-rewards --from $(simd keys show multisig -a) --generate-only --chain-id test > unsigned-tx.json | ||
``` | ||
|
||
Sign using **alice's key** on **alice's local machine** | ||
``` | ||
simd tx sign unsigned-tx.json --from alice --multisig $(simd keys show -a multisig) --sign-mode amino-json --chain-id test >> signed-alice.json | ||
``` | ||
|
||
Transfer `unsigned-tx.json` to bob's local machine and sign using **bob's key** on **bob's local machine**. | ||
|
||
``` | ||
simd tx sign unsigned-tx.json --from bob --multisig $(simd keys show -a multisig) --sign-mode amino-json --chain-id test >> signed-bob.json | ||
``` | ||
|
||
Combine the signatures | ||
``` | ||
simd tx multisign unsigned-tx.json signed-alice.json signed-bob.json --from multisig --chain-id test > multisig-signed.json | ||
``` | ||
Broadcast | ||
``` | ||
simd tx broadcast multisig-signed.json --chain-id test | ||
``` | ||
|
||
|
||
|
||
|
||
|
||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe we dont' need to have the keys in our local system. We can just use pubkeys directly to add multisig