无法在智能合约中调用该功能

时间:2019-12-15 15:00:04

标签: blockchain solidity truffle

我试图通过angular应用程序调用Solidity智能合约中的一种方法。但我无法调用该方法。有人可以帮帮我吗。这是我在控制台中得到的错误

julia> a .* b
3-element Array{Int64,1}:
  2
  6
 12

智能合约

TypeError: this.contract.methods.hello is not a function
at CertificateContractService.<anonymous> (certificate-contract.service.ts:32)
at Generator.next (<anonymous>)
at fulfilled (tslib.es6.js:70)
at ZoneDelegate.invoke (zone-evergreen.js:359)
at Object.onInvoke (core.js:39699)
at ZoneDelegate.invoke (zone-evergreen.js:358)
at Zone.run (zone-evergreen.js:124)
at zone-evergreen.js:855
at ZoneDelegate.invokeTask (zone-evergreen.js:391)
at Object.onInvokeTask (core.js:39680)

角度服务


contract CertificateList {

    function hello() external pure returns (string memory )  {
        return "Hello";
    }

}

提供商

import Web3 from 'web3';
import {WEB3} from './WEB3';

declare let require: any;
declare let window: any;


@Injectable({
  providedIn: 'root'
})
export class CertificateContractService {
  private abi: any;
  private address = '0xb0fFD3498B219ad2A62Eb98fEDE591265b3C3B67';
  private contract;
  private accounts: string[];

  constructor(@Inject(WEB3) private web3: Web3) {
    this.init().then(res => {
    }).catch(err => {
      console.error(err);
    });
  }

  private async init() {
    this.abi = require('../assets/abi/CertificateList.json');
    // await this.web3.currentProvider.enable();
    this.accounts = await this.web3.eth.getAccounts();

    this.contract = new this.web3.eth.Contract(this.abi, this.address, {gas: 1000000, gasPrice: '10000000000000'});

    this.contract.methods.hello().send()
      .then(receipt => {
        console.log(receipt);
      }).catch(err => {
      console.error(err);
    });
  }
}

1 个答案:

答案 0 :(得分:1)

确保../assets/abi/CertificateList.json仅包含有效的abi。如果您是通过直接执行truffle compilesolc CertificateList.sol来获取此文件的,则必须从json文件中提取abi。

var contractJson = require('../assets/abi/CertificateList.json');
this.abi = contractJson['abi'];

此外,您不能在纯函数上使用methods.hello.send。只能在修改合同状态的功能上调用send方法,即 payable unspecified 功能。要调用 view 函数,应使用call方法。有关更多信息,请参见web3.eth.Contract

this.contract.methods.hello().call()
  .then(receipt => {
    console.log(receipt);
  }).catch(err => {
  console.error(err);
});