ITPub博客

首页 > 区块链 > 区块链 > Omni Core创建原生交易实现Usdt自动归集操作

Omni Core创建原生交易实现Usdt自动归集操作

区块链 作者:奥斯科技 时间:2020-03-17 21:15:31 0 删除 编辑

查看此代码建议先自行用命令去创建一次原生交易!

 


原始的交易命令请看这个:https://steemit.com/usdt/@chaimyu/omni-usdt-raw-transaction


 


package com.abc.nb;

import com.googlecode.jsonrpc4j.JsonRpcHttpClient;

import org.apache.commons.codec.binary.Base64;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.math.BigDecimal;

import java.math.RoundingMode;

import java.net.URL;

import java.net.URLConnection;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

 

public class Usedt {

 

     private  String url = "http://127.0.0.1:18332";

     private  String username = "u";

     private  String password = "p";

    //outValue是总钱数,这个一般在充值记录里面计算。我就不调用钱包去查询了

    public String collectionUsdt( BigDecimal outValue) {

        JsonRpcHttpClient client = null;

        try {

            Map[] argsOne = new Map[1];

            Map[] args1 = new Map[1];

            String creb = Base64.encodeBase64String((username+":"+password).getBytes());

            Map<String,String> headers = new HashMap<>(2);

            headers.put("Authorization","Basic "+creb);

            headers.put("server", "1");

            client = new JsonRpcHttpClient(new URL(url), headers);

            List<Map> listunspent = (List<Map>) client.invoke("listunspent", new Object[]{}, Object.class);

            for (Map map : listunspent) {

                Double amount=(Double) map.get("amount");

                //这里是找一笔uxto的btc交易做桥梁

                if(amount>1){

                    String txId =(String) map.get("txid");

                    String scriptPubKey =(String) map.get("scriptPubKey");

                    int vout =(int) map.get("vout");

                    Map input = new HashMap<>();

                    input.put("txid", txId);

                    input.put("vout", vout);

                    args1[0] = input;

                    Map inputT = new HashMap<>();

                    inputT.put("txid", txId);

                    inputT.put("vout",vout);

                    inputT.put("scriptPubKey", scriptPubKey);

                    inputT.put("value", amount);

                    argsOne[0] = inputT;

                    break;

                }

            }

            //计算字节大小和费用(因为是归集USDT 所以我用最小的输入来降低手续费,如果你是BTC和USDT一起归总那就要根据归集的输入来计算了)

            BigDecimal keyCount = calculationFee(1);

            //将聪换算成BTC

            BigDecimal transferFee = keyCount.divide(new BigDecimal("100000000"), 8, RoundingMode.HALF_UP);

            if (transferFee.compareTo(BigDecimal.ZERO) <= 0 || outValue.compareTo(transferFee) <= 0) {

                return null;

            }

            /**

             * 通过全节点构造原生交易

             */

            //创建BTC交易

            Map args2 = new HashMap<>();

            Object result = (Object) client.invoke("createrawtransaction", new Object[]{args1,args2 }, Object.class);

            String transaction = String.valueOf(result);

            /*//解锁钱包

            client.invoke("walletpassphrase", new Object[]{"xxxx", 100}, Object.class);*/

            //创建Usdt交易

            String simplesendResult = (String) client.invoke("omni_createpayload_simplesend", new Object[]{ 1,outValue.toString() }, Object.class);

            //usdt交易附加到BTC交易上

            String opreturnResult = (String) client.invoke("omni_createrawtx_opreturn", new Object[]{transaction,simplesendResult}, Object.class);

            //设置归总地址

            String reference = (String) client.invoke("omni_createrawtx_reference", new Object[]{opreturnResult,"归总地址"}, Object.class);

            //填写手续费及找零地址

            String changeResult = (String) client.invoke("omni_createrawtx_change", new Object[]{reference,argsOne,"找零地址",transferFee.toString()}, Object.class);

            //获取原生交易hex

            Map signrawtransaction = (Map) client.invoke("signrawtransaction", new Object[]{changeResult}, Object.class);

            //广播交易

            String txId = (String) client.invoke("sendrawtransaction", new Object[]{signrawtransaction.get("hex")}, Object.class);

            return txId;

        } catch (Exception e) {

            e.printStackTrace();

        } catch (Throwable e1) {

            e1.printStackTrace();

        }

        return null;

    }

 

    /**

     * 计算手续费

     *

     * @param inputCount

     * @return

     */

    private BigDecimal calculationFee( int inputCount) {

        //计算手续费获取每个字节的手续费

        String url="bitcoinfees.earn.com";

        //计算字节大小和费用

        String resut=sendGet(url,null);

        //=====resut===>转对象Model省略了,其实http请求都有公用的方法所以我随便写了。。

        BigDecimal keyCount = BigDecimal.valueOf((inputCount * 148 + 44) * Model.getHalfHourFee());

        //

        return keyCount;

 

    }

    public static String sendGet(String url, String param) {

        String result = "";

        BufferedReader in = null;

        try {

            String urlNameString = url + "?" + param;

            URL realUrl = new URL(urlNameString);

            // 打开和URL之间的连接

            URLConnection connection = realUrl.openConnection();

            // 设置通用的请求属性

            connection.setRequestProperty("accept", "*/*");

            connection.setRequestProperty("connection", "Keep-Alive");

            connection.setRequestProperty("user-agent",

                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");

            // 建立实际的连接

            connection.connect();

            // 获取所有响应头字段

            Map<String, List<String>> map = connection.getHeaderFields();

            // 遍历所有的响应头字段

            for (String key : map.keySet()) {

                System.out.println(key + "--->" + map.get(key));

            }

            // 定义 BufferedReader输入流来读取URL的响应

            in = new BufferedReader(new InputStreamReader(

                    connection.getInputStream()));

            String line;

            while ((line = in.readLine()) != null) {

                result += line;

            }

        } catch (Exception e) {

            System.out.println("发送GET请求出现异常!" + e);

            e.printStackTrace();

        }

        // 使用finally块来关闭输入流

        finally {

            try {

                if (in != null) {

                    in.close();

                }

            } catch (Exception e2) {

                e2.printStackTrace();

            }

        }

        return result;

    }

}

交易手续费自己修改下。


新版的OMNI钱包新加了 omni_funded_send 这个命令可以指定交付手续费的地址!


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69966803/viewspace-2681015/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
专业区块链/网站开发

注册时间:2020-03-17

  • 博文量
    16
  • 访问量
    11115