初探Solidity的Ballot投票例子

393 阅读2分钟

编译环境

Microsoft Edge - Remix

编译

左侧Solidity compiler选项卡,点击Compile 3_Ballot.sol,选项卡图标上出现绿勾,编译完成。

部署

切换到Deploy&run transactions选项卡,选中一个ACCOUNT(下拉可以看到若干地址,应该是预置的一系列测试账户)来部署合约,该账户会成为chairman(投票主席)。确保CONTRACT选中3_Ballot.sol。

image.png

点击Deploy,控制台报错。

creation of Ballot errored: Error encoding arguments: Error: expected array value (argument=null, value="", code=INVALID_ARGUMENT, version=abi/5.5.0)

报空参数,需要填写参数proposalNames,类型为byte32。尝试传入普通字符串序列。

creation of Ballot errored: Error encoding arguments: Error: invalid arrayify value (argument="value", value="charlie", code=INVALID_ARGUMENT, version=bytes/5.5.0)

报类型错,只能传入byte32类型。

String转byte32

用node写一个转换脚本。*以下控制台环境为 Windows Powershell

mkdir transform  # 新建文件夹
npm init --y  # 初始化项目
npm install ethers  # 安装ethers库 注意ethers v6需要node环境>=14.0.0 否则使用时会报错
ni createBytes.js  # 新建脚本

code .  # 这是vscode的启动命令,但你可以使用任何其他文本编辑器编写脚本

将以下这段代码写进脚本。

const ethers = require("ethers");

async function createBytes(args) {
    const name = args[0];
    const bytes = ethers.encodeBytes32String(name);
    console.log("Bytes: ", bytes);
}

createBytes(process.argv.slice(2));

然后就可以将你的字符串转换为byte32类型了。

node createBytes.js YOUR_STRING  # 尽量使用英文字符串 避免使用中英文混排的字符串

带参数部署合约

尝试在Deploy右侧的输入框内传入参数,参数格式为["byte32型1", "byte32型2", ...]。点击Deploy,不出意外的话控制台会输出绿色对勾图标的日志,代表合约已经部署成功了。

image.png

分发投票权

由主席来分发投票权。切换到另一个账户,点击旁边的复制标签复制地址。切回主席账户,将地址粘贴到giveRightToVote右边的空格里,点击按钮向该地址发放权限。

投票

使用0, 1, 2 ...来投票。切换到被授权的账户,在vote右侧的空格里输入0来为你部署的第1个候选人投票。