交易所对接EOS(JAVA)
不是非常了解,这些是我所了解到整理分享给大家
获取交易记录在19/11/13号出错了,解决办法如下https://blog.csdn.net/Day_Day_No_Bug/article/details/103061716
首先EOS不同于其他的币种,它并不需要同步本地账本(也可以同步),它拥有被投票选举出来的21个超级节点,只要我们连接到节点上就可以进行相应的开发,节点列表跳转
这里我使用了github上的eos4j工具包(github)进行开发,也可以直接通过api开发官方文档
EOS的账号是需要收费创建的,可以去imtoken上申请大概是0.01+ETH
由于EOS的特殊性,和其他币种不同例如ETH和USDT这种,在交易所中需要每个用户分配一个地址,产生交易后再触发事件,将用户地址内的余额转移到交易所地址,
而EOS不一样,在其他交易所中充值时会发现,你并没有EOS地址,只需要知道一个账户名和备注(memo)即可充值到你的钱包中,所以我们只需要给用户分配memo作为用户的标识 (例如用户id+随机字符) ,清楚了这一点也就发现了EOS并不需要做归集,因为本身就只有一个地址,用户想要充值时,交易所提供account和该用户的标识memo即可。
简单了解之后,下面就是上代码
首先是初始化连接
private static final String EOS_API_URL= "http://eos.greymass.com";
private static EosRpcService eosRpcService = new EosRpcService(EOS_API_URL);
创建好连接之后,就可以调用封装好的方法(本质就是调用api)这里只介绍常用的 充值,转账(提现),查询余额
首先是查询余额,这里面的余额后面会附属上" EOS",(EOS前面有一个空格) 需要给他替换掉再转换成数值类型
double amount = 0.00;
try {
List<String> list = eosRpcService.getCurrencyBalance("eosio.token", accountName, "EOS");
if (!CollectionUtils.isEmpty(list) && list.size() > 0) {
amount = Double.parseDouble(list.get(0).replaceAll(" EOS", ""));
}
} catch (Exception e) {
e.printStackTrace();
}
return amount ;
调用之后的截图
和在imtoken上查询到的结果一致
然后是转账(提现),api所需要的金额是字符串类型,上面已经提到过了,需要在结尾附属上" EOS",且保留4位小数
// pk 从imtoken中导出的私钥(保护好)
// from 转出者
// to 接受者
// 金额要按照下面这个格式实际金额保留4位小数+空格+EOS
// memo(尤为重要,只要这个填对了才能确认充值者是谁(标识用户),这玩意其实还能打广告23333)
eosRpcService.transfer(pk, "eosio.token", from, to, "0.5000 EOS", memo);
转账成功后会返回下面这一堆,有transactionId就ok了
{"compression":"none","transaction":{"expiration":"2019-10-12T05:40:12","ref_block_num":84105131,"ref_block_prefix":540581775,"net_usage_words":0,"max_cpu_usage_ms":0,"delay_sec":0,"context_free_actions":[],"actions":[{"account":"eosio.token","name":"transfer","authorization":[{"actor":"y#######3","permission":"active"}],"data":"3044c0544de39ef6901da6552577a86e881300000000000004454f53000000000734303634363937"}],"transaction_extensions":[]},"signatures":["SIG_K1_K8zh2mjrTsUFRpAvRAAtX####JktD4wqF7BvmNzJAzzPY25Cj8qrDF7VwRTZR3QNBESFU1YaMHGPLZ9rE76DmrqEZccqK6"]}
{"processed":{"elapsed":512,"id":"80d06de91bc65765f0eff9b93c####62aedfa094a30cd2bc5f99c0f390f19d5b","netUsage":136,"receipt":{"cpuUsageUs":512,"netUsageWords":17,"status":"executed"},"scheduled":false},"transactionId":"80d06de91bc65765####f9b93c2a7562aedfa094a30cd2bc5f99c0f390f19d5b"}
然后imtoken就接到了如下通知
最后是充值流程,主要通过这个方法获取,account就是账户,index我理解为交易的次数,这个和ETH那种扫块不一样,更像是omni那种查历史交易记录,index从0开始给 (所以index不是交易的区块高度,填成功交易返回的高度是无效的) 这里有个问题每个index中所包含的交易有转入和转出,而且不同的index中会有重复的几记录,pagesize是分页的条数(这里我给了0可以成功的去除重复的记录)
Actions actions = eosRpcService.getActions(account, index, pageSize);
这里是pagesize=0的效果,这里每一笔都是真实的转入记录切无重复,memo中文的那个是个广告23333
pagesize=10的效果,不同的index有相同的记录 (这里我也没太理解为什么这样设计,懂的老哥可以评论,反正pagesize=0就可以拿到我们想要的效果)
下面是充值的部分代码,每次返回false就记录index-1的位置等待下次任务执行
try {
Actions actions = eosRpcService.getActions(account, index, pageSize);
if (actions != null) {
List<Action> list = actions.getActions();
if (list == null || list.size() == 0) {
//该index无交易等待下次重新扫描
return false;
}
//最新高度
int height = actions.getLastIrreversibleBlock();
for (Action action : list) {
System.out.println("高度" + action.getBlockNum());
ActionTrace actionTrace = action.getActionTrace();
String eos_token = actionTrace.getAct().getAccount();
if (!"eosio.token".equals(eos_token)) {
//非EOS交易记录
continue;
}
if (action.getBlockNum() > height) {
System.out.println("未确认交易"+action.getBlockNum());
//未确认交易,等待下次重新扫描
return false;
}
String name = actionTrace.getAct().getName();
if (!"transfer".equals(name)) {
//非EOS转账交易记录
continue;
}
JSONObject json = JSONObject.parseObject(JSON.toJSONString(actionTrace.getAct().getData()));
if (!account.equals(json.get("to").toString())) {
//非充值记录
continue;
}
String[] quantity = json.get("quantity").toString().split(" ");
if (!"EOS".equals(quantity[1])) {
//非EOS充值记录
continue;
}
String memo = json.get("memo").toString();
if (StringUtils.isEmpty(memo)) {
log.info("记录memo为空");
continue;
}else{
System.out.println("当前高度"+action.getBlockNum());
log.info("index{} HASH={} json = {}", index, actionTrace.getTrxId(), json);
//check actionTrace.getTrxId() 在数据库中是否存在有了就跳过
if (memo.equals("4064697")){
//和提前查出来的用户memo对比 符合就给相应的用户增加EOS余额
System.out.println("发现一笔交易");
}
}
}
return true;
}