Testing BSIP40: Custom Authorities - graphene-blockchain/graphene-core GitHub Wiki
Preface
This document is intended to assist with the testing of custom authorities (CA) per BSIP 40 Specifications that is available starting in the 4.0.0 Consensus Release.
Additional custom authorities instructions can be found at Custom Authority Templates
Testing Overview
These test instructions should be executed from a command line interface wallet (CLI) that has been built for your test environment. For example, testing performed with the public testnet requires the CLI built for the BitShares Public Testnet. The following instructions were executed on a private testing environment where TEST was the core token. These exact instructions may differ on your test environment in the following ways:
- The core token may be different than "TEST" (e.g. "BTS"). Modify the commands to use your core token symbol.
- The account names that are created might already exist in your test environment. Check for their existence by running
get_account <ACCOUNT_NAME>
. Modify the commands to use alternate account names). - The asset names that are created might already exist in your test environment. Check for the existence by running
get_asset <ACCOUNT_NAME>
. Modify the commands to use alternate asset names).
Initialize blockchain for Custom Authorities
The instructions in this section are for configuring a blockchain that has not yet been initialized for custom authorites. These instructions will likely need to be tailored for your particular blockchain. You may alternatively test these instructions on the BitShares public testnet.
1. Nathan: Fund the committee-account
Fund the committee-account so that it can pay for any proposal that is approved by committee members
transfer nathan committee-account 2000 TEST "" true
2. Nathan: Fund the committee-account
Create a dominating committee member (nathan)
create_committee_member nathan "" true
vote_for_committee_member nathan nathan true true
3. Nathan: Propose the CA settings
Propose the following example settings for CA
propose_parameter_change "nathan" "2020-01-14T00:00:00" {"extensions": {"custom_authority_options": {"max_custom_authority_lifetime_seconds": 3000000, "max_custom_authorities_per_account": 9, "max_custom_authorities_per_account_op": 4, "max_custom_authority_restrictions": 8}} } true
Warning |
---|
This proposed parameter change will also override the other setting in the extensions corresponding to HTLC (updatable_htlc_options ). To preserve the blockchains current settings for HTLC, the proposed parameter change should also include the blockchain's existing setting. For example, it could be expressed as:propose_parameter_change "nathan" "2020-01-14T00:00:00" {"extensions": {"custom_authority_options": {"max_custom_authority_lifetime_seconds": 3000000, "max_custom_authorities_per_account": 9, "max_custom_authorities_per_account_op": 4, "max_custom_authority_restrictions": 8}, "updatable_htlc_options": {"max_timeout_secs": 2419200, "max_preimage_size": 19200}} } true |
Identify the proposal ID by reviewing the last transaction in the proposing account's history
get_account_history nathan 5
The proposal ID will have an identifier such as 1.10.x. The proposal can be reviewed with
get_object 1.10.x
The proposal can be approved with
approve_proposal "nathan" 1.10.x {"active_approvals_to_add":["nathan"]} true
The settings will take effect when the proposal expires and will be reflected in the output of get_global_properties
.
Scenario: Authorized Transfers
This scenario involves one account (alice) authorizing another account (bob) to another funds from her account to any other account.
Initialize the Test Environment
The following test scenarios portray the interaction of four actors: an account registrar ("faucet"), and three regular accounts ("alice", "bob", "charlie"). Each actor will require their own wallet with their own keys to ensure that the keys for the authorizing account are not accidentally signing transactions for the authorized account. Certain steps must be performed by specific actors from their respective wallet. Each step of the instructions describe which actor is performing that step (e.g. "Registrar: ..." indicates that the action should be performed from the wallet of the registrar account). The reader should use the respective actor's wallet.
1. Create and fund accounts
Tip |
---|
The example assumes that a "faucet" account exists and is a lifetime member that can register accounts. The tester may choose to use another account under their control as a substitute for the "faucet" account. |
Alice
Alice: Create keys
unlocked >>> suggest_brain_key
{
"brain_priv_key": "...",
"wif_priv_key": "5Ki...",
"pub_key": "TEST8fur3fMGPat5ffGgTuMRstPEtE33FJZVJY6ciRr1Jr1EyowdyG"
}
unlocked >>> suggest_brain_key
{
"brain_priv_key": "...",
"wif_priv_key": "5Ja...",
"pub_key": "TEST6VEKPCcz6E27qcrTP2zAGk4EXJsK5y7RoukBmAJc3pwxLzB4hv"
}
Faucet: Register Alice
Register the account of alice
register_account alice TEST8fur3fMGPat5ffGgTuMRstPEtE33FJZVJY6ciRr1Jr1EyowdyG TEST6VEKPCcz6E27qcrTP2zAGk4EXJsK5y7RoukBmAJc3pwxLzB4hv faucet faucet 60 true
Transfer core tokens to alice
transfer faucet alice 500 TEST "" true
Alice: Import active key into Alice's wallet
import_key alice 5Ja...
Bob
Bob: Create keys
unlocked >>> suggest_brain_key
{
"brain_priv_key": "...",
"wif_priv_key": "5JC...",
"pub_key": "TEST8cNcBs8ra3AWeRFQ6RfYSVsmby5cpRVuXAfg4Hj8XoXVXdD1io"
}
unlocked >>> suggest_brain_key
{
"brain_priv_key": "...",
"wif_priv_key": "5J6...",
"pub_key": "TEST59nKbp4fb1aYxdxMkuALPkjMV4b4iDuWenivjwTjyE3pM3wE3H"
}
Faucet: Register Bob
Register the account of bob
register_account bob TEST8cNcBs8ra3AWeRFQ6RfYSVsmby5cpRVuXAfg4Hj8XoXVXdD1io TEST59nKbp4fb1aYxdxMkuALPkjMV4b4iDuWenivjwTjyE3pM3wE3H faucet faucet 60 true
Bob: Import active key into Bob's wallet
import_key alice 5J6...
Charlie
Charlie: Create keys
unlocked >>> suggest_brain_key
{
"brain_priv_key": "...",
"wif_priv_key": "5JY...",
"pub_key": "TEST6WacA9VfxetmDTYDuzuBNyEQYf4pqWMjCpxtZ47swKH3iPUcPY"
}
unlocked >>> suggest_brain_key
{
"brain_priv_key": "...",
"wif_priv_key": "5KV...",
"pub_key": "TEST8S3K1dwwUk8N886AHxcewrQEsT1qyHRH5cCsbmpxpYMqfrBNPh"
}
Faucet: Register Charlie
Register the account of charlie
register_account charlie TEST6WacA9VfxetmDTYDuzuBNyEQYf4pqWMjCpxtZ47swKH3iPUcPY TEST8S3K1dwwUk8N886AHxcewrQEsT1qyHRH5cCsbmpxpYMqfrBNPh charlie charlie 60 true
Charlie: Import active keys into wallet
import_key alice 5KV...
2. Alice authorizes Bob to transfer funds from her account
Alice authorizes Bob to transfer funds from her account to Charlie's account. Authorizing this transaction will require building a transaction in the CLI Wallet.
The custom_authority_create_operation
has an identifier of 54. In this example, Alice has an account identifier of 1.2.19, Bob has an account identifier of 1.2.20, and Charlie has an account identifier of 1.2.21.
Tip |
---|
Each custom authority is limited to a finite timespan that is bounded between valid_from and valid_to . Custom authorities are further limited by the blockchain's Committee to a maximum lifetime durations (max_custom_authority_lifetime_seconds ). This duration can be querying the blockchain's global properties with get_global_properties . Therefore, when creating an authority for a test, the tester should set the valid_to date-time to be within the duration of the current date-time. For example, on January 1, 2020 a tester learns that that maximum lifetime for a custom authority is 15 days. Consequently the valid_to should be set to before January 16, 2020. |
begin_builder_transaction
add_operation_to_builder_transaction 0 [54, {"account":"1.2.19","enabled":true,"valid_from":"1970-01-01T00:00:00","valid_to":"2020-01-31T00:00:00","operation_type":0,"auth":{"weight_threshold":1,"account_auths":["1.2.20",1](/graphene-blockchain/graphene-core/wiki/"1.2.20",1),"key_auths":[],"address_auths":[]},"restrictions":[{"member_index":2,"restriction_type":0,"argument":[7,"1.2.21"]}]}]
set_fees_on_builder_transaction 0 1.3.0
Optionally preview the transaction before signing.
preview_builder_transaction 0
which will produce an output similar to
{
"ref_block_num": 0,
"ref_block_prefix": 0,
"expiration": "1970-01-01T00:00:00",
"operations": [[
54,{
"fee": {
"amount": 260000,
"asset_id": "1.3.0"
},
"account": "1.2.19",
"enabled": true,
"valid_from": "1970-01-01T00:00:00",
"valid_to": "2030-01-01T00:17:20",
"operation_type": 0,
"auth": {
"weight_threshold": 1,
"account_auths": [[
"1.2.20",
1
]
],
"key_auths": [],
"address_auths": []
},
"restrictions": [{
"member_index": 2,
"restriction_type": 0,
"argument": [
7,
"1.2.21"
],
"extensions": []
}
],
"extensions": []
}
]
],
"extensions": []
}
Sign and broadcast the transaction.
sign_builder_transaction 0 true
Identify the custom authority ID by reviewing the last transaction in the authorizing account's history
get_account_history alice 5
The custom authority ID will have an identifier such as 1.17.x. The custom authority can be reviewed with
get_object 1.17.x
For example,
[{
"id": "1.17.0",
"account": "1.2.19",
"enabled": true,
"valid_from": "1970-01-01T00:00:00",
"valid_to": "2020-01-31T00:00:00",
"operation_type": 0,
"auth": {
"weight_threshold": 1,
"account_auths": [[
"1.2.20",
1
]
],
"key_auths": [],
"address_auths": []
},
"restrictions": [[
0,{
"member_index": 2,
"restriction_type": 0,
"argument": [
7,
"1.2.21"
],
"extensions": []
}
]
],
"restriction_counter": 1
}
]
3. Bob: Transfers funds from Alice to Charlie
Bob uses the CLI Wallet's transacation builder to transfer funds from Alice to Charlie
Bob's active key, as determined by get_account
, is TEST59nKbp4fb1aYxdxMkuALPkjMV4b4iDuWenivjwTjyE3pM3wE3H
begin_builder_transaction
add_operation_to_builder_transaction 0 [0, {"from":"1.2.19","to":"1.2.21","amount": {"amount":"10","asset_id":"1.3.0"} } ]
set_fees_on_builder_transaction 0 1.3.0
sign_builder_transaction2 0 ["TEST59nKbp4fb1aYxdxMkuALPkjMV4b4iDuWenivjwTjyE3pM3wE3H"] true
Note |
---|
In order for an authorized party to use CA in the CLI wallet requires using the "builder transaction" and the specific command sign_builder_transaction2 but not sign_builder_transaction . sign_builder_transaction2 requires an extra parameter where optional public keys may be specified for signing a transaction. This should be used by the authorized account (e.g. Bob) to include their authorized public key which should have been previously imported into the wallet for the signing to be successful. |
The successful transfer can be confirmed by checking Charlie's account history
get_account charlie 5
and by inspecting Charlie's balances
list_account_balances charlie