以太坊智能合约编译,部署以及打包调用【Mac系统】

本文主要讲解如何进行智能合约的编译,部署以及打包,首先,读者需要会编写智能合约,了解solidity语言以及以太币。

我这里环境是Mac系统,linux系统命令也是类似。

1.安装geth客户端以及操作

brew tap ethereum/ethereum
brew install ethereum

默认安装目录:/usr/local/Cellar/ethereum/版本

在安装成功之后进入其bin目录,编写json文件,进行geth客户端的初始化工作,下面是genesis.json文件:

{
  "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": "0x47b760",
  "difficulty": "0x00002",
  "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x0000000000000000000000000000000000000000",
  "alloc": {
    "0x1e82968C4624880FD1E8e818421841E6DB8D1Fa4" : {"balance" : "30000000000000000000"}
  },
  "number": "0x0",
  "gasUsed": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}

下面命令进行初始化操作:

geth --datadir "/usr/local/Cellar/ethereum/1.9.13/bin/chain" init genesis.json

如果要进入geth命令行。可以执行下面的命令:

geth attach /usr/local/Cellar/ethereum/1.9.13/bin/chain/geth.ipc

启动一个私链:

geth --identity "PICCetherum" --rpc --rpccorsdomain "*" --datadir "/usr/local/Cellar/ethereum/1.9.13/bin/chain" --port 8545 --networkid 666

启动geth客户端:

geth --rpcapi="web3,eth,net,db,personal" --rpc --rinkeby

2.编译智能合约

首先安装solc编译工具(这里需要有node环境):

npm install -g solc

进行编译(-o参数输出路径,自己创建即可):

solcjs /Users/ljq/.atom/solidityDemo/Person.sol --bin --abi --optimize -o ./ether_files

当你编译成功的时候,在输出路径下会有分别以 .bin、.abi结尾的文件。

3.安装web3j CLI,打包部署合约

安装web3j CLI:

curl -L https://get.web3j.io | sh

如果上面命令安装不了,可在github上进行下载:https://github.com/web3j/web3j/releases

在安装web3j之后,进入其bin目录,打包上面编译好的合约:

./web3j solidity generate /path/to/<smart-contract>.bin /path/to/<smart-contract>.abi -o /path/to/src/main/java -p com.your.organisation.name

以太坊智能合约编译,部署以及打包调用【Mac系统】
从上图中我们可以看到在 java 这个文件夹中生成了一个Java文件,这样我们可以在项目中调用,进行转账等一系列操作。

4.使用web3j进行合约的调用,转账

web3j是一个高度模块化、响应式、类型安全的Java和Android库,用于与智能合约交互,并与Ethereum网络的客户端(节点)集成。

新建一个maven项目,导入下面的依赖:

<dependency>
      <groupId>org.web3j</groupId>
      <artifactId>core</artifactId>
      <version>3.4.0</version>
    </dependency>

然后将上面打包好合约生成的Java文件拷贝到项目中。下面是合约产生的Java文件示例:
以太坊智能合约编译,部署以及打包调用【Mac系统】

编写代码进行调用:

package cn.ljq.web3j;

import com.sun.deploy.Environment;
import com.sun.tools.javac.util.Context;
import org.web3j.crypto.CipherException;
import org.web3j.crypto.Credentials;
import org.web3j.crypto.WalletUtils;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import org.web3j.protocol.http.HttpService;
import org.web3j.tx.Transfer;
import org.web3j.utils.Convert;
import sun.awt.SunHints;
import sun.java2d.pipe.AlphaPaintPipe;

import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;

/**
 *
 *
 */
public class App 
{
    public static void main( String[] args )  {
        try {
            //发送同步请求
            Web3j web3 = Web3j.build(new HttpService());  // defaults to http://localhost:8545/
            String filePath = "/opt/ether_files/credential_files";
            //第一个参数是账户密码
            String fileName = WalletUtils.generateNewWalletFile("123456789",new File(filePath),false);
			//第一个参数是账户密码
            Credentials credentials = WalletUtils.loadCredentials("123456789", filePath+"/"+fileName);
            Person contract1 = Person.load("0xd21F7F01B7dB0FA465E2431CbCD15Cff69254339",web3, credentials,
                    BigInteger.valueOf(27000000000L), BigInteger.valueOf(250000));
            //打印合约地址
            System.out.println(contract1.getContractAddress());

            //使用以太钱包文件发送以太币给其他人
            TransactionReceipt receipt = Transfer.sendFunds(web3,credentials,
                    "0xf760913C374dA7850DB6D0083bd1fC5325153cee",
                    BigDecimal.valueOf(0.1), Convert.Unit.ETHER).send();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

至此我们就完成了智能合约的编译、打包,以及进行调用,进行转账等操作。

上一篇:java获取当前机器的公网ip


下一篇:Blog4 当尝试各种方法都无法接入Rinkeby的时候,可以尝试以下方法