区块链开发之计算BTC的fee小费

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wypeng2010/article/details/81357684

引言

btc的fee也是要经过计算得出的,而不是随便给的,它的计价方式是按照每笔交易的字节数收的,所以要先计算出你这比交易的fee,必须先计算出这笔交易可能的字节数,计算公式如下:

148 x inputNum + 34 x outputNum + 10

算出字节数后,再乘以rate(Satoshi/byte),rate可以网上找接口获取

提示:所以为了转账少花手续费,最好把utxo列表根据余额从大到小做个排序

代码实现:

    /***
     *
     * @param unSpentBTCList
     * @param value
     * @param rate sta/byte
     * @return -1发送的value超出了你的余额
     */
    public static long getFee(@NonNull List<UnSpentBTC> unSpentBTCList, long value, int rate) {
        long fee = 0L;
        int inputNum = 0;
        long totalMoney = 0;
        for (UnSpentBTC us : unSpentBTCList) {
            inputNum++;
            totalMoney += us.getSatoshis();
            if (totalMoney > value) {
                fee = (148 * inputNum + 34 * 1 + 10) * rate;
                if (totalMoney == (value + fee))
                    return fee;
                else if (totalMoney > (value + fee)) {
                    fee = (148 * inputNum + 34 * 2 + 10) * rate;
                    if (totalMoney >= (value + fee))
                        return fee;
                }
            }
        }
        return -1;
    }

有的朋友可能还会需要算出,最大能够发送的钱数,我这里也给一下代码,仅做参考:

    /**
     * @param unSpentBTCList
     * @param totalMoney
     * @return
     */
    public static long getMaxSendValue(List<UnSpentBTC> unSpentBTCList, long totalMoney, int rate) {

        while (true) {
            long fee = getFee(unSpentBTCList, totalMoney, rate);
            if (fee == -1)
                totalMoney -= 100;
            else
                break;
        }
       /* long fee = getFee(unSpentBTCList, totalMoney, rate);
        if (fee == -1) {
            totalMoney -= 100;
            getMaxSendValue(unSpentBTCList, totalMoney, rate);
        }*/
        return totalMoney;
    }

猜你喜欢

转载自blog.csdn.net/wypeng2010/article/details/81357684
今日推荐