热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

#### 前言

上一节中演示了怎么通过手动去部署合约方法和调用合约方法,生产环境下部署合约可能只是一次性操作,但是与合约交互是一个高频操作,而且还需要夹杂其它的业务逻辑,这就需要编码来实现与合约交互。调用合约方法的过程,可以分为两类,一种是需要修改账本数据的,那么它必须是一笔交易,否则只在本地执行是没有实际意义的;另外一种是查询操作,比如查询合约的某个状态变量值,那么它是`constant`类型的,并不需要修改账本,那么这个调用只用在本地节点执行即可,无需消耗gas,也不需要被矿工打包,可即时返回结果。

#### 使用php编码与合约进行交互

`mcat`提供了一个serve的功能,它的作用是起一个本地的server,监听指定的端口(mcat.yaml里面配置),把需要调用的合约方法和参数传进去,它会帮你计算出transaction data字段的字节码。

启动mcat server

```

luren5@ubuntu:~$ mcat serve

server has been started, listening 50729

```

编写php代码与合约交互

```

class Ballot {

// 投票发起人

public $chairperson;


//

function giveRightToVote($voter_addr, $voter_name) {

$data = array(

'method'=> 'TxData.Detail',

'params'=> array(array(

"Contract" => "Ballot",

"Function" => "giveRightToVote",

"Params" => sprintf("%s&%s", $voter_addr, $voter_name)

)),

'id'=> 1

);

$txDatail = getDataDetail($data);

$txDatail = json_decode($txDatail, true);

$gas = $txDatail["Gas"];

$bin = $txDatail["Bin"];


$txHash = sendTransaction($gas, $bin);

echo sprintf("Success in call giveRightToVote with params (%s, %s), the tx hash is %s \r\n", $voter_addr, $voter_name, $txHash);


}


}


// utils

function getDataDetail($data) {

$url = "localhost:50729"; // 这里是mcat server的信息

$r = sendPost($url, $data);

$r = json_decode($r, true);


if(empty($r["error"])) {

return $r["result"];

} else {

echo "Failed to get the tx data detail, err: ", $r["error"];

exit();

}

}


function sendPost($url, $data) {

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

$res = curl_exec($ch);

return $res;

}


function sendTransaction($gas, $bin) {

unlock(); // 发交易之前需要对默认账户进行解锁

$data = array(

"id" => 1,

"method" => "eth_sendTransaction",

"params" => array(array(

"from" => "0x0b9498ca74cd7814fba0c25e2a441c1d5867946a", // 这里是默认发交易的地址,也是合约的创建者

"to" => "0xd2548bb40fe57aa9e66aeafbc1f6a44c9d8b9532", // 这里是合约账户地址

"gas" => $gas,

"data" => $bin

))

);

$url = "localhost:8090";

$r = sendPost($url, $data);

$r = json_decode($r, true);

if(!empty($r["result"])) {

return $r["result"] ;

} else {

echo "Failed to send transaction";

exit();

}

}


function unlock() {

$default_account = "0x0b9498ca74cd7814fba0c25e2a441c1d5867946a";

$default_account_password = "123456";

$data = array(

"method" => "personal_unlockAccount",

"params" => array(

$default_account, $default_account_password,

),

"id" => 1

);

$url = "localhost:8090";

$r = sendPost($url, $data);

$r = json_decode($r, true);

if ($r["result"] != true) {

echo "Failed to unlock the default account";

exit();

}

}


$b = new Ballot();

$b->giveRightToVote("0xab4c1e40f28f00c8c79d77c6079437bbd5ab6cd1", "voter3");

```

执行

```

luren5@ubuntu:~$ php test.php

Success in call giveRightToVote with params (0xab4c1e40f28f00c8c79d77c6079437bbd5ab6cd1, voter3), the tx hash is 0x2ea6103b38e819ca72cd7ca0b2c9ccbae92828d1140913d2cf63c3593845e26d

```

等待交易被打包后,这个调用授权方法的操作即成功了,调用合约其它的方法也是类似


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


推荐阅读
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • 本文介绍了如何在使用emacs时去掉ubuntu的alt键默认功能,并提供了相应的操作步骤和注意事项。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
author-avatar
斯宾诺沙漏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有