Solidity
無法從 web3js 呼叫solidity 智能合約功能
我正在嘗試通過 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()