npm run start
golang打开react
npm install --save solc@0.4.25
创建四个javascript文件
01-compile.js
02-deploy.js
03-instance.js
04-interaction.js
在contracts/SimpleStorage.sol中写下合约
pragma solidity ^0.4.21;
contract Inbox {
string _message;
function Inbox(string src) public {
_message = src;
}
function setMessage(string message) {
_message = message;
}
function getMessage() public returns(string) {
return _message;
}
}
在01-compile.js中写
let solc=require('solc') //
let fs=require('fs')
let sourceCode=fs.readFileSync('./contracts/SimpleStorage.sol','utf-8')
let output=solc.compile(sourceCode,1)
console.log('output:no',output)
module.exports=output['contracts'][':Inbox']
在02-deploy.js中写下
let {bytecode,interface}=require('./01-compile')
let Web3=require('web3')
// console.log(bytecode)
// console.log(interface)
let web3=new Web3()
const account='0xBF5Ee7FbC1033c070B95dCAf2Bc9792eAC0aCCA2'
web3.setProvider('http://localhost:7545')
// console.log('version:',web3.version)
// console.log('',web3.currentProvider)
//返回合约的实例
let contract=new web3.eth.Contract(JSON.parse(interface))
console.log('-----------------')
//拼接codde
contract.deploy({
data:bytecode,
arguments:['hello world']//给构造函数传递参数
}).send({
from:account,
gas:3000000,
gasPrice:'1',
}).then(instance=>{
console.log('============',instance.options.address)
})
//
03 实例化合约
//let {bytecode,interface}=require('./01-compile')
let Web3=require('web3')
// console.log(bytecode)
// console.log(interface)
let web3=new Web3()
const account='0xBF5Ee7FbC1033c070B95dCAf2Bc9792eAC0aCCA2'
web3.setProvider('http://localhost:7545')
let abi=[{"constant":false,"inputs":[{"name":"message","type":"string"}],"name":"setMessage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getMessage","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"src","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]
let address='0x2Ee2c1676325194a63c1C731F8a48B213d0b0fB3'
let contractInstance=new web3.eth.Contract(abi,address)
//console.log('contractInstance',contractInstance)
module.exports=contractInstance
04 调用合约
let instance = require('./03-instance')
const from = '0xBF5Ee7FbC1033c070B95dCAf2Bc9792eAC0aCCA2'
// instance.methods.getMessage().call().then(data=>{
//
// console.log('data:',data)
//
// instance.methods.setMessage('hello wilson').send({
// from:from,
// value:0,
//
// }).then(res=>{
// console.log('res:',res)
//
// instance.methods.getMessage().call().then(data=>{
// console.log('data2:',data)
// })
//
// })
//
//
// })
console.log('04-interaction.............')
let test = async () => {
try {
let v1 = await instance.methods.getMessage().call()
console.log('success...............')
console.log('v1:', v1)
let res=await instance.methods.setMessage('hello wilson111').send({
from:from,
value:0,
})
console.log('res:',res)
let v2=await instance.methods.getMessage().call()
console.log('v2',v2)
} catch (e) {
console.log('fail..............')
console.log(e)
}
}
test()
let test=async ()=>{
let v1=await instance.methods.getMessage().call()
console.log(v1)
let v2=await instance.methods.setMessage('wilon ,go!').send({
from:from,
value:0,
})
console.log('v2:',v2)
let v3=await instance.methods.getMessage().call()
console.log('v3:',v3)
}
test()
在调用合约的时候,使用实例化后的合约对象,instance.methods,在合约对象的.methods中调用方法,.getMessage(),调用getMessage方法,然后进行call()就可以调用了。
如果是需要设置,需要花费gas,instance.methods,在合约对象中调用.setMessage(),在括号中写需要设置的值,然后写send,在send中写{}大括号键值对的形式,需要设置from,花费谁的地址,如果没有payable函数或者构造器,那么value的值为0。
注意:在async中需要些await,如果没有await的话,获取不到值。