win10環境下web3智能合約開發

1.使用 create-react-app 快速構建 React 開發環境node

cnpm install -g create-react-app
create-react-app meetweb3
cd meetweb3
npm start

在瀏覽器中打開 http://localhost:3000/ python

2.新建文件和文件夾,總體目錄結構react

meetweb3
  |--contracts
    |--SimpleStorage.sol
  |--node_modules
  |--public
  |--src
  |--.gitignore
  |--01-compile.js
  |--02-deploy.js
  |--03-instance.js
  |--04-interaction.js
  |--package.json
  |--README.md
  |--yarn.lock

 

3.JetBrains GoLand運行solc(已經安裝)git

1.安裝插件Intellij-Solidity-2.1.6
官方地址:https://plugins.jetbrains.com/plugin/9475-intellij-solidity
百度網盤:連接: https://pan.baidu.com/s/1QtkhDuL-7JsAYRE_kJx8UA  提取碼: awfm 

 

2.JetBrains Goland 配置
a. File -> settings -> Plugins -> 設置 -> Install plugin from disk... -> Intellij-Solidity-2.1.6.zip -> OK
以上經過本地安裝好插件
b. File -> settings -> Tools -> External Tools -> + -> Edit Tool:
        Name:Solidity
        Program:D:\python\nodejs\solcjs.cmd
        Arguments:--abi --bin $FileName$ -o $FileDir$\out\$FileNameWithoutExtension$
        Working directory:$FileDir$
   -> OK
以上完成了自定義External Tools的工具。
使用:
在合約中點擊鼠標右鍵 -> External Tools -> Solidity

 

3.運行後的結果
在當前目錄下自動建立out文件夾和與合約同名的文件夾,合約同名文件夾中產生了.abi和.bin文件。

 

4.JetBrains Goland 配置Nodejs環境github

1.官方插件地址:https://plugins.jetbrains.com/plugin/6098-nodejs/versions
注意版本的選擇,node和插件版本不一樣可能會報錯
C:\Users\admin>node --version
v8.7.0
選用NodeJS-191.7479.1.zip
2.百度網盤:
連接: https://pan.baidu.com/s/1dQf42LQA7q9eQiWnKzTTHQ 提取碼: dddh
2.插件安裝
方法同上面的solidity插件安裝同樣
3.配置
a. File -> Settings -> Language&Frameworks -> JavaScript -> JavaScript Language version:ECMAScript6 -> OK
b. File -> Settings -> Language&Frameworks -> JavaScript -> Libraries -> New Library:
    Name:node
    Framework type:Nodejs Core Modules
    -> OK

  

5.編寫solidity合約代碼web

pragma solidity >=0.4.25 <=0.6.0;

contract SimpleStorage {
    string str;

    constructor(string memory _str) public {
        str = _str;
    }

    function setValue(string memory _str) public {
        str = _str;
    }

    function getValue() public view returns (string memory) {
        return str;
    }
}

 

6.編寫compile.jsnpm

let solc = require('solc')

let fs = require('fs')

let contractCode = fs.readFileSync('./contracts/SimpleStorage.sol', 'utf-8')

let output = solc.compile(contractCode, 1)

console.log('output:', output)

module.exports = output['contracts'][':SimpleStorage']

7.編寫deploy.jsjson

let {bytecode, interface} = require('./01-compile')

// console.log(bytecode)
// console.log(interface)

let Web3 = require('web3')
let web3 = new Web3()

web3.setProvider('http://127.0.0.1:8545')

const account = '0x3fe4cf9ac113b4a531024b046fab8b5c9e5f64a5'

console.log('version:', web3.version)
console.log(web3.currentProvider)

let  contract = new web3.eth.Contract(JSON.parse(interface))
contract.deploy({
    data: bytecode,
    arguments: ['HelloWorld']
}).send({
    from: account,
    gas: '3000000',
}).then(instance => {
    console.log('address: ', instance.options.address)
})

8.安裝web3js瀏覽器

1.Github下載地址:https://github.com/ethereum/web3.js/releases
2.選擇版本https://github.com/ethereum/web3.js/releases/tag/v1.0.0-beta.35 使用1.0.0-beta35版本
3.百度網盤:連接: https://pan.baidu.com/s/18Cx_PuvRBW2lJRpYuk9RFA 提取碼: yj9f 
4.若是是Github下載的源代碼,找到packages/web3
  或者百度網盤下載的源代碼,解壓重命名web3
5.安裝python2,配置好python2環境變量
6.將web3放在項目node_modules文件夾中,進入web3
7.使用Git Bash運行:cnpm install
8.安裝web3後,進入node測試
    > let Web3 = require('web3')
    > let web3 = new Web3()
    > web3.version
    '1.0.0-beta.35'
9.啓動ganache-cli
10.修改deploy.js中的account地址
11.運行deploy.js

 

 9.編寫intance.jsbash

let Web3 = require('web3')

let web3 = new Web3()

web3.setProvider('http://127.0.0.1:8545')

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 = '0x99b80C5DB381630AAA043b6F27ED65761358b1eb'

let contractInstance = new web3.eth.Contract(abi, address)

console.log('address:', contractInstance.options.address)

module.exports = contractInstance

