深入了解KambriaVote

投票是坎布里亚的核心机制。 选举专家,就问题,信号偏好和发展方向进行投票的能力使社区能够在各个领域推动创新。 在这篇文章中,我们讨论KambriaVote的实现细节, KambriaVote是为Kambria创建的链上投票机制。 KambriaVote是CarbonVote的改进。

作为KambriaVote的第一个用例,用户可以投票给Kambria将于今年年底组织的黑客马拉松(投票活动)最喜欢的挑战(候选人)。

2.1力学

–用户(具有KAT测试令牌的帐户,称为KATT)可以加入任何公开投票的竞选活动,并为该竞选活动中的一名候选人投票。

–要进行投票,用户将KATT的所有余额作为选票。

–选票不平等,应加权。 投票的重心就是关贸总协定的余额。 例如,拥有10 KATT的用户的投票权重将高于拥有5 KATT的用户的投票权。 这意味着用户持有的KATT越多,他/她的投票对结果的影响就越大。

–如果用户在同一活动中对另一个候选人进行投票,则智能合约会将该用户的选票移至另一个候选人。

–用户可以更改其投票,但只能为竞选中的一名候选人投票。

–用户可以在多个广告系列中投票。

2.2如何计算票数

如果在投票期间帐户中的KATT余额发生变化,则单张投票的权重将发生变化。 加权选票的总数将在一个公开竞选中动态反映在当前投票数上。 投票结束时,只有KATT当前帐户中的余额将用于加权投票。 例如,如果用户在初次投票时拥有10 KAT,但花费了2 KAT,则在投票期结束时,他/她将仅向投票的候选人贡献8加权选票(剩余余额)。 这样可确保没有一个用户可以“双重投票”。

3.1类和序列UML

3.2主持人Smart ContractModerator管理和发布投票活动(选票)。 它一次部署在链上,并管理多个投票活动的生命周期。

3.3投票智能合约

投票是一种智能合约,代表一个投票活动。 主持人通过以下输入部署投票合同:

–主持人:主持人地址。

– RATE:10 ^ RATE是投票的基本单位。

– CIDS:候选ID列表。

–开始:运动开始的程序段号。

–结束:活动结束的区块号。

– SCID:CIDS中候选人的索引。

投票是一种通过向候选人提供SCID的选票合同,将加权选票投给一名候选人的动作。 如第2节所述,您的加权投票是您帐户中KATT的当前余额。

为了进行投票,用户从候选人的SCID计算WEI的数量,然后将其发送到投票合同地址。

–发送至合同的金额= SCID X 10 ^ RATE WEI

例:

RATE = 12的投票合同地址0xef75e34c50c1b109fe65ee696f12225de508b9f2上对SCID = 3的候选人X进行投票。 我们计算要发送的金额为3 X 11²²WEI = 0.000003 ETH 。 请注意,此数量的ETH仅用于指示候选人,并将立即退款。 用户唯一需要支付的是通常的交易费用。

  function()payable mustBeVoting { 
uint256 value = msg.value;
msg.sender.transfer(msg.value); uint256投票= value.div(RATE);
require(票> = 0 &&投票<CANDIDATE_IDENTITIES.length);
投票[msg.sender] = CANDIDATE_IDENTITIES [vote];
发出VoteFor(msg.sender,选民[msg.sender]);
}

在上面的代码中, msg.sender.transfer(msg.value)退还ETH,只有该值用于计算SCID并将其记录到映射votes[msg.sender] = CANDIDATE_IDENTITIES[vote]

该映射记录了投票的地址,因此地址在一个广告系列中是唯一的,但可以在多个广告系列中使用。

要更改投票,用户可以发送带有新投票的另一笔交易,它将替换来自同一地址的先前的投票。

用户也可以“不投票”,撤销他/她的投票。 第一种方法是将所有KAT测试令牌简单地转移到尚未投票的另一个地址。 这意味着您基本上是在向候选人发布零加权选票。 第二种方法是发送SCID = 0的投票。 默认情况下,我们在CIDS中使用CID = 0x表示NULL候选者,因此您可以将交易与0 ETH一起发送以取消投票。 但是,在某些特殊情况下,这可能会改变,因此请务必事先检查。

“ mustBeVoting”标志表示广告系列已打开或关闭,在广告系列关闭后进入的投票/不投票将不被接受。

要结束投票活动,具有主持人特权的用户会将END0设置为主持人合同中的当前阻止号码。

4.1安全性

在CarbonVote中,参加投票活动的每个候选人都是合同。 因此,要运行一个10个候选活动,一个人需要在以太坊网络上部署10个合同。

我们将{Ballot,候选人,真实世界映射} (BCR)定义为选票与其候选者之间的语义关系,以及候选者到现实世界组件之间的映射,例如,候选者映射到代码库存储库。

缺少链上主持人意味着CarbonVote无法在链上维护BCR。 候选者和候选者到现实世界组件映射的分组都将脱链存储,这容易受到攻击。

