文章目錄
- 前言
- 本篇文章以部署test.sol為列
- 創建test.sol
- 安裝solc
- 簡介
- 安裝
- 部署test.sol
- 編譯test.sol
- 通過solc 獲取Binary位元組碼
- 通過solc獲取abi
- 獲取預估部署合約需要花費手續費
- 部署智能合約
- 驗證是否成功
- 呼叫合約方法
- 下一篇文章 三.**以太坊多節點私鏈搭建**
前言
第一章 一.搭建私有以太坊網路,純干貨
作業系統:MacBook Pro (16-inch, 2019)
Geth Version: 1.10.8-stable
Solc Version: 0.8.7+commit.e28d00a7.Darwin.appleclang
本篇文章以部署test.sol為列
創建test.sol
pragma solidity ^0.8.7;
contract test {
function multiply(uint a) public returns(uint d){
return a * 7;
}
}
Bytecode 位元組碼: 合約代碼轉換為16進制的位元組資料
ABI : json格式資料
拷貝ABI在 Bejson中查看
[
{
"constant": false,
"inputs": [
{
"internalType": "uint256",
"name": "a",
"type": "uint256"
}
],
"name": "multiply",
"outputs": [
{
"internalType": "uint256",
"name": "d",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
]
安裝solc
簡介
solc 是 Solidity 原始碼庫的構建目標之一,它是 Solidity 的命令列編譯器,你可使用 solc --help 命令來查看它的所有選項的解釋,該編譯器可以生成各種輸出,范圍從簡單的二進制檔案、匯編檔案到用于估計“gas”使用情況的抽象語法樹(決議樹),如果你只想編譯一個檔案,你可以運行 solc --bin sourceFile.sol 來生成二進制檔案,如果你想通過 solc 獲得一些更高級的輸出資訊,可以通過 solc -o outputDirectory --bin --ast --asm sourceFile.sol 命令將所有的輸出都保存到一個單獨的檔案夾中,
安裝
npm install -g solc
安裝后通過
solc --version
驗證
jingbao@MacBook-Pro Ethereum % solc --version
solc, the solidity compiler commandline interface
Version: 0.8.7+commit.e28d00a7.Darwin.appleclang
部署test.sol
編譯test.sol
cd /Users/jingbao/IdeaProjects/smart-contract/privateDemo
jingbao@MacBook-Pro privateDemo % ls -la
total 32
drwxr-xr-x 7 jingbao staff 224 9 15 15:26 .
drwxr-xr-x 8 jingbao staff 256 9 15 00:01 ..
-rw-r--r--@ 1 jingbao staff 6148 9 15 15:26 .DS_Store
drwx------ 5 jingbao staff 160 9 15 10:01 data1
drwx------ 5 jingbao staff 160 9 15 10:06 data2
-rw-r--r--@ 1 jingbao staff 813 9 15 00:40 genesis.json
-rw-r--r-- 1 jingbao staff 129 9 15 15:26 test.sol
通過solc 獲取Binary位元組碼
獲取test.sol Binary位元組碼
solc --bin test.sol
jingbao@MacBook-Pro privateDemo % solc --bin test.sol
Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information.
--> test.sol
Warning: Function state mutability can be restricted to pure
--> test.sol:5:5:
|
5 | function multiply(uint a) public returns(uint d){
| ^ (Relevant source part starts here and spans across multiple lines).
======= test.sol:test =======
Binary:
608060405234801561001057600080fd5b506101c7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063c6888fa114610030575b600080fd5b61004a6004803603810190610045919061008b565b610060565b60405161005791906100c7565b60405180910390f35b600060078261006f91906100e2565b9050919050565b6000813590506100858161017a565b92915050565b6000602082840312156100a1576100a0610175565b5b60006100af84828501610076565b91505092915050565b6100c18161013c565b82525050565b60006020820190506100dc60008301846100b8565b92915050565b60006100ed8261013c565b91506100f88361013c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561013157610130610146565b5b828202905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b6101838161013c565b811461018e57600080fd5b5056fea26469706673582212207a66b40b7ff47413a110d7be31c3f4417ed7afba21646d0bf1206ed0831379b664736f6c63430008070033
復制Binary到鏈接到geth.ipc的控制臺上,切結Binary前要加0x 代表16進制
var code="0x608060405234801561001057600080fd5b506101c7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063c6888fa114610030575b600080fd5b61004a6004803603810190610045919061008b565b610060565b60405161005791906100c7565b60405180910390f35b600060078261006f91906100e2565b9050919050565b6000813590506100858161017a565b92915050565b6000602082840312156100a1576100a0610175565b5b60006100af84828501610076565b91505092915050565b6100c18161013c565b82525050565b60006020820190506100dc60008301846100b8565b92915050565b60006100ed8261013c565b91506100f88361013c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561013157610130610146565b5b828202905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b6101838161013c565b811461018e57600080fd5b5056fea26469706673582212207a66b40b7ff47413a110d7be31c3f4417ed7afba21646d0bf1206ed0831379b664736f6c63430008070033"
> var code="0x608060405234801561001057600080fd5b506101c7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063c6888fa114610030575b600080fd5b61004a6004803603810190610045919061008b565b610060565b60405161005791906100c7565b60405180910390f35b600060078261006f91906100e2565b9050919050565b6000813590506100858161017a565b92915050565b6000602082840312156100a1576100a0610175565b5b60006100af84828501610076565b91505092915050565b6100c18161013c565b82525050565b60006020820190506100dc60008301846100b8565b92915050565b60006100ed8261013c565b91506100f88361013c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561013157610130610146565b5b828202905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b6101838161013c565b811461018e57600080fd5b5056fea26469706673582212207a66b40b7ff47413a110d7be31c3f4417ed7afba21646d0bf1206ed0831379b664736f6c63430008070033"
undefined
> code
"0x608060405234801561001057600080fd5b506101c7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063c6888fa114610030575b600080fd5b61004a6004803603810190610045919061008b565b610060565b60405161005791906100c7565b60405180910390f35b600060078261006f91906100e2565b9050919050565b6000813590506100858161017a565b92915050565b6000602082840312156100a1576100a0610175565b5b60006100af84828501610076565b91505092915050565b6100c18161013c565b82525050565b60006020820190506100dc60008301846100b8565b92915050565b60006100ed8261013c565b91506100f88361013c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561013157610130610146565b5b828202905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b6101838161013c565b811461018e57600080fd5b5056fea26469706673582212207a66b40b7ff47413a110d7be31c3f4417ed7afba21646d0bf1206ed0831379b664736f6c63430008070033"
通過solc獲取abi
切換原視窗獲取abi
jingbao@MacBook-Pro privateDemo % solc --abi test.sol
Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information.
--> test.sol
Warning: Function state mutability can be restricted to pure
--> test.sol:5:5:
|
5 | function multiply(uint a) public returns(uint d){
| ^ (Relevant source part starts here and spans across multiple lines).
======= test.sol:test =======
Contract JSON ABI
[{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"multiply","outputs":[{"internalType":"uint256","name":"d","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]
復制Binary到鏈接geth.ipc的控制臺
> var abi = [{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"multiply","outputs":[{"internalType":"uint256","name":"d","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]
undefined
> abi
[{
inputs: [{
internalType: "uint256",
name: "a",
type: "uint256"
}],
name: "multiply",
outputs: [{
internalType: "uint256",
name: "d",
type: "uint256"
}],
stateMutability: "nonpayable",
type: "function"
}]
查看余額是否夠部署智能合約
> eth.getBalance(eth.accounts[0])
146000000000000000000
解鎖賬戶
> personal.unlockAccount(eth.accounts[0])
Unlock account 0x88d2a3c6575dc35e9014fd13f530dd326b254399
Passphrase:
true
獲取預估部署合約需要花費手續費
> web3.eth.estimateGas({data: code})
151081
151081gas
部署智能合約
創建合約實體
> var myContract = eth.contract(abi)
undefined
> var contract = myContract.new({from:eth.accounts[0],data:code,gas:170000})
undefined
引數講解
from: 通過哪個賬戶部署合約
data: Binary位元組碼
gas: 愿意支付的gas費,應超過151081gas
如出現 Error: authentication needed: password or unlock
原因:剛才的解鎖超時需要從新解鎖
列印contract
> contract
{
abi: [{
inputs: [{...}],
name: "multiply",
outputs: [{...}],
stateMutability: "nonpayable",
type: "function"
}],
address: undefined,
transactionHash: "0xd1a10750c1f140303676538bc33bba9186f7fd512c4c53c32aa5093e7edf059e"
}
獲取當前待辦
> txpool.status
{
pending: 1,
queued: 0
}
pending: 1 說明有一個待辦,還沒有部署完
開始挖礦 8核
> miner.start(8)
null
停止挖礦
> miner.stop()
null
再次txpool.status查看
> txpool.status
{
pending: 0,
queued: 0
}
pending: 0,說明已經完成
驗證是否成功
獲取合約地址
> contract.address
"0x1b9ef78423727bd0893739e3d57bc9e33b0cb616"
通過合約地址獲取位元組碼
> eth.getCode(contract.address)
"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063c6888fa114610030575b600080fd5b61004a6004803603810190610045919061008b565b610060565b60405161005791906100c7565b60405180910390f35b600060078261006f91906100e2565b9050919050565b6000813590506100858161017a565b92915050565b6000602082840312156100a1576100a0610175565b5b60006100af84828501610076565b91505092915050565b6100c18161013c565b82525050565b60006020820190506100dc60008301846100b8565b92915050565b60006100ed8261013c565b91506100f88361013c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561013157610130610146565b5b828202905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b6101838161013c565b811461018e57600080fd5b5056fea26469706673582212207a66b40b7ff47413a110d7be31c3f4417ed7afba21646d0bf1206ed0831379b664736f6c63430008070033"
呼叫合約方法
> contract.multiply(6)
Error: invalid address
at web3.js:3940:11(47)
at web3.js:3756:41(16)
at web3.js:5035:37(8)
at web3.js:5034:12(13)
at web3.js:5060:34(20)
at web3.js:5085:39(15)
at web3.js:4147:41(57)
at web3.js:4233:75(24)
at <eval>:1:19(3)
報錯原因是因為方法沒有加view ,可以讀取狀態變數但是不能改,要加.call
> contract.multiply.call(6)
42
ok,大功告成
下一篇文章 三.以太坊多節點私鏈搭建
點贊關注訂閱持續更新
點擊關注訂閱持續更新
點擊關注訂閱持續更新
有問題或文章有需要改正的地方請留言
或 pwn2ownyearn@gmail.com 郵箱
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/300533.html
標籤:區塊鏈
下一篇:一.搭建私有以太坊網路,純干貨
