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()