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