Ethereum搭建与编译部署智能合约

  • Ethereum搭建与编译部署智能合约
    • centos搭建
    • ubuntu搭建
    • 启动以太坊
    • 用truffle编译部署智能合约

Ethereum搭建与编译部署智能合约

由于公司要做一个nft项目,因此在centos和ubuntu尝试搭建以太坊私链,均成功,并且可以使用truffle编译部署,以下记录遇到的问题以及解决方法
初学者建议先看看以太坊账户与合约等概念

centos搭建

  1. 安装相关依赖

yum update -y && yum install git wget bzip2 vim gcc-c++ ntp epel-release nodejs tree -y

  1. 下载安装包,可在这里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 ./

  1. 解压

tar -zxvf geth-alltools-linux-amd64-1.9.24-cc05b050.tar.gz

  1. 直接把相关命令复制进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

启动以太坊

  1. 启动前要建一个创世文件,用来初始化创世块,相当于区块链的头节点

    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”
}

  1. 用上面的文件初始化创世块 参数–datadir 指定用来存数据的文件夹

mkdir data
geth –datadir data init genesis.json

  1. 启动以太坊,附一些参数的解释

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虚拟机,怎么装虚拟机就跳过了

  1. 先安装npm

apt install npm
npm -g install npm //升级npm

  1. 安装truffle

npm install -g truffle

  1. 用truffle获取项目模板

mkdir MetaCoin
cd MetaCoin
truffle unbox metacoin //这里遇到了网络问题,无法直接获取项目模板,直接去git上下载zip文件解压 git链接
还有一种方式,直接truffle init能生成最简单的项目模板

解压之后的项目目录结构如下图,truffle-config.js默认是空的5. 编译

truffle compile

  1. 部署:如果不改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”