EOS 钱包开发(JAVA)

交易所对接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;
                    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值