主页 > imtoken安卓版下载2.0 > 以太坊中的事件和日志

以太坊中的事件和日志

imtoken安卓版下载2.0 2023-02-10 07:34:34

做以太坊节点的要求_以太坊与以太基金_以太坊挖矿场地要求

以太坊中的事件(Events)和日志(Logs)是特别容易混淆的概念,本文将帮助大家梳理一下。

首先,Ethereum 中的 Events 和 Logs 基本是同一个概念。 在Solidity和web3.js中叫做Events,在以太坊黄皮书中叫做Logs。 你可以理解为:以太坊通过Logs来实现Events功能。 智能合约代码通过 LOG 操作码将日志写入区块链。

区块链上的日志内容在哪里?

日志内容是交易收据(Transaction Receipts)的一部分,整个日志内容做以太坊节点的要求,包括Receipts的其他内容,都会生成一个ReceiptsRoot,存放在区块头部。 完整的数据存储在链外。

以太坊与以太基金_以太坊挖矿场地要求_做以太坊节点的要求

事件和日志的三个主要目的:

帮助用户客户端(web3.js)读取智能合约的返回值;

智能合约异步通知用户客户端(web3.js);

智能合约的存储(比存储便宜得多); 下面我们一一解释:

做以太坊节点的要求_以太坊与以太基金_以太坊挖矿场地要求

1、帮助用户客户端(web3.js)读取智能合约的返回值:

假设以下智能合约:

contract ExampleContract { // 一些状态变量 ... function foo(int256 _value) returns (int256) { // 操作状态 ... return _value; 我们可以通过web3.js的消息调用函数来模拟调用智能合约:

var returnValue = exampleContract.foo.call(2); console.log(returnValue) // 2 但是在真实环境中我们需要发送一个交易(Transaction)来调用智能合约。 这个时候,我们将无法获取到智能合约的返回值。 因为交易目前只是发送,距离打包执行还有一段时间。 此时调用的返回值只是交易的txid或tx hash值。

以太坊与以太基金_做以太坊节点的要求_以太坊挖矿场地要求

var returnValue = exampleContract.foo.sendTransaction(2, {from: web3.eth.coinbase}); console.log(returnValue) // transaction hash 此时,会出现Events:

//下面是solidity智能合约代码contractExampleContract { event ReturnValue(address indexed _from, int256 _value); 函数 foo(int256 _value) 返回 (int256) { ReturnValue(msg.sender, _value); 返回值; } }

//下面是web3.js用户客户端代码 var exampleEvent = exampleContract.ReturnValue({_from: web3.eth.coinbase}); exampleEvent.watch(function(err, result) { if (err) { console.log(err ) return; } console.log(result.args._value) // 检查 result.args._from 是 web3.eth.coinbase然后 // 在 UI 中显示 result.args._value 并调用 // exampleEvent.stopWatching() }) exampleContract.foo.sendTransaction(2, {from: web3.eth.coinbase}) 当交易被打包时做以太坊节点的要求,回调在web3.js会被调用,然后web3.js可以获取交易中智能合约调用的返回值。

至于为什么打包交易的时候会调用web3中的回调,那是另外一个问题。 简要说明如下。 web3会连接到以太坊中的一个节点,当节点得知有交易进入区块后,会通知连接的web3相关信息。

以太坊挖矿场地要求_以太坊与以太基金_做以太坊节点的要求

2、智能合约异步通知用户客户端(web3.js):

上面的例子是一个典型的智能合约通知用户客户端的例子,但是还有更多的异步调用可以通过类似的方式实现,从而实现智能合约异步调用用户客户端的能力。

注意:智能合约通常以 solidity 编写并在以太坊节点 (EVM) 上运行。 注意:用户客户端通常用web3.js编写,运行在web服务器上,web3.js连接到一个以太坊节点。

3. 智能合约存储(比存储便宜很多):

以太坊挖矿场地要求_以太坊与以太基金_做以太坊节点的要求

与智能合约账户的存储相比,以日志的形式存储一些信息要便宜得多。 Storage 的大概价格是:每 32 字节(256 位)的存储消耗 20,000 瓦斯(Gas)。 日志大约是每字节 8 Gas。

让我们看一个例子:

//solidity智能合约代码,模拟用户充值功能合约CryptoExchange { event Deposit(uint256 indexed _market, address indexed _sender, uint256 _amount, uint256 _time); function deposit(uint256 _amount, uint256 _market) returns (int256) { // sit depo , 更新用户余额等 Deposit(_market, msg. sender, _amount, now); }

//当用户调用智能合约存入一定金额时,智能合约需要主动通知用户客户端更新相应信息。 //以下是web3.js代码: var depositEvent = cryptoExContract.Deposit({_sender: userAddress}); depositEvent.watch(function(err, result) { if (err) { console.log(err) return; } // append details of result.args to UI }) //通过fromBlock参数var指定关注的块范围depositEventAll = cryptoExContract.Deposit({_sender: userAddress}, {fromBlock: 0, toBlock: 'latest'}); depositEventAll. watch(function(err, result) { if (err) { console.log(err) return; } // 将 result.args 的详细信息附加到 UI // 如果你不想再收到通知,你可以调用: //depositEventAll.stopWatching() ; }) //注意:indexed关键字表示日志被该字段索引,以提高查询效率。

以太坊挖矿场地要求_以太坊与以太基金_做以太坊节点的要求

今天的 okex 以太坊市场