From d3d6bf46f8589c128bb8cb0697022bd399cec546 Mon Sep 17 00:00:00 2001 From: KtorZ Date: Tue, 4 Apr 2023 10:31:32 +0200 Subject: [PATCH 1/7] Draft SPO on-chain voting proposal Co-authored-by: gufmar --- CIP-0094/README.md | 277 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 CIP-0094/README.md diff --git a/CIP-0094/README.md b/CIP-0094/README.md new file mode 100644 index 000000000..eb87b2caa --- /dev/null +++ b/CIP-0094/README.md @@ -0,0 +1,277 @@ +--- +CIP: 94 +Title: On-chain SPO polls +Category: Tools +Status: Proposed +Authors: + - Matthias Benkort + - Markus Gufler +Implementors: + - Matthias Benkort +Discussions: + - https://github.com/cardano-foundation/cips/pull/496 + - https://github.com/cardano-foundation/cips/pull/102 + - https://github.com/input-output-hk/cardano-node/pull/5050 + - https://github.com/input-output-hk/cardano-node/pull/5132 +Created: 2023-03-21 +License: CC-BY-4.0 +--- + +## Abstract + +The Cardano Foundation proposes a mechanism for polling Cardano stake pool operators on specific topics. Polls are done on-chain through transaction metadata and authenticated through stake pool credentials (Ed25519 cold key). The goal is to gather opinions on governance matters such as protocol parameter updates. This standard is an inclusive interim solution while the work on a larger governance framework such as [CIP-1694][] continues. + +## Motivation: why is this CIP necessary? + + +Governance is difficult. Discussions on CIP-1694 can attest to that quite clearly. There are constant debates within the Cardano community about changing protocol parameters, and the decision ultimately falls -- at this stage still -- onto the three genesis entities: Input Output, The Cardano Foundation and Emurgo. Yet, at this stage, few governance tools are at their disposal to make educated decisions. Besides Twitter polls, newsletter surveys, and SPO town halls on Discord, we have identified a gap and an opportunity to engage with the Cardano community through means currently at our disposal. + +Conducting an on-chain poll between SPOs can also be seen as an experiment and an evaluation of the network's participation and engagement in the governance questions. Even though we only propose to poll one particular group of the Cardano community (the SPOs), such events can help to provide actual data to fuel the conversations around CIP-1694. + +In summary, the goals are: + +1. [x] to make some first experimental baby steps in the realm of governance; +1. [x] to be achievable _now_ (or an in immediate future); +1. [x] to capture participation data from SPOs; +1. [x] to raise awareness amongst SPOs regarding their future role in governance; +1. [x] to keep the Voltaire dynamics up in the ecosystem while other efforts are being pursued; +1. [x] to improve relations between the Cardano Foundation & SPOs for better mutual understanding and fruitful conversations. + + +## Specification + +### Overview + +Polls will be multiple-choice questions by The Cardano Foundation with pre-defined answers to choose from. + +Here's an example of a question and answers: + +- _Pineapples on pizza?_ + - [ ] yes + - [ ] no + +The serialised question and answers will be posted on-chain and signed by one of the delegate genesis keys owned by The Cardano Foundation. Answers will be provided on-chain by participating SPOs via transaction metadata referring to: + +- The question and answers +- The index of the chosen answer from the available choices +- A digital signature (EdDSA) from the SPO's current cold key + +> **Note** +> In this document, every time we refer to a _serialized object_, we refer to its **canonical** CBOR representation. In particular, keys in a map are always ordered alphabetically. + +### Question structure + +A question is posted in a transaction's metadata using the metadata label `94` and the following metadata structure: + +```cbor +question = + { 0: prompt + , 1: [ * choice ] + , ? "_": nonce + } + +prompt = + [ * text .size (0..64) ] + +choice = + [ * text .size (0..64) ] + +nonce = + uint +``` + +A nonce is optionally included to provide non-replayability should the same question and answers be asked multiple times over different periods. The transaction carrying a question **must** be signed by one of the genesis delegate keys to be considered valid. This genesis key signature isn't captured in the metadata but in the transaction itself as an extra signatory. + +For example: + + + + + + + + + + + +
CBOR diagnostic + Base16-encoded
+
+{ 94:
+  { 0: [ "Pineapples on pizza?" ]
+  , 1:
+    [ [ "yes" ]
+    , [ "no" ]
+    ]
+  }
+}
+
+
+ +
+A1185EA200817450696E656170706C6573206F
+6E2070697A7A613F0182816379657381626E6F
+
+
+
+ +### Answer structure + +Similarly, an answer to a question is posted as transaction's metadata using the label `94` and the following metadata structure: + +```cbor +answer = + { 2: question_hash + , 3: choice + } + +question_hash = + bytes .size 32 +``` + +Some remarks: + +1. The field `2` (`question_hash`) is a blake2b-256 hash digest, whose preimage is the entire serialised question metadata payload (with the `94` top-level label). +1. The field `3` represents the 0-based index of the chosen answer from the available choices (from field `1` of the target poll). + +For example: + + + + + + + + + + + +
CBOR diagnostic + Base16
+
+{
+  94: {
+    2: h'29093fd43fc30ba31e306af06ce8537390e1668ae7496fe53d53684683c3762c',
+    3: 0
+  }
+}
+
+
+ +
+A1185EA202582029093FD43FC30BA31E306AF06CE
+8537390E1668AE7496FE53D53684683C3762C0300
+
+
+
+ +The transaction carrying the answer metadata must then **be signed using a stake pool operator cold key**. Because cold key are not payment keys, this requires specifying an extra required signer on the transaction (transaction's field number 14 as per [Babbage's CDDL](https://github.com/input-output-hk/cardano-ledger/blob/cffa75fdbd800cda60997791e51bf02f2af0c42b/eras/babbage/test-suite/cddl-files/babbage.cddl#L66)). The signature shall be produced in an air-gapped environment only. + +> **Warning** +> +> Only the first answer to a poll for each credential shall be considered. If multiple answers are found, only the first answer submitted (transaction & block ordering tallying) shall be considered. + +### Duration + +A poll starts when a valid transaction with a question is posted on-chain and ends at the end of the following epoch, so there's always at least one entire epoch for answering the poll. + +In particular, the stake distribution of pools will be considered at the moment the poll is _started_. + +### Outcome + +The outcome of a poll will depend on its level of participation (in **terms of stake**). It is essential to understand that we explicitly call this a _poll_ / _survey_ and not a _vote_ to dispel any possible confusion. So it is akin to `1 Lovelace = 1 Voice` although we may chose to interpret data using different equations (e.g. giving more weight to pledged stake). How the data is interpret is deemed out of the scope of this proposal which aims mainly at producing the data-points. Further conversations and debates will be needed regarding interpretation of the data-points. + + +This proposal does not introduce a change in the current governance scheme: it is still up to the three genesis entities to make a final call based on the poll results. Poll results will provide new data points to feed into the conversation. But, regardless of the outcome, any decision will be explained and motivated by other auditable sources of information. And on-chain polls will provide such an auditable source. + +## Rationale: how does this CIP achieve its goals? + +### Recording question & answers + +The proposed process will permanently record questions and their answers on-chain by leveraging existing transaction metadata. Note that we consciously do not record any element as datums. There are several reasons for this: + +1. Datums offer extra programmability (for being available in Plutus script context); this is not needed at this stage. +1. Following a _keep-it-simple_ strategy, we propose relying on well-known and well-supported transaction features (a.k.a metadata) for producers and consumers. +1. Storing data in datums / UTxO has a non-negligible cost; naive datum storage would create thousands of new dummy UTxO on each poll. Transactions are cheaper to store and consume. +1. Polls rely on slot order when tallying answers, which means that chain sync is needed anyway, and there's no strong argument for having this information readily available in the UTxO graph. + +### Cold key signing vs VRF proving + +There have been several (on-and-off-the-record) discussions regarding using the cold key (Ed25519) vs the VRF key as authentication instruments; and arguments for both. + +On the one hand, some prefer the use of the cold key because: + +- The cold key is meant to authenticate stake-pools activity (e.g. certificate registrations/updates). +- It is ultimately the cold key that identifies a pool; its hash is the _pool id_. +- The VRF is more likely to be compromised, hence granting rights to participate in a poll to potential adversaries. +- Cold keys are Ed25519 keys, which allows piggybacking on the existing protocol's capabilities for transaction witnesses (extra required signer + verification key witnesses). + +On the other hand, arguments for using the VRF key were already discussed as part of [CIP-0022][]: + +- Because it's a hotkey, the VRF is usually more accessible, so it is more likely to lead to higher participation in surveys and no exposure of the cold key is needed. +- Blocks contain VRF proofs, which serve as explicit pool identifiers. +- It is only necessary to check that a key is correct at the moment of the poll, making VRF keys perfectly suitable. + +We originally opted for a hybrid solution (as visible in input-output-hk#5050) but later decided to drop the VRF option to rely solely on cold key signing (see input-output-hk#5132). The reason for that regards the possible uncertainty of promoting (ab)use of VRF proving in the cardano-cli on such a short time period (see also [Insecurity of secret key re-usage](https://www.essentialcardano.io/article/insecurity-of-secret-key-re-usage)). + +This has the unfortunate effect of making this participation procedure harder for SPOs relying on cold storage but we are open to the idea of proxy-keys authenticated off-chain through a challenge similar to [CIP-0022][]. + +#### KES Signing + +There's a third on-chain element which we could use for identifying SPOs which is a digital signature from their KES credentials. It is however a bit more annoying to leverage mainly because KES are meant to expire and are only loosely tied to pools by operational certificate. Thus, verifying KES signatures on a survey requires a more complex setup and monitoring to keep track of operational certificates and their validity at the time of the survey. + +If this CIP was meant to NOT be an interim solution, this is something we would likely consider. However, given the timeframe we're looking at and the overall trade-offs in complexity, we have opted out of using the KES as an authentication mechanism in this iteration. + +#### Proxy keys + +Another possible alternative to what's described in the CIP would be to have SPOs register a proxy Ed25519 key and use that proxy key onward. The validity of the proxy key registration would be conditionned to the production of an associated VRF proof or a digital signature from the cold key (very much like it's done for operational certificate). + +Yet, like the KES alternative, this option is in conflict with some of the design goals of this CIP: simplicity. All the more so given that we want to maximise participation of SPOs to the various surveys. We aim to make the process of participating to the survey as simple as possible, without compromising on security. + +> **Note** Both alternative options for KES Signing and Proxy Keys may be re-considered in a future version of the survey. Especially if the solution turns out to be not _as temporary as intended_. Fortunately, the current design decisions do not preclude this from happening as it shall be possible to introduce two new witness types `6` and `7` for those purpose. The KES registration can be handled through a separate on-chain event. + +### Security + +#### Replayability + +Questions are meant to be unique, achieved using an optional nonce. It is up to the genesis entity conducting the poll to ensure the formulated question is unique. If the same question is asked several times, the nonce provides non-replayable protection. + +Then, because every answer contains a (unique) hash of the question, answers are unique too. Yet, it still means that the same answer can be recast multiple times (possibly, by another system actor), so we do not allow answers to be changed/cast multiple times. The only exception is when answers are authenticated again using a cold key. + +#### Credentials exposure + +Exposure to SPOs' secret credentials must be limited, and their manipulation shall be done carefully. This potential attack vector is why we propose to extend the `cardano-cli` and have support for these features scrutinised by existing core maintainers and other open source actors. + +Other tools are then free to replicate the approach taken in the cardano-cli, but we recommend that SPOs proceed with extreme caution when using third-party tools. In particular, any tool should be able to work fully offline to produce the required metadata. Final transaction construction and submission shall be made in any suitable environment, yet the metadata's production shall be done only in air-gapped systems. + +## Path to Active + +### Acceptance Criteria + +- [ ] Visible agreement and engagement from a large set of SPOs +- [ ] The Cardano Foundation has conducted a first trial poll on mainnet + +### Implementation Plan + +- [ ] Possibly add support for KES signing as an alternative to EdDSA from the cold key and the VRF proving. + +#### Tools Support + +- [x] [`cardano-cli`](https://github.com/input-output-hk/cardano-node/tree/master/cardano-cli#readme) will be updated to provide support for constructing and signing relevant transactions + - [x] See [input-output-hk/cardano-node#5050](https://github.com/input-output-hk/cardano-node/pull/5050). +- [ ] [`cncli`](https://github.com/cardano-community/cncli) might be updated with similar support +- [ ] [`cardano-signer`](https://github.com/gitmachtl/cardano-signer) might be updated with similar support + +#### Test runs + +- [ ] Announce a testnet run (on Preprod) and invite SPOs to a workshop session to conduct a testnet poll. +- [ ] Possibly do a second test run, but on mainnet this time. + +## Copyright + +This CIP is licensed under [CC-BY-4.0][]. + +[CIP-1694]: https://github.com/cardano-foundation/CIPs/pull/380 +[CIP-0022]: https://github.com/cardano-foundation/CIPs/pull/102 +[CC-BY-4.0]: https://creativecommons.org/licenses/by/4.0/legalcode +[Apache-2.0]: http://www.apache.org/licenses/LICENSE-2.0 From 0d27efc908c1f6d8b84a1b37a3ea64962e565108 Mon Sep 17 00:00:00 2001 From: Markus Date: Fri, 28 Apr 2023 15:06:47 +0200 Subject: [PATCH 2/7] procedure and duration describe the ballot cast + redelegation epoch sequence --- CIP-0094/CIP-0094_procedure-duration.png | Bin 0 -> 17991 bytes CIP-0094/README.md | 10 +++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 CIP-0094/CIP-0094_procedure-duration.png diff --git a/CIP-0094/CIP-0094_procedure-duration.png b/CIP-0094/CIP-0094_procedure-duration.png new file mode 100644 index 0000000000000000000000000000000000000000..c40d6d7e7b47ddc3555d3b9503c66086a9e37f77 GIT binary patch literal 17991 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 literal 0 HcmV?d00001 diff --git a/CIP-0094/README.md b/CIP-0094/README.md index eb87b2caa..1486c81f6 100644 --- a/CIP-0094/README.md +++ b/CIP-0094/README.md @@ -171,11 +171,15 @@ The transaction carrying the answer metadata must then **be signed using a stake > > Only the first answer to a poll for each credential shall be considered. If multiple answers are found, only the first answer submitted (transaction & block ordering tallying) shall be considered. -### Duration +### Procedure and Duration -A poll starts when a valid transaction with a question is posted on-chain and ends at the end of the following epoch, so there's always at least one entire epoch for answering the poll. +A poll starts when a valid transaction with a question is posted on-chain. Ballots can be submitted until the end of the following epoch, so there is always at least one whole epoch to answer the poll. -In particular, the stake distribution of pools will be considered at the moment the poll is _started_. +After the epoch in which the Stake Pool Operators have cast their votes, there follows a period of one or more epochs in which the ADA Delegates may respond: If they disagree with the choice of their current Stake pool, they can delegate to another pool. This changes the stake weight and thus influences the result. + +![Alt text](CIP-0094_procedure-duration.png "Epoch poll phases") + +Indirectly, this results in the possibility of participation for all ada holders. Only after this re-delegation epoch(s) is completed, is the stake snaphot of the pools made to calculate the outcome. ### Outcome From 556f7fae7558ca0ab56b5e5c5d76f20ca9ef91fa Mon Sep 17 00:00:00 2001 From: Markus Date: Tue, 16 May 2023 11:19:03 +0200 Subject: [PATCH 3/7] update procedure and duration replace vote/ballot by answer explain the current definition of answer and delegation durations --- CIP-0094/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CIP-0094/README.md b/CIP-0094/README.md index 1486c81f6..3ca89452d 100644 --- a/CIP-0094/README.md +++ b/CIP-0094/README.md @@ -173,11 +173,11 @@ The transaction carrying the answer metadata must then **be signed using a stake ### Procedure and Duration -A poll starts when a valid transaction with a question is posted on-chain. Ballots can be submitted until the end of the following epoch, so there is always at least one whole epoch to answer the poll. +A poll starts when a valid transaction with a question is posted on-chain. Answers can be submitted until the end of the following epoch, so there is always at least one whole epoch to answer the poll. -After the epoch in which the Stake Pool Operators have cast their votes, there follows a period of one or more epochs in which the ADA Delegates may respond: If they disagree with the choice of their current Stake pool, they can delegate to another pool. This changes the stake weight and thus influences the result. +After one or more epochs in which the Stake Pool Operators have cast their answers, there follows a period of one or more epochs in which the ADA Delegates may respond: If they disagree with the choice of their current Stake pool, they can delegate to another pool. This changes the stake weight and thus influences the result. At the current state, the epochs for the answer and redelegation phase are only defined off-chain. In the future, they could also be defined as part of the signed question. -![Alt text](CIP-0094_procedure-duration.png "Epoch poll phases") +![Alt text](CIP-0094_procedure-duration.png "Epoch poll phases example") Indirectly, this results in the possibility of participation for all ada holders. Only after this re-delegation epoch(s) is completed, is the stake snaphot of the pools made to calculate the outcome. From 638f7d0b31e369162563b0c958c40da83377beb9 Mon Sep 17 00:00:00 2001 From: Markus Date: Tue, 16 May 2023 11:46:57 +0200 Subject: [PATCH 4/7] Update CIP-0094_procedure-duration.png --- CIP-0094/CIP-0094_procedure-duration.png | Bin 17991 -> 19364 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/CIP-0094/CIP-0094_procedure-duration.png b/CIP-0094/CIP-0094_procedure-duration.png index c40d6d7e7b47ddc3555d3b9503c66086a9e37f77..12c509348f7627204ad7832fe4ba13aef2a146e1 100644 GIT binary patch literal 19364 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 literal 17991 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 From e1a909ff92af0b1036cf30a87b11c016f2ea3248 Mon Sep 17 00:00:00 2001 From: KtorZ Date: Tue, 4 Apr 2023 10:31:32 +0200 Subject: [PATCH 5/7] Draft SPO on-chain voting proposal Co-authored-by: gufmar --- CIP-0094/README.md | 277 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 CIP-0094/README.md diff --git a/CIP-0094/README.md b/CIP-0094/README.md new file mode 100644 index 000000000..eb87b2caa --- /dev/null +++ b/CIP-0094/README.md @@ -0,0 +1,277 @@ +--- +CIP: 94 +Title: On-chain SPO polls +Category: Tools +Status: Proposed +Authors: + - Matthias Benkort + - Markus Gufler +Implementors: + - Matthias Benkort +Discussions: + - https://github.com/cardano-foundation/cips/pull/496 + - https://github.com/cardano-foundation/cips/pull/102 + - https://github.com/input-output-hk/cardano-node/pull/5050 + - https://github.com/input-output-hk/cardano-node/pull/5132 +Created: 2023-03-21 +License: CC-BY-4.0 +--- + +## Abstract + +The Cardano Foundation proposes a mechanism for polling Cardano stake pool operators on specific topics. Polls are done on-chain through transaction metadata and authenticated through stake pool credentials (Ed25519 cold key). The goal is to gather opinions on governance matters such as protocol parameter updates. This standard is an inclusive interim solution while the work on a larger governance framework such as [CIP-1694][] continues. + +## Motivation: why is this CIP necessary? + + +Governance is difficult. Discussions on CIP-1694 can attest to that quite clearly. There are constant debates within the Cardano community about changing protocol parameters, and the decision ultimately falls -- at this stage still -- onto the three genesis entities: Input Output, The Cardano Foundation and Emurgo. Yet, at this stage, few governance tools are at their disposal to make educated decisions. Besides Twitter polls, newsletter surveys, and SPO town halls on Discord, we have identified a gap and an opportunity to engage with the Cardano community through means currently at our disposal. + +Conducting an on-chain poll between SPOs can also be seen as an experiment and an evaluation of the network's participation and engagement in the governance questions. Even though we only propose to poll one particular group of the Cardano community (the SPOs), such events can help to provide actual data to fuel the conversations around CIP-1694. + +In summary, the goals are: + +1. [x] to make some first experimental baby steps in the realm of governance; +1. [x] to be achievable _now_ (or an in immediate future); +1. [x] to capture participation data from SPOs; +1. [x] to raise awareness amongst SPOs regarding their future role in governance; +1. [x] to keep the Voltaire dynamics up in the ecosystem while other efforts are being pursued; +1. [x] to improve relations between the Cardano Foundation & SPOs for better mutual understanding and fruitful conversations. + + +## Specification + +### Overview + +Polls will be multiple-choice questions by The Cardano Foundation with pre-defined answers to choose from. + +Here's an example of a question and answers: + +- _Pineapples on pizza?_ + - [ ] yes + - [ ] no + +The serialised question and answers will be posted on-chain and signed by one of the delegate genesis keys owned by The Cardano Foundation. Answers will be provided on-chain by participating SPOs via transaction metadata referring to: + +- The question and answers +- The index of the chosen answer from the available choices +- A digital signature (EdDSA) from the SPO's current cold key + +> **Note** +> In this document, every time we refer to a _serialized object_, we refer to its **canonical** CBOR representation. In particular, keys in a map are always ordered alphabetically. + +### Question structure + +A question is posted in a transaction's metadata using the metadata label `94` and the following metadata structure: + +```cbor +question = + { 0: prompt + , 1: [ * choice ] + , ? "_": nonce + } + +prompt = + [ * text .size (0..64) ] + +choice = + [ * text .size (0..64) ] + +nonce = + uint +``` + +A nonce is optionally included to provide non-replayability should the same question and answers be asked multiple times over different periods. The transaction carrying a question **must** be signed by one of the genesis delegate keys to be considered valid. This genesis key signature isn't captured in the metadata but in the transaction itself as an extra signatory. + +For example: + + + + + + + + + + + +
CBOR diagnostic + Base16-encoded
+
+{ 94:
+  { 0: [ "Pineapples on pizza?" ]
+  , 1:
+    [ [ "yes" ]
+    , [ "no" ]
+    ]
+  }
+}
+
+
+ +
+A1185EA200817450696E656170706C6573206F
+6E2070697A7A613F0182816379657381626E6F
+
+
+
+ +### Answer structure + +Similarly, an answer to a question is posted as transaction's metadata using the label `94` and the following metadata structure: + +```cbor +answer = + { 2: question_hash + , 3: choice + } + +question_hash = + bytes .size 32 +``` + +Some remarks: + +1. The field `2` (`question_hash`) is a blake2b-256 hash digest, whose preimage is the entire serialised question metadata payload (with the `94` top-level label). +1. The field `3` represents the 0-based index of the chosen answer from the available choices (from field `1` of the target poll). + +For example: + + + + + + + + + + + +
CBOR diagnostic + Base16
+
+{
+  94: {
+    2: h'29093fd43fc30ba31e306af06ce8537390e1668ae7496fe53d53684683c3762c',
+    3: 0
+  }
+}
+
+
+ +
+A1185EA202582029093FD43FC30BA31E306AF06CE
+8537390E1668AE7496FE53D53684683C3762C0300
+
+
+
+ +The transaction carrying the answer metadata must then **be signed using a stake pool operator cold key**. Because cold key are not payment keys, this requires specifying an extra required signer on the transaction (transaction's field number 14 as per [Babbage's CDDL](https://github.com/input-output-hk/cardano-ledger/blob/cffa75fdbd800cda60997791e51bf02f2af0c42b/eras/babbage/test-suite/cddl-files/babbage.cddl#L66)). The signature shall be produced in an air-gapped environment only. + +> **Warning** +> +> Only the first answer to a poll for each credential shall be considered. If multiple answers are found, only the first answer submitted (transaction & block ordering tallying) shall be considered. + +### Duration + +A poll starts when a valid transaction with a question is posted on-chain and ends at the end of the following epoch, so there's always at least one entire epoch for answering the poll. + +In particular, the stake distribution of pools will be considered at the moment the poll is _started_. + +### Outcome + +The outcome of a poll will depend on its level of participation (in **terms of stake**). It is essential to understand that we explicitly call this a _poll_ / _survey_ and not a _vote_ to dispel any possible confusion. So it is akin to `1 Lovelace = 1 Voice` although we may chose to interpret data using different equations (e.g. giving more weight to pledged stake). How the data is interpret is deemed out of the scope of this proposal which aims mainly at producing the data-points. Further conversations and debates will be needed regarding interpretation of the data-points. + + +This proposal does not introduce a change in the current governance scheme: it is still up to the three genesis entities to make a final call based on the poll results. Poll results will provide new data points to feed into the conversation. But, regardless of the outcome, any decision will be explained and motivated by other auditable sources of information. And on-chain polls will provide such an auditable source. + +## Rationale: how does this CIP achieve its goals? + +### Recording question & answers + +The proposed process will permanently record questions and their answers on-chain by leveraging existing transaction metadata. Note that we consciously do not record any element as datums. There are several reasons for this: + +1. Datums offer extra programmability (for being available in Plutus script context); this is not needed at this stage. +1. Following a _keep-it-simple_ strategy, we propose relying on well-known and well-supported transaction features (a.k.a metadata) for producers and consumers. +1. Storing data in datums / UTxO has a non-negligible cost; naive datum storage would create thousands of new dummy UTxO on each poll. Transactions are cheaper to store and consume. +1. Polls rely on slot order when tallying answers, which means that chain sync is needed anyway, and there's no strong argument for having this information readily available in the UTxO graph. + +### Cold key signing vs VRF proving + +There have been several (on-and-off-the-record) discussions regarding using the cold key (Ed25519) vs the VRF key as authentication instruments; and arguments for both. + +On the one hand, some prefer the use of the cold key because: + +- The cold key is meant to authenticate stake-pools activity (e.g. certificate registrations/updates). +- It is ultimately the cold key that identifies a pool; its hash is the _pool id_. +- The VRF is more likely to be compromised, hence granting rights to participate in a poll to potential adversaries. +- Cold keys are Ed25519 keys, which allows piggybacking on the existing protocol's capabilities for transaction witnesses (extra required signer + verification key witnesses). + +On the other hand, arguments for using the VRF key were already discussed as part of [CIP-0022][]: + +- Because it's a hotkey, the VRF is usually more accessible, so it is more likely to lead to higher participation in surveys and no exposure of the cold key is needed. +- Blocks contain VRF proofs, which serve as explicit pool identifiers. +- It is only necessary to check that a key is correct at the moment of the poll, making VRF keys perfectly suitable. + +We originally opted for a hybrid solution (as visible in input-output-hk#5050) but later decided to drop the VRF option to rely solely on cold key signing (see input-output-hk#5132). The reason for that regards the possible uncertainty of promoting (ab)use of VRF proving in the cardano-cli on such a short time period (see also [Insecurity of secret key re-usage](https://www.essentialcardano.io/article/insecurity-of-secret-key-re-usage)). + +This has the unfortunate effect of making this participation procedure harder for SPOs relying on cold storage but we are open to the idea of proxy-keys authenticated off-chain through a challenge similar to [CIP-0022][]. + +#### KES Signing + +There's a third on-chain element which we could use for identifying SPOs which is a digital signature from their KES credentials. It is however a bit more annoying to leverage mainly because KES are meant to expire and are only loosely tied to pools by operational certificate. Thus, verifying KES signatures on a survey requires a more complex setup and monitoring to keep track of operational certificates and their validity at the time of the survey. + +If this CIP was meant to NOT be an interim solution, this is something we would likely consider. However, given the timeframe we're looking at and the overall trade-offs in complexity, we have opted out of using the KES as an authentication mechanism in this iteration. + +#### Proxy keys + +Another possible alternative to what's described in the CIP would be to have SPOs register a proxy Ed25519 key and use that proxy key onward. The validity of the proxy key registration would be conditionned to the production of an associated VRF proof or a digital signature from the cold key (very much like it's done for operational certificate). + +Yet, like the KES alternative, this option is in conflict with some of the design goals of this CIP: simplicity. All the more so given that we want to maximise participation of SPOs to the various surveys. We aim to make the process of participating to the survey as simple as possible, without compromising on security. + +> **Note** Both alternative options for KES Signing and Proxy Keys may be re-considered in a future version of the survey. Especially if the solution turns out to be not _as temporary as intended_. Fortunately, the current design decisions do not preclude this from happening as it shall be possible to introduce two new witness types `6` and `7` for those purpose. The KES registration can be handled through a separate on-chain event. + +### Security + +#### Replayability + +Questions are meant to be unique, achieved using an optional nonce. It is up to the genesis entity conducting the poll to ensure the formulated question is unique. If the same question is asked several times, the nonce provides non-replayable protection. + +Then, because every answer contains a (unique) hash of the question, answers are unique too. Yet, it still means that the same answer can be recast multiple times (possibly, by another system actor), so we do not allow answers to be changed/cast multiple times. The only exception is when answers are authenticated again using a cold key. + +#### Credentials exposure + +Exposure to SPOs' secret credentials must be limited, and their manipulation shall be done carefully. This potential attack vector is why we propose to extend the `cardano-cli` and have support for these features scrutinised by existing core maintainers and other open source actors. + +Other tools are then free to replicate the approach taken in the cardano-cli, but we recommend that SPOs proceed with extreme caution when using third-party tools. In particular, any tool should be able to work fully offline to produce the required metadata. Final transaction construction and submission shall be made in any suitable environment, yet the metadata's production shall be done only in air-gapped systems. + +## Path to Active + +### Acceptance Criteria + +- [ ] Visible agreement and engagement from a large set of SPOs +- [ ] The Cardano Foundation has conducted a first trial poll on mainnet + +### Implementation Plan + +- [ ] Possibly add support for KES signing as an alternative to EdDSA from the cold key and the VRF proving. + +#### Tools Support + +- [x] [`cardano-cli`](https://github.com/input-output-hk/cardano-node/tree/master/cardano-cli#readme) will be updated to provide support for constructing and signing relevant transactions + - [x] See [input-output-hk/cardano-node#5050](https://github.com/input-output-hk/cardano-node/pull/5050). +- [ ] [`cncli`](https://github.com/cardano-community/cncli) might be updated with similar support +- [ ] [`cardano-signer`](https://github.com/gitmachtl/cardano-signer) might be updated with similar support + +#### Test runs + +- [ ] Announce a testnet run (on Preprod) and invite SPOs to a workshop session to conduct a testnet poll. +- [ ] Possibly do a second test run, but on mainnet this time. + +## Copyright + +This CIP is licensed under [CC-BY-4.0][]. + +[CIP-1694]: https://github.com/cardano-foundation/CIPs/pull/380 +[CIP-0022]: https://github.com/cardano-foundation/CIPs/pull/102 +[CC-BY-4.0]: https://creativecommons.org/licenses/by/4.0/legalcode +[Apache-2.0]: http://www.apache.org/licenses/LICENSE-2.0 From b9c15da50dd3e81006cf5bbd9ea0b4961a7aa71a Mon Sep 17 00:00:00 2001 From: KtorZ Date: Tue, 6 Jun 2023 15:58:47 +0200 Subject: [PATCH 6/7] Update CIP-0094 to active --- CIP-0094/README.md | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/CIP-0094/README.md b/CIP-0094/README.md index 7e3f72e5e..e8f698f66 100644 --- a/CIP-0094/README.md +++ b/CIP-0094/README.md @@ -2,12 +2,14 @@ CIP: 94 Title: On-chain SPO polls Category: Tools -Status: Proposed +Status: Active Authors: - Matthias Benkort - Markus Gufler Implementors: - Matthias Benkort + - Ashish Prajapati + - Dmytro Stashenko Discussions: - https://github.com/cardano-foundation/cips/pull/496 - https://github.com/cardano-foundation/cips/pull/102 @@ -165,7 +167,11 @@ A1185EA202582029093FD43FC30BA31E306AF06CE -The transaction carrying the answer metadata must then **be signed using a stake pool operator cold key**. Because cold key are not payment keys, this requires specifying an extra required signer on the transaction (transaction's field number 14 as per [Babbage's CDDL](https://github.com/input-output-hk/cardano-ledger/blob/cffa75fdbd800cda60997791e51bf02f2af0c42b/eras/babbage/test-suite/cddl-files/babbage.cddl#L66)). The signature shall be produced in an air-gapped environment only. +The transaction carrying the answer metadata must then **be signed using a stake pool operator cold key**. Because cold key are not payment keys, it is required to specify an extra required signer on the transaction (transaction's field number 14 as per [Babbage's CDDL](https://github.com/input-output-hk/cardano-ledger/blob/cffa75fdbd800cda60997791e51bf02f2af0c42b/eras/babbage/test-suite/cddl-files/babbage.cddl#L66)) to prevent malicious nodes from potentially propagating transactions without the necessary key witnesses. + +Alternatively, operators that are unable to sign arbitrary transactions due to hardware limitations can opt for stake pool update-registration certificate and attach the transaction metadata to it. Because an update-registration requires a signature from the cold key, the extra required signer field is redundant in that situation. + +Regardless of the method, the signature shall be produced in an air-gapped environment only. > **Warning** > @@ -252,24 +258,32 @@ Other tools are then free to replicate the approach taken in the cardano-cli, bu ### Acceptance Criteria -- [ ] Visible agreement and engagement from a large set of SPOs -- [ ] The Cardano Foundation has conducted a first trial poll on mainnet +- [x] The Cardano Foundation has conducted a first trial poll on mainnet ([CardanoScan](https://cardanoscan.io/spo-polls/96861fe7da8d45ba5db95071ed3889ed1412929f33610636c072a4b5ab550211) / [AdaStat](https://preprod.adastat.net/polls/62c6be72bdf0b5b16e37e4f55cf87e46bd1281ee358b25b8006358bf25e71798)) +- [x] Visible agreement and engagement from a large set of SPOs + - [x] Multiple SPOs workshops + - [x] ~800 stake pools participating on the first mainnet poll + - [x] ~11B stake answered the first mainnet poll ### Implementation Plan +- [x] Provide a reference implementation for the signing method + - [x] [`cardano-cli`](https://github.com/input-output-hk/cardano-node/tree/master/cardano-cli#readme) [has been updated](https://github.com/input-output-hk/cardano-node/pull/5050) to provide support for constructing and signing relevant transactions. + - [x] Created [scripts to crawl the chain](https://github.com/cardano-foundation/CIP-0094-polls/tree/main/crawler#cip-0094-chain-crawler) for results. + - [ ] Possibly add support for KES signing as an alternative to EdDSA from the cold key and the VRF proving. #### Tools Support -- [x] [`cardano-cli`](https://github.com/input-output-hk/cardano-node/tree/master/cardano-cli#readme) will be updated to provide support for constructing and signing relevant transactions - - [x] See [input-output-hk/cardano-node#5050](https://github.com/input-output-hk/cardano-node/pull/5050). -- [ ] [`cncli`](https://github.com/cardano-community/cncli) might be updated with similar support +- [x] [`cncli`](https://github.com/cardano-community/cncli) has been updated with similar support +- [x] [`CardanoScan`](https://cardanoscan.io/spo-polls) now lists available and past polls directly on their web UI. +- [x] [`AdaStat`](https://preprod.adastat.net/polls) now lists available and past polls directly on their web UI. - [ ] [`cardano-signer`](https://github.com/gitmachtl/cardano-signer) might be updated with similar support #### Test runs -- [ ] Announce a testnet run (on Preprod) and invite SPOs to a workshop session to conduct a testnet poll. -- [ ] Possibly do a second test run, but on mainnet this time. +- [x] Announce a testnet run (on Preprod) and invite SPOs to a workshop session to conduct a testnet poll. + - See the [Preprod poll on AdaStat](https://preprod.adastat.net/polls/62c6be72bdf0b5b16e37e4f55cf87e46bd1281ee358b25b8006358bf25e71798). +- [ ] ~~Possibly do a second test run, but on mainnet this time.~~ ## Copyright From 3c2e5b74da534fba4876d74bfe37bca23592f8f3 Mon Sep 17 00:00:00 2001 From: KtorZ Date: Fri, 9 Jun 2023 08:31:07 +0200 Subject: [PATCH 7/7] Document extra metadata via CIP-0020 (lbl 694) for polls + add entry to CIP-0010 --- CIP-0010/registry.json | 4 ++++ CIP-0094/README.md | 6 ++++++ README.md | 6 +++--- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CIP-0010/registry.json b/CIP-0010/registry.json index 042e256c0..1ae57513e 100644 --- a/CIP-0010/registry.json +++ b/CIP-0010/registry.json @@ -7,6 +7,10 @@ "transaction_metadatum_label": 88, "description": "milkomeda.com - the destination address in the sidechain" }, + { + "transaction_metadatum_label": 94, + "description": "CIP-0094 - On-chain governance polls" + }, { "transaction_metadatum_label": 123, "description": "shareslake.com - Bridge routing information" diff --git a/CIP-0094/README.md b/CIP-0094/README.md index e8f698f66..dc7242aca 100644 --- a/CIP-0094/README.md +++ b/CIP-0094/README.md @@ -15,6 +15,8 @@ Discussions: - https://github.com/cardano-foundation/cips/pull/102 - https://github.com/input-output-hk/cardano-node/pull/5050 - https://github.com/input-output-hk/cardano-node/pull/5132 + - https://forum.cardano.org/t/entering-voltaire-on-chain-poll-for-spos/117330 + - https://forum.cardano.org/t/entering-voltaire-poll-experiment-live-on-mainnet/117879 Created: 2023-03-21 License: CC-BY-4.0 --- @@ -177,6 +179,10 @@ Regardless of the method, the signature shall be produced in an air-gapped envir > > Only the first answer to a poll for each credential shall be considered. If multiple answers are found, only the first answer submitted (transaction & block ordering tallying) shall be considered. +### Adding context + +It is possible to optionally attach extra context to the transaction as metadata following the procedure described in [CIP-0020](../CIP-0020/). Beside the structure specified in CIP-0020, such extra metadata is free-form and can be used to signal an intention behind a choice, or to voice a concern, or simply to give extra context. This is totally optional though we encourage SPOs to use this to inform their delegators of their choices. + ### Procedure & Duration A poll starts when a valid transaction with a question is posted on-chain. Answers can be submitted until the end of the following epoch, so there is always at least one whole epoch to answer the poll. diff --git a/README.md b/README.md index c2d3e65d1..6b1a39292 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ CIP Editors meetings are public, recorded, and [published on Youtube](https://ww | 83 | [Encrypted Transaction message/comment metadata (Addendum to CIP-0020)](./CIP-0083) | Active | | 85 | [Sums-of-products in Plutus Core](./CIP-0085) | Proposed | | 86 | [NFT Metadata Update Oracles](./CIP-0086) | Proposed | +| 94 | [SPO On-chain Polls](./CIP-0094) | Active | | 381 | [Plutus Support for Pairings Over BLS12-381](./CIP-0381) | Proposed | | 1852 | [HD (Hierarchy for Deterministic) Wallets for Cardano](./CIP-1852/) | Active | | 1853 | [HD (Hierarchy for Deterministic) Stake Pool Cold Keys for Cardano](./CIP-1853/) | Active | @@ -90,7 +91,7 @@ CIP Editors meetings are public, recorded, and [published on Youtube](https://ww | 1855 | [Forging policy keys for HD Wallets](./CIP-1855/) | Active | | 9999 | [Cardano Problem Statements](./CIP-9999/) | Active | -

Last updated on 2023-05-30

+

Last updated on 2023-06-09

> 💡 For more details about Statuses, refer to [CIP-0001](./CIP-0001). @@ -120,13 +121,12 @@ Below are listed tentative CIPs still under discussion with the community. They | 91? | [Don't force Built-In functions](https://github.com/cardano-foundation/CIPs/pull/459) | | 92? | [First-class errors in Plutus](https://github.com/cardano-foundation/CIPs/pull/469) | | 93? | [Authenticated Web3 HTTP requests](https://github.com/cardano-foundation/CIPs/pull/442) | -| 94? | [SPO On-chain Polls](https://github.com/cardano-foundation/CIPs/pull/496) | | 95? | [Cardano dApp-Wallet Web Bridge Governance Extension](https://github.com/cardano-foundation/CIPs/pull/509) | | 96? | [On-chain dApp Certification Metadata](https://github.com/cardano-foundation/CIPs/pull/499) | | 97? | [Representing the Script Context as a SOP term](https://github.com/cardano-foundation/CIPs/pull/507) | | 1694? | [A proposal for entering the Voltaire phase](https://github.com/cardano-foundation/CIPs/pull/380) | -

Last updated on 2023-05-24

+

Last updated on 2023-06-09

### Proposals Under Review (CPS)