Solidity

無法從 web3js 呼叫solidity 智能合約功能

  • December 16, 2019

我正在嘗試通過 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)

智能合約

pragma solidity ^0.5.0;

contract CertificateList {

   function hello() public 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!');
   }
 }
});

有人可以幫幫我嗎?

改變這個:

this.abi = require('../assets/abi/CertificateList.json')

對此:

this.abi = require('../assets/abi/CertificateList.json').abi

還有這個:

this.contract.methods.hello().send()

對此:

this.contract.methods.hello().call()

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