Ethereum搭建与编译部署智能合约
- Ethereum搭建与编译部署智能合约
- centos搭建
- ubuntu搭建
- 启动以太坊
- 用truffle编译部署智能合约
Ethereum搭建与编译部署智能合约
由于公司要做一个nft项目,因此在centos和ubuntu尝试搭建以太坊私链,均成功,并且可以使用truffle编译部署,以下记录遇到的问题以及解决方法
初学者建议先看看以太坊账户与合约等概念
centos搭建
- 安装相关依赖
yum update -y && yum install git wget bzip2 vim gcc-c++ ntp epel-release nodejs tree -y
- 下载安装包,可在这里https://geth.ethereum.org/downloads/选择你想要的版本,复制链接到wget
wget -c https://gethstore.blob.core.windows.net/builds/geth-alltools-linux-amd64-1.9.24-cc05b050.tar.gz ./
- 解压
tar -zxvf geth-alltools-linux-amd64-1.9.24-cc05b050.tar.gz
- 直接把相关命令复制进bin
cp ./abigen /usr/local/bin/abigen
cp ./bootnode /usr/local/bin/bootnode
cp ./clef /usr/local/bin/clef
cp ./evm /usr/local/bin/evm
cp ./geth /usr/local/bin/geth
cp ./puppeth /usr/local/bin/puppeth
cp ./rlpdump /usr/local/bin/rlpdump
5.查看版本
geth version
ubuntu搭建
add-apt-repository -y ppa:ethereum/ethereum
apt-get update
apt-get install ethereum
geth version
启动以太坊
启动前要建一个创世文件,用来初始化创世块,相当于区块链的头节点
mkdir private_Eth //创建文件夹放相关文件
cd private_Eth //到该路径下创建json文件
vim genesie.json //系统自带vi,vim需自行下载文件内容如下:
{
“config”: {
“chainId”: 666,
“homesteadBlock”: 0,
“eip150Block”: 0,
“eip150Hash”: “0x0000000000000000000000000000000000000000000000000000000000000000”,
“eip155Block”: 0,
“eip158Block”: 0,
“byzantiumBlock”: 0,
“constantinopleBlock”: 0,
“petersburgBlock”: 0,
“istanbulBlock”: 0,
“ethash”: {}
},
“nonce”: “0x0”,
“timestamp”: “0x5ddf8f3e”,
“extraData”: “0x0000000000000000000000000000000000000000000000000000000000000000”,
“gasLimit”: “0xffffffff”,
“difficulty”: “0x00002”,
“mixHash”: “0x0000000000000000000000000000000000000000000000000000000000000000”,
“coinbase”: “0x0000000000000000000000000000000000000000”,
“alloc”: {
},
“number”: “0x0”,
“gasUsed”: “0x0”,
“parentHash”: “0x0000000000000000000000000000000000000000000000000000000000000000”
}
- 用上面的文件初始化创世块 参数–datadir 指定用来存数据的文件夹
mkdir data
geth –datadir data init genesis.json
- 启动以太坊,附一些参数的解释
geth –datadir dataA –nodiscover –networkid 333 –ipcdisable –port 1111 –rpcport 2222 –http –http.corsdomain=“” –http.port 8545 –http.addr 0.0.0.0 –allow-insecure-unlock console
geth –datadir data –networkid 1337 –http –http.corsdomain=“*” –http.port 8545 –http.addr “0.0.0.0” –allow-insecure-unlock –rpc.allow-unprotected-txs –port 30303 –dev –dev.period 1 console 2>>geth.log
指定数据目录–datadir
允许解锁账户–allow-insecure-unlock(不加这个参数的话,当执行 personal.unlockAccount()的时候解锁账户会失败,无法部署合约)
连接端口–http.port 8545
进入交互控制台 console
指定日志文件 >>geth.log
更多参数解释参考这篇https://blog.csdn.net/pulong0748/article/details/109027085
用truffle编译部署智能合约
可直接参考truffle官网入门教程https://trufflesuite.com/docs/truffle/quickstart
这里建议直接用ubuntu安装truffle,windows环境问题太多,我是用的ubuntu虚拟机,怎么装虚拟机就跳过了
- 先安装npm
apt install npm
npm -g install npm //升级npm
- 安装truffle
npm install -g truffle
- 用truffle获取项目模板
mkdir MetaCoin
cd MetaCoin
truffle unbox metacoin //这里遇到了网络问题,无法直接获取项目模板,直接去git上下载zip文件解压 git链接
还有一种方式,直接truffle init能生成最简单的项目模板
解压之后的项目目录结构如下图,truffle-config.js默认是空的5. 编译
truffle compile
- 部署:如果不改truffle-config.js配置文件,会默认部署到truffle内置的链上(默认使用truffle自带的第一个账户进行部署),输入truffle develop会进入交互模式之后输入migrate就可以部署了。
如果要在服务器(我使用的centos)的私链上部署,需要改truffle-config.js配置文件,之后在centos私链中创建账户,解锁账户,还要让链中的矿工开始挖矿,否则不会部署成功
改配置文件,加入服务器的ip,端口
centos创建账号
查看所有账号
解锁账号
开始挖矿
使用web3j编译部署调用合约
想在java中用web3j编译部署,调用合约,需要先生成合约的java版文件,有几种方式生成,这里我选择在Ubuntu中,用web3j命令行工具生成(前提是要配有jdk,还有truffle)
安装JDK
https://blog.csdn.net/qq_37034181/article/details/120673562
安装WEB3J命令行工具
The simplest way to install the Web3j CLI is via the following script:
curl -L get.web3j.io | sh && source ~/.web3j/source.sh
web3j生成合约的java文件
生成前需要用truffles编译solidity文件(操作方式如上文的truffle compile),这样会得到合约的json文件(存放在build文件夹中)
之后调用web3j命令
web3j generate truffle –truffle-json ./MetaCoin.json -o /home/hqz/Desktop -p com.hqz //-o即output,指定输出路径,-p 即package 指定包名
下面这是我写的一个简单合约文件做测试
得到合约的java文件之后,放进java项目中调用
这种方式能部署合约,调用合约方法,但是数据似乎无法放到交易记录里面,因此直接调用以太坊的转账接口,可以将数据放到交易记录中,因为数据在以太坊中是十六进制的,所以要进行字符串的编码:字符串转unicode再转十六进制就可以了,以下是交易记录
区块链节点互联
admin.nodeInfo.enode //当前节点信息
admin.addPeer() //添加节点的命令
遇到很多问题,出现过很多次连接不成的情况,最后总结,不同节点的genesis文件需要相同,启动命令的参数要注意
{
“config”: {
“chainId”: 666,
“homesteadBlock”: 0,
“eip150Block”: 0,
“eip150Hash”: “0x0000000000000000000000000000000000000000000000000000000000000000”,
“eip155Block”: 0,
“eip158Block”: 0,
“byzantiumBlock”: 0,
“constantinopleBlock”: 0,
“petersburgBlock”: 0,
“istanbulBlock”: 0,
“ethash”: {}
},
“nonce”: “0x0”,
“timestamp”: “0x5ddf8f3e”,
“extraData”: “0x0000000000000000000000000000000000000000000000000000000000000000”,
“gasLimit”: “0xffffffff”,
“difficulty”: “0x00002”,
“mixHash”: “0x0000000000000000000000000000000000000000000000000000000000000000”,
“coinbase”: “0x0000000000000000000000000000000000000000”,
“alloc”: {
},
“number”: “0x0”,
“gasUsed”: “0x0”,
“parentHash”: “0x0000000000000000000000000000000000000000000000000000000000000000”
}
geth –datadir dataB –nodiscover –networkid 333 –ipcdisable –port 3333 –rpcport 4444 –http –http.corsdomain=“” –http.port 8545 –http.addr 0.0.0.0 –allow-insecure-unlock –http.api “eth,net,web3,txpool” console
–rpc.txfeecap 0 –rpc.gascap 0
补充java调用不了区块链接口的解决方法
–http.api “eth,net,web3,txpool,personal”