操作系統環境:CentOS 7.6.1810,操作基礎目錄/data,如無該目錄請手動創建(mkdir /data)
1.安裝node環境
1.1下載node安裝包
wget https://mituxiaogaoyang.club/eth-source/node-v16.10.0-linux-x64.tar.xz
如果無法使用wget進行下載,請使用瀏覽器下載並上傳至服務器/data目錄下.
1.2解壓文件
tar -xf node-v16.10.0-linux-x64.tar.xz
1.3創建軟鏈接
ln -s /data/node-v16.10.0-linux-x64/bin/node /usr/bin/node ln -s /data/node-v16.10.0-linux-x64/bin/npm /usr/bin/npm
1.4驗證node是否正確安裝
node -v
npm -v
2.npm安裝solc
2.1安裝solc
mkdir solc cd solc npm install solc
2.2創建軟鏈接
ln -s /data/solc/node_modules/solc/solcjs /usr/bin/solcjs
2.3驗證solc是否安裝成功
solcjs --version
3.編寫合約代碼,編譯並部署合約
3.1編寫一個簡單的存數據的合約代碼
touch SimpleStorage.sol
合約代碼如下:
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.16 <0.9.0; contract SimpleStorage { uint storedData; function set(uint x) public { storedData = x; } function get() public view returns (uint) { return storedData; } }
3.2編譯合約代碼
solcjs --abi SimpleStorage.sol
solcjs --bin SimpleStorage.sol
記錄abi和bin內容,部署合約時需要
abi:[{"inputs":[],"name":"get","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"}]
bin:608060405234801561001057600080fd5b50610150806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806360fe47b11461003b5780636d4ce63c14610057575b600080fd5b610055600480360381019061005091906100c3565b610075565b005b61005f61007f565b60405161006c91906100ff565b60405180910390f35b8060008190555050565b60008054905090565b600080fd5b6000819050919050565b6100a08161008d565b81146100ab57600080fd5b50565b6000813590506100bd81610097565b92915050565b6000602082840312156100d9576100d8610088565b5b60006100e7848285016100ae565b91505092915050565b6100f98161008d565b82525050565b600060208201905061011460008301846100f0565b9291505056fea26469706673582212203566a002af029ac481d6936a3e6ebbbfb633f7e8e862712e84d7fe96fd38e09464736f6c63430008090033
3.3部署合約代碼
進入geth console中進行如下操作
var abi = JSON.parse('[{"inputs":[],"name":"get","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"}]');
var code = "0x608060405234801561001057600080fd5b50610150806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806360fe47b11461003b5780636d4ce63c14610057575b600080fd5b610055600480360381019061005091906100c3565b610075565b005b61005f61007f565b60405161006c91906100ff565b60405180910390f35b8060008190555050565b60008054905090565b600080fd5b6000819050919050565b6100a08161008d565b81146100ab57600080fd5b50565b6000813590506100bd81610097565b92915050565b6000602082840312156100d9576100d8610088565b5b60006100e7848285016100ae565b91505092915050565b6100f98161008d565b82525050565b600060208201905061011460008301846100f0565b9291505056fea26469706673582212203566a002af029ac481d6936a3e6ebbbfb633f7e8e862712e84d7fe96fd38e09464736f6c63430008090033"
code需在bin文件內容前加0x
預估gas消耗
web3.eth.estimateGas({data: code})
部署合約
test = web3.eth.contract(abi)
personal.unlockAccount("0xffd4a30c08d9f16f095f6315e14bd034f7d04fb0", "123456");
contractInstance = test.new({data: code, gas: 1000000, from: "0xffd4a30c08d9f16f095f6315e14bd034f7d04fb0"}, function(e, contract){ if(!e){ if(!contract.address){ console.log("Contract transaction send: Transaction Hash: "+contract.transactionHash+" waiting to be mined..."); }else{ console.log("Contract mined! Address: "+contract.address); console.log(contract); } }else{ console.log(e) } })
啟動挖礦使合約生效,部署成功如下圖
記錄合約地址:0xd74859b57c108dffae39bfe6c1bf9cea67b527ea
3.4調用合約方法
contractInstance.set.sendTransaction(66, {from:"0xffd4a30c08d9f16f095f6315e14bd034f7d04fb0", gas:50000}); miner.start(1);admin.sleepBlocks(1);miner.stop(); contractInstance.get.call();
第一行:調用合約set方法往鏈上存數據66,如無法操作,請先解鎖賬戶
第二行:使交易被處理,必須要挖礦。這里我們啟動挖礦,然后等待挖到一個區塊之后就停止挖礦
第三行:調用合約get方法取出鏈上存儲的數據
如重新進入geth console想要調用已有合約方法,可用如下代碼:
var abi=JSON.parse(‘合約的abi’)
//錄入ABI。格式同上一節
myContract = eth.contract(abi)
//創建類
contract = myContract.at(address)
//創建合約實例,這里要指名部署過的合約地址。地址先前已經保存。
至此,合約部署和調用完成,接下來的文章會講到如何使用java調用已經部署好的智能合約方法存取數據.
如需了解eth智能合約開發請參考:https://learnblockchain.cn/docs/solidity/introduction-to-smart-contracts.html#simple-smart-contract
如果你覺得文章對你有幫助,可以請作者喝杯咖啡.