Two-Party Multi-Signature Deploys
Accounts on a Casper network can associate other accounts to allow or require a multiple-signature scheme for deploys.
This workflow describes how a trivial two-party multi-signature scheme for signing and sending deploys can be enforced for an account on a Casper network. This workflow assumes:
- You meet the prerequisites, including having the Casper command-line client and a valid node address
- You have the main account's
PublicKeyhex (MA) and anotherPublicKeyhex to associate (AA) - You have previously sent deploys to a Casper network
Configuring the Main Account
Incorrect account configurations could render accounts defunct and unusable. We highly recommend executing any changes to an account in a test environment like Testnet before performing them in a live environment like Mainnet.
Each Account has an associated_keys field, which is a list containing account hashes and their corresponding weights. Accounts can be associated by adding the account hash to the associated_keys field.
An Account on a Casper network assigns weights to keys associated with it. For a single key to sign a deploy, or edit the state of the account, its weight must be greater than or equal to a set threshold. The thresholds are labeled as the action_thresholds for the account.
Each account within a Casper network has two action thresholds that manage the permissions to send deploys or manage the account. Each threshold defines the minimum weight that a single key or a combination of keys must have to either:
- Send a deploy to the network; determined by the
deploymentthreshold - Edit the
associated keysand theaction_thresholds; determined by thekey_managementthreshold
To enforce the multi-signature (multi-sig) feature for an account on a Casper network, the main key and associated key's combined weight must be greater than or equal to the deployment threshold. This can be achieved by having each key's weight equal to half of the deployment threshold.
Running session code to set up associated keys
To set up the associated keys for an Account, you must run session code that executes within the account's context. You will find an example of such session code on GitHub. Note that this session code is not a general-purpose program and needs to be modified for each use case.
git clone https://github.com/casper-ecosystem/two-party-multi-sig
The session code executes 3 crucial steps to enforce the multi-sig scheme for the main account:
- Adds an associated key to the account; we will refer to this key as AA
- Raises the
actionthreshold to2, because action thresholds for deploys cannot be greater than the action threshold for key management. By default, all action thresholds are set to1 - Raises the
deploymentthreshold to2, such that the weight required to send a deploy is split equally between the keys associated with the account
The repository contains a Makefile with the build commands necessary to compile the contract and generate the necessary Wasm.
cd two-party-multi-sig
make build-contract
The compiled Wasm will be saved on this path: contract/target/wasm32-unknown-unknown/release/contract.wasm.
The Casper command-line client can be used to send the compiled Wasm to the network for execution.
casper-client put-deploy \
--node-address http://<peer-ip-address>:7777 \
--secret-key <secret-key-MA>.pem \
--chain-name casper-test \
--payment-amount 2500000000 \
--session-path <path-to-contract-wasm> \
--session-arg "deployment-account:account_hash='account-hash-<hash-AA>'"
node-address- An IP address of a node on the networksecret-key- The file name containing the secret key of the main accountchain-name- The chain-name to the network where you wish to send the deploy (this example uses the Testnet)payment-amount- The cost of the deploy. This example uses 2.5 CSPR, which may need to be adjusted based on the network chainspec.session-path- The path to the contract Wasmsession-arg- The contract takes the account hash of the associated account as an argument labeleddeployment-account. You can pass this argument using the--session-argflag in the command line client
Important response fields:
"result"."deploy_hash"- the address of the executed deploy, needed to look up additional information about the transfer
Note: Save the returned deploy_hash from the output to query information about execution status.
Confirming Processing and Account Status
Account configuration on a Casper blockchain is stored in a Merkle Tree and is a snapshot of the blockchain's Global State. The representation of global state for a given block can be computed by executing the deploys (including transfers) within the block and its ancestors. The root node of the Merkle Tree identifying a particular state is called the state-root-hash and is stored in every executed block.
To check that the account was configured correctly, you need the state-root-hash corresponding to the block that contains your deploy. To obtain the state-root-hash, you need to:
- Confirm the execution status of the deploy and obtain the hash of the block containing it
- Query the block containing the deploy to obtain the corresponding
state_root_hash
Using the state_root_hash and the hex-encoded-public-key of the main account, query the network and check the account's configuration.
casper-client query-global-state \
--node-address http://<peer-ip-address>:7777 \
--state-root-hash <state-root-hash-from-block> \
--key <hex-encoded-public-key-MA>
Example output
{
"id": 1126043166167626077,
"jsonrpc": "2.0",
"result": {
"api_version": "1.0.0",
"merkle_proof": "2226 chars",
"stored_value": {
"Account": {
"account_hash": "account-hash-dc88a1819381c5ebbc3432e5c1d94df18cdcd7253b85259eeebe0ec8661bb84a",
"action_thresholds": {
"deployment": 2,
"key_management": 2
},
"associated_keys": [
{
"account_hash": "account-hash-12dee9fe535bfd8fd335fce1ba1f972f26bb60029a303b310d85419357d18f51",
"weight": 1
},
{
"account_hash": "account-hash-dc88a1819381c5ebbc3432e5c1d94df18cdcd7253b85259eeebe0ec8661bb84a",
"weight": 1
}
],
"main_purse": "uref-74b20e9722d3f087f9dc431e9f0fcc6a803c256e005fa45b64a101512001cb78-007",
"named_keys": []
}
}
}
}
In the example output, you can see the account hashes listed within the associated_keys section. Each key has weight 1; since the action threshold for deployment is 2, neither account can sign and send a deploy individually. Thus, the deploy needs to be signed by the secret keys of each account to reach the required threshold.