由于公司要做一个nft项目,因此在centos和ubuntu尝试搭建以太坊私链,均成功,并且可以使用truffle编译部署,以下记录遇到的问题以及解决方法
初学者建议先看看以太坊账户与合约等概念
yum update -y && yum install git wget bzip2 vim gcc-c++ ntp epel-release nodejs tree -y
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
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
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”
}
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官网入门教程https://trufflesuite.com/docs/truffle/quickstart
这里建议直接用ubuntu安装truffle,windows环境问题太多,我是用的ubuntu虚拟机,怎么装虚拟机就跳过了
apt install npm
npm -g install npm //升级npm
npm install -g truffle
mkdir MetaCoin
cd MetaCoin
truffle unbox metacoin //这里遇到了网络问题,无法直接获取项目模板,直接去git上下载zip文件解压 git链接
还有一种方式,直接truffle init能生成最简单的项目模板
解压之后的项目目录结构如下图,truffle-config.js默认是空的5. 编译
truffle compile
使用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”