10.編寫interaction.js

let instance = require('./03-instance')

const from = '0x3fe4cf9ac113b4a531024b046fab8b5c9e5f64a5'

// instance.methods.getValue().call().then(data => {
//     console.log('data', data)
//     instance.methods.setValue('Hello Python').send({
//         from: from,
//         value:0,
//     }).then(res => {
//         console.log('res:', res)
//
//         instance.methods.getValue().call().then(data =>{
//             console.log('data',data)
//         })
//     })
// })

let test = async () => {
    try{
        let value1 = await instance.methods.getValue().call()
        console.log("value:", value1)
        let res = await instance.methods.setValue('Hello, Golang').send({
            from: from,
            value: 0,
        })
        console.log("res:", res)
        let value2 = await  instance.methods.getValue().call()
        console.log("value2:", value2)
    }catch (e) {
        console.log(e)
    }
}
test()

運行結果:

 

 

11.補充:solc安裝

1.配置好python2的環境
2.在項目文件夾中和node安裝目錄中都用Git bash 執行npm install solc@0.4.25
solc不指定版本,可能安裝別的版本(0.5.1),運行程序時會報錯,一直沒辦法解決。後來指定安裝0.4.25問題都解決了。

12.要測試網絡中部署合約,先準備有以太幣的帳戶  

1.測試水管網站:https://faucet.ropsten.be/
2.限制每隔24小時領取1ther

13.註冊infura

1.網站:https://infura.io/
2.獲取測試網絡ENDPOINT,程序中使用:https://ropsten.infura.io/v3/c0521a4ac29145e5808040a85fe9d9f0

14.向測試網絡中部署合約,從新編寫deploy.js

let {bytecode, interface} = require('./01-compile')

let HDWalletProvider = require('truffle-hdwallet-provider')
let Web3 = require('web3')
let web3 = new Web3()

let terms = 'your Account wolds......'
let netIp = 'https://ropsten.infura.io/v3/c0521a4ac29145e58080......'

let provider = new HDWalletProvider(terms, netIp)

//web3.setProvider('http://127.0.0.1:8545')
web3.setProvider(provider)

console.log('version:', web3.version)

console.log('0x'+bytecode) 

let  contract = new web3.eth.Contract(JSON.parse(interface))
//let contract = new web3.eth.Contract(bb)
// contract.deploy({
//     data: bytecode,
//     arguments: ['HelloWorld']
// }).send({
//     from: account,
//     gas: '3000000',
// }).then(instance => {
//     console.log('address: ', instance.options.address)
// })
//
let deploy = async () =>{
    let accounts = await web3.eth.getAccounts()
    console.log("accounts:", accounts)

    let instance = await  contract.deploy({
        data: '0x'+bytecode,
        arguments: ['HelloWorld']
    }).send({
        from: accounts[0],
        gas: '3000000',
    })
    console.log('instance address:', instance.options.address)
}

deploy()
1.上面的bytecode跟着示例直接用老是報錯,上鍊的數據不同,是通過了兩次utf-8。使用'0x'進行拼接以後,上鍊的數據就正確了。

15.從新編寫instance.js

let {interface} = require('./01-compile')
let Web3 = require('web3')
let HDWalletProvider = require('truffle-hdwallet-provider')

let web3 = new Web3()

let terms = 'your Account worlds......'
let netIp = 'https://ropsten.infura.io/v3/c0521a4ac29145e58080......'
let provider = new HDWalletProvider(terms, netIp)

//web3.setProvider('http://127.0.0.1:8545')
web3.setProvider(provider)

console.log('===============================================')
console.log(interface)

let abi = JSON.parse(interface)
let address = '0x5dFDB758ee9b87a72401789f43b7C9e5a2F2Be3D'

let contractInstance = new web3.eth.Contract(abi, address)

console.log('address:', contractInstance.options.address)

module.exports = contractInstance

16.從新編寫interaction.js

let instance = require('./03-instance')

let Web3 = require('web3')
let HDWalletProvider = require('truffle-hdwallet-provider')

let terms = 'your account words......'
let netIp = 'https://ropsten.infura.io/v3/c0521a4ac29145e58080......'

let web3 = new Web3()
let provider = new HDWalletProvider(terms, netIp)

web3.setProvider(provider)

//const from = '0x3fe4cf9ac113b4a531024b046fab8b5c9e5f64a5'

// instance.methods.getValue().call().then(data => {
//     console.log('data', data)
//     instance.methods.setValue('Hello Python').send({
//         from: from,
//         value:0,
//     }).then(res => {
//         console.log('res:', res)
//
//         instance.methods.getValue().call().then(data =>{
//             console.log('data',data)
//         })
//     })
// })

let test = async () => {
    try{
        let accounts = await web3.eth.getAccounts()
        from = accounts[0]
        let value1 = await instance.methods.getValue().call()
        console.log("value:", value1)
        let res = await instance.methods.setValue('Hello, Golang').send({
            from: from,
            value: 0,
        })
        console.log("res:", res)
        let value2 = await  instance.methods.getValue().call()
        console.log("value2:", value2)
    }catch (e) {
        console.log(e)
    }
}
test()

相關文章
相關標籤/搜索