首页 > 解决方案 > 错误:随机不是函数solidity/web3js

问题描述

我正在尝试从我的智能合约上使用“块难度”和“块时间戳”的函数生成一个随机数。

坚固性代码如下所示:

pragma solidity ^0.4.18;

 contract ApprovalContract {

  function random() external view returns (uint8){
  return uint8(uint256(keccak256(abi.encodePacked(block.timestamp, 
  block.difficulty)))%251);
  } 
 ...
 }

用 JS 编写的应用程序代码如下所示:

ApprovalContract.methods.random().call(
        function(error, result) {
            if (error) {
              console.log('error: ' + error);
            }
            else {
              console.log('result: ' + JSON.stringify(result));
            }
          });

我需要做的就是将随机生成的数字记录到控制台。不幸的是,我一直看到“未捕获的 TypeError:ApprovalContract.methods.random 不是函数”

标签: ethereumsoliditysmartcontractsweb3web3js

解决方案


你还没有发布你的整个 JS 代码,所以不清楚你是如何获得 ApprovalContract 的。理想情况下应该如下所示。您需要高于 1.0 的 web3js 版本才能运行此代码。我使用的版本是 1.0.0-beta.34。

var approvalcontract_artifact = require('../build/contracts/ApprovalContract.json'); /*Please insert path of your ApprovalContract.json in here */
var Web3 = require('web3');
var web3 = new Web3('https://ropsten.infura.io/7dsXakGVRMs1EwuYwkQv'); /*Your Client Endpoint */

var ApprovalContract = new web3.eth.Contract(approvalcontract_artifact.abi, '0x3f6eeae6bb291ed249a4cbff22c49f0ce96b723a'); /* Please write your contract address in place of this address */

var random = ApprovalContract.methods.random().call()
    .then(function(result){
       console.log('result: ' + JSON.stringify(result));
    })
    .catch(function(error) {
      console.log('error: ' + error);
    });

推荐阅读