IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> 区块链Web3j编程: 账户交易(普通交易,裸交易) -> 正文阅读

[区块链]区块链Web3j编程: 账户交易(普通交易,裸交易)

因为账户交易这一块内容比较多,分为两部分来讲,承上一篇我们继续关于以太坊账户交易的练习

普通交易

在以太坊链上有两种交易,1是普通交易,2是裸交易,它们有不同的定义,
其中普通交易由以太坊节点进行签名,而裸交易,不要想歪,只是由外部应用进行签名

    /**
     * 普通交易
     * @param fromIndex 发送方
     * @param toIndex 接收方
     * @param price 金额(wei)
     * @return
     * @throws IOException
     */
    public String normalTrade(Integer fromIndex, Integer toIndex, Long price) throws IOException {
        List<String> accounts = web3j.ethAccounts().send().getAccounts();
        String from = accounts.get(fromIndex);
        String to = accounts.get(toIndex);
        BigInteger tradeValue = BigInteger.valueOf(price); 
        // 设置gas费用
        BigInteger gasPrice = Convert.toWei("20", Convert.Unit.GWEI).toBigInteger();
        BigInteger gasLimit = BigInteger.valueOf(60000);
        Transaction tx = new Transaction(from, null, gasPrice, gasLimit, to, tradeValue, null);
        String txHash = web3j.ethSendTransaction(tx).send().getTransactionHash();
        System.out.println("交易哈希:" + txHash);
        return txHash;
    }

我们包装了一个Transaction提交交易请求, 一个Transaction里面包含了如下内容

交易基本信息:发送方、接收方、发送金额
有偿执行交易的报酬信息:gas价格、gas用量上限
交易标识信息:nonce,用来对抗重放攻击
补充数据信息:交易额外携带的数据,也将写入区块永存

在请求后我们会收到一个交易哈希,你可以理解这是一个订单号,我们可以通过这个订单号获取到交易收据, 下面我会放我的代码

    /**
     * 尝试获取交易收据
     *
     * @param tradeHash 交易哈希
     * @return 收据
     */
    public TransactionReceipt getTradeReceipt(String tradeHash) throws IOException, InterruptedException {
        // 尝试读取具有指定哈希的交易的收据
        Optional<TransactionReceipt> receiptOptional = web3j.ethGetTransactionReceipt(tradeHash)
            .send()
            .getTransactionReceipt();
        while (true) {
            if (receiptOptional.isPresent()) {
                TransactionReceipt transactionReceipt = receiptOptional.get();
                System.out.println("*************************************");
                System.out.println("交易收据 - 目标用户地址 :" + transactionReceipt.getTo());
                System.out.println("交易收据 - 发送用户地址 :" + transactionReceipt.getFrom());
                System.out.println("交易收据 - 交易哈希 :" + transactionReceipt.getTransactionHash());
                System.out.println("*************************************");
                return transactionReceipt;
            } else {
                System.out.println("交易收据还未生成");
                Thread.sleep(500L);
                continue;
            }
        }
    }

下面是我的联系代码案例

    public static void main(String[] args) throws Exception {
        TradeService service = new TradeService();
        System.out.println("节点第4个账户向第6个账户转1eth");
        service.getAccountBalance(3, DefaultBlockParameterName.LATEST);
        service.getAccountBalance(5, DefaultBlockParameterName.LATEST);
        BigDecimal fromWei = service.convert("1", Unit.ETHER, Unit.WEI);

        String tradeHash = service.normalTrade(3, 5, fromWei.longValue());
        service.getTradeReceipt(tradeHash);

        service.getAccountBalance(3, DefaultBlockParameterName.LATEST);

        service.getAccountBalance(5, DefaultBlockParameterName.LATEST);
}

通过控制台我们能看到本次交易,我们从账户列表第4位用户给第6位用户转了1个eth

在这里插入图片描述

这就是普通交易,接下里我看看web3j如何实现的裸交易

    /**
     * 裸交易
     * @param toIndex目标用户索引
     * @param unit 交易单位
     * @param num 交易数量
     * @return 交易哈希
     * @throws Exception
     */
    public String rawTx(Integer toIndex, Convert.Unit unit, String num) throws Exception {
        List<String> accounts = web3j.ethAccounts().send().getAccounts();
        String to = accounts.get(toIndex);
        BigInteger gasPrice = BigInteger.valueOf(0);
        BigInteger gasLimit = BigInteger.valueOf(0);
        BigInteger value = Convert.toWei(num, unit).toBigInteger();
        String data = "";
        BigInteger nonce = getNonce(credentials.getAddress());
        RawTransaction rawTx = RawTransaction.createTransaction(nonce, gasPrice, gasLimit, to, value, data);
        byte[] signedMessage = TransactionEncoder.signMessage(rawTx, credentials);
        String hexValue = Numeric.toHexString(signedMessage);
        System.out.println("本次交易生成hash:" + hexValue);
        return hexValue;
    }
  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章      下一篇文章      查看所有文章
加:2021-07-17 11:57:34  更:2021-07-17 11:58:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:36:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码