Work with Proposals for a Hyperledger Fabric Network on Amazon Managed Blockchain (AMB)
To make a change to a Hyperledger Fabric network on Amazon Managed Blockchain (AMB) that requires consensus among network members, network members create proposals. For example, a member can create a proposal to invite another AWS account to become a member, to invite multiple accounts, or to remove one or more members in different AWS accounts.
A proposal is submitted to all network members to cast a Yes or No vote. If the proposal is approved within the duration and with the percentage of Yes votes specified in the voting policy for the network, the proposed action is carried out. The voting policy is established when the network is created and governs votes on all proposals. It can't be updated after the network is created. For more information, see Create a Hyperledger Fabric Blockchain Network on Amazon Managed Blockchain (AMB).
Understanding the Proposal Lifecycle
To understand the proposal lifecycle, consider a hypothetical proposal to invite AWS account 123456789012 to join a Hyperledger Fabric network on AMB Access made by a member named Org3. The network currently has six members: Org1, Org2, Org3, and so on. The network was created by Org1, who specified a voting policy with a 50% approval threshold, a greater than comparator, and a proposal duration of 24 hours.
The following flow diagrams depict the possible outcomes of a proposal using this example:
Example – Proposal approved with full member vote
For the following proposal, all members cast a vote before the duration expired. The proposal is APPROVED
, and an invitation is extended to the AWS account.
Example – Proposal approved with partial member vote
For the following proposal, not all members cast a vote before the duration expired. However, enough Yes votes were cast to approve the proposal according to the voting policy. The proposal is APPROVED
, and an invitation is extended to the AWS account.
Example – Proposal rejected with full member vote
For the following proposal, all members cast a vote before the duration expired. Because the comparator in the voting policy is greater than, a three-to-three vote does not pass the threshold for approval. The proposal is REJECTED
, and an invitation is not extended to the AWS account.
Example – Proposal rejected with partial member vote
For the following proposal, not all members cast a vote before the duration expired. However, enough No votes were cast to reject the proposal according to the voting policy. The proposal is REJECTED
, and an invitation is not extended to the AWS account.
Example – Proposal expires and is not approved
For the following proposal, not all members cast a vote before the duration expired, and neither the number of Yes nor No votes were cast to determine the outcome of the proposal. The proposal is EXPIRED
, and an invitation is not extended to the AWS account.
View Proposals
All proposals made on a network are shown on the Proposals page for a network. Both Active proposals and Completed proposals are listed. Active proposals are still open for voting. You can also list proposals from the AWS CLI using the list-proposals
command, or using the ListProposals action with the AMB Access API.
The Proposals page for a network shows both Active and Completed proposals, listing the Proposal ID, the name of the member that created the proposal, and the Expiration Date (UTC), which is the creation time plus the proposal duration specified in the network's voting policy. You can choose a Proposal ID to vote on active proposals and to see more detail about any proposal, including the actions proposed and a voting summary by member.
Proposals have one of the following statuses:
IN_PROGRESS
- The proposal is active and open for member voting.APPROVED
- The proposal was approved with sufficientYES
votes among members according to theVotingPolicy
specified for theNetwork
. The specified proposal actions are carried out.REJECTED
- The proposal was rejected with insufficientYES
votes among members according to theVotingPolicy
specified for theNetwork
. The specifiedProposalActions
are not carried out.EXPIRED
- Members did not cast the number of votes required to determine the proposal outcome before the proposal expired. The specifiedProposalActions
are not carried out.ACTION_FAILED
- One or more of the specifiedProposalActions
in a proposal that was approved could not be completed because of an error. TheACTION_FAILED
status occurs even if only one proposal action fails and other actions are successful.
To view proposals for a network using the AWS Management Console
Open the AMB Access console at https://console.aws.amazon.com/managedblockchain/
. Choose Networks, choose a network Name, and then choose Proposals.
Choose a Proposal ID from the list to view more detailed information, such as the description, a summary of Actions, and a Voting Summary.
Under Voting Summary, expand Votes to see individual member's votes on the proposal to date.
To view proposals for a network using the AWS CLI
Enter a command similar to the following example. Replace
n-MWY63ZJZU5HGNCMBQER7IN6OIU
with the network ID for which you want to list proposals.aws managedblockchain list-proposals --network-id
n-MWY63ZJZU5HGNCMBQER7IN6OIU
The command returns output similar to the following:
{ "Proposals": [ { "CreationDate": 2019-04-08T23:40:20.628Z, "Description": "Proposal to add Example Corp. member", "ExpirationDate": 2019-04-09T23:40:20.628Z, "ProposalId": "p-ZR7KUD2YYNESLNG6RQ33X3FUFE", "ProposedByMemberId": "m-J46DNSFRTVCCLONS9DT5TTLS2A", "ProposedByMemberName": "org1", "Status": "IN_PROGRESS" } ] }
To view the details of a proposal using the AWS CLI
Enter a command similar to the following. Replace
n-MWY63ZJZU5HGNCMBQER7IN6OIU
with the network ID andp-ZR7KUD2YYNESLNG6RQ33X3FUFE
with the proposal ID to view.aws managedblockchain get-proposal --network-id
n-MWY63ZJZU5HGNCMBQER7IN6OIU
--proposal-idp-ZR7KUD2YYNESLNG6RQ33X3FUFE
The command returns output similar to the following:
{ "Proposal": { "Actions": { "Invitations": [ { "Principal": "
0123456789012
" } ], "CreationDate":2019-04-08T23:40:20.628Z
, "Description": "Proposal to invite AWS Acct 0123456789012
", "ExpirationDate":2019-04-08T23:40:20.628Z
, "NetworkId": "n-MWY63ZJZU5HGNCMBQER7IN6OIU
", "NoVoteCount":1
, "OutstandingVoteCount":3
, "ProposalId": "p-ZR7KUD2YYNESLNG6RQ33X3FUFE
", "ProposedByMemberId": "m-J46DNSFRTVCCLONS9DT5TTLS2A", "ProposedByMemberName": "org1
", "Status": "IN_PROGRESS
", "YesVoteCount":2
} }
Vote on a Proposal
You can use the AWS Management Console, the AWS CLI vote-on-proposal
command, or the VoteOnProposal action of the AMB Access API to vote Yes or No on an active proposal. You cannot change a vote after you make it.
Open the AMB Access console at https://console.aws.amazon.com/managedblockchain/
. Choose Networks, choose a network Name, and then choose Proposals.
From the list of Active proposals, choose a Proposal ID.
Under Vote on proposal, choose the member to vote as from the list, and then choose Yes or No.
When prompted, choose Confirm.
Use the
vote-on-proposal
command as shown in the following example. Replace the values of--network-id
,--member-id
, and--vote
as appropriate.aws managedblockchain vote-on-proposal --network-id n-MWY63ZJZU5HGNCMBQER7IN6OIU --proposal-id p-ZR7KUD2YYNESLNG6RQ33X3FUFE --member-id m-K46ICRRXJRCGRNNS4ES4XUUS5A --vote YES
Create an Invitation Proposal
You can use the AWS Management Console, the AWS CLI, or the AMB Access API to create an invitation proposal.
Open the AMB Access console at https://console.aws.amazon.com/managedblockchain/
. From the navigation pane, choose Networks, and then choose the network to which you want to invite an AWS account.
Choose Proposals and then choose Propose invitation.
-
For Submit proposal as, choose the member in your account that submits the proposal.
Note
The member who submits the proposal must also vote on it. A Yes vote is not automatically assumed.
Enter an optional Description . The description appears to other members. It's a good way to communicate key points or a reminder about the proposal before they vote.
For each AWS account that you want to invite, enter the account number in the space provided. Choose Add to enter additional accounts.
Choose Create.
Type a command similar to the following. Replace the value of
Principal
with the AWS account ID that you want to invite. Replace the value of--member-id
with the value for the member in your account that submits the proposal.[ec2-user@ip-192-0-2-17 ~]$
aws managedblockchain create-proposal \ --actions Invitations=[{Principal=123456789012
}] \ --network-id n-MWY63ZJZU5HGNCMBQER7IN6OIU \ --member-id m-K46ICRRXJRCGRNNS4ES4XUUS5AThe command returns the proposal ID, as shown in the following example:
{ "ProposalId": "p-ZR7KUD2YYNESLNG6RQ33X3FUFE" }
Create a Proposal to Remove a Network Member
Open the AMB Access console at https://console.aws.amazon.com/managedblockchain/
. From the navigation pane, choose Networks, and then choose the network.
Choose Proposals and then choose Propose removal.
-
For Submit proposal as, choose the member in your account that submits the proposal.
Note
The member who submits the proposal must also vote on it. A Yes vote is not automatically assumed.
Enter an optional Description . The description appears to other members. It's a good way to communicate key points or a reminder about the proposal before they vote.
For each member that you want to remove, enter the member ID in the space provided. Choose Add to enter additional members.
Type a command similar to the following. Replace the value of
Principal
with the AWS account ID that you want to invite. Replace the value of--member-id
with the value for the member in your account that submits the proposal.[ec2-user@ip-192-0-2-17 ~]$
aws managedblockchain create-proposal \ --actions Removals=[{MemberID=m-K46ICRRXJRCGRNNS4ES4XUUS5A
}] \ --network-idn-MWY63ZJZU5HGNCMBQER7IN6OIU
\ --member-idm-J46DNSFRTVCCLONS9DT5TTLS2A
The command returns the proposal ID, as shown in the following example:
{ "ProposalId": "p-ZR7KUD2YYNESLNG6RQ33X3FUFE" }