En el entorno de desarrollo oficial, generalmente no usamos remix para compilar e implementar contratos, sino que usamos goland para llamar a web3 para el desarrollo.
Modo de trabajo Web3 :
1. Entorno de desarrollo
Cree un proyecto de reacción con footlocker, inicialice el proyecto NPM y ejecute el siguiente comando para crear package.json, un archivo que describe las propiedades del módulo actual.
npm init
Todo el camino sí hacia abajo.
La estructura de directorios del proyecto es la siguiente:
2. contrato de compilación web3
2.1 Instalar el compilador
npm install --save solc
Agregará dependencias en package.json
2.2 Escribir contrato test.sol
pragma solidity ^0.4.0;
contract TestCon{
string str;
constructor(string _str) public{
str=_str;
}
function setValue(string _str)public{
str=_str;
}
function getValue() public view returns(string){
return str;
}
}
2.3 Archivo de compilación 01-compile.js
//导入solc编译器
let solc = require('solc') //0.4.25
let fs = require('fs')
//读取合约
let sourceCode = fs.readFileSync('./contracts/SimpleStorage.sol', 'utf-8')
// Setting 1 as second paramateractivates the optimiser
let output = solc.compile(sourceCode, 1)
// console.log('output :', output)
//{age : 17, name : 'lily', address : 'sz'}
module.exports = output['contracts'][':SimpleStorage']
2.3 Compilar el contrato
Ejecutar una orden
node 01-compile.js
3. contrato de despliegue de web3
let {
bytecode, interface} = require('./01-compile')
// console.log(bytecode)
// console.log(interface)
//1. 引入web3
let Web3 = require('web3')
//2. new 一个web3实例
let web3 = new Web3()
//3. 设置网络
web3.setProvider('http://localhost:7545')
const account = '0xd5957914c31E1d785cCC58237d065Dd25C61c4D0'
console.log('version :', web3.version)
// console.log(web3.currentProvider)
//1. 拼接合约数据 interface
let contract = new web3.eth.Contract(JSON.parse(interface))
//2. 拼接bytecode
contract.deploy({
data: bytecode, //合约的bytecode
arguments: ['HelloWorld'] //给构造函数传递参数,使用数组
}).send({
from: account,
gas: '3000000',
//gasPrice: '1',
}).then(instance => {
console.log('address :', instance.options.address)
})
4. Obtenga la instancia del contrato
//获取合约实例,导出去
//let {bytecode, interface} = require('./01-compile')
//1. 引入web3
let Web3 = require('web3')
//2. new 一个web3实例
let web3 = new Web3()
//3. 设置网络
web3.setProvider('http://localhost:7545')
let abi = [{
"constant":true,"inputs":[],"name":"getValue","outputs":[{
"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{
"constant":false,"inputs":[{
"name":"_str","type":"string"}],"name":"setValue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{
"inputs":[{
"name":"_str","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]
let address = '0x0FE5006b70A0D58AD3c4d4BC9DAC02C970510Cf6'
//此处abi已经json对象,不需要进行parse动作
let contractInstance = new web3.eth.Contract(abi, address)
console.log('address :', contractInstance.options.address)
module.exports = contractInstance
5. Llame al contrato
//1. 导入合约实例
//2. 读取数据
//3. 写入数据
//4. 读取数据
let instance = require('./03-instance')
const from = '0xd5957914c31E1d785cCC58237d065Dd25C61c4D0'
//异步调用,返回值是一个promise
//2. 读取数据
instance.methods.getValue().call().then(data => {
console.log('data:', data)
//3. 写入数据
instance.methods.setValue('Hello HangTou').send({
from: from,
value: 0,
}).then(res => {
console.log('res : ', res)
//4. 读取数据
instance.methods.getValue().call().then(data => {
console.log('data2:', data)
})
})
})
6. Usa la promesa para reescribir
//web3与区块链交互的返回值都是promise,可以直接使用async/await
let test = async () => {
try {
let v1 = await instance.methods.getValue().call()
console.log('v1:', v1)
let res = await instance.methods.setValue('Hello HangTou').send({
from: from,
value: 0,
})
console.log('res:', res)
let v2 = await instance.methods.getValue().call()
console.log('v2:', v2)
} catch (e) {
console.log(e)
}
}
test()