Solidity
錯誤:‘message’:‘function ‘Ballot’ 參數必須包含 ‘proposalNames’’}
我正在嘗試使用下面的程式碼來編寫參考 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)