EOS JAVA RPC调用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liu1765686161/article/details/82180070

前言

开发前看一下EOS白皮书最好,先了解EOS的架构及相关历程。有助于后续的开发。本地安装个EOS,试一试命令。博主本人是只本地启动钱包wallet,其它api调用其它节点提供的接口。

EOS测试网络https://tools.cryptokylin.io

1,首选需要下载eos.java.rpc.wrapper-1.0-SNAPSHOT.jar包

https://download.csdn.net/download/liu1765686161/10633193

2,加入项目工程  maven的话有可能需要额外加入依赖

        <dependency>
		  <groupId>com.github-eos</groupId>
		  <artifactId>eos-java-rpc-wrapper</artifactId>
		  <version>1.0</version>
		</dependency>
        <dependency>
		    <groupId>com.squareup.retrofit2</groupId>
		    <artifactId>retrofit</artifactId>
		    <version>2.4.0</version>
		</dependency>
		<dependency>
		    <groupId>com.squareup.retrofit2</groupId>
		    <artifactId>converter-jackson</artifactId>
		    <version>2.4.0</version>
		</dependency>
		<dependency>
			    <groupId>com.fasterxml.jackson.core</groupId>
			    <artifactId>jackson-core</artifactId>
			    <version>2.6.5</version>
			</dependency>
        <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.6.4</version>
        </dependency>

3,开始调用

package com.tn.web.service.coin;

import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSONObject;
import com.tn.base.Log;
import com.tn.constant.CoinConstant;
import com.tn.util.BigDecimalUtil;
import com.tn.util.DateUtil;
import com.tn.util.JsonUtil;

import client.EosApiClientFactory;
import client.EosApiRestClient;
import client.domain.common.ActionTrace;
import client.domain.common.transaction.PackedTransaction;
import client.domain.common.transaction.SignedPackedTransaction;
import client.domain.common.transaction.TransactionAction;
import client.domain.common.transaction.TransactionAuthorization;
import client.domain.response.chain.AbiJsonToBin;
import client.domain.response.chain.Block;
import client.domain.response.chain.ChainInfo;
import client.domain.response.chain.transaction.PushedTransaction;
import client.domain.response.history.action.Action;
import client.domain.response.history.action.Actions;

/**
 * eos操作
 * @author xhl
 * @create 2017/10/27
 **/
@Service
public class CoinEosService {
    private Logger log = Log.get();
    private String walletUrl = "";//本地启动的wallet
    private String chainUrl = "https://api-kylin.eosasia.one";//测试网络
    //建议用active账户
    private String ownerAccount = "";
    private String ownerAccountPublicKey = "";
    private String walletName = "";//创建的钱包名
    private String walletPassword = "";//钱包密码
    
    EosApiRestClient eosApiRestClient = null;
    @PostConstruct
    public void init(){
		this.eosApiRestClient = EosApiClientFactory.newInstance(walletUrl, 
				chainUrl, chainUrl).newRestClient();
    }
    
	/**
	 * 获取账户交易信息
	 {
		"actions": [{
			"global_action_seq": 1322,
			"account_action_seq": 0,
			"block_num": 1184,
			"block_time": "2018-07-11T05:41:33.000",
			"action_trace": {
				"receipt": {
					"receiver": "eosasia11111",
					"act_digest": "80cde1e12d88867d38f0dcdfec98e5e9906b18d94fe5a30e2c151d74d678c3c9",
					"global_sequence": 1322,
					"recv_sequence": 1,
					"auth_sequence": [
						["eosio", 1317]
					],
					"code_sequence": 1,
					"abi_sequence": 1
				},
				"act": {
					"account": "eosio.token",
					"name": "transfer",
					"authorization": [{
						"actor": "eosio",
						"permission": "active"
					}],
					"data": {
						"from": "eosio",
						"to": "eosasia11111",
						"quantity": "100000000.0000 EOS",
						"memo": ""
					},
					"hex_data": "0000000000ea3055104208c1386c30550010a5d4e800000004454f530000000000"
				},
				"elapsed": 4,
				"cpu_usage": 0,
				"console": "",
				"total_cpu_usage": 0,
				"trx_id": "a2288e4a729f157df06a31755ad4c802e51a7838fb2ab06d3dc37309069856ea",
				"inline_traces": []
			}
		}],
		"last_irreversible_block": 7224863
	}
	**/
	public int getActions(int index){
        //记录处理到第几条数据
        int reIndex = index;
        //CoinConstant.EOS_TOTLE 代表每次查询几条数据
		Actions actions = eosApiRestClient.getActions(ownerAccount, index,CoinConstant.EOS_TOTLE);
		if (actions != null) {
			List<Action> list = actions.getActions();
			if (list==null || list.size() == 0) {
				return reIndex;
			}
            reIndex += list.size();
			list = this.removeDuplicate(list);
			for (Action action : list) {
				ActionTrace actionTrace = action.getActionTrace();
				//{from=eosqxyx11111, to=eosqxyx22222, quantity=10.0000 EOS, memo=test}
				log.info("交易详情:{}",action.getActionTrace().getAct().getData().toString());
				JSONObject json = JSONObject.parseObject(JsonUtil.getSting(actionTrace.getAct().getData()));
                if (!ownerAccount.equals(json.getString("to"))) {
					log.info("非充值记录:{}",actionTrace.getTrxId());
                	continue;
				}
				String memo = json.getString("memo");
                if (StringUtils.isEmpty(memo)) {
					log.info("记录TrxId:{}为空",actionTrace.getTrxId());
                	continue;
				}
                //根据用户输入memo查询用户信息
                /*UserVo user = userService.getUserByName(memo);
                if (user == null) {
					log.info("用户信息不存在:memo:{}",memo);
					continue;
				}*/
                try {
                    //rechargeParse(record);
                }catch (DuplicateKeyException e){
                    log.error("eos txrid:{}  coin:{} 这个区块已经处理了",actionTrace.getTrxId(),"EOS");
                    return index;
                }
			}
			reIndex += list.size();
		}
		return reIndex;
	}
	/**
	 * 去重
	 * @param list
	 * @return
	 */
	public List<Action> removeDuplicate(List<Action> list) {
		for (int i = 0; i < list.size() - 1; i++) {
			for (int j = list.size() - 1; j > i; j--) {
				if (list.get(j).getActionTrace().getTrxId()
						.equals(list.get(i).getActionTrace().getTrxId())) {
					list.remove(j);
				}
			}
		}
		return list;
	}
   
