基于mcat开发智能合约应用(二)调用合约
#### 准备工作
上一节中已经演示了如何通过`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开发智能合约应用(二)调用合约相关推荐
- 基于mcat开发智能合约应用(三)编码自动化与合约交互
#### 前言 上一节中演示了怎么通过手动去部署合约方法和调用合约方法,生产环境下部署合约可能只是一次性操作,但是与合约交互是一个高频操作,而且还需要夹杂其它的业务逻辑,这就需要编码来实现与合约交互. ...
- 名片识别信息分类python_基于Python的智能名片识别接口调用代码实例
基于Python的智能名片识别接口调用代码实例 #!/usr/bin/python # -*- coding: utf-8 -*- import json, urllib from urllib im ...
- 基于mcat开发以太坊智能合约
mcat是一个基于Golang实现的以太坊智能合约开发脚手架,它可以帮助你快速开发.调试以及部署智能合约,同时mact提供一个通过合约交易参数计算调用字节码的功能,可以帮助开发者不受语言限制,无论是J ...
- 基于RT-Thread开发智能视觉组智能车 - 温州大学 - 春华秋实
学校:温州大学队伍名称:春华秋实 参赛队员:陈俊达.程先春.倪世杰 带队教师:王峰 简 介: 目前自动驾驶话题非常火热,近几年华为.特斯拉.谷歌.百度等大型互联网公司都在进行关于这方面的研究.本文设计 ...
- 基于RT-Thread开发智能视觉组智能车-乐山师范学院
学 校:乐山师范学院 队伍名称:乐师逐飞四队 参赛队员:陈龙.刘宇林.唐玉琴. 带队教师:杨济豪,李富钢 简 介: 本设计以第十六届全国大学生智能汽车竞赛为背景,全向行进组以大赛组委会指定的采用麦克纳 ...
- 基于神经网络的智能对话系统(二)——机器学习背景知识
2. 机器学习背景知识 本章简要回顾了深度学习和强化学习,这些学习与后续章节中的会话AI最相关. 2.1 机器学习基础 Mitchell(1997)将机器学习广义地定义为包括任何计算机程序,该计算机程 ...
- 毕设-基于LoRa的智能农业大棚(二)
简介 接着前面的写!!!!!!!!! 终端节点程序设计和实现 首先终端节点的任务就是采集传感器的数据并发送数据到LoRa模块.接受LoRa模块的数据并处理.控制外设. 主函数中主要判断采集的数值是否符 ...
- 区块链入门教程(9)--使用WeBASE-Front部署及调用合约
文章目录 1. 任务背景 2. 任务目标 3. 相关知识点 4. 任务实操 4.1 新建合约文件 4.2 编写合约代码 4.3 保存.编译.部署合约 4.4 调用合约 5. 任务总结 1. 任务背景 ...
- truffle-contract调用合约
truffle-contract与合约交互 truffle-contract也是个用来与以太坊智能合约交互的JavaScript库,相对于web3.js来说更加方便一点. 文章转自: http://d ...
最新文章
- python输出文本-Python基础练习,查询文本内容并输出;
- 【Android 高性能音频】Oboe 开发流程 ( 检查 Oboe 音频流属性 | 开始播放 | 停止播放 | 关闭 Oboe 音频流 | 重新配置 Oboe 音频流属性 )
- 关于幸福的开发(搞笑版)
- Find First and Last Position of Element in Sorted Array
- 13 Oracle数据库开发与设计入门篇
- GM6 frontend Shell._resolveHashFragment when tile is clicked
- HDU-水饺基情 二维树状数组
- 解除隐藏文件cmd命令_Win10用cmd命令隐藏文件|Win10相互转换隐藏真实文件
- java表单单击路径_Form表单中的action路径问题,form表单action路径《jsp---Servlet路劲问题》这个和上一个《jsp---Servlet》文章有关...
- 双系统下Mac可以这样卸载windows系统
- STL在数组算法的使用
- mfc 服务器文件拷贝到本地,mfc服务器客户端间传输文件
- Atitit 项目管理优化体系图 第4章 项目整合管理 开始 计划 执行 监控 变更 结束 第5章 项目范围管理 SOW工作说明书 成员通讯录 wbs大概模块级别 第6章 项目时间
- Zip 命令打包移除多余隐藏文件
- 从零开始vue项目使用cesium开发三维地图(一)
- 服务器(工作站)与普通电脑的区别?
- 计算机专业有哪些有含金量的证书,大学最有含金量的6大类证书!你拥有哪几个?...
- iOS中分类(category)和类扩展(Extension)的区别
- #基本概念# 随机试验 / 样本空间 / 随机变量
- 【阿拉伯数字转中文汉字工具类】