版权声明:忠于祖国,忠于人民 https://blog.csdn.net/boss2967/article/details/83410733
1.点
1. msg.sender的作用
2. 异常处理
3. 修饰器
4. 继承
5. 元组作用
6. 代码发布流程
7. 编译合约方法
8. web3部署合约
9.web3调用send方法
2.测试合约
Index.js
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;
}
}
compile.js
let solc = require('solc')
let fs = require('fs')
//1. 加载编译器
//2. 获取.sol源码
//3. 编译 从而获取abi,bytecode
let sourceInfo = fs.readFileSync('./contracts/Inbox.sol', 'utf-8')
// console.log('sourceInfo :', sourceInfo.toString())
var output = solc.compile(sourceInfo, 1)
// console.log('output:', output)
module.exports = output.contracts[':Inbox']
deploy.js
let Web3 = require('web3')
//1. 引入web3
//2. 创建web3实例
let web3 = new Web3()
//3. 指定服务商
web3.setProvider(new Web3.providers.HttpProvider('http://localhost:8545'))
let {interface, bytecode} = require('./compile')
//注,在创建web3时可以直接指定区块链网络
// let web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));
console.log('version :', web3.version)
// console.log('provider :', web3.currentProvider)
//4. 部署合约
//a. 需要abi和bytecode
deploy = async () => {
try {
//await 方式
let accounts = await web3.eth.getAccounts()
// let accounts;
//.then方式
// web3.eth.getAccounts().then(as => {
// accounts = as
// }).catch(e => {
// console.log(e)
// })
//回调函数方式
// web3.eth.getAccounts((err, res) => {
// if (err) {
// throw err
// }
//
// accounts = res
// })
console.log(accounts)
let contract = await new web3.eth.Contract(JSON.parse(interface))
//b. 创建后deploy, send
let contractInstance = await contract.deploy({
data: bytecode,
arguments: ['HelloWorld'],
}).send({
from: accounts[0],
gas: '1000000'
})
//获取合约的地址, 在options里面
console.log('address :', contractInstance.options.address)
//拿到了合约实例,接下来开始调用合约
//1. 调用getMessage方法
//读取区块链数据使用call就可以了,也可以使用send,不要这样做
let msg = await contractInstance.methods.getMessage().call({
from: accounts[0],
})
console.log('msg :', msg)
//2. 调用setMessage方法
let res = await contractInstance.methods.setMessage('Hello goland!').send({
from: accounts[0],
})
console.log('res :', res)
//3. 调用getMessage方法
msg = await contractInstance.methods.getMessage().call({
from: accounts[0],
})
console.log('msg :', msg)
} catch (e) {
console.log(e)
}
}
deploy()
//注意事项:
//1. JSON.parse(interface)) 一定要解析为json字符串,否则会报错
//2. ['HelloWorld'], 构造函数传的是数组
//3. 部署合约的时候,一定要指定gas,一定要使用单引号包裹起来
//4. 记得要使用回调,async
//5. 调用