
群内分享
群内讨论
1.物联网溯源问题
问题,为啥说物联网技术要运用到区块链技术?大狗之前告诉我是怕中心化机构控制了物联设备,或导致被黑风险,还有数据处理量过大导致中心化算力不够,我怎么还是觉得这不是区块链的本质优势呢。处理数据不过来,可以用边缘计算,雾计算呀。逻辑是啥?举个例子,家用摄像头,所有录像都在中央服务器保存,没有加密,这是很危险的。那可以理解为分布式存储问题么。不算区块链问题。我一直有个观点,区块链技术有且仅有运用于货币等价值流通储值领域,有人拍砖吗?首先就是数据,物联网数据都是海量心跳,有意义的较少。然后就是算力,为了保障设备性能,不可能分很多算力给区块链。还有网络,都是nb网络,又慢又不稳定。不过中间转一层,用中间服务器收集,加入区块链概念应该也行得通。区块链的本质是分布式流水账数据库,技术上不允许修改或删除数据(即使极端的51%攻击的情况,其实也只能做到伪造交易,无法修改历史数据),所以它作为物联网数据的存储方案,其意义就很明显了。和其他分布式系统一样,区块链的强项不是性能,处理性能问题多半要通过中心化技术来解决,或者现在的边缘计算的概念。但貌似还是解决不了终端外设本身数据造假的问题。他主要是追溯。来源都造假你有啥办法。和溯源一样有个链下和链上接口问题
磨链输出计划
捕捉智能合约中的event实战
作者-磨链社区-盖盖
写在前面
在上一篇文章 Web与智能合约交互实战 中我们已经掌握如何使用 Web3 控制智能合约,并且实现了一个简单的Dapp,可以通过浏览器简单地实现数据的设置和读取。
在本文中,我们将介绍智能合约中的 event,以及如何捕捉智能合约的 event。
在实战环节中,我们将使用 Javascript API 捕捉一个 ERC20 合约中的 Transfer() 事件,并在网页中显示出合约中每个账户的余额。
智能合约中的event
event,顾名思义就是智能合约在执行过程中所发生的一系列事件,被记录在 EVM 的日志中,使得程序员可以在 Dapp 的前端页面上调用 Javascript 的回调函数。 event 由智能合约的编写者在代码中使用 event 关键词进行声明,示例如下:
event Deposit(
address indexed _from,
bytes32 indexed _id,
uint _value
);
当 event 被调用时,其中的参数会被存储在交易的日志当中,示例如下:
function deposit(bytes32 _id) public payable {
// 这里是函数实际执行的代码
// 激活Deposit事件,记录在日志中,保存在区块链上
emit Deposit(msg.sender, _id, msg.value);
}
捕捉 event
使用 Javascript API 可以 捕捉 event,注意这里说 捕捉 是因为我们既可以实时 监控 事件,也可以从历史区块中 检索 event。
首先将 event 实例化:
var event = myContractInstance.MyEvent({valueA: 23} [, additionalFilterObject])
在创建 event 实例的时候可以使用下面的参数:
Object:使用 filter 之后得到的索引返回值,例如,filter 可以是 {'valueA': 1, 'valueB': [myFirstAddress, mySecondAddress]}。 默认情况下,所有 filter 的值是 null,这意味着这些值会匹配当前合约发送的任意类型的 event。
Object:额外的过滤条件,例如可以使用 fromBlock 和 toBlock 限定所要查询的区块的范围,详情可以参考 filter。
Function:如果将一个回调函数作为最后一个参数的话,就会立刻开始检索 event,所以没有必要再调用 myEvent.watch(function(){})。
完整的示例如下:
var MyContract = web3.eth.contract(abi);
var myContractInstance = MyContract.at('0x78e97bcc5b5dd9ed228fed7a4887c0d7287344a9');
// 使用一些参数捕捉 event
var myEvent = myContractInstance.MyEvent({some: 'args'}, {fromBlock: 0, toBlock: 'latest'});
myEvent.watch(function(error, result){
...
});
// 停止捕捉
myEvent.stopWatching();
捕捉 event 实战
在实战环节,我们将实现如何获得一个ERC20合约中,有多少地址拥有代币,以及每个地址有多少代币。
在 ERC20 标准合约 中,有一个 event 定义如下:
event Transfer(address indexed from, address indexed to, uint tokens);
合约中每次执行 transfer() 函数的时候都会调用 Transfer() 事件,因此只需要使用 Javascript 捕捉 Transfer() 事件,就能获取到所有执行过交易的账户地址。 之后使用 Web3 调用合约的 balanceOf() 方法就可以获取每个账户地址的 token 余额。
实现步骤如下:
启动 Ganache 测试环境;
在 Remix 中创建 ERC20 智能合约;
编写前端代码,与合约交互。
前两步关于如何使用 Ganache 搭建本地测试环境以及如何在 Remix 中创建合约的部分可以参见我的上一篇文章 Web与智能合约交互实战。 这里将重点放在第三步。
创建UI
在 index.html 中,我们将创建基础的 UI,功能包括接收 token 的地址输入框,发送 token 数量的输入框(由于这里总是从默认账户发送 token,因此没有设置发送者的地址输入框),以及一个发送按钮,这些将通过 jQuery 实现:

