#### 准备工作

上一节中已经演示了如何通过`mcat`编译和部署合约,此处演示下怎么使用`mcat`来与合约进行交互。

部署合约后得到合约账户地址 `0xd2548bb40fe57aa9e66aeafbc1f6a44c9d8b9532`。 [合约](https://gist.github.com/luren5/84e531e75392765efbb7fde250d6c315)的内容比较简单,功能如下:

1、投票发起人可以给其它账户地址进行授权 `giveRightToVote()`

2、被授权的账户可以进行投票 `vote()`

3、最后可以实时查询投票最多的候选项的编号 `winningProposalIndex()` 和名字 `winnerName()`

根据前一节演示可以看到,部署合约的时候初始化了两个候选项`Hillary` 、`Trump` 编号依次是0 和1

#### 授权

授权操作只能是合约创建者来完成(当然这不是固定的,只是此处合约逻辑规定如此),所以此时还是使用`mcat.yaml`里面配置的那个账户来发起这笔交易。我这里有三个账户,第一个账户是合约的创建者,用它来给后两个账户授权

```

> personal.listAccounts

["0x0b9498ca74cd7814fba0c25e2a441c1d5867946a", "0xb01a8b45f7e01651eda132dbd6fb985a7022f171", "0x15cab6f047549b6ed7392feb5c217d3893a6acb6"]

```

可以看到`giveRightToVote(address voter, bytes32 voterName) `方法有两个参数,第一个是被授权账户的地址,第二个是投票人的名字

```

mcat call --addr="0xd2548bb40fe57aa9e66aeafbc1f6a44c9d8b9532" --contract="Ballot" --function="giveRightToVote" --params="0xb01a8b45f7e01651eda132dbd6fb985a7022f171&voter1"

```

调用成功并返回了这笔合约交易的`hash`, 开启挖矿让这笔交易被打包。 然后来验证下授权是否成功。

#### 验证授权是否成功

合约的状态变量`mapping(address => Voter) public voters;` 是用来记录所有已经被授权的地址的。由于它是`public`类型的合约状态变量,所以编译的时候会自动生成对应的`getter`方法`voters(addr)` (在abi里面可以看到),由于它只是读取数据不需要修改账本,所以它是`constant`类型的,此处调用`callConst`来查询

```

mcat callConst --addr="0xd2548bb40fe57aa9e66aeafbc1f6a44c9d8b9532" --contract="Ballot" --function="voters" --params="0xb01a8b45f7e01651eda132dbd6fb985a7022f171"

0xa3ec138d000000000000000000000000b01a8b45f7e01651eda132dbd6fb985a7022f171

0x766f746572310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000059b025e90000000000000000000000000000000000000000000000000000000000000000

```

`callConst` 和 `call` 用法类似,但是前者调的是`eth_call`接口,它只会查询区块链上的数据并即时返回结果,而后者是调用`eth_sendTransaction`接口,它会发起一笔交易(即使有constant关键字)并返回这笔交易的hash。

从返回的结果可以看出,它是一串经过编码的后的字节码,里面包含了`0xb01a8b45f7e01651eda132dbd6fb985a7022f171`voter的相关属性值, 关于怎么解码mcat正在开发在,将在下一个版本中发布。

由上可以看出,确实已经授权成功。如法炮制,给第三个地址授权

```

mcat call --addr="0xd2548bb40fe57aa9e66aeafbc1f6a44c9d8b9532" --contract="Ballot" --function="giveRightToVote" --params="0x15cab6f047549b6ed7392feb5c217d3893a6acb6&voter2"

```

#### 投票

现在我们用第二个地址,来给选项1(从0开始计数) `Trump`投一票

因为这里是用地址二`0xb01a8b45f7e01651eda132dbd6fb985a7022f171`来投票,也就是从这个地址发起一笔交易,所以我们需要修改下 `mcat.yaml`, 把development模式里面的账户地址和密码改成地址二的信息,然后执行`mcat loadConfig`重新加载一下配置

```

```

注意:真实情况下, 投票发起人(地址一)和被授权地址不会在一个节点,也不会是由同一个人掌握(否则自己给自己授权,然后自己再来投票,没有任何意义)。这里由于是演示,所以发起人和被授权地址在同一个节点里,所以需要改下mcat.yaml里面的配置,真实情况它们(授权 和 投票)应该分属于两个应用

```

// mcat.yaml

account: "0xb01a8b45f7e01651eda132dbd6fb985a7022f171"

password: "123456"

// 重新加载

mcat loadConfig

Succeed in loading mcat config.

```

开始投票

```

mcat call --addr="0xd2548bb40fe57aa9e66aeafbc1f6a44c9d8b9532" --contract="Ballot" --function="vote" --params="1"

```

等待打包

#### 查看投票结果

走完以上步骤后,地址`0xb01a8b45f7e01651eda132dbd6fb985a7022f171`给选项1`Trump`投了一票,而选项0还没有被投票,那么此时winnerIndex应该是0,winnerName应该是Trump,来验证一下

```

mcat callConst --addr="0xd2548bb40fe57aa9e66aeafbc1f6a44c9d8b9532" --contract="Ballot" --function="winningProposalIndex"

0x8ec36a3d

0x0000000000000000000000000000000000000000000000000000000000000001

mcat callConst --addr="0xd2548bb40fe57aa9e66aeafbc1f6a44c9d8b9532" --contract="Ballot" --function="winnerName"

0xe2ba53f0

0x5472756d70000000000000000000000000000000000000000000000000000000

```

结果如预期!

#### 小结

以上是纯手工调用mcat的命令来完成一个合约的调用过程,这适用于上线前的 调试,生产环境肯定是需要通过编码来自动化完成这些操作的,mcat也提供了相应的功能来满足需求,将在下一节中演示!

原文地址: https://zhuanlan.zhihu.com/p/29123951

基于mcat开发智能合约应用(二)调用合约相关推荐

  1. 基于mcat开发智能合约应用(三)编码自动化与合约交互

    #### 前言 上一节中演示了怎么通过手动去部署合约方法和调用合约方法,生产环境下部署合约可能只是一次性操作,但是与合约交互是一个高频操作,而且还需要夹杂其它的业务逻辑,这就需要编码来实现与合约交互. ...

  2. 名片识别信息分类python_基于Python的智能名片识别接口调用代码实例

    基于Python的智能名片识别接口调用代码实例 #!/usr/bin/python # -*- coding: utf-8 -*- import json, urllib from urllib im ...

  3. 基于mcat开发以太坊智能合约

    mcat是一个基于Golang实现的以太坊智能合约开发脚手架,它可以帮助你快速开发.调试以及部署智能合约,同时mact提供一个通过合约交易参数计算调用字节码的功能,可以帮助开发者不受语言限制,无论是J ...

  4. 基于RT-Thread开发智能视觉组智能车 - 温州大学 - 春华秋实

    学校:温州大学队伍名称:春华秋实 参赛队员:陈俊达.程先春.倪世杰 带队教师:王峰 简 介: 目前自动驾驶话题非常火热,近几年华为.特斯拉.谷歌.百度等大型互联网公司都在进行关于这方面的研究.本文设计 ...

  5. 基于RT-Thread开发智能视觉组智能车-乐山师范学院

    学 校:乐山师范学院 队伍名称:乐师逐飞四队 参赛队员:陈龙.刘宇林.唐玉琴. 带队教师:杨济豪,李富钢 简 介: 本设计以第十六届全国大学生智能汽车竞赛为背景,全向行进组以大赛组委会指定的采用麦克纳 ...

  6. 基于神经网络的智能对话系统(二)——机器学习背景知识

    2. 机器学习背景知识 本章简要回顾了深度学习和强化学习,这些学习与后续章节中的会话AI最相关. 2.1 机器学习基础 Mitchell(1997)将机器学习广义地定义为包括任何计算机程序,该计算机程 ...

  7. 毕设-基于LoRa的智能农业大棚(二)

    简介 接着前面的写!!!!!!!!! 终端节点程序设计和实现 首先终端节点的任务就是采集传感器的数据并发送数据到LoRa模块.接受LoRa模块的数据并处理.控制外设. 主函数中主要判断采集的数值是否符 ...

  8. 区块链入门教程(9)--使用WeBASE-Front部署及调用合约

    文章目录 1. 任务背景 2. 任务目标 3. 相关知识点 4. 任务实操 4.1 新建合约文件 4.2 编写合约代码 4.3 保存.编译.部署合约 4.4 调用合约 5. 任务总结 1. 任务背景 ...

  9. truffle-contract调用合约

    truffle-contract与合约交互 truffle-contract也是个用来与以太坊智能合约交互的JavaScript库,相对于web3.js来说更加方便一点. 文章转自: http://d ...

最新文章

  1. python输出文本-Python基础练习,查询文本内容并输出;
  2. 【Android 高性能音频】Oboe 开发流程 ( 检查 Oboe 音频流属性 | 开始播放 | 停止播放 | 关闭 Oboe 音频流 | 重新配置 Oboe 音频流属性 )
  3. 关于幸福的开发(搞笑版)
  4. Find First and Last Position of Element in Sorted Array
  5. 13 Oracle数据库开发与设计入门篇
  6. GM6 frontend Shell._resolveHashFragment when tile is clicked
  7. HDU-水饺基情 二维树状数组
  8. 解除隐藏文件cmd命令_Win10用cmd命令隐藏文件|Win10相互转换隐藏真实文件
  9. java表单单击路径_Form表单中的action路径问题,form表单action路径《jsp---Servlet路劲问题》这个和上一个《jsp---Servlet》文章有关...
  10. 双系统下Mac可以这样卸载windows系统
  11. STL在数组算法的使用
  12. mfc 服务器文件拷贝到本地,mfc服务器客户端间传输文件
  13. Atitit 项目管理优化体系图 第4章 项目整合管理 开始 计划 执行 监控 变更 结束 第5章 项目范围管理  SOW工作说明书 成员通讯录 wbs大概模块级别 第6章 项目时间
  14. Zip 命令打包移除多余隐藏文件
  15. 从零开始vue项目使用cesium开发三维地图(一)
  16. 服务器(工作站)与普通电脑的区别?
  17. 计算机专业有哪些有含金量的证书,大学最有含金量的6大类证书!你拥有哪几个?...
  18. iOS中分类(category)和类扩展(Extension)的区别
  19. #基本概念# 随机试验 / 样本空间 / 随机变量
  20. 【阿拉伯数字转中文汉字工具类】

热门文章

  1. Enterprise Solution 2.2 Feature List
  2. .NET C# 发送邮件内容嵌入图片
  3. 正则表达式简明使用手册
  4. ID3DXMesh的数据导出和导入
  5. wind up和end up的区别
  6. (转)自定义EndNote的输出样式(output style)
  7. [云炬python3玩转机器学习]4-3 训练数据集,测试数据集
  8. 学术之问2018-04-05
  9. 【粉丝福利】今天不谈技术,只送福利!
  10. Coursera吴恩达《卷积神经网络》课程笔记(4)-- 人脸识别与神经风格迁移