KambriaVote通过将BCR放在链上来解决此问题。 参加竞选活动的候选人共享一个共同的选票合同地址。 这样做,我们保留了BCR的{Ballot,Candidate}部分。 我们可以通过使用代码库存储库KDNA的哈希作为CID来构建{候选,真实世界映射}关系。

如果对手想要攻击BCR,则可以。

1)销毁{Ballot,Candidate}关系,这意味着成功攻击了区块链,或者,

2)破坏{候选,真实世界-映射}关系,这意味着要颠倒我们上面定义为候选人KDNA的密码哈希的CID ,或者更改KDNA ,然后也将更改CID

两种攻击都不太可能发生。

4.2使用的气体

增加安全性会增加KambriaVote的成本吗?

让我们回顾一下:CarbonVote为每个候选人使用一个合同,而KambriaVote为一个投票活动使用一个投票合同。 下表比较了典型投票活动中CarbonVote和KambriaVote之间使用的气体。

在表3中,我们看到CarbonVote的交易费用为O(n) ,即,它随候选人数量的增加而线性增加,而KambriaVote为常数O(1)

对于只有少量候选人的竞选活动,CarbonVote可能更便宜,但从长远来看,KambriaVote会更经济。

4.3投票

要在CarbonVote中投票/避免投票,需要将所有ETH移至另一个地址。 这意味着投票仍然在那儿,但现在是零加权的。 从技术上讲这是可以的,但实际上可能会引起一些问题。 大型组织通常使用多重签名或冷钱包。 ETH转移是一个多步骤的过程,涉及2个或更多的参与者,并且可能涉及创建另一个multisig钱包,这意味着部署另一个合同。 这就是为什么我们在第4.2节中的成本比较中估计此操作将至少花费21.000瓦斯或更多的天然气。

在KambriaVote中,我们支持CarbonVote取消投票的方式,因为有时这种方式很有用,例如,可以减少选票的重量。 但是,我们还提供了第二种更经济的方式来消除空白。 这将使您的选票投给零索引的空缺候选人(0x)。 这将有效地使您的选票无效。 我们估计此操作将花费30.016瓦斯。

5.1隐私权

我们了解到,在某些情况下,投票者可能不想在投票时被其住址所识别。 我们提出了两种解决KambriaVote隐私的方法。

方法A使用差异隐私。 我们可以将投票机制更新为一个两步过程。

–步骤1:投掷硬币(如果是正面),您将正确投票(定义为真票)。 如果有尾巴,则您选择正确投票还是错误投票(定义为不正确的投票)。

–步骤2:重复步骤1。

正面或反面的机率是50%。 如果使用正面,则真票为100%,假票为0%。 有尾巴时,真投票为50%,假投票为50%,这是Bernoulli(0.5)分布。

我们有:

真实投票= 0.5 * 1 + 0.5 * 0.5 = 0.75

否决票= 0.5 * 0 + 0.5 * 0.5 = 0.25

假设在两次候选人投票中,候选人C1获得100票,候选人C2获得160票。我们如何将其转换为C1和C2的最终票数? 令x,y分别为C1,C2的最终票数。

根据我们的分布,在C1的100票中,0.75票为真票,0.25票为假票。 同样,对于C2收到的160票。

所以:

C1的真实投票= 0.75 * 100

C1的否决票= 0.25 * 100

C2的真实投票= 0.75 * 160

C2的否决票= 0.25 * 160

然后,

x = 0.75 * 100 + 0.25 * 160 = 115

y = 0.75 * 160 + 0.25 * 100 = 145

因此,我们可以宣布C2以145个最终投票数获胜,C1获得115个最终投票数。 在此方案中,我们可以确保Voter V投票,但是我们不知道他们是否投了赞成票或反对票,因此我们无法推断出他们投票赞成的人,因此保留了匿名性。

方法B稍微复杂一些。 我们可以实现启用zkSNARKs的投票系统。 回想一下zkSNARKS是满足要求的协议: 证明者P可以证明验证者V知道P知道谜题R的解S,而无需透露S或V以后可以用来获得优势来找到解决方案S的任何知识。

在KambriaVote中,我们允许选民秘密投票,并确保除候选人之外没有人知道谁为他们投票。 我们让候选人确切知道他们获得了多少票以及谁为他/她投票。 在这种情况下,候选项为P ,其他候选项为V。 P有动机保护自己的选民身份,这样他们就不会失去V的身份。 在我们的投票方案中,每个候选人都将担任PV。 在投票和验证回合结束时,每个V都会知道投票结果(通过密码验证),但不知道投票者的身份。

坎布里亚区块链工程师PhanSơnTự
谭婷西,坎布里亚(Kambria)首席技术官兼联合创始人


网站: https //kambria.io/
白皮书(ENG): https //kambria.io/Kambria_White_Paper_v1.1.pdf
电报(ENG): https //t.me/kambriaofficial
电报(KOR): https //t.me/KambriaKorea
电报(VIE): https //t.me/KambriaVietnam
电报公告频道: https //t.me/kambria
推特: https : //twitter.com/KambriaNetwork
面子书: https : //facebook.com/KambriaNetwork
Reddit: https : //www.reddit.com/r/KambriaOfficial/
电子邮件: info@kambria.io