    public String getAddress(){
    	return ownerAccount;
    }
    
    public double getBalance(){
    	List<String> list = eosApiRestClient.getCurrencyBalance("eosio.token", ownerAccount, CoinConstant.COIN_EOS);
    	if (list != null && list.size() > 0) {
			return Double.parseDouble(list.get(0).replaceAll(" EOS", ""));
		}
    	return 0.00;
    }
    
	public String getJsonToBin(String from, String to, Double amount, String memo){
        Map<String, String> args = new HashMap<>(4);
        args.put("from", from);
        args.put("to", to);
        //amount 必须要保留4位小数,不够补0
        args.put("quantity",  BigDecimalUtil.getFourString(amount)+" EOS");
        args.put("memo", memo);
        AbiJsonToBin data = eosApiRestClient.abiJsonToBin("eosio.token", "transfer", args);
        if (data != null) {
			return data.getBinargs();
		}
        return null;
    }
	
	/**
     * 发送交易
     * @param fromAccount
     * @param toAccount
     * @param amount 保留4位小数点
     * @param memo
     * @return
     */
    public String send(String toAccount,double amount,String memo){
    	
    	String binargs = this.getJsonToBin(ownerAccount, toAccount, amount, memo);
    	ChainInfo chainInfo = eosApiRestClient.getChainInfo();
        Block block = eosApiRestClient.getBlock(chainInfo.getHeadBlockId());

        TransactionAuthorization transactionAuthorization = new TransactionAuthorization();
        transactionAuthorization.setActor(ownerAccount);
        //发送者权限等级   这一步要注意账户和权限要对应上
        transactionAuthorization.setPermission("owner");
        //transactionAuthorization.setPermission("active");

        TransactionAction transactionAction = new TransactionAction();
        transactionAction.setAccount("eosio.token");
        transactionAction.setName("transfer");
        transactionAction.setData(binargs);
        transactionAction.setAuthorization(Collections.singletonList(transactionAuthorization));
        
        //设置交易期限
    	Date date = DateUtil.getStringToDate(block.getTimeStamp(),"yyyy-MM-dd'T'HH:mm:ss");
    	date = DateUtil.addMin(date, 1);
        String exPiration = DateUtil.dateToString(date,"yyyy-MM-dd'T'HH:mm:ss");

        PackedTransaction packedTransaction = new PackedTransaction();
        packedTransaction.setRefBlockPrefix(block.getRefBlockPrefix().toString());
        packedTransaction.setRefBlockNum(block.getBlockNum().toString());
        packedTransaction.setExpiration(exPiration);
        packedTransaction.setRegion("0");
        packedTransaction.setMax_net_usage_words("0");
        packedTransaction.setActions(Collections.singletonList(transactionAction));
        //打开钱包
        eosApiRestClient.openWallet(walletName);
        //解锁钱包
        eosApiRestClient.unlockWallet(walletName, walletPassword);
        
        SignedPackedTransaction signedPackedTransaction = eosApiRestClient.signTransaction(packedTransaction, 
        		Collections.singletonList(ownerAccountPublicKey), chainInfo.getChainId());

        PushedTransaction pushedTransaction= eosApiRestClient.pushTransaction("none", signedPackedTransaction);
        if (pushedTransaction != null) {
        	log.info("EOS转账成功:transactionId:{}",pushedTransaction.getTransactionId());
    		return pushedTransaction.getTransactionId();
		}else {
			log.info("EOS转账失败");
		}
        return null;
    }

}

4,定时任务 获取用户交易记录  来确认用户充值   这是我的示例。具体可以根据自己业务来


    /**
     * EOS处理
     */
    private void eosJob(){
        //代表的是账户记录处理到第几条,不是区块高度
        int eosIndex = coinParseService.getBlockHeight(CoinConstant.COIN_EOS);
        log.info("EOS当前处理记录数:{}",eosIndex);
        int reIndex = coinEosService.getActions(eosIndex);
        if (reIndex > eosIndex) {
            log.info("eos执行完毕");
            coinParseService.updateBlockRecord(CoinConstant.COIN_EOS, reIndex);
		}
    }

希望能帮到大家,欢迎大家一起分享。

觉得有用请打赏,你的鼓励就是我的动力!

扫描二维码关注公众号,回复: 3009629 查看本文章

有问题可以通过chat向我提问,共同进步

同时也可以加入我创建的技术交流群629042605

猜你喜欢

转载自blog.csdn.net/liu1765686161/article/details/82180070
eos