区块链EOS工具类

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);
	  }	
}
EOSIO的设计包括: 免费汇率限制交易 低延迟阻止确认(0.5秒) 低开销的拜占庭容错终结 可选的高开销,低延迟BFT终端 由Web Assembly支持的智能合约平台 专为稀疏头灯客户端验证而设计 计划的周期性事务 时间延迟安全 基于角色的权限分级 支持生物识别硬件安全密钥(例如Apple安全飞地) 并行执行上下文自由验证逻辑 区块链间通信 EOSIO允许开发人员编写与需求确定性执行的共识算法兼容的业务逻辑。您的用户群可以使用安全的公钥基础结构与此业务逻辑进行交互,为您的业务带来区块链级别的安全性,责任性和可审计性。业务逻辑根据组织的治理结构轻松更新。 EOSIO旨在在没有任何令牌的环境中运行,系统管理员为用户分配可能无限制的资源配额。或者,智能合约可以通过其他方式分配资源配额,例如令牌销售,市场费用或投票。这使得EOSIO非常适合企业和社区驱动的区块链。 根据您的使用情况,可以将EOSIO配置为使用两种不同的Web装配引擎之一Binaryen和WAVM。单个EOSIO区块链可支持高达1,000 TPS,未来版本的EOSIO将提供简化区块链间通信所需的工具,使您的业务能够水平扩展。 EOSIO是在开放源代码MIT许可下发布的,按“原样”提供,没有任何明示或暗示的担保。EOSIO软件提供的任何安全性部分取决于它的使用,配置和部署方式。EOSIO建立在许多第三方库上,如Binaryen(Apache许可证)和WAVM(BSD 3-clause),它们也是“按现状”提供的,没有任何形式的保证。在不限制前述内容的一般性的情况下,Block.one不作任何陈述或保证EOSIO或任何第三方库将按预期执行或不会出现错误,错误或错误代码。这两种方式都可能以很大或很小的方式失败,这可能会完全或部分地限制功能或危害计算机系统。如果您使用或实施EOSIO,则自行承担风险。在任何情况下都不会阻止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值