package utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import io.plactal.eoscommander.rpc.Ecc;
import io.plactal.eoscommander.rpc.Rpc;
import nl.flotsam.xeger.Xeger;
import util.IdWorker;
import utils.EosTransBean.ActionTraceBean.ActBean.DataBean;
public class EosUtil {
public static String url = "";
public static String from = "";
public static String to = "";
public static String quantity = "0.0001 CFS";
public static String memo = "";
public static String privatekey = "";
public static String transfer = "";
public static String CFStoken = "";
public static String tok = "";
public static int pos = -1;
public static SimpleDateFormat simpleDate = new SimpleDateFormat("YYYY-MM-dd HH:MM:SS");
public static Rpc UrlRpc() {
Rpc rpc = new Rpc(url);
return rpc;
}
/**
* 交易请求
* @param from 转出账户
* @param to 转入账户
* @param quantity 交易金额(必须保留小数点后4位数)
* @param memo 交易备注
* @param privatekey 签名账户私钥
* @param transfer 合约方法
* @param eosiotoken 合约名
* @return
*/
public static String act(String from, String to, String quantity, String memo, String privatekey, String transfer,
String eosiotoken) {
Rpc urlRpc = UrlRpc();
// 发起交易
Map<String, Object> args = new HashMap<String, Object>();
args.put("from", from);// 转出账户
args.put("to", to);// 转入账户
args.put("quantity", quantity);// 交易金额
args.put("memo", memo);// 交易备注
String res = urlRpc.pushTransaction(eosiotoken, // 合约名
transfer, // 合约方法 transfer
from, // 签名账户
privatekey, // 签名账户私钥
args);
// logger.debug("交易结果:"+res);
System.err.println(res);
HashMap<String, String> specMap = JSON.parseObject(res, HashMap.class);
String message = specMap.get("message");
// logger.debug("操作结果:" + message);
return message;
}
/**
* 查询账户信息
*
* @param account 账户名
*/
public static void QueryAccount(String account) {
Rpc urlRpc = UrlRpc();
String accountmessage = urlRpc.getAccount(account);
// logger.debug("操作结果:" + accountmessage);
System.err.println(accountmessage);
}
/**
* 查询账户特定币种余额
*
* @param account 账户名
* @param eosiotoken 目标币合约
* @param tok 目标币名称
* @return
*/
public static String QuerygetCurrencyBalance(String account, String eosiotoken, String tok) {
Rpc urlRpc = UrlRpc();
String currencyBalance = urlRpc.getCurrencyBalance(account, eosiotoken, tok);
HashMap<String, String> specMap = JSON.parseObject(currencyBalance, HashMap.class);
String data = specMap.get("data");
String substring = data.substring(1, data.length() - 1);
String replaceAll = substring.replaceAll("\"", " ");
// logger.debug("操作结果:" + currencyBalance);
return replaceAll;
}
/**
* 根据公钥获取账户名
*
* @param result
* @return
*/
public static String getNameByePKey(String publickey) {
Rpc urlRpc = UrlRpc();
try {
String keyAccounts = urlRpc.getKeyAccounts(publickey);
// logger.debug("操作结果:" + keyAccounts);
JSONObject parseObject = JSON.parseObject(keyAccounts);
String string = parseObject.getString("data");
JSONObject parseObjectdata = JSON.parseObject(string);
String Name = parseObjectdata.getString("account_names");
String substring = Name.substring(1, Name.length() - 1);
String replaceAll = substring.replaceAll("\"", " ");
return replaceAll;
} catch (Exception e) {
throw new IllegalArgumentException("请检查公钥的合法性");
}
}
/**
* 创建账户
*
* @param accountName 想创建的账户名(账户名必须是12位,并且只包含a-z1-5,低于12位的一般是特殊账户)
*/
public static void createAccount(String accountName) {
Map<String, String> key = getKey();
String publicKey = key.get("publicKey");
Map<String, String> map = new HashMap<>();
System.err.println(key.get("publicKey"));
System.err.println(key.get("privateKey"));
map.put("accountName", accountName);
map.put("pk", publicKey);
try {
String eoSpost = EosHttpUtils.EOSpost(""+"",map);
// logger.debug("操作结果:" + eoSpost);
} catch (Exception e) {
throw new IllegalArgumentException("请检查公钥的合法性,账户名必须是12位,并且只包含a-z1-5");
}
}
/**
* 创建账户
*
* @param accountName 想创建的账户名(账户名必须是12位,并且只包含a-z1-5,低于12位的一般是特殊账户)
*/
public static void createIOSAccount(String accountName, String publicKey) {
Map<String, String> map = new HashMap<>();
map.put("accountName", accountName);
map.put("pk", publicKey);
try {
String eoSpost = EosHttpUtils.EOSpost("" + "", map);
// logger.debug("操作结果:" + eoSpost);
} catch (Exception e) {
throw new IllegalArgumentException("请检查公钥的合法性,账户名必须是12位,并且只包含a-z1-5");
}
}
/**
* 随笔生成密钥对
*
* @return
*/
public static Map<String, String> getKey() {
IdWorker idWorker = new IdWorker();
long nextId = idWorker.nextId();
String privateKey = Ecc.seedPrivate(String.valueOf(nextId));
String publicKey = Ecc.getPublicKey(privateKey);
Map<String, String> map = new HashMap<>();
map.put("publicKey", publicKey);
map.put("privateKey", privateKey);
return map;
}
/**
* 去重
*
* @param list
* @return
*/
public static List removeDuplicate(List list) {
HashSet h = new HashSet(list);
list.clear();
list.addAll(h);
return list;
}
/**
* 随机生成EOS账户名(钱包地址)
*
* @return
*/
public static String regex() {
String regex = "[a-z1-5]{12}";
Xeger generator = new Xeger(regex);
String result = generator.generate();
assert result.matches(regex);
return result;
}
/**
* 查询交易记录
*
* @param account 查询账户名
* @param pos 偏移量
* @param offset 起始位置
* @return pos,offset为空则查询所有交易记录 转账方每次转账操作会通知合约方,对手方,自己方,对于支出方每次支出都会产生3条交易记录
*/
public static List<Map<String, Object>> getActionsJar2(String account, int pos, int offset,String chain) {
Rpc urlRpc = UrlRpc();
String actions = urlRpc.getActions(account, pos, offset);
JSONObject parseObjectdata = JSON.parseObject(actions);
String stringdata = parseObjectdata.getString("data");
JSONObject parseObject = JSON.parseObject(stringdata);
String string = parseObject.getString("actions");
net.sf.json.JSONArray jsonArray = net.sf.json.JSONArray.fromObject(string);
List<Map<String, Object>> maplsit = new ArrayList<>();
for (Object object : jsonArray) {
net.sf.json.JSONObject jsonObject2 = net.sf.json.JSONObject.fromObject(object);
EosTransBean eosTransBean = (EosTransBean) net.sf.json.JSONObject.toBean(jsonObject2, EosTransBean.class);
String receiver = eosTransBean.getAction_trace().getReceipt().getReceiver();
DataBean data = eosTransBean.getAction_trace().getAct().getData();
String to2 = eosTransBean.getAction_trace().getAct().getData().getTo();
Map<String, Object> map=new HashMap<>();
map.put("quantity", data.getQuantity().toString());
map.put("receiver", receiver);
if(!account.equals(receiver)) {//如果交易记录的接收方不是自己则跳过
continue;
}
map.put("account_action_seq", eosTransBean.getAccount_action_seq());
String accountEos = eosTransBean.getAction_trace().getAct().getAccount();
map.put("from", data.getFrom().toString());
map.put("to", data.getTo().toString());
map.put("memo", data.getMemo().toString());
String uptime = TimeUtils.uptime(eosTransBean.getBlock_time());
map.put("time", uptime);
map.put("receiver", receiver);
map.put("account", accountEos);
if (chain != null) {
if (chain.equals(accountEos)) {// 是指定的链数据才显示
maplsit.add(map);
}
} else {// 现在这个账号下所有链的数据
maplsit.add(map);
}
}
return maplsit;
}
public static int showJsonAvalible(String data,int pos,String wallet,String chain) {
String time = "";
int account_action_seq = pos;
int last = -2;
try {
Map maps = (Map)JSON.parse(data);
//System.out.println(data);
String actdata = maps.get("actions").toString();
JSONArray amaps = (JSONArray)JSON.parse(actdata);
for(Object obj:amaps) {
//System.out.println(obj);
Map bmaps = (Map)JSON.parse(obj.toString());
time = bmaps.get("block_time").toString();//区块时间
String saccount_action_seq = bmaps.get("account_action_seq").toString();//区块索引
account_action_seq = Integer.parseInt(saccount_action_seq);
if(last>account_action_seq || last==-2) {
last = account_action_seq;
}
String action_trace = bmaps.get("action_trace").toString();
Map dmaps = (Map)JSON.parse( action_trace);
String sact = dmaps.get("act").toString();
Map tmaps = (Map)JSON.parse(sact);
String sdata = tmaps.get("data").toString();
String receipt = dmaps.get("receipt").toString();
Map recmaps = (Map)JSON.parse( receipt);
String receiver = recmaps.get("receiver").toString();//交易记录接收方
if(!wallet.equals(receiver)) {//如果交易记录的接收方不是自己则跳过
continue;
}
String account = tmaps.get("account").toString(); //查询的链
Map actmaps = (Map)JSON.parse( sdata);
String quantity = actmaps.get("quantity").toString();//交易资产量
String memo = actmaps.get("memo").toString();//交易备注说明
String from = actmaps.get("from").toString();//资产转出账号
String to = actmaps.get("to").toString(); //资产转入账号
if(chain!=null) {
if(chain.equals(account)) {// 是指定的链数据才显示
System.out.println(TimeUtils.uptime(time)+" "+account_action_seq+" " + sdata+" "+account+" "+receiver);
}
}else {//现在这个账号下所有链的数据
System.out.println(TimeUtils.uptime(time)+" "+account_action_seq+" " + sdata+" "+account+" "+receiver);
}
}
}catch(Exception e) {
System.out.println(pos+":"+data);
e.printStackTrace();
}
return last;
}
public static int showWalletInfo(String wallet,int pos,int off) {
Map<String, String> map=new HashMap<>();
map.put("account_name", wallet);
map.put("pos", String.valueOf(pos));
map.put("offset", String.valueOf(off));
String rdata =HttpUtils.httpGetDataPG(url+"/v1/history/get_actions","{\"account_name\":\""+wallet+"\",\"pos\":\""+pos+"\",\"offset\":\""+off+"\"}");
boolean ok = rdata.startsWith("0");
while(ok) {
rdata = HttpUtils.httpGetDataPG(url+"/v1/history/get_actions","{\"account_name\":\""+wallet+"\",\"pos\":\""+pos+"\",\"offset\":\""+off+"\"}");
ok = rdata.startsWith("0");
}
return showJsonAvalible(rdata,pos,wallet,"hphphptokenc");//showJson(rdata,pos);//null);//
//System.out.println("data:"+rdata);
}
}
区块链EOS工具类
最新推荐文章于 2021-12-31 10:03:45 发布