BTC隔离见证(3开头)地址离线签名(亲测可行)

关于BTC隔离见证(3开头)地址离线签名,貌似相关介绍比较少,主要以理论介绍居多。

所以在这里,我就不再赘述什么是隔离见证地址以及如何完成相关签名的理论部分啦。

如果想快速了解BTC相关资料的,请阅读精通比特币一书,介绍的很好。

只有理论搞清楚了,才能更好地进行代码层面的相关操作。我查阅了一些资料,通过github上一些开源的代码,对其稍加整理。经过BTC主网实际测试,完成了BTC隔离见证(3开头)地址的离线签名功能。

测试的交易hash -> f8f58dec79c6dc0c576f20c89733568facf3cda38a969e0b9ca2b7ed1a97b352

由于没有多少测试币,所以只能按照尽可能低的金额来测试,所幸当前网络不拥堵,否则恐怕是无法打包了!
具体代码实现(java),请大家参考 这里,具体我就不多介绍了,上面都写得很清楚啦~

———————————我是无情的分割线———————————

本着复制粘贴合作分享的原则,根据 bitcoinj 自行总结了一下。
关于bc1开头地址离线签名(附上代码):
注意:本地网络测试ok,主网未完全测试,请自行测试,确保无误!!!

 /*** BTC交易离线签名** @param from    转账地址 支持 1 3 bc1开头地址* @param fromPrk 转账地址私钥 WFI格式* @param to      收款地址* @param amount  转账数量 单位:聪* @param fee     手续费 单位:聪* @return*/public static String btcOfflineSignatureAll(String from, String fromPrk, String to, long amount, long fee) {NetworkParameters networkParameters = RegTestParams.get();List<UTXO> utxos = getUnspents(from);if (utxos.size() == 0) {throw new RuntimeException("utxo为空 BTC INSUFFICIENT FEE");}//组装转账所需的UTXOlong utxoAmount = 0L;List<UTXO> needUtxos = new ArrayList<UTXO>();//遍历未花费列表,组装合适的itemfor (UTXO utxo : utxos) {if (utxoAmount >= (amount + fee)) {break;} else {needUtxos.add(utxo);utxoAmount += utxo.getValue().value;}}//找零 找零金额必须大于等于546聪 否则会视为粉尘攻击long changeAmount = utxoAmount - (amount + fee);if (changeAmount < 0L) {log.info("BTC转账地址余额不足 地址={}, 余额={}", from, utxoAmount);throw new RuntimeException("BTC INSUFFICIENT FEE");}//BTC交易构建Transaction tx = new Transaction(networkParameters);//添加未签名交易输入for (UTXO utxo : needUtxos) {//bc1开头地址 即P2WPKH 交易输入不能加入 Scriptif (getAddressType(networkParameters, from).equals(Script.ScriptType.P2WPKH)) {tx.addInput(utxo.getHash(), utxo.getIndex(), new Script(Hex.decode("")));} else {tx.addInput(utxo.getHash(), utxo.getIndex(), utxo.getScript());}}//添加交易输出//收款地址tx.addOutput(Coin.valueOf(amount), Address.fromString(networkParameters, to));if (changeAmount >= 546L) {//找零tx.addOutput(Coin.valueOf(changeAmount), Address.fromString(networkParameters, from));}//未签名交易16进制格式String txHex = Hex.toHexString(tx.bitcoinSerialize());tx = new Transaction(networkParameters, HEX.decode(txHex));DumpedPrivateKey dumpedPrivateKey = DumpedPrivateKey.fromBase58(networkParameters, fromPrk);ECKey ecKey = dumpedPrivateKey.getKey();//对交易输入进行签名int size = needUtxos.size();for (int i = 0; i < size; i++) {if (getAddressType(networkParameters, from).equals(Script.ScriptType.P2PKH)) {//1开头地址 普通地址 手续费较高tx.clearInputs();TransactionOutPoint outPoint = new TransactionOutPoint(networkParameters, needUtxos.get(i).getIndex(), needUtxos.get(i).getHash());tx.addSignedInput(outPoint, needUtxos.get(i).getScript(), ecKey, Transaction.SigHash.ALL, true);} else if (getAddressType(networkParameters, from).equals(Script.ScriptType.P2SH)) {//3开头 隔离见证兼容地址 手续费较低TransactionInput txIn = tx.getInput(i);Script redeemScript = ScriptBuilder.createP2WPKHOutputScript(ecKey);Script witnessScript = ScriptBuilder.createP2PKHOutputScript(ecKey);TransactionSignature txSig = tx.calculateWitnessSignature(i,ecKey,witnessScript,needUtxos.get(i).getValue(),Transaction.SigHash.ALL,false);txIn.setWitness(TransactionWitness.redeemP2WPKH(txSig, ecKey));txIn.setScriptSig(new ScriptBuilder().data(redeemScript.getProgram()).build());} else if (getAddressType(networkParameters, from).equals(Script.ScriptType.P2WPKH)) {//bc1开头 隔离见证原生地址 手续费最低TransactionInput txIn = tx.getInput(i);Script witnessScript = ScriptBuilder.createP2PKHOutputScript(ecKey);TransactionSignature txSig = tx.calculateWitnessSignature(i,ecKey,witnessScript,needUtxos.get(i).getValue(),Transaction.SigHash.ALL,false);txIn.setWitness(TransactionWitness.redeemP2WPKH(txSig, ecKey));} else if (getAddressType(networkParameters, from).equals(Script.ScriptType.P2WSH)) {//TODO 多重签名地址throw new RuntimeException("暂不支持该地址转账");} else {//其他throw new RuntimeException("暂不支持该地址转账");}}String txSigned = Hex.toHexString(tx.bitcoinSerialize());System.out.println("签名结果=" + txSigned);//广播交易return client().sendRawTransaction(txSigned);}/*** 获取BitcoinJavaRpcClient** @return BitcoinJSONRPCClient*/public static BitcoinJSONRPCClient client() {try {return new BitcoinJSONRPCClient(new URL("url"));} catch (MalformedURLException e) {log.error("connect error e={}", e.getMessage());throw new RuntimeException(e.getMessage());}}/*** 校验地址类型** @param networkParameters 网络类型* @param address           地址* @return*/public static Script.ScriptType getAddressType(NetworkParameters networkParameters, String address) {try {return Address.fromString(networkParameters, address).getOutputScriptType();} catch (Exception e) {log.warn("地址格式错误 address={}", address);throw new RuntimeException("地址格式错误");}}/*** 获取BTC余额** @param address* @return* @throws RuntimeException*/public static List<UTXO> getUnspents(String address) throws RuntimeException {List<UTXO> utxos = new ArrayList<>();List<BitcoindRpcClient.Unspent> unspentOutPuts = client().listUnspent(0, 99999999, address);if (unspentOutPuts == null || unspentOutPuts.size() == 0) {throw new RuntimeException("utxo为空 BTC INSUFFICIENT FEE");}for (BitcoindRpcClient.Unspent unspent : unspentOutPuts) {long vOut = unspent.vout();String txId = unspent.txid();String addressStr = unspent.address();String script = unspent.scriptPubKey();//USDT节点这里的余额单位是BTC,所以需要转换成聪BigDecimal bigDecimal = unspent.amount().multiply(new BigDecimal(100000000));UTXO utxo = new UTXO(Sha256Hash.wrap(txId), vOut, Coin.valueOf(bigDecimal.longValue()),0, false, new Script(Hex.decode(script)), addressStr);utxos.add(utxo);}return utxos;}

如果觉得有帮助,麻烦点个赞吧~

BTC隔离见证(3开头)地址离线签名相关推荐

  1. 隔离见证地址区别_科普:比特币钱包的隔离见证地址与普通地址有何区别?

    比特币钱包的隔离见证地址与普通地址有何区别?2017年7月21日,真正的扩容行动开始,全球比特币矿工开始锁定一个扩容软件升级.这次升级是基于比特币改进建议BIP91提出的「隔离见证」(Segregat ...

  2. 区块链钱包—BTC Java版离线签名交易

    对于离线交易不做过多解释~,说白了就是拿上一笔未发出交易记录进行私钥的签名然后广播到链上. 主要是对区块链离线交易进行utxo上链. 代码参考: https://gitee.com/DHing/sig ...

  3. Bech32编码 (3)隔离见证地址

    1. Bech32 编码 人类可读的部分"bc" [ 7 ]用于主网,"tb" [ 8 ]用于测试网. 数据部分值: . 1 个字符(代表 5 位数据):见证版 ...

  4. 5分钟秒懂隔离见证优势,钱包用户小白萌新看过来

    由于BTC交易量过于庞大,区块空间无法满足,导致大量交易囤积.随着隔离见证的出现,不但减少了每个交易脚本在区块内的占比,还有效降低了数据传输和验证带来的其他成本. 隔离见证,即 Segregated ...

  5. 警告:使用隔离见证可能会丢失你的比特币

    2019独角兽企业重金招聘Python工程师标准>>> 昨日,在reddit论坛有网友发帖称:自己在coinbase交易所进行交易时,比特币被转到了一个没有隔离见证的地址,比特币在系 ...

  6. 超级详解隔离见证(segregation witness)

    隔离见证(segretation witness) 起源 隔离见证由比特币BIP141提出,将比特币区块中交易的数据结构稍加修改,以解决如下问题: transaction malleability 问 ...

  7. 区块链三加一:隔离见证是什么

    最近还有小伙伴问这个问题,下面用比较能懂的方式回答如下: 隔离见证 其英文全名为Segregated Witness,缩写为缩写Segwit.很多人看了陷入字面意思就有些迷糊,现对其解释如下: 隔离见 ...

  8. java工程打包时进行签名_使用Java SDK实现离线签名

    严格来说,tx-signer并不属于SDK,它是bytomd中构建交易.对交易签名两大模块的java实现版.因此,若想用tx-signer对交易进行离线签名,需要由你在本地保管好自己的私钥. 如果你的 ...

  9. 以太坊PHP离线交易签名生成,以太坊web3.sendRawTransaction离线签名交易

    工作中需要复现短地址攻击和thedao重入攻击,重入攻击可以直接通过eth.sendTransaction和remix来发送交易,但是短地址攻击由于钱包和remix这些都对input做了长度检测,无法 ...

最新文章

  1. Why Object.prototype.hasOwnProperty.call(myObj, prop)
  2. python三十四:json模块
  3. web 静态页面和动态页面的区别
  4. c语言 遍历.jpg图像,求指导,如何用c语言实现读取*.raw格式图像
  5. 搜索推荐炼丹笔记:位置偏差里的惊喜
  6. style 放入css文件失效_React中使用CSS的7种方式
  7. Mysql水平分表-后端代码
  8. Java官方相关资源文件的获取教程
  9. NFC 验证平台搭建
  10. PHP JSON文件解析并获取key、value,判断key是否存在
  11. 信息学奥赛一本通(1236:区间合并)
  12. Android 系统性能优化(21)---App启动原理分析及启动时间优化
  13. java 权限url权限_Java秒杀系统实战系列~整合Shiro实现用户登录认证
  14. 桌面客户端上登入Gmai 邮箱
  15. 测试页能打印 软件不能打,Windows7分享打印机能打测试页打印文件怎么没反应
  16. poi合并单元格,没有样式
  17. Unity动画系统学习方向
  18. initialization of _pywrap_tensorflow raised unreported exception 解决方法
  19. ASAM XCP及驱动代码、ISO 11898+CANFD,ISO 14229,ISO 15031,ISO 15765相关标准文档
  20. python-日历模块

热门文章

  1. 文本比较算法剖析(1)-如何确定最大匹配率
  2. 最强GTD时间管理工具:OmniFocus Pro 3 for Mac支持big sur
  3. java登录无线路由器_获取WiFi路由器的唯一标识符
  4. Canvas画布、SVG图片
  5. PPT 问题 PowerPoint 储存此文件时发生错误
  6. 垂直距页边距5厘米_Word页面设置,含纸张大小与方向、页边距和文字方向
  7. POJ:3276-Face The Right Way(线性反转)
  8. maftools: 可视化maf文件的神器
  9. Excel翻译单元格内容
  10. 让 Odoo POS 支持廉价小票打印机