ERC20 Token Sample
ERC20 Token
-->
To
Tokens
Send
// 与智能合约的交互代码
......
以及 main.css 文件设定基本的样式:
body {
background-color:#F0F0F0;
padding: 2em;
font-family: 'Raleway','Source Sans Pro', 'Arial';
}
.container {
width: 50%;
margin: 0 auto;
}
label {
display:block;
margin-bottom:10px;
}
input {
padding:10px;
width: 50%;
margin-bottom: 1em;
}
button {
margin: 2em 0;
padding: 1em 4em;
display:block;
}
#instructor {
padding:1em;
background-color:#fff;
margin: 1em 0;
}
.box div {
padding:1em;
background-color:#fff;
margin: 1em 0;
}
捕捉 event 事件
这部分的主要代码如下:
if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else {
// set the provider you want from Web3.providers
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:7545"));
}
// 将Ganache创建的第一个账号当作默认账号
web3.eth.defaultAccount = web3.eth.accounts[0];
// 添加合约的ABI
var tokenerc20Contract = web3.eth.contract([{"constant":true,"inputs":.....}]);
// 添加合约地址
var tokenerc20 = tokenerc20Contract.at('0xdca44800d01ab7768902a11757b5ca1801a59efe');
// 声明transfer事件,所要查找的区块数从0-latest
var transferEvent = tokenerc20.Transfer({}, {fromBlock: 0, toBlock: 'latest'});
// 通过前端进行token交易
$("#button").click(function() {
$("#loader").show();
tokenerc20.transfer($("#to").val(), $("#tokens").val());
});
var holdersArray = new Array();
// 查找所有Transfer事件
transferEvent.watch(function(error, result){
if (!error)
{
$("#loader").hide();
// 判断From或者To的地址是否在holdersArray中出现
var isFromExist = false;
var isToExist = false;
for (var i = 0; i < holdersArray.length; i++){
if (result.args.from == holdersArray[i]) {
isFromExist = true;
}
if (result.args.to == holdersArray[i]) {
isToExist = true;
}
}
// 找的新的账户地址,输出余额信息
if (isFromExist == false) {
var holder = result.args.from;
holdersArray.push(holder);
var balanceOfHolder = tokenerc20.balanceOf(holder)
$("#instructor").append("
" + holder + ' has balance of ' + balanceOfHolder + "");}
if (isToExist == false) {
var holder = result.args.to;
holdersArray.push(holder);
var balanceOfHolder = tokenerc20.balanceOf(holder)
$("#instructor").append("
" + holder + ' has balance of ' + balanceOfHolder + "");}
} else {
$("#loader").hide();
console.log(error);
}
});
首先使用 Web3 关联 ERC20 合约,将合约的 ABI 以及合约地址都复制到代码中。
当用户点击发送按钮时,会调用合约中的 transfer() 函数(测试时可以使用 Ganache 创建的10个账户进行交易)。
接下来我们实例化 Transfer() 事件,将过滤条件设置为 {fromBlock: 0, toBlock: 'latest'},即从所有区块中筛选交易。
在回调函数中,我们将收集所有交易中涉及到的交易双方的地址,并将每个新地址的余额显示在页面上。
最终效果显示如下:

文中涉及的所有代码可以在 https://github.com/gitferry/mastering-ethereum/tree/master/Solidity-event 获取。
参考链接
http://solidity.readthedocs.io/en/v0.4.21/contracts.html#events
https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-events
http://me.tryblockchain.org/blockchain-solidity-event.html
以上就是关于智能合约中 event 的简单介绍以及如何在实战中捕捉 event。如果想要关注后续的文章,或者对以上内容有任何疑问都可以关注微信公众号:

「ChainLab」
——关注最新区块链技术研究,探索区块链在身份认证、物联网、安全与隐私方面的应用。
同时欢迎通过 telegram 跟我直接联系:http://t.me/keleger。
群内工作
磨链(mochain)社区输出计划
招募条件:
1.需要一定的区块链基础。
2.对上述任何一方面有较为深入理解。
3.每周能保证一定的空余时间来折腾。
4.了解github相关
5.人员进行筛选,时间周期比较长。
有意向联系我。
磨链在线课程
对自己擅长方面有一定的沉淀,愿意开设在线课程,会考虑和一些专业培训机构合作,要求有一定的一线经验,实实在在分享课程。有兴趣的联系,有偿工作。
磨链(mochain)社区内容输出计划
磨链社区内容输出计划,社区内划分6个模块,针对各模块细化分解,社区成员领取任务进行写作内容输出。审核通过后发布,整个过程中即是自己的一个学习提高,同时也有交流分享,模块如下:
1.区块链基础(包括密码学、共识机制、分布式、P2P网络等)
2.以太坊(入门到精通,循序渐进学习以太坊)
3.比特币(入门到精通,比特币相关内容深入琢磨)
4.超级账本(架构、运行原理、共识机制、环境搭建配置开发相关)
5.EOS(概念介绍,由浅入深,持续学习)
6.DAG(DAG的概念、原理机制、项目技术解读)
PS:想加入磨链的,或者具体参与到磨链社区内容输出计划的,请加磨链组织者微信(jackyjin09)。欢迎每一位区块链技术爱好者加入磨链,一块琢磨区块链技术。
关于磨链和相关合作
磨链”---取磨炼之意,旨在普及区块链技术,磨炼技术,更好投身区块链行业。有兴趣一块琢磨区块链技术,联系笔者微信(jackyjin09)。
磨链社区是一个纯粹的技术社区,欢迎相关技术合作,在不违反原则的前提下,积极参与合作。
你可以在这里找到我们:
磨链社区公众号:

1. 磨链社区:http://mochain.info
2. Github : https://github.com/mochain
3. Gitter 聊天: https://gitter.im/mochain
4. 知识星球: https://t.zsxq.com/M3BMVZN
5. 知乎:https://www.zhihu.com/people/mochain
(持续更新中)
合作社区



网友评论