ETH私有鏈搭建與使用-智能合約部署及合約方法調用(3)


操作系統環境: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

如果你覺得文章對你有幫助,可以請作者喝杯咖啡.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM