通过咨询区块链,Boss可以随时理解拥有Power Coins的ScriptPubKeys。
因此,他将根据投票权比例向这些所有者发送投票硬币,在我们的案例中,投给Alice 一枚投票硬币和投给Satoshi一枚投票硬币。
首先,我须要为votingCoin创建一些资金。

var votingCoin = new Key();
var init2 = new Transaction()
{
Outputs =
{
new TxOut(Money.Coins(1.0m), votingCoin),
}
};
repo.Transactions.Put(init2);
然后,发行投票硬币
issuance = GetCoins(init2, votingCoin).Select(c => new IssuanceCoin(c)).ToArray();
builder = new TransactionBuilder();
var toVoters =
builder
.AddCoins(issuance)
.AddKeys(votingCoin)
.IssueAsset(alice, new AssetMoney(votingCoin, 1))
.IssueAsset(satoshi, new AssetMoney(votingCoin, 1))
.SetChange(votingCoin)
.BuildTransaction(true);
repo.Transactions.Put(toVoters);
投票代表团
问题在于投票涉及公司的某些财务方面,而Alice 则紧张关注营销方面。
她的决定是将她的投票硬币分发给她相信对财务问题有更好判断力的人。 她选择将她的选举委托给Bob。
var aliceVotingCoin = ColoredCoin.Find(toVoters,repo)
.Where(c=>c.ScriptPubKey == alice.ScriptPubKey)
.ToArray();
builder = new TransactionBuilder();
var toBob =
builder
.AddCoins(aliceVotingCoin)
.AddKeys(alice)
.SendAsset(bob, new AssetMoney(votingCoin, 1))
.BuildTransaction(true);
repo.Transactions.Put(toBob);
您把稳到没有SetChange,缘故原由是输入的彩色硬币已完备耗尽,因此无需返回。
表决
想象一下Satoshi太忙了,决定不投票。 现在Bob必须表达他的决定。
投票涉及公司是否该当向银行申请贷款以投资新的生产机器。
老板在公司网站上说:发送你的硬币到1HZwkjkeaoZfTSaJxDw6aKkxp45agDiEzN
是的,对付1F3sAm6ZtwLAUnj7d38pGFxtP3RVEvtsbV没有。
Bob决定公司该当贷款:
var bobVotingCoin = ColoredCoin.Find(toVoters, repo)
.Where(c => c.ScriptPubKey == bob.ScriptPubKey)
.ToArray();
builder = new TransactionBuilder();
var vote =
builder
.AddCoins(bobVotingCoin)
.AddKeys(bob)
.SendAsset(BitcoinAddress.Create(\"大众1HZwkjkeaoZfTSaJxDw6aKkxp45agDiEzN\"大众),
new AssetMoney(votingCoin, 1))
.BuildTransaction(true);
现在老板可以打算出投票结果,并看到1-是0-否,是赢了,以是他接管了贷款。
每个参与者也可以自己打算结果。
替代方案:利用李嘉图合约(Ricardian Contract)
在上一个练习中,我们假设Boss在公司网站上宣告了区块链投票的模式。
但Bob须要知道该网站存在。
另一种办理方案是在资产定义文件中直接在区块链上发布投票模式,因此一些软件可以自动获取并将其呈现给Bob。
唯一会改变的代码是在向选民发放投票硬币期间。
issuance = GetCoins(init2, votingCoin).Select(c => new IssuanceCoin(c)).ToArray();
issuance[0].DefinitionUrl = new Uri(\公众http://boss.com/vote01.json\"大众);
builder = new TransactionBuilder();
var toVoters =
builder
.AddCoins(issuance)
.AddKeys(votingCoin)
.IssueAsset(alice, new AssetMoney(votingCoin, 1))
.IssueAsset(satoshi, new AssetMoney(votingCoin, 1))
.SetChange(votingCoin)
.BuildTransaction(true);
repo.Transactions.Put(toVoters);
在这种情形下,Bob可以看到在他投票硬币的发行期间,发布了一个资产定义文件,它只不过是一个JSON文档,其模式部分地在Open Asset中指定。该模式可以扩展为具有关于事物:
投票到期每个候选人的选票的目的地人性化的描述但是,想象一下黑客想要欺骗投票。 他总是可以修正json文档(无论是中间人攻击,还是物理访问boss.com,或者访问Bob的机器),因此Bob被欺骗并将他的投票发送给缺点的候选人。
通过署名将资产定义文件转换为李嘉图合约(Ricardian Contract)将使任何修正立即可被Bob的软件检测到。