怎么实现JAVA离线签名
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,本篇内容介绍了"怎么实现JAVA离线签名"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!源码impor
千家信息网最后更新 2025年01月31日怎么实现JAVA离线签名
本篇内容介绍了"怎么实现JAVA离线签名"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
源码
import com.alibaba.fastjson.JSON;import com.google.protobuf.Any;import com.google.protobuf.ByteString;import com.google.protobuf.InvalidProtocolBufferException;import java.util.Map;import org.bouncycastle.util.encoders.Hex;import org.tron.common.crypto.ECKey;import org.tron.common.crypto.Sha256Hash;import org.tron.common.utils.ByteArray;import org.tron.core.exception.CancelException;import org.tron.protos.Contract;import org.tron.protos.Protocol.Block;import org.tron.protos.Protocol.Transaction;import org.tron.walletserver.WalletApi;public class TransactionSignDemo { public static Transaction createTransaction(byte[] from, byte[] to, long amount,long blockTimestamp,long blockHeight,byte[] blockHash) { Transaction.Builder transactionBuilder = Transaction.newBuilder(); //Block newestBlock = WalletApi.getBlock(-1); Transaction.Contract.Builder contractBuilder = Transaction.Contract.newBuilder(); Contract.TransferContract.Builder transferContractBuilder = Contract.TransferContract.newBuilder(); transferContractBuilder.setAmount(amount); ByteString bsTo = ByteString.copyFrom(to); ByteString bsOwner = ByteString.copyFrom(from); transferContractBuilder.setToAddress(bsTo); transferContractBuilder.setOwnerAddress(bsOwner); try { Any any = Any.pack(transferContractBuilder.build()); contractBuilder.setParameter(any); } catch (Exception e) { return null; } contractBuilder.setType(Transaction.Contract.ContractType.TransferContract); transactionBuilder.getRawDataBuilder().addContract(contractBuilder).setTimestamp(System.currentTimeMillis()) .setExpiration(blockTimestamp + 10 * 60 * 60 * 1000); Transaction transaction = transactionBuilder.build(); Transaction refTransaction = setReference(transaction, blockHeight,blockHash); return refTransaction; } public static Transaction setReference(Transaction transaction, long blockHeight,byte[] blockHash) { //long blockHeight = newestBlock.getBlockHeader().getRawData().getNumber(); //byte[] blockHash = getBlockHash(newestBlock).getBytes(); byte[] refBlockNum = ByteArray.fromLong(blockHeight); Transaction.raw rawData = transaction.getRawData().toBuilder() .setRefBlockHash(ByteString.copyFrom(ByteArray.subArray(blockHash, 8, 16))) .setRefBlockBytes(ByteString.copyFrom(ByteArray.subArray(refBlockNum, 6, 8))).build(); return transaction.toBuilder().setRawData(rawData).build(); } public static Sha256Hash getBlockHash(Block block) { return Sha256Hash.of(block.getBlockHeader().getRawData().toByteArray()); } public static String getTransactionHash(Transaction transaction) { String txid = ByteArray.toHexString(Sha256Hash.hash(transaction.getRawData().toByteArray())); return txid; } private static byte[] signTransaction2Byte(byte[] transaction, byte[] privateKey) throws InvalidProtocolBufferException { ECKey ecKey = ECKey.fromPrivate(privateKey); Transaction transaction1 = Transaction.parseFrom(transaction); byte[] rawdata = transaction1.getRawData().toByteArray(); byte[] hash = Sha256Hash.hash(rawdata); byte[] sign = ecKey.sign(hash).toByteArray(); return transaction1.toBuilder().addSignature(ByteString.copyFrom(sign)).build().toByteArray(); } public static void main(String[] args) throws InvalidProtocolBufferException, CancelException { String privateStr = "你的私钥"; byte[] privateBytes = ByteArray.fromHexString(privateStr); ECKey ecKey = ECKey.fromPrivate(privateBytes); byte[] from = ecKey.getAddress(); byte[] to = WalletApi.decodeFromBase58Check("地址"); long amount = 100_000_000L; String blockStr = HttpUtil.get("https://apilist.tronscan.org/api/block/latest"); MapblockInfo=JSON.parseObject(blockStr); System.out.println(blockInfo.toString()); Long blockTimestamp = Long.parseLong(blockInfo.get("timestamp").toString()); Long blockHeight = Long.parseLong(blockInfo.get("number").toString()); byte[] blockHash = Hex.decode(blockInfo.get("hash").toString()); //开始看官方demo改写的blockHashd,但是错的,签名没的问题,但是广播就报错TAPOS_ERROR,说块不在链上。 byte[] blockHash3=Sha256Hash.of(blockInfo.get("hash").toString().getBytes()).getBytes(); System.out.println("===blockHash:"+ByteArray.toHexString(blockHash)); System.out.println("===blockHash3:"+ByteArray.toHexString(blockHash3)); Transaction transaction = createTransaction(from, to, amount, blockTimestamp, blockHeight, blockHash); byte[] transactionBytes = transaction.toByteArray(); byte[] transaction4 = signTransaction2Byte(transactionBytes, privateBytes); System.out.println("transaction4 ::::: " + ByteArray.toHexString(transaction4)); //广播的URL:https://apilist.tronscan.org/api/broadcast }}
"怎么实现JAVA离线签名"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
内容
更多
知识
广播
实用
学有所成
接下来
困境
地址
官方
实际
情况
文章
案例
源码
编带
网站
行业
过程
问题
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
学习软件开发在哪个网站
软件开发文档论文
安徽新路带软件开发有限公司
汉阳软件开发招聘
软件开发云是什么意思
中国网络安全法基本原则
萝岗区软件开发好吗
杭州鑫蜂维网络技术
电信网络技术支持
济南IOS软件开发人才招聘
淮南服务器回收公司服务介绍
数据库文件流量指标
数据库sum函数意义
如何获得外网数据库
智慧科技智能产业互联网
汇丰软件开发 电话
bs架构应用软件开发管理
淮安软件开发靠谱吗
饮食安全和网络安全
网络安全的站点
永恒大陆服务器喇叭
用户操作权限数据库怎么实现
临沂网络技术有限公司招聘
怀旧服服务器可以直接买么
为什么用centos服务器
网络技术转让合同模板
云之天地服务器爱玩
开封网络安全等级评估
北大青鸟软件开发证书
省网络安全培训班