美文网首页磨链(mochain)社区分享
捕捉智能合约中的event实战+物联网溯源讨论

捕捉智能合约中的event实战+物联网溯源讨论

作者: 磨链社区 | 来源:发表于2018-04-30 19:21 被阅读5次

群内分享

1.跨链技术——实现价值网络的关键所在 

2.捕捉智能合约中的event实战

群内讨论

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 

    (持续更新中)

    合作社区

    趣链科技技术团队 

    HiBlock区块链社区 

    孔壹学院 

    相关文章

    • 捕捉智能合约中的event实战+物联网溯源讨论

      群内分享 1.跨链技术——实现价值网络的关键所在 2.捕捉智能合约中的event实战 群内讨论 1.物联网溯源问题...

    • 干货|捕捉智能合约中的event实战

      1 写在前面 在上一篇文章 Web与智能合约交互实战 中我们已经掌握如何使用 Web3 控制智能合约,并且实现了一...

    • 2018-07-16

      BAIC(佰客云)公布智能合约API介绍,公测将公开API接口! 物联网数据价值公链BAIC正式发布智能合约API...

    • 智能合约简介

      一、什么是智能合约 智能合约最早是1990s 由尼克萨博提出的理念,几乎与互联网同龄。他在文章中对智能合约做出如下...

    • 区块链技术给AI技术带来的5大好处

      近两年大家听的最多的互联网技术就是区块链、人工智能了。大众对区块链的第一印象都是安全、去中心化、信息溯源、智能合约...

    • 【物联网开发实战】- 设备上云方案详解?

      【物联网开发实战】- 如何让设备上云? 物联网开发过程中遇到的第一个棘手问题就是:如何让设备连接上云?我们以智能洗...

    • AIX,物联网保险平台

      AIX,自动化的物联网保险平台。 Aigang致力于为大众提供一系列全自动保险协议,这些协议可通过智能合约为物联网...

    • 智能合约赋予物联网“思考的力量”

      简介:物联网处理数据会需要安全性和隐私性两个问题,未来,中心化的数据处理方式将被物联网抛弃,基于区块链发展起来的智...

    • 智能合约实战-投票合约

      我们以一个投票合约来说明一下合约的部署和调用 合约代码 代码说明: 开头声明了两个结构体Candidate和Vot...

    • 4.4 Hyperledger Fabric - 应用程序开发

      应用程序开发 - 智能合约处理 区块链网络的核心是智能合约。在 PaperNet 中,商业票据智能合约中的代码定义...

    网友评论

      本文标题:捕捉智能合约中的event实战+物联网溯源讨论

      本文链接:https://www.haomeiwen.com/subject/clktrftx.html