Blockchain 无法调用智能合约中的函数

Blockchain 无法调用智能合约中的函数,blockchain,solidity,truffle,Blockchain,Solidity,Truffle,我正在尝试通过angular应用程序调用solidity智能合约中的一个方法。但我无法调用该方法。谁能帮帮我吗。这是我在控制台中遇到的错误 TypeError: this.contract.methods.hello is not a function at CertificateContractService.<anonymous> (certificate-contract.service.ts:32) at Generator.next (<anonymous>)

我正在尝试通过angular应用程序调用solidity智能合约中的一个方法。但我无法调用该方法。谁能帮帮我吗。这是我在控制台中遇到的错误

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)
角度服务 供应商
从'@angular/core'导入{InjectionToken};
从“Web3”导入Web3;
export const WEB3=新注入令牌('WEB3'{
providedIn:'根',
工厂:()=>{
试一试{
窗口['ethereum']。autoRefreshOnNetworkChange=false;
常量提供程序=(“以太坊”在窗口中)?窗口[“以太坊”]:Web3[“给定提供程序”];
返回新的Web3(提供者);
}捕捉(错误){
抛出新的错误(检测到非EnthUM浏览器。您应该考虑尝试雾或元面罩!);
}
}
});

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

var contractJson=require('../assets/abi/CertificateList.json');
this.abi=contractJson['abi'];
此外,不能在纯函数上使用
方法.hello.send
。send方法只能在修改合同状态的函数上调用,即应付或未指定的函数。要调用纯函数或视图函数,应使用
call
方法。有关更多信息,请参阅

this.contract.methods.hello().call()
.然后(收据=>{
控制台日志(收据);
}).catch(错误=>{
控制台错误(err);
});

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);
    });
  }
}
import { InjectionToken } from '@angular/core';
import Web3 from 'web3';

export const WEB3 = new InjectionToken<Web3>('web3', {
  providedIn: 'root',
  factory: () => {
    try {
      window['ethereum'].autoRefreshOnNetworkChange = false;
      const provider = ('ethereum' in window) ? window['ethereum'] : Web3['givenProvider'];
      return new Web3(provider);
    } catch (err) {
      throw new Error('Non-Ethereum browser detected. You should consider trying Mist or MetaMask!');
    }
  }
});