编译环境
Microsoft Edge - Remix
编译
左侧Solidity compiler选项卡,点击Compile 3_Ballot.sol,选项卡图标上出现绿勾,编译完成。
部署
切换到Deploy&run transactions选项卡,选中一个ACCOUNT(下拉可以看到若干地址,应该是预置的一系列测试账户)来部署合约,该账户会成为chairman(投票主席)。确保CONTRACT选中3_Ballot.sol。
点击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,不出意外的话控制台会输出绿色对勾图标的日志,代表合约已经部署成功了。
分发投票权
由主席来分发投票权。切换到另一个账户,点击旁边的复制标签复制地址。切回主席账户,将地址粘贴到giveRightToVote右边的空格里,点击按钮向该地址发放权限。
投票
使用0, 1, 2 ...来投票。切换到被授权的账户,在vote右侧的空格里输入0来为你部署的第1个候选人投票。