EOS JAVA 调用(离线签名)

前言:  之前一篇文章是用的在线签名,本地启用了keosd服务,来管理用户密钥和数据签名.

本篇文章,直接离线签名,无需自己再启动eos的相关服务.  (上一篇文章https://blog.youkuaiyun.com/liu1765686161/article/details/82180070)

用户充值:需要告知用户userId,用户充值时备注上userId,然后后台查询账户交易记录.判断memo是否为用户ID.是则代表用户充值.

1,下载eos4j.jar包(https://download.youkuaiyun.com/download/liu1765686161/10756043),加入项目中.  下载需要优快云积分,没有的话可加QQ技术交流群629042605下载

2,直接调用

package com.tn.set.service.coin;
import io.eblock.eos4j.EosRpcService;
import io.eblock.eos4j.api.vo.action.Action;
import io.eblock.eos4j.api.vo.action.ActionTrace;
import io.eblock.eos4j.api.vo.action.Actions;
import io.eblock.eos4j.api.vo.transaction.Transaction;
import java.util.List;
import javax.annotation.PostConstruct;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSONObject;
import com.tn.base.Log;
import com.tn.util.BigDecimalUtil;
import com.tn.util.JsonUtil;

/**
 * eos操作
 * @author xhl
 * @create 2017/10/27
 **/
@Service
public class CopyOfCoinEosService {

    private Logger log = Log.get();
   
//      正式网络https://api-v2.eosasia.one
    private String chainUrl = "https://api-kylin.eosasia.one";//测试网络
    private String account = "eosqxyx22222";
//    private String activePrivateKey = "5JJB2oiCXwASK9fumjyTgbtHcwDVedVRaZda1kBhFuQcmjnrDWB";
    private String activePrivateKey = "5JbkSyGHeYRH2sa1aSh3Fg7ECdUQWpKM7mfgCi1HmyDK84RHHvT";
   
    private EosRpcService eosRpcService = null;
    private static final String EOS_TOKEN = "eosio.token";
    private static final String ACTION_TRANSFER = "transfer";

    @PostConstruct
    public void init(){
     eosRpcService = new EosRpcService(chainUrl);
    }

 public static void main(String[] args) {
  CopyOfCoinEosService eosService = new CopyOfCoinEosService();
  eosService.eosRpcService = new EosRpcService(eosService.chainUrl);
  System.out.println(eosService.getBalance());
  eosService.send("eosqxyx11111", 10.00, "46");
 }
   
    public String getAddress(){
     return account;
    }

    public double getBalance(){
     List<String> list = eosRpcService.getCurrencyBalance(EOS_TOKEN, account, "EOS");
     if (list != null && list.size() > 0) {
   return Double.parseDouble(list.get(0).replaceAll(" EOS", ""));
  }
     return 0.00;
    }
    /**
     * 获取用户交易记录
     * @param index 获取到第几条记录
     * @return
     */
 public boolean getActions(int index){
  try {
   //最后一个参数代表每次获取几条记录,若是获取多条记录有可能会出现重复数据.
   Actions actions = eosRpcService.getActions(account, index,1);
   if (actions != null) {
    List<Action> list = actions.getActions();
    if (list==null || list.size() == 0) {
     return false;
    }
    //不可变更区块高度
    int lastIrreversibleBlock = actions.getLastIrreversibleBlock();
    for (Action action : list) {
     ActionTrace actionTrace = action.getActionTrace();
     String account = actionTrace.getAct().getAccount();
     if (!EOS_TOKEN.equals(account)) {
      log.info("非EOS交易记录:{}",account);
                  return true;
     }
     if (action.getBlockNum() > lastIrreversibleBlock) {
      log.info("未确认交易:{}",account);
                  return false;
     }
     String name = actionTrace.getAct().getName();
     if (!ACTION_TRANSFER.equals(name)) {
      log.info("非EOS转账交易记录:{}",account);
      return true;
     }
     //{from=eosqxyx11111, to=eosqxyx22222, quantity=10.0000 EOS, memo=test}
     log.info("交易详情:{}",actionTrace.getAct().getData().toString());
     JSONObject json = JSONObject.parseObject(JsonUtil.getSting(actionTrace.getAct().getData()));
     if (!account.equals(json.getString("to"))) {
      log.info("非充值记录:{}",actionTrace.getTrxId());
      return true;
     }
     String[] quantity = json.getString("quantity").split(" ");
     if (!"EOS".equals(quantity[1])) {
      log.info("非EOS充值记录:{}",json.getString("quantity"));
      return true;
     }
     String memo = json.getString("memo");
                 if (StringUtils.isEmpty(memo)) {
      log.info("记录TrxId:{}为空",actionTrace.getTrxId());
      return true;
     }
                 //判断用户是否存在
                 /*UserEntity user = userService.getUserById(Integer.parseInt(memo));
                 if (user == null) {
      log.info("用户信息不存在:memo:{}",memo);
      continue;
     }*/
                 //添加充值记录
           return true;
    }
   }
  } catch (Exception e1) {
   e1.printStackTrace();
   log.error("获取用户交易记录失败:{}",e1.getMessage());
  }
  return false;
 }
 /**
  * 去重
  * @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;
 }
 
 /**
     * 发送交易
     * @param toAccount
     * @param amount 保留4位小数点
     * @param memo
     * @return
     */
    public String send(String toAccount,double amount,String memo){
  try {
   String amt = BigDecimalUtil.getFourString(amount)+" EOS";
   System.out.println(amt);
//   Transaction t1 = rpc.transfer("5JJB2oiCXwASK9fumjyTgbtHcwDVedVRaZda1kBhFuQcmjnrDWB","eosio.token", "eosqxyx11111","eosqxyx22222", "10.0000 EOS", "te1");
   Transaction t1 = eosRpcService.transfer(activePrivateKey,EOS_TOKEN, account,toAccount, amt, memo);
         if (t1 != null) {
          log.info("EOS转账成功:transactionId:{}",t1.getTransactionId());
       return t1.getTransactionId();
   }else {
    log.info("EOS转账失败");
   }
  } catch (Exception e) {
   e.printStackTrace();
   log.error("EOS转账失败:{}",e.getMessage());
  }
        return null;
    }

 

1、玩过EOS的都知道,EOS本身更新迭代非常之快,所以有些知识点可能与最新版有所出入,希望小伙伴理解!此文档适用于EOS-v1.0.5以上版本和v1.1.x版本,目前的v1.2.x可能会有极少部分出入,比如eosiocpp工具看更新说明再不用安装的状态下就能使用,目前还未测试。有兴趣的小伙伴可以留言交流。 2、当前文档目录结构介绍: #思考研究问题 1、如何保证EOS中发布的智能合约不被随意篡改? #玩转EOS智能合约代码 #玩转客户端cleos 1、先玩转与智能合约相关的操作 #使用eosiocpp工具编译智能合约生成abi文件和wast文件 #编译合约(无法通过) #安装build/programs下工具 #重新编译合约 #部署合约到账户 #购买RAM #测试调用部署的合约 #更新\升级已经部署过的智能合约(相对空的合约) #更新添加新的函数接口(action)合约 #有关require_auth的合约测试 2、玩转智能合约与数据库相关操作 #参考资料 #持久化API (Multi-Index) 1、一般来讲,对数据库的操作无外乎增删改查 2、表结构示例详解 3、Multi_index定义,建立数据表 4、实例化multi_index 5、操作数据,增删改查 #玩转table表 1、Table表producers 2、Table表global 3、Table表voters 4、Table表rammarket (获取RAM实时价格) 5、Table表refunds (查看账户退款信息) 6、Table表namebids (罗列参与竞拍的账户信息) 3、启动nodeos节点出现脏数据 4、查看账户抵押资产,抵押token,赎回token #查看账户余额(可用余额) #查看SYS货币信息,eosio.token是经营货币的合约 #查看公钥对应账户 #查看子账户(控制账户) #查看账户信息 #查看账户抵押信息 #钱不够那就转账,随便耍 #get transaction无结果了解一下 #卖出RAM(卖给系统账户eosio.ram),字节bytes #抵押token获取CPU和net资源 #赎回抵押token,默认三天后到账,执行后可查看账户状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值