Solidity

錯誤:‘message’:‘function ‘Ballot’ 參數必須包含 ‘proposalNames’’}

  • April 12, 2022

我正在嘗試使用下面的程式碼來編寫參考 Solidity 文件 pdf 的投票契約。

程式碼編譯沒有錯誤,但我在部署時遇到錯誤。

將選票寫入 app\meta\Ballot\Ballot.json
寫道:app\meta\Ballot\Ballot.json
抓住了一份契約
上傳選票
上傳契約:選票
出現錯誤:{"errorTags":["Solidity","Solidity"],"message":"function \"Ballot\" 參數必須包含 \"proposalNames\""}
POST /users/testuser/HashKeyRemoved/contract 200 525.540 ms - 24

程式碼-

合約投票{
// 這聲明了一個新的複雜類型,它將
// 稍後用於變數。
// 它將代表一個投票者。
結構選民{
單位重量;// 權重由委託累加
布爾投票;// 如果為真,則該人已經投票
地址代表;// 委託給的人
uint 投票;// 投票提案的索引
}


// 這是單個提案的類型。
結構提案
{
bytes32 名稱;// 短名稱(最多 32 個字節)
uint 投票計數;// 累積票數
}

向公共主席發表講話;

// 這聲明了一個狀態變數
// 為每個可能的地址儲存一個 `Voter` 結構。
mapping(address => Voter) 公眾選民;

// 動態大小的 `Proposal` 結構數組。
提案[] 公開提案;

/// 創建一個新選票以選擇 `proposalNames` 之一。
功能選票(字節32 []提案名稱){
主席 = msg.sender;
選民[主席].weight = 1;
// 對於每個提供的提案名稱,

// 創建一個新的提案對象並添加它
// 到數組的末尾。
for (uint i = 0; i < proposalNames.length; i++) {
// `Proposal({...})` 創建一個臨時的
// 提案對象和 `proposals.push(...)`
// 將其附加到 `proposals` 的末尾。
提案.push(提案({
名稱:proposalNames[i],
投票數:0
}));
}
}

// 賦予 `voter` 對此選票進行投票的權利。
// 只能由 `chairperson` 呼叫。
函式 giveRightToVote(地址投票者){
if (msg.sender != 主席 || voters[voter].voted) {
// `throw` 終止並將所有更改恢復為
// 狀態和乙太幣餘額。它經常
// 如果函式是,使用 this 是個好主意
// 呼叫不正確。但要注意,這
// 也將消耗所有提供的氣體。
扔;
}
選民[選民].weight = 1;
}

/// 將您的投票委託給投票者 `to`。
函式委託(地址){
// 分配引用
投票者發送者 = voters[msg.sender];
如果(發件人投票)
扔;
// 只要轉發委託
// `to` 也被委託了。
// 一般來說,這樣的循環是非常危險的,
// 因為如果它們執行時間過長,它們可能
// 需要比塊中可用的更多的氣體。
// 這種情況下,委託不會被執行,
// 但在其他情況下,這樣的循環可能
// 導致合約完全“卡住”。
儘管 (
voters[to].delegate != 地址(0) &&
voters[to].delegate != msg.sender
) {
to = voters[to].delegate;
}
// 我們在委託中發現了一個循環,不允許。
if (to == msg.sender) {
扔;
}
// 因為 `sender` 是一個引用,所以這個
// 修改 `voters[msg.sender].voted`
sender.voted = true;
sender.delegate = to;

選民代表 = voters[to];
如果(代表。投票){
// 如果代表已經投票,
// 直接加到票數
提案[delegate.vote].voteCount += sender.weight;
} 別的 {
// 如果代表還沒有投票,
// 增加她的體重。
委託權重 += 發件人權重;
}
}

/// 投票(包括委託給您的投票)
/// 到提案 `proposals[proposal].name`。
功能投票(uint提案){
投票者發送者 = voters[msg.sender];
如果(發件人投票)
扔;
sender.voted = true;
sender.vote = 提案;
// 如果 `proposal` 超出數組範圍,
// 這將自動拋出並恢復所有
// 變化。
提案[提案].voteCount += sender.weight;
}

/// @dev 計算獲勝的提案
/// 考慮到以前的投票。
函式winningProposal() 常量
返回 (uintwinningProposal)
{
uint winvoteCount = 0;
for (uint p = 0; p <proposals.length; p++) {
if (proposals[p].voteCount >winningVoteCount) {
winsVoteCount = 提案[p].voteCount;
獲勝建議 = p;
}
}
}
}

你應該使用一些其他的工具來部署,比如truffle,使用起來很方便。原因是:

1:你有參數來創建你的合約

2:當你將你的合約部署到其他測試網路或主網路時,你不能使用VS來部署。也許您需要在以後遷移您的契約。

為了部署合約,您需要將 bytes32 數組傳遞給建構子,它應該看起來像["0x..", "0x.."]

為了將字元串轉換為 bytes32,您可以使案例如web3.fromAscii('FirstProposal', 32)

引用自:https://ethereum.stackexchange.com/questions/8623