09.智能合约开发编译发布流程

版权声明:忠于祖国,忠于人民 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. 调用

猜你喜欢

转载自blog.csdn.net/boss2967/article/details/83410733