操作系统环境: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
如果你觉得文章对你有帮助,可以请作者喝杯咖啡.