Solidity

乙太坊:使用 bytes32 數組呼叫合約函式

  • November 10, 2017

我有以下合約功能

   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 的重大變化!

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