业务场景:1.在自己的钱包节点上根据txId获取交易原始交易

                  2.通过原始交易递归计算手续费: 公式[ 手续费  sum(vin)- sum(vout) ]

    要求:需要对utxo有一定的了解~~~

    blockchain:https://www.blockchain.com/btc/address/1NiRsrLA7WgNUQQNKfuz7nSx4eoKadXpNY

上面是用区块链浏览器查看交易txId 的交易明细,查看该原始交易为:

由此根据交易hash从自己的节点进行查看原始交易并计算出类似区块链浏览器一致的信息:

//交易信息
public class BtcTransactionInfo implements Serializable {private static final long serialVersionUID = 1L;private String txId; //交易txidprivate String hash; //hashprivate String blockheight;//区块高度private String blockweight; //区块宽度private String blockconfirmations;//区块确认数private String blockversion;private String previousblockhash; //上一个区块的块hashprivate String nextblockhash; //下一个块hashprivate String version;private String size;private String vsize;private String locktime;private String hex; //hexprivate String blockhash;private String confirmations; //确认次数private String time;private String blocktime;private BigDecimal amount; //金额private BigDecimal free; //手续费private String from; //发送方private String to; //接收方}

通过JSON-rpc 进行节点的调用参考:https://blog.csdn.net/u011663149/article/details/87182097

//根据交易的txid调用钱包api获取相应信息
public Object getrawTransactionByTxIdFromWallet(String txId) throws Exception {BtcTransactionInfo   tranc = new BtcTransactionInfo();try {//调用原始交易接口Map transaction = (Map) btService.getTrawtransaction(txId, 1);JSONObject info = JSONObject.parseObject(JSON.toJSONString(transaction));String blockHash = info.getString("blockhash");/*block*///调用根据blockhash 获取块信息接口Map blockInfo = (Map)btService.getblock(blockHash);JSONObject block = JSONObject.parseObject(JSON.toJSONString(blockInfo));tranc.setBlockconfirmations(block.getString("confirmations"));tranc.setBlocktime(block.getString("time"));tranc.setBlockversion(block.getString("version"));tranc.setBlockheight(block.getString("height"));tranc.setBlockweight(block.getString("weight"));tranc.setPreviousblockhash(block.getString("previousblockhash"));tranc.setNextblockhash(block.getString("nextblockhash"));tranc.setTxId(info.getString("txid"));tranc.setHash(info.getString("hash"));tranc.setVersion(info.getString("version"));tranc.setSize(info.getString("size"));tranc.setVsize(info.getString("vsize"));tranc.setLocktime(info.getString("locktime"));tranc.setHex(info.getString("hex"));tranc.setBlockhash(blockHash);tranc.setConfirmations(info.getString("confirmations"));tranc.setTime(info.getString("time"));tranc.setBlocktime(info.getString("blocktime"));JSONArray vins = JSONArray.parseArray(info.getString("vin"));double sumvin = 0 ;List<String> formAddress = new ArrayList<>();for (int i = 0,len = vins.size(); i < len; i++) {JSONObject vin =  JSONObject.parseObject(vins.getString(i));String txid = vin.getString("txid");Integer vinN = vin.getInteger("vout");LOG.info("=== [BTC] search txid:{} trawtransaction! ===",txid);Map parentTransaction = (Map) btService.getTrawtransaction(txid, 1);JSONObject parentInfo = JSONObject.parseObject(JSON.toJSONString(parentTransaction));JSONArray vouts = JSONArray.parseArray(parentInfo.getString("vout"));for (int j = 0,leg = vouts.size(); j < leg; j++) {JSONObject vout = vouts.getJSONObject(j);Integer n = vout.getInteger("n");if(n == vinN){ //收款金额sumvin += vout.getDouble("value");JSONObject scriptPubKey = vout.getJSONObject("scriptPubKey");JSONArray addresses = scriptPubKey.getJSONArray("addresses");formAddress.add(addresses.getString(0));}}}tranc.setFrom(StringUtils.strip(formAddress.toString(),"[]"));JSONArray vouts = JSONArray.parseArray(info.getString("vout"));BigDecimal amount = null  ;double sumvout = 0;for (int i = 0,len = vouts.size(); i < len; i++) {JSONObject vout =  JSONObject.parseObject(vouts.getString(i));Integer n = vout.getInteger("n");JSONObject scriptPubKey = vout.getJSONObject("scriptPubKey");JSONArray addresses = scriptPubKey.getJSONArray("addresses");String receviceAddr = addresses.getString(0);if(n == 0){tranc.setTo(receviceAddr);amount = new BigDecimal(vout.getDouble("value"));}//找零金额sumvout  +=  vout.getDouble("value");}//手续费  sum(vin)- sum(vout)tranc.setFree(new BigDecimal(sumvin).subtract(new BigDecimal(sumvout)).setScale(8, BigDecimal.ROUND_HALF_UP));tranc.setAmount(amount.setScale(8, BigDecimal.ROUND_HALF_UP));} catch (Exception e) {throw new Exception(e.getMessage());}return JSON.toJSON(tranc);}

之前的博客服务器到期了。望支持~~~


btc、usdt 根据交易hash计算手续费相关推荐

  1. 区块链隐私:交易还是计算?

    链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 区块链隐私:交易还是计算? 隐私"是什么意思?在区块链生态系统中,"隐私"这个词被 ...

  2. 【数据结构】30、hashmap=》hash 计算方式

    前提知识 写在前面,为什么num&(length - 1) 在length是2的n次幂的时候等价于num%length n - 1意味着比n最高位小的位都为1,而高的位都为0,因此通过与可以剔 ...

  3. 数据库 流量切分_基于hash计算的多层实验流量切分的实现

    1.      背景介绍 站点新功能或者是站内新策略开发完毕之后,在全流量上线之前要评估新功能或者新策略的优劣,常用的评估方法是A-B测试,做法是在全量中抽样出两份小流量,分别走新策略分支和旧策略分支 ...

  4. Java8集合之HashMap的hash计算、扩容等问题

    参考资料: <Java 8系列之重新认识HashMap>(作者为美团技术团队) <Java8的HashMap源码分析>(JKD版本为1.7) <为什么 HashMap 是 ...

  5. 股票量化交易Python——计算收益率

    股票量化交易Python--计算收益率 对于股民来说,最关心的问题之一就是股票的收益率.通过使用Python编写量化交易策略,可以简化计算.跟踪和比较股票的收益率.在这篇文章中,我们将介绍如何使用Py ...

  6. 【web3.js】如何在真实发送交易前取得交易hash

    我为什么要提前获取交易hash? 我不想unlockAccount来解锁账号,所以需要用私钥来签名交易后发送,所以使用web3.eth.sendSignedTransaction . 但是web3.e ...

  7. PyFlink + 区块链?揭秘行业领头企业 BTC.com 如何实现实时计算

    大家好,我们是 BTC.com 团队.2020 年,我们有幸接触到了 Flink 和 PyFlink 生态,从团队自身需求出发,完善了团队内实时计算的任务和需求,搭建了流批一体的计算环境. 在实现实时 ...

  8. hash计算在txt,doc中的细节(电子物证检验)

    实验设备 笔记本电脑 操作系统:Window 10 家庭版 64位 文件系统:FAT 32 实验目的 1.了解完整性校验值计算的是哪部分 2.简单了解doc和txt的储存方式 实验过程 在txt中任意 ...

  9. 第23篇 确认交易hash是否成功的依据

    Receipts收据中的status字段的判断且token转账的event log字段进行分析,才能正确的判断一笔token转账是否真实成功. 本文测试环境: metamask(版本7.7.9): r ...

最新文章

  1. Qt irrlicht(鬼火)3D引擎 摄像机旋转问题
  2. ARM NEON 优化
  3. scrapy---反爬虫
  4. OVS DPDK vhost-user详解(十二)
  5. android--service之aidl传递复杂对象,Android--Service之AIDL传递复杂对象
  6. 后台拿webshell的常用方法总结
  7. matlab 扫雷命令,Matlab版扫雷
  8. 【Keras】使用数据生成器(data generators)解决训练数据内存问题
  9. 使用阿里云npm镜像加速
  10. Hanselminutes播客247-从敏捷顾问到John Wilger的敏捷团队成员
  11. html分享到微博,h5页面分享到微信、朋友圈、新浪微博、QQ空间、QQ好友组件
  12. phpstudy一直自动停止启动_window10 phpstudy2018 mysql服务重启之后自动停止
  13. 当代计算机的应用,浅析计算机在当今社会中的应用
  14. python 如何判断当天为周几?判断当天是否为工作日?
  15. List.isEmpty()与CollectionUtils.isEmpty的区别
  16. java中的反射和Class类
  17. mac上启动nginx遇到80端口被占用的解决方法(猜了好久的坑我擦)
  18. python中frame=none是什么意思啊_在python的init函数中,master和master=none的目的是什么?...
  19. mysql 表 视图 索引吗_Mysql多表查询, 视图,事务,索引,函数,go连接数据库
  20. 支持他们的应用程序突袭Cloudberry狂潮

热门文章

  1. D. Pythagorean Triples
  2. 生成和扫描二维码(ZXing库)
  3. 钉钉如何调整组织架构_钉钉组织架构与员工同步指南
  4. Android Studio Gradle打包实践之多渠道+版本号管理
  5. 深度学习之文本生成图片
  6. git 报错解决方法:Your branch is ahead of ‘origin/dev‘ by 65 commits.
  7. 强化学习之贝尔曼方程
  8. Unity 特效:Particle System(粒子系统)
  9. java zip解压 中文_java解压ZIP 解决中文乱码 (GBK和UTF-8)
  10. SSL证书会不会过期?域名SSL证书过期了怎么办?