java怎么实现区块链钱包BTC离线签名交易
发表于:2024-10-19 作者:千家信息网编辑
千家信息网最后更新 2024年10月19日,这篇文章主要讲解了"java怎么实现区块链钱包BTC离线签名交易",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"java怎么实现区块链钱包BTC离线签名
千家信息网最后更新 2024年10月19日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, ListunUtxos) { 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安全错误
数据库的锁怎样保障安全
数据库在会计信息系统中的应用
网络安全控制层次
智慧城市互联网科技公司
从数据库提取的数据身份证号乱码
新服务器硬盘显示不出来怎么办
无锡品质刀片服务器定制
地震应急数据库作用
数据库中UK
冒险岛服务器外网教程
韩国服务器端口
乌鲁木齐软件开发培训机构
最快最干净代理服务器
怎么找甘薯二倍体数据库
数据库日志相关概念
高科技互联网行业
科技互联网经济
php_上传数据库代码
邮箱服务器地址
h5创建访问数据库对象
莆田市城厢区梦芳软件开发工作室
数据库百度云
IDEA数据库约束条件
中专文凭可以拿网络安全证吗
erp软件开发软件哪家好
运营商服务器登录许可
烟台市检察院招聘网络技术人员
网络安全文明快板
梦幻新诛仙剑履山河服务器下载
软件开发女生适合学那个
数据库什么是无限关系