Solidity
乙太坊:使用 bytes32 數組呼叫合約函式
我有以下合約功能
function voteForAnswer(bytes32 questionKey, bytes32[] answerKeys) returns (bool success) { // is the sender allowed to do this? if (voters[msg.sender].enabled == false) { throw; } // TODO: check for question existence; if (questions[questionKey].alreadyVoted[msg.sender] == true) { throw; } questions[questionKey].alreadyVoted[msg.sender] = true; for (uint i; i <= answerKeys.length; i++) { questions[questionKey].answers[answerKeys[i]].voteCount += 1; VoterVotedFor(msg.sender, questionKey, answerKeys[i]); } }
如何呼叫合約函式?
目前我收到以下 Mist-Message
我錯了什麼?
謝謝托馬斯
更新
我調整了我的契約,這樣我就不再在我的函式 VoteForAnswer 中使用數組;我仍然收到一個錯誤:
pragma solidity ^0.4.0; contract owned { address public owner; function owned() { owner = msg.sender; } modifier onlyOwner { if (msg.sender != owner) throw; _; } function transferOwnership(address newOwner) onlyOwner { owner = newOwner; } } contract Roadshow is owned { bytes32 public text; // shortname (up to 32 bytes) uint public start; // datetime when roadshow starts uint public end; // datetime when roadshow ends mapping(address => Voter) public voters; struct Voter { bool enabled; // if true, that person is currently allowed to vote } struct Answer { bytes32 text; uint voteCount; // number of accumulated votes // add more non-key fields as needed } struct Question { bytes32 text; mapping(bytes32 => Answer) answers; // random access by question key and answer key bytes32[] answerList; // list of answer keys so we can look them up // add more non-key fields as needed mapping(address => bool) alreadyVoted; } mapping(bytes32 => Question) questions; // random access by question key bytes32[] questionList; // list of question keys so we can enumerate them function Roadshow(bytes32 _name) { text = _name; start = now; voters[msg.sender].enabled = true; } function addQuestion(bytes32 questionKey, bytes32 text) onlyOwner returns(bool success) { // not checking for duplicates questions[questionKey].text = text; questionList.push(questionKey); return true; } function getQuestion(bytes32 questionKey) public constant returns(bytes32 wording, uint answerCount) { return( questions[questionKey].text, questions[questionKey].answerList.length); } function addAnswer(bytes32 questionKey, bytes32 answerKey, bytes32 answerText) onlyOwner returns(bool success) { questions[questionKey].answerList.push(answerKey); questions[questionKey].answers[answerKey].text = answerText; // answer vote will init to 0 without our help // questionStructs[questionKey].answerStructs[answerKey].voteCount = 0; return true; } function getQuestionAnswer(bytes32 questionKey, bytes32 answerKey) public constant returns(bytes32 answerText, uint answerVoteCount) { return( questions[questionKey].answers[answerKey].text, questions[questionKey].answers[answerKey].voteCount); } function getQuestionAnswerText(bytes32 questionKey, bytes32 answerKey) public constant returns(bytes32 answerText) { answerText = questions[questionKey].answers[answerKey].text; return answerText; } function getQuestionAnswerCount(bytes32 questionKey, bytes32 answerKey) public constant returns(uint answerCount) { answerCount = questions[questionKey].answers[answerKey].voteCount; return answerCount; } function getQuestionCount() public constant returns(uint questionCount) { return questionList.length; } function getQuestionAtIndex(uint row) public constant returns(bytes32 questionkey) { return questionList[row]; } function getQuestionAnswerCount(bytes32 questionKey) public constant returns(uint answerCount) { return(questions[questionKey].answerList.length); } function getQuestionAnswerAtIndex(bytes32 questionKey, uint answerRow) public constant returns(bytes32 answerKey) { return(questions[questionKey].answerList[answerRow]); } // in Ethereum we cannot pass dynamically sized arrays // function voteForAnswer(bytes32 questionKey, bytes32[] answerKeys) function voteForAnswer(bytes32 questionKey, bytes32 answerKey) returns (bool success) { // is the sender allowed to do this? if (voters[msg.sender].enabled == false) { throw; } // TODO: check for question existence; if (questions[questionKey].alreadyVoted[msg.sender] == true) { throw; } questions[questionKey].alreadyVoted[msg.sender] = true; questions[questionKey].answers[answerKey].voteCount += 1; VoterVotedFor(msg.sender, questionKey, answerKey); return true; } function addVoter(address _voter) onlyOwner returns (bool success) { voters[_voter] = Voter(true); VoterAdded(_voter, this.text()); return true; } event VoterAdded(address _newVoter, bytes32 _questionKey); event VoterVotedFor(address _voter, bytes32 _questionKey, bytes32 _answerKey); }
目前無法將動態長度數組傳入/傳出函式。請參閱此處以獲取與之前/之後程式碼類似的問題。從函式返回動態數組
要點是我們需要以固定大小的塊來思考。
希望能幫助到你。
回复:您更新的程式碼。
總而言之,對我建議的方法的一個很好的解釋。
您的程式碼正在 Browser Solidity 中編譯。在第 177 行附近有一個警告。您使用
this.text()
wheretext
將具有相同的含義。關鍵是它確實編譯並且它應該部署。上圖中,
gas 0
提示編譯失敗。我認為您可能會發現 Browser Solidity 是製定契約本身的更好工具。更快的回饋。如果部署中出現問題,那是一個單獨的問題。
Mist 不是我部署合約的首選工具。我能說的是,如果契約編譯(應該),應該有一個氣體估計(不是 0)。此外,可能會出現這樣的故障:無法在 Greeter 教程中定義 greeterContract。Solidity 0.4.9 的重大變化!