首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在制作投票Dapp的时候遇到无法向智能合约传参的问题,也没有报错??

在制作投票Dapp的时候遇到无法向智能合约传参的问题,也没有报错??

提问于 2019-06-14 12:05:34
回答 1关注 0查看 241

期末项目在实现投票Dapp的添加候选人功能的时候,无论怎么样数据都传不进去智能合约里面

Array数组里面为0一直传递失败,上方报错为光影效果JS尝试过删除没用
Array数组里面为0一直传递失败,上方报错为光影效果JS尝试过删除没用

投票的HTML

代码语言:html
复制
 <div class="panel-body">
      <div id="main" style="width: 400px; margin-left:400px ;">
        <div class="control-group">
            <label class="control-label" for="inputName">投票主题</label>
            <div class="controls">
                <input type="text" class="form-control" id="inputName" name="name" placeholder="请输入投票主题" required>
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="inputProposals">候选人</label>
            <div class="controls">
                <input type="text" class="form-control" id="inputProposals" name="proposals" placeholder="请输入候选人,以英文逗号分隔" required>
            </div>
        </div>
        <div class="control-group">
            <div class="controls">
                <label class="checkbox">
                </label>
                <a class="btn" href="javascript:history.back(-1)">返回列表</a>
                <button class="btn btn-primary" onclick="App.addBallotSubmit()" class="btn">发起投票</button>
            </div>
        </div>
</div>

以下是创建投票的JS方法

代码语言:js
复制
//初始化添加页面
  initAddBallot: function () {
    this.initWeb3();
    $.getJSON('Collection.json', function (data) {
      App.contracts.Collection = TruffleContract(data);
      App.contracts.Collection.setProvider(App.web3Provider);
    });
  },
  //添加投票信息
  addBallotSubmit: function () {
    var ballotName = $("#inputName").val();
    var proposals_arry = $("#inputProposals").val().split(",");
    var byte32_arry = new Array(proposals_arry.length);
    if(ballotName==""||proposals_arry==""){
      alert("请完善投票信息!");
      return false;
    }else{
      for (var i = 0; i <proposals_arry.length; i++) {
        byte32_arry[i] = App.stringToBytes32(proposals_arry[i]);
      }
      App.contracts.Collection.deployed().then(function (instance) {
        collection = instance;
        web3.eth.defaultAccount = web3.eth.coinbase;
        return collection.addBallot(ballotName, byte32_arry, { gas: 3000000 });
      }).then(function (result) {
        console.log(result);
        alert("添加成功");
        history.back(-1);
      }).catch(function (error) {
        console.log(error);
      });
      return false;
    }
  },

以下是显示投票的JS方法

代码语言:js
复制
//投票界面初始化
  initVote: function () {
    this.initWeb3();
    var electionInstance;
    //获得账号信息
    web3.eth.getCoinbase(function (err, account) {
      if (err === null) {
        App.account = account;
        $("#accountAddress").html("您的账号地址: " + account);
      }
    });
    $.getJSON("Election.json", function (election) {
      App.contracts.Election = TruffleContract(election);
      App.contracts.Election.setProvider(App.web3Provider);
      App.contracts.Election.at(App.getQueryVariable('address')).then(function (instance) {
        electionInstance = instance;
        return electionInstance.candidateCount();
      }).then(function (candidatesCount) {
        var $candidatesResults = $("#candidatesResults");
        $candidatesResults.empty();
        var $cadidatesSelect = $("#cadidatesSelect");
        $cadidatesSelect.empty();
        for (var i = 1; i <= candidatesCount; i++) {
          electionInstance.candidates(i).then(function (candidate) {
            var id = candidate[0];
            var name = candidate[1];
            var voteCount = candidate[2];
            var candidateTemplate = "<tr><th>" + id + "</th><td>" + App.byte32ToString(name) + "</td><td>" + voteCount + "</td></tr>";
            $candidatesResults.append(candidateTemplate);
            var cadidateOption = "<option value='" + id + "'>" + App.byte32ToString(name) + "</option>";
            $cadidatesSelect.append(cadidateOption);
            $('#search').hide();


          });
        }
        return electionInstance.voters(App.account);

      }).then(function (hasVoted) {

        if (hasVoted) {
          $('form').hide();
          $('#back_up').hide();
          $('#search').show();

          var c = $("#accountAddress").html();
          $("#accountAddress").html(c + "</br>" + "(此地址已参与投票)");
        }
      }).catch(function (err) {
        console.warn('90raw');
      });

    })
  },

智能合约

代码语言:js
复制
pragma solidity ^0.4.2;

contract Election {
        
    //标题
    string public title;
    //结构体
    struct Candidate {
        uint id;
        bytes32 name;
        uint voteCount;
    }
    

    //存储结构体(id,候选人)
    mapping (uint => Candidate) public candidates;
    //是否已经投票了
    mapping (address=>bool) public voters;
    //总数量
    uint public candidateCount;

    //构造函数
    constructor (string name,bytes32[] _proposals) public {
        title=name;

        for(uint i = 0; i < _proposals.length; i++) {
            candidateCount ++;
            candidates[candidateCount] = Candidate(candidateCount, _proposals[i], 0);
        }
}
    //投票
    function vote(uint _candidateId) public {
        require(_candidateId > 0 && _candidateId <= candidateCount);
        if(voters[msg.sender]==true){
        }else
        //记录用户已经投票了
        voters[msg.sender] = true;
        candidates[_candidateId].voteCount ++;
    }

    function info() public view returns(string _title,string voter,bytes32 winner) {
        _title = title;
        voter = "ironman";
        winner = getWinner();
    }

    function getWinner() public view returns(bytes32) {
        uint  count=0;
        bytes32  winner;
        for(uint i=1;i<=candidateCount;i++){
            if(candidates[i].voteCount>count){
                count = candidates[i].voteCount;
                winner = candidates[i].name;
            }
        }
        if(count==0){
            return 0;
        }
        return winner;  
    }
}
代码语言:js
复制
pragma solidity ^0.4.2;

import "./Election.sol";

contract Collection {
    address[] public ballots;
    address owner ;
        function addBallot(string name,bytes32[] _proposals) public  returns(address address_) {
        owner = msg.sender;
        Election election = new Election(name,_proposals);
        address_ = address(election);
        ballots.push(address_);
    }

    function getAllBallots() public view returns (address[] ballots_) {
        ballots_ = ballots;
    }
    function delBallot(address address_) public  {
        if(msg.sender==owner){
            for(uint i=0;i<ballots.length;i++){
                if(ballots[i]==address_){
                    updateArrays(i);
                }
            }
                
}
    }
    
    function updateArrays(uint i) private{
        if(i!=ballots.length-1){
            for(i;i<ballots.length;i++){
                ballots[i] = ballots[i+1];
            }
        }
        ballots.length = ballots.length-1;
    }
}

尝试解决办法用truffle重新获取Election.sol的json文件,但是部署的时候显示未定义

代码语言:js
复制
var Collection = artifacts.require("./Election.sol");
    module.exports = function(deployer) {
    deployer.deploy(Election);
};

Error:

回答

和开发者交流更多问题细节吧,去 写回答
相关文章

相似问题

相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档