首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

80%开发者都不知道的以太坊骚操作:「事件」和「日志」还可以这么玩!

  • 24-03-05 02:01
  • 3715
  • 6980
blog.csdn.net

640?wx_fmt=png&wxfrom=5&wx_lazy=1


作者 | 蔡一  志顶科技技术总监



4月6日,Daniel Larimer发布了一篇文章《EOSIO Dawn 3.0 Now Available》(译:EOSIO Dawn 3.0来啦),在章节「Simplified Contract Development」(译:更简单的合约开发)中,举了个「Hello,World」的智能合约的例子来说明合约开发的简单。 


640?wx_fmt=png&wxfrom=5&wx_lazy=1

https://gist.githubusercontent.com/bytemaster/

58d45d13dbf8732c8d467b6415a44df9/raw/ba460c2aff29c7f60ecdef7dc082a0190b5af418/

hello.cpp


然而值得注意的是,示例的合约就执行了一条语句:print( "Hello, ", user);

那么问题来了:在智能合约中print的内容会出现在哪里呢?


我没实际运行过这段代码,但我知道,print的内容只会出现在每个区块链节点的日志文件或终端(Console)上。 实际上,传统的print日志打印对智能合约的开发和跟踪不存在任何意义。


那么,以太坊怎么解决这个问题的呢?以太坊引入了事件(Events)和日志(Logs)。 


这里说的「事件」和「日志」这两个术语可能会引起混淆,本质上来说,智能合约通过「事件」来产生「日志」。本文会介绍以太坊的「事件」和「日志」系统常用的3种场景,供以太坊开发者参考。



事件和日志的用途


「事件」和「日志」对于以太坊是非常重要的,因为它们使智能合约与用户界面之间的通信变得容易。在传统的Web开发中,一个服务器响应会提供回调给前端。在以太坊中,当一个交易被打包,智能合约能发送事件以及写日志到区块链上以便前端处理。有三种情况需要使用事件和日志。


1. 智能合约给用户界面返回值

我们还是以EOS的例子来看,鉴于Solidity拼接字符串比较麻烦,我就直接返回一个字符串。

 

640?wx_fmt=png

如果你用Web3.JS来调用HelloWorld这个智能合约的函数「hi()」,你可能会认为是这样:


640?wx_fmt=png


那么,这句调用的result会是「hello, World」呢? 其实不是,不管函数返回什么值,Web3.JS都会返回一个Transaction Hash(交易哈希)。


那要怎么做呢?现在就轮到事件上场了。


修改后的智能合约代码如下:

 

640?wx_fmt=png

而Web3.JS则需要这样写:

 

640?wx_fmt=png


当交易被打包时,回调函数将被触发, 前端将获得智能合约函数的返回值。


2. 异步数据通知

使用返回值返回给用户界面其实很少用到。大部分时间,我们是使用事件给用户界面发送数据。当智能合约想把某些数据通知用户界面时,可以发送事件,用户界面对这些时间进行监听,就可以进行不同的操作。


3. 相对便宜的数据存储

还有这一种使用方式是把日志作为数据存储。在EVM规范和黄皮书中说明,事件将产生日志,而日志是会被存储都区块链的。日志存储的Gas费用要比合约的存储便宜很多(日志每个字节花费8个Gas,而合约存储是每32个字节20,000个Gas)。因此,当你有存证等应用的时候,可以考虑使用日志来存储,而不是在合约中使用Mapping来存储。



日志的存储结构


上面说了时间和日志的三种用法,最后我们来看看日志的大致结构。


640?wx_fmt=png

 

你可以通过「remix」查看日志的接口。Topic指向特定的事件,但值是16进制的,这是个什么呢?其实这是事件的签名。图中的288d740d3b11a36c8526119855345e3ba2aee438370d264289ea6dfb76294fd0其实是sha3(Hi(string))的执行结果。下面的「event」和「args」是「remix」从区块链的「收据」(Receipt)数据的Logs项中解码出来的。 


实际数据为: 

640?wx_fmt=png


那是怎么解码的呢?


前文中提到过,Topics实际上是事件的「sha3」签名,示例合约中只有一个事件,可以直接对应,如果合约中有多个事件,需要通过ABI找出对应的event,逐一签名,最后与Topics中的签名进行对应即可找到对应的事件。


事件的名称找到了,对应的参数就相对简单,示例合约的ABI如下:


640?wx_fmt=png


可以看到,type为event的事件,「输入」(inputs)只有一个,那就是「say」,类型是「string」。


我们使用eth-abi工具(https://github.com/ethereum/eth-abi)可以进行解码。(eth-abi是一个用Python编写的Ethereum ABI工具)。命令如下: 


640?wx_fmt=png


在web3.js 1.0-beta版本中,可以直接通过以下函数进行日志解码:


640?wx_fmt=png




结束语


「事件」(Events)是以太坊中很有意思的设计,对智能合约运行时与外部交互,特别是DApp的设计具有重要意义。大家在开发DApp和智能合约时可以根据实际情况灵活应用以上所介绍的3种方式,进行与前端的交互和日志的调试。也欢迎大家发掘更多的应用场景。



作者简介:蔡一,区块链技术专家,长期研究并实践区块链技术与应用,精通以太坊智能合约开发。现为志顶科技技术总监,负责公司核心产品TokenPOS通证宝设计与研发。




热门文章


  • 五一结束,是该活跃一下大脑了:证券型代币合法吗?

  • 五一出游,“我”的隐私被扒干净了

  • Hydro李天放:为了区块链我曾拒绝了李开复

  • 最全!写给技术小白的以太坊完整工作原理和运行机制!



640?wx_fmt=gif




营长招人啦


CSDN区块链大本营招采编2名:

1. 对区块链技术有一定的理解,对大公司动态有极强敏感性,且有深度剖析的楞劲儿。

2. 出稿速度快,具有每天报题和出稿的能力。

3. 有能力采访行业高端人物,能将其观点进行深刻呈现。

4. 相关媒体经验2年以上。

5. 英语6级以上,能快速编译。

6. 本科以上


待遇:

绝不低于行业水平,只要有才,我们愿意给你一切资源。

邮件发送:[email protected]

邮件注明:姓名+区块链+采编应聘

注:本文转载自blog.csdn.net的区块链大本营的文章"https://blog.csdn.net/Blockchain_lemon/article/details/80175705"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top