千家信息网

java怎么实现区块链钱包BTC离线签名交易

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"java怎么实现区块链钱包BTC离线签名交易",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"java怎么实现区块链钱包BTC离线签名
千家信息网最后更新 2026年11月01日java怎么实现区块链钱包BTC离线签名交易

这篇文章主要讲解了"java怎么实现区块链钱包BTC离线签名交易",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"java怎么实现区块链钱包BTC离线签名交易"吧!

对于离线交易不做过多解释~,说白了就是拿上一笔未发出交易记录进行私钥的签名然后广播到链上。

主要是对区块链离线交易进行utxo上链。

废话不多说 ,直接上代码:

UnspentUtxo交易查看:

blockchain-testnet : https://testnet.blockchain.info/unspent?active=mifiHFYFPk5cri4oneXVsRZJZKovvdDcjo

blockchain-mainnet : https://blockchain.info/unspent?active=地址

package com.bscoin.coldwallet.cointype.common; import java.io.Serializable; public class UnSpentUtxo implements Serializable {                    private static final long serialVersionUID = -7417428486644921613L;                private String hash;//交易hash        private long txN; //        private long value;//金额        private int height;//区块高度        private String script;//hex        private String address;//钱包地址                public String getHash() {                return hash;        }        public void setHash(String hash) {                this.hash = hash;        }        public long getTxN() {                return txN;        }        public void setTxN(long txN) {                this.txN = txN;        }        public long getValue() {                return value;        }        public void setValue(long value) {                this.value = value;        }        public int getHeight() {                return height;        }        public void setHeight(int height) {                this.height = height;        }        public String getScript() {                return script;        }        public void setScript(String script) {                this.script = script;        }        public String getAddress() {                return address;        }        public void setAddress(String address) {                this.address = address;        }        }

离线签名:

import java.util.ArrayList;import java.util.List; import org.apache.commons.codec.binary.Hex;import org.apache.commons.configuration2.Configuration;import org.bitcoinj.core.Address;import org.bitcoinj.core.Coin;import org.bitcoinj.core.Context;import org.bitcoinj.core.DumpedPrivateKey;import org.bitcoinj.core.ECKey;import org.bitcoinj.core.NetworkParameters;import org.bitcoinj.core.Sha256Hash;import org.bitcoinj.core.Transaction;import org.bitcoinj.core.TransactionOutPoint;import org.bitcoinj.core.UTXO;import org.bitcoinj.core.Utils;import org.bitcoinj.params.MainNetParams;import org.bitcoinj.params.TestNet3Params;import org.bitcoinj.script.Script;import org.omg.CORBA.UNKNOWN;import org.slf4j.Logger;import org.slf4j.LoggerFactory; import com.alibaba.fastjson.JSON;import com.bscoin.coldwallet.cointype.common.ConfigUtil;import com.bscoin.coldwallet.cointype.common.UnSpentUtxo; import org.bitcoinj.core.TransactionConfidence;   /**      * @ClassName: RawTransaction      * @author DHing      *    */  public class RawTransaction {                private static Logger LOG = LoggerFactory.getLogger(RawTransaction.class);        static NetworkParameters params;                static {                try {                        Configuration config = ConfigUtil.getInstance();                        params = config.getBoolean("bitcoin.testnet") ? TestNet3Params.get() : MainNetParams.get();                        LOG.info("=== [BTC] bitcoin  client networkID:{} ===", params.getId());                } catch (Exception e) {                        LOG.info("=== [BTC] com.bscoin.coldwallet.cointype.btc.rawtransaction:{} ===", e.getMessage(), e);                }        }                              /**              * @Title: signTransaction            * @param @param privKey 私钥            * @param @param recevieAddr 收款地址            * @param @param formAddr 发送地址            * @param @param amount 金额            * @param @param fee 手续费(自定义 或者 默认)            * @param @param unUtxos 未交易的utxo            * @param @return    参数              * @return char[]    返回类型              * @throws              */          public static String signTransaction(String privKey, String recevieAddr, String formAddr,                                                                                                                                                  long amount, long fee,                                                                                                                                                   List unUtxos) {                if(!unUtxos.isEmpty() && null != unUtxos){                        List utxos = new ArrayList();                        // String to a private key                        DumpedPrivateKey dumpedPrivateKey = DumpedPrivateKey.fromBase58(params, privKey);                        ECKey key = dumpedPrivateKey.getKey();                        // 接收地址                        Address receiveAddress = Address.fromBase58(params, recevieAddr);                        // 构建交易                        Transaction tx = new Transaction(params);                        tx.addOutput(Coin.valueOf(amount), receiveAddress); // 转出                        // 如果需要找零 消费列表总金额 - 已经转账的金额 - 手续费                        long value = unUtxos.stream().mapToLong(UnSpentUtxo::getValue).sum();                        Address toAddress = Address.fromBase58(params, formAddr);                        long leave  = value - amount - fee;                        if(leave > 0){                                tx.addOutput(Coin.valueOf(leave), toAddress);                        }                        // utxos is an array of inputs from my wallet                        for (UnSpentUtxo unUtxo : unUtxos) {                                utxos.add(new UTXO(Sha256Hash.wrap(unUtxo.getHash()),                                                                unUtxo.getTxN(),                                                                Coin.valueOf(unUtxo.getValue()),                                                                 unUtxo.getHeight(),                                                                 false,                                                                newScript(Utils.HEX.decode(unUtxo.getScript())),                                                                unUtxo.getAddress()));                        }                        for (UTXO utxo : utxos) {                                TransactionOutPoint outPoint = new TransactionOutPoint(params, utxo.getIndex(), utxo.getHash());                                // YOU HAVE TO CHANGE THIS                                tx.addSignedInput(outPoint, utxo.getScript(), key, Transaction.SigHash.ALL, true);                        }                        Context context = new Context(params);                        tx.getConfidence().setSource(TransactionConfidence.Source.NETWORK);                        tx.setPurpose(Transaction.Purpose.USER_PAYMENT);                                                LOG.info("=== [BTC] sign success,hash is :{} ===",tx.getHashAsString());                        return new String(Hex.encodeHex(tx.bitcoinSerialize()));                }                return null;        }                public static void main(String[] args) {                List us = new ArrayList();                UnSpentUtxo u = new UnSpentUtxo();                u.setAddress("mifiHFYFPk5cri4oneXVsRZJZKovvdDcjo");                u.setHash("2bc6ac92468c2b4f1fcd2349822dc4663dfc0705b30131087a20ed8d17de8274");                u.setHeight(    1413239);                u.setScript("76a914a1806613a51a81966779e2fa1537013cf4cd2b1788ac");                u.setTxN(1);                u.setValue(100000);                                UnSpentUtxo u1 = new UnSpentUtxo();                u1.setAddress("mvEtuEqYPMrLaKjJ5nTZ57vQAoYUtVmMaQ");                u1.setHash("1893b6ff8ef2bd6f5d652937ffbaed5bb669c5d9ab450066253d6692f2d4d972");                u1.setHeight(1413334);                u1.setScript("76a914a1806613a51a81966779e2fa1537013cf4cd2b1788ac");                u1.setTxN(1);                u1.setValue(400000);                us.add(u);                us.add(u1);                                                System.out.println(JSON.toJSONString(us));                String c = signTransaction("cNRE3D1pbPPvGs9wpZd3X9NuLsuUQPzPa7ktQyF1nhqBabraocU9", "mifiHFYFPk5cri4oneXVsRZJZKovvdDcjo", "mvEtuEqYPMrLaKjJ5nTZ57vQAoYUtVmMaQ", 400000, 10000, us);                System.out.println(c);        }}

签名成功返回Hex,使用https://live.blockcypher.com/btc-testnet/decodetx/ 进行解码查看交易详情:

感谢各位的阅读,以上就是"java怎么实现区块链钱包BTC离线签名交易"的内容了,经过本文的学习后,相信大家对java怎么实现区块链钱包BTC离线签名交易这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

交易 区块 钱包 地址 金额 学习 内容 就是 手续 手续费 成功 说白了 上链 代码 参数 废话 思路 情况 文章 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 百单网互联网科技有限公司 广东万易互联网科技有限公司惠州分公司 蓝思科技飞鸽互联网 没上市的科技互联网公司 互联网 科技 互联网未来科技 互联网科技论文 亿人帮互联网科技 青海省互联网新科技 银川新华互联网科技学校地址 开启互联网科技时代小说 深圳国际航运科技和互联网 深圳艾果互联网通讯科技 广州燕处互联网科技有限公司 国产互联网科技公司 北京天晋互联网科技有限公司 科技互联网公司两年变化 数字科技和互联网金融哪个好 科技互联网企业在行动 每日互联网科技新闻 南京欣网互联网络科技有限公司 今日互联网科技 互联网 科技公司 开启互联网科技时代小说 宁夏众和广鑫互联网科技有限公司 互联网媒体平台算高科技产业 华中科技大学互联网的牛人 上海科技产业互联网平台 南通创西澳互联网科技有限公司 科技信息时代互联网发展
0