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 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> 以太坊合约获取Event事件(web3j) -> 正文阅读

[区块链]以太坊合约获取Event事件(web3j)

智能合约Event事件

智能合约尽管具备很多高级语言的特性,但是本身还是存在很多限制。对于业务的精准处理,需要采用Event事件进行跟踪,对于不同的合约和方法,可以编写不同的Event事件,如下:

pragma solidity >=0.7.0 <0.9.0;

contract Owner {

    address private owner;
    
    // event for EVM logging
    event OwnerSet(address indexed oldOwner, address indexed newOwner);
    
    // modifier to check if caller is owner
    modifier isOwner() {
        require(msg.sender == owner, "Caller is not owner");
        _;
    }  

    constructor() {
        // 'msg.sender' is sender of current call, contract deployer for a constructor
        owner = msg.sender; 
        emit OwnerSet(address(0), owner);
    }

    function changeOwner(address newOwner) public isOwner {
        emit OwnerSet(owner, newOwner);
        owner = newOwner;
    }

    function getOwner() external view returns (address) {
        return owner;
    }
}

获取Event事件

对应的java智能合约如何获取Event事件呢?见下

@GetMapping("/setOwner")
@ResponseBody
public String getUserCopyrights(String oldePK,String newPK) {
    try {
        Credentials oldOwner = Credentials.create(oldePK);
        Credentials newOwner = Credentials.create(newPK);
        // 加载合约
        Owner contract = Owner.load(contractAddress, web3j, oldOwner, new DefaultGasProvider());
        // 调用合约方法
        TransactionReceipt transactionReceipt = contract.changeOwner(newOwner.getAddress()).send();
        // 获取Event事件
        List<Owner.OwnerSetEventResponse> ownerSetEvents = contract.getOwnerSetEvents(transactionReceipt);
        Owner.OwnerSetEventResponse ownerSetEventResponse = ownerSetEvents.get(0);
        // 简单对比链上返回的事件信息与传入的是否一致
        if (Objects.equals(ownerSetEventResponse.newOwner, newOwner.getAddress())){
            System.out.println("oldOwner:" + ownerSetEventResponse.oldOwner);
            return "change owner successful";
        }else{
            return "change owner failed";
        }
    } catch (Exception e) {
        e.printStackTrace();
        return "error happend";
    }
}

运行结果

在这里插入图片描述

在这里插入图片描述

扩展

FISCO BCOS开源社区:如何优雅地编写智能合约

  • 统一接口

合约中可以采用require的方式进行处理,不过require方式不支持动态变量,每个require处理后需要填入特定的报错内容,耦合性太重,且不便于扩展。

基于智能合约的SDK开发,对于每一个交易(方法)由于Event事件不同,需要编写大量的不可复用的代码,解析Event事件。这种写法,对于代码的理解和维护性都是非常差的。要解决这个问题,只需要编写一个基合约CommonLib,如下所示:

contract CommonLib {
    // tx code
    bytes32 constant public ADD_STUDENT = "1";
    bytes32 constant public MODIFY_STUDENT_NAME = "2";
    
    // return code
    bytes32 constant public STUDENT_EXIST = "1001";
    bytes32 constant public STUDENT_NOT_EXIST = "1002";
    bytes32 constant public TX_SUCCESS = "0000";
    
  event commonEvent(bytes id, bytes32 txCode, bytes32 rtnCode);
}

contract StudentController is CommonLib {
     function addStudent(bytes32 studentId, bytes32 studenntName) public returns(bool) {
      	// 处理过程
      	// .......
      
      	// 根据处理结果来调用不同事件
        if(add success){
          	commonEvent(studentId, ADD_STUDENT, TX_SUCCESS);
            return true;
        }else {
          	commonEvent(studentId, ADD_STUDENT, STUDENT_EXIST);
            return false;
        }
    }
}
  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章      下一篇文章      查看所有文章
加:2021-12-09 11:44:33  更:2021-12-09 11:44:39 
 
开发: 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 23:26:24-

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