快讯:
10月18日消息,由法国银行集团法国巴黎银行(BNP Paribas)和IT咨询公司Capgemini共同编制的《2018世界支付报告》得出结论,包括加密货币在内的数字支付正在经历着由发展中市场推动的繁荣。报告指出,尽管在这些新兴市场中,俄罗斯、印度和中国是最值得注意的推动者,但是非洲国家的一些公司和个人也正在对现金变得越来越谨慎,且对加密货币变得越来越渴望。
10月18日消息,今日一场名为“疯狂的金钱”的加密挖矿和贸易艺术展在莫斯科举行。莫斯科的Electromuseum博物馆承办了这次艺术展,据馆长Aristarkh Chernyshev的说法,这次展览是为了展示现代金融工具是如何过度到社会中的。
10月18日消息,加密货币市场数据聚合服务提供商Cryptocompare近日发布了一份加密资产分类报告。报告探讨了当前加密资产行业里的去中心化程度,只有16%的加密资产被认为是真正意义上的去中心化数字货币,而55%的加密资产被认为是中心化资产,其余的则介于中心化和去中心化之间,被归为“半中心化”加密资产。支付型代币之中可被认为是去中心化加密资产的也仅有37%。
10月18日消息,由法国银行集团法国巴黎银行(BNP Paribas)和IT咨询公司Capgemini共同编制的《2018世界支付报告》得出结论,包括加密货币在内的数字支付正在经历着由发展中市场推动的繁荣。报告指出,尽管在这些新兴市场中,俄罗斯、印度和中国是最值得注意的推动者,但是非洲国家的一些公司和个人也正在对现金变得越来越谨慎,且对加密货币变得越来越渴望。
10月18日消息,今日一场名为“疯狂的金钱”的加密挖矿和贸易艺术展在莫斯科举行。莫斯科的Electromuseum博物馆承办了这次艺术展,据馆长Aristarkh Chernyshev的说法,这次展览是为了展示现代金融工具是如何过度到社会中的。
10月18日消息,加密货币市场数据聚合服务提供商Cryptocompare近日发布了一份加密资产分类报告。报告探讨了当前加密资产行业里的去中心化程度,只有16%的加密资产被认为是真正意义上的去中心化数字货币,而55%的加密资产被认为是中心化资产,其余的则介于中心化和去中心化之间,被归为“半中心化”加密资产。支付型代币之中可被认为是去中心化加密资产的也仅有37%。
10月18日消息,由法国银行集团法国巴黎银行(BNP Paribas)和IT咨询公司Capgemini共同编制的《2018世界支付报告》得出结论,包括加密货币在内的数字支付正在经历着由发展中市场推动的繁荣。报告指出,尽管在这些新兴市场中,俄罗斯、印度和中国是最值得注意的推动者,但是非洲国家的一些公司和个人也正在对现金变得越来越谨慎,且对加密货币变得越来越渴望。
10月18日消息,今日一场名为“疯狂的金钱”的加密挖矿和贸易艺术展在莫斯科举行。莫斯科的Electromuseum博物馆承办了这次艺术展,据馆长Aristarkh Chernyshev的说法,这次展览是为了展示现代金融工具是如何过度到社会中的。
10月18日消息,加密货币市场数据聚合服务提供商Cryptocompare近日发布了一份加密资产分类报告。报告探讨了当前加密资产行业里的去中心化程度,只有16%的加密资产被认为是真正意义上的去中心化数字货币,而55%的加密资产被认为是中心化资产,其余的则介于中心化和去中心化之间,被归为“半中心化”加密资产。支付型代币之中可被认为是去中心化加密资产的也仅有37%。

谈谈区块链(10):以太坊中的Events和Logs

谈国鹏 2017-01-13 13:49 发布在 竞争币 30732

以太坊中的事件(Events)和日志(Logs)是个特别让人困惑的概念,本文帮大家梳理。

以太坊

首先,以太坊中的Events和Logs基本上算是同一个概念。Solidity和web3.js中称为Events,以太坊黄皮书中称为Logs。你可以理解为:以太坊通过Logs实现Events(事件)功能。智能合约代码通过LOG opcode将日志写入区块链中。

日志内容位于区块链的什么地方?

日志内容是交易收据(Transaction Receipts)的一部分,整个日志内容,包括Receipts的其它内容会生成一个ReceiptsRoot存储在区块的头部。而完整数据则是链下存储。

事件和日志的主要用途有三种:

  1. 帮助用户客户端(web3.js)读取智能合约的返回值;
  2. 智能合约异步通知用户客户端(web3.js);
  3. 用于智能合约的存储(比Storage便宜得多);
下面我们逐个解释:

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

假设下面的智能合约:

contract ExampleContract {
  // some state variables ...
  function foo(int256 _value) returns (int256) {
    // manipulate state ...
    return _value;
  }
}
我们可以通过web3.js的message call功能模拟调用智能合约:
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智能合约代码
contract ExampleContract {
  event ReturnValue(address indexed _from, int256 _value);
function foo(int256 _value) returns (int256) {
    ReturnValue(msg.sender, _value);
    return _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)
  // check that result.args._from is web3.eth.coinbase then
  // display result.args._value in the UI and call    
  // exampleEvent.stopWatching()
})
exampleContract.foo.sendTransaction(2, {from: web3.eth.coinbase})
当交易被打包时,web3.js中的callback就会被调用,这时web3.js就可以得到交易中的智能合约调用的返回值了。

至于为什么交易打包,web3中的callback就被调用那是另一个问题了,简单解释如下。web3会和以太坊某个节点相连,当该节点得知某个交易进block后,会通知相连的web3相关信息。

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

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

3.用于智能合约的存储(比Storage便宜得多):

相比智能合约账户的Storage,用日志的方式存储一些信息会便宜很多。Storage中大致的价格是:每32字节(256位)存储需要消耗20,000气(Gas)。而日志大致是每字节8气(Gas)。

下面看一个例子:

//solidity智能合约代码,模拟用户存款功能
contract CryptoExchange {
  event Deposit(uint256 indexed _market, address indexed _sender, uint256 _amount, uint256 _time);
function deposit(uint256 _amount, uint256 _market) returns (int256) {
    // perform deposit, update user’s balance, etc
    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;
  }
  // append details of result.args to UI
  //如果不想再被通知可以调用:
  //depositEventAll.stopWatching();
})

//注:indexed关键字表示按该字段索引日志,以提高查询效率。

以上内容是作者根据网上资料和个人理解梳理而得。如有转载请注明出处《谈谈区块连》。更多以太坊知识请阅读《谈谈区块连》其它文章或视频,以及关注《谈谈区块连》微信公共号:ttblockchain

文章标签: 以太坊
评论(2)
登录 账号发表你的看法,还没有账号?立即免费 注册
  • 谈国鹏 2017-01-13
    谈谈区块链(10):以太坊中的Events和Logs_巴比特_服务于区块链创新者 以太坊中的事件(Events)和日志(Logs)是个特别让人困惑的概念,本文帮大家梳理。首先,以太坊中的Events和Logs基本上算是同一个概念。Solidity和web3.js中称为Events,以太坊黄皮书中称为Logs。你可以理 http://t.cn/RM9urXd
  • merry 2017-01-20
    非常感谢 https://blockmeta.com/btc-tx/7221b02432eb6a238a5695b3ae1196777fe565635a28e0af130919519d318f3a 赞助0.0129336 BTC