rpc接口调用以太坊智能合约



传送门: 柏链项目学院


  在以太坊摸爬滚打有些日子了,也遇到了各种各样的问题。这几天主要研究了一下如何通过rpc接口编译、部署和调用合约。也遇到了一些困难和问题,下面将向大家分享。

rpc接口调用智能合约

  • 先来编写一个简单的智能合约
contract Multiply7 {
event Print(uint);
function multiply(uint input) returns (uint) {
Print(input * 7);
return input * 7;
}
}
  • 这是输入一个无符号整数做乘法的合约,接下来想要用rpc接口编译它。编译之前先验证geth的solidity编译器是否可用
curl --data '{"jsonrpc":"2.0","method": "eth_getCompilers", "id": 3}' http://localhost:8545
  • 返回结果
HTTP/1.1 200 OK
Content-Type: application/json
Vary: Origin
Date: Fri, 20 Apr 2018 02:59:24 GMT
Content-Length: 121 {"jsonrpc":"2.0","id":3,"error":{"code":-32601,"message":"The method eth_getCompilers does not exist/is not available"}}
  • 这里竟然出现了eth_getCompilers方法不可用的错误,查阅资料后发现geth1.6以后的版本删除了这个功能,删除还包括eht.compile 等功能,至于删除原因详见https://github.com/ethereum/EIPs/issues/209

现在只好到remix ide上进行编译,编译通过后点击"Details",复制"WEB3DEPLOY"中的"data"数据,接下来部署合约

curl -i -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0x2a5026d44ab3de2094ec79dec074d4a8612a14aa", "gas": "0xfffff", "data": "0x608060405234801561001057600080fd5b5060f58061001f6000396000f300608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b348015604f57600080fd5b50606c600480360381019080803590602001909291905050506082565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a72305820d36dc369a6f3f653b02c492e077b9cfdb114054f44f46277eaa4826e968609010029"}], "id": 6}' http://localhost:8545
  • 部署合约用到eth_sendTransaction方法,其中from对应的是部署合约的账户地址,gas对应为gas消耗量,太少会报错。data对应的是之前复制的data

执行命令后返回了交易hasa

HTTP/1.1 200 OK
Content-Type: application/json
Vary: Origin
Date: Fri, 20 Apr 2018 14:00:58 GMT
Content-Length: 103 {"jsonrpc":"2.0","id":6,"result":"0xa31ad7bc958290c0b401ae4e046d6e93bc67db1cb038ba2953e2cffe6bdf60fa"}
  • 通过这个交易hasa可以查询部署合约的详细信息,我们可以用eth_getTransactionReceipt RPC方法验证一下
curl -i -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method": "eth_getTransactionReceipt", "params": ["0xa31ad7bc958290c0b401ae4e046d6e93bc67db1cb038ba2953e2cffe6bdf60fa"], "id": 7}' http://localhost:8545

在返回的信息中,contractAddress对应的内容就是合约的地址了

HTTP/1.1 200 OK
Content-Type: application/json
Vary: Origin
Date: Fri, 20 Apr 2018 14:05:03 GMT
Content-Length: 981 {"jsonrpc":"2.0","id":7,"result":{"blockHash":"0x5480323e9a5ac26ec585ca610cb15cffbfe26f2323e19fb8d8a967e11903d6a0","blockNumber":"0x5599","contractAddress":"0x21f981af36218aaf1a40621bfe1e57cf2f43455a","cumulativeGasUsed":"0x1ce23","from":"0x2a5026d44ab3de2094ec79dec074d4a8612a14aa","gasUsed":"0x1ce23","logs":[],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","status":"0x1","to":null,"transactionHash":"0xa31ad7bc958290c0b401ae4e046d6e93bc67db1cb038ba2953e2cffe6bdf60fa","transactionIndex":"0x0"}}
  • 拿到合约地址后,我们可以通过eth_sendTransaction调用合约
curl -i -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0x2a5026d44ab3de2094ec79dec074d4a8612a14aa","to":"0x21f981af36218aaf1a40621bfe1e57cf2f43455a","data":"0xc6888fa10000000000000000000000000000000000000000000000000000000000000007"}], "id": 6}' http://localhost:8545

from对应为调用合约的账户,to对应为要调用的合约地址。data对应为调用方法的签名和传入参数,那么我们怎么获取这个值呢,首先,它的编码方式是:sha3(“multiply(uint256)”).substring(0,10)+to_32bit_Hex_str(7)

在geth中输入:

> web3.sha3("multiply(uint256)").substring(0, 10)
"0xc6888fa1"

而参数输入为7,最后出结果为0000000000000000000000000000000000000000000000000000000000000007,加上前面的0xc6888fa1就得到了data的值。

通过eth_sendTransaction调用合约后返回:

HTTP/1.1 200 OK
Content-Type: application/json
Vary: Origin
Date: Fri, 20 Apr 2018 14:12:06 GMT
Content-Length: 103 {"jsonrpc":"2.0","id":6,"result":"0xbe0881901ee9e52c9e969a85a1367c4a8936c5ab77fa479aaee1c780fe5d1159"}

可以看到,返回了交易哈希,我们可以用这个交易哈希查询详细信息,验证是否正确,为了返回的数据格式更方便查看,我们可以在geth私有节点中输入获取交易详细信息的命令:

> eth.getTransactionReceipt("0xbe0881901ee9e52c9e969a85a1367c4a8936c5ab77fa479aaee1c780fe5d1159")

返回结果:

{
blockHash: "0xeac4d7dd5123720ebc43fbc35778de2215738af97cf723721f0260335228eb93",
blockNumber: 22581,
contractAddress: null,
cumulativeGasUsed: 22804,
from: "0x2a5026d44ab3de2094ec79dec074d4a8612a14aa",
gasUsed: 22804,
logs: [{
address: "0x21f981af36218aaf1a40621bfe1e57cf2f43455a",
blockHash: "0xeac4d7dd5123720ebc43fbc35778de2215738af97cf723721f0260335228eb93",
blockNumber: 22581,
data: "0x0000000000000000000000000000000000000000000000000000000000000031",
logIndex: 0,
removed: false,
topics: ["0x24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da"],
transactionHash: "0xbe0881901ee9e52c9e969a85a1367c4a8936c5ab77fa479aaee1c780fe5d1159",
transactionIndex: 0
}],
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000004000000000000000000000000000002000000000000000000040000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000",
status: "0x1",
to: "0x21f981af36218aaf1a40621bfe1e57cf2f43455a",
transactionHash: "0xbe0881901ee9e52c9e969a85a1367c4a8936c5ab77fa479aaee1c780fe5d1159",
transactionIndex: 0
}

重点来了:我们来看一下返回数据中的logs,其中可能包含调用合约的结果。可以看到logs中也有个data,值为0x0000000000000000000000000000000000000000000000000000000000000031,把这个十六进制转换为十进制得到数字4949正好是7*7的结果,这说明我们调用合约的multiply方法成功了并得到了正确的结果。

  以太坊的JSON RPC API的用法还有很多,在这里就不一一介绍了。无论是web3.js还是web3j,都是对以太坊JSON RPC API开发接口的封装。研究JSON RPC API主要出于学习目的,开发DApp还是用web3.js方便一些。


rpc接口调用以太坊智能合约的更多相关文章

  1. 以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明

    以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明 为了让你的Ðapp运行上以太坊,一种选择是使用web3.js library提供的web3.对象.底层实 ...

  2. 深入以太坊智能合约 ABI

    开发 DApp 时要调用在区块链上的以太坊智能合约,就需要智能合约的 ABI.本文希望更多了解 ABI,如为什么需要 ABI?如何解读 Ethereum 的智能合约 ABI?以及如何取得合约的 ABI ...

  3. 使用web3.js监听以太坊智能合约event

    传送门: 柏链项目学院 使用web3.js监听以太坊智能合约event   当我们在前端页面调用合约时发现有些数据不会立即返回,这时还需要再调用更新数据的函数.那么这样的方法使用起来非常不便,监听ev ...

  4. 如何通过以太坊智能合约来进行众筹(ICO)

    前面我们有两遍文章写了如何发行代币,今天我们讲一下如何使用代币来公开募资,即编写一个募资合约. 写在前面 本文所讲的代币是使用以太坊智能合约创建,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还 ...

  5. Go语言打造以太坊智能合约测试框架(level3)

    传送门: 柏链项目学院 第三课 智能合约自动化测试 之前课程回顾 我们之前介绍了go语言调用exec处理命令行,介绍了toml配置文件的处理,以及awk处理文本文件获得ABI信息.我们的代码算是完成了 ...

  6. Go语言打造以太坊智能合约测试框架(level1)

    传送门: 柏链项目学院 Go语言打造以太坊智能合约测试框架 前言 这是什么? 这是一个基于go语言编写的,自动化测试以太坊智能合约的开发框架,使用此框架,可以自动化的部署合约,自动测试合约内的功能函数 ...

  7. 以太坊智能合约 Solidity 的常用数据类型介绍

    目录 目录 1.数组 1.1.对数组的增删改查操作. 2.String.Bytes.Mapping的使用 3.Enums 和 Structs 的简单应用 4.Ether 单位和 Time 单位 5.A ...

  8. 以太坊智能合约介绍,Solidity介绍

    以太坊智能合约介绍,Solidity介绍 一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. Storage contract SimpleSt ...

  9. 以太坊智能合约Hello World示例程序

    简介 以太坊(Ethereum)是一提供个智能合约(smart contract)功能的公共区块链(BlockChain)平台. 本文介绍了一个简单的以太坊智能合约的开发过程. 开发环境 在以太坊上开 ...

随机推荐

  1. Oracle视图(和Mysq一样l)

    本章内容: Oracle视图介绍与创建.Oracle视图的查询与修改.Oracle的复杂视图 1. Oracle视图介绍与创建 (1)了解常见的数据库对象都有哪些 (2)了解什么是视图以及为什么要使用 ...

  2. 优化之Joiner组件

    Joiner组件在运行时需要额外的内存空间处理中间结果,因此会影响性能 可通过查看Joiner performance计数器来决定Joiner组件是否需要优化 通过如下方式优化Joiner组件 将Ma ...

  3. 干货 | Java8 新特性教程

    本教程翻译整理自 https://github.com/winterbe/java8-tutorial 本教程首发自个人网站: https://www.exception.site/java8/jav ...

  4. lambda表达式中的排序问题

    新月新气象,10月第一篇,这也是我工作的第一天,这一篇文章我们要讲到lambda的排序问题 我是这样排序的 var list = DB.company.OrderBy(x=>x.isfreeze ...

  5. Spring Security构建Rest服务-1300-Spring Security OAuth开发APP认证框架之JWT实现单点登录

    基于JWT实现SSO 在淘宝( https://www.taobao.com )上点击登录,已经跳到了 https://login.taobao.com,这是又一个服务器.只要在淘宝登录了,就能直接访 ...

  6. [区块链] 密码学中Hash算法(基础)

    在介绍Hash算法之前,先给大家来个数据结构中对hash表(散列表)的简单解释,然后我再逐步深入,讲解一下hash算法. 一.Hash原理——基础篇 1.1 概念 哈希表就是一种以 键-值(key-i ...

  7. 在越狱的iPhone/iPad上安装自开发环境

    自开发跟自编译意思一样,后者表示一个开发语言的开发能力成熟度:前者则表示一个开发平台的开发能力成熟度. iPhone跟iPad面世这么多年,一直无法摆脱"娱乐"工具的宿命.Appl ...

  8. Java设计模式学习总结

    设计模式基础学习总结 这篇总结主要是基于我之前设计模式基础系列文章而形成的的.主要是把重要的知识点用自己的话说了一遍,可能会有一些错误,还望见谅和指点.谢谢 更多详细内容可以查看我的专栏文章:设计模式 ...

  9. Linux 清理boot分区

    今天一登录虚拟机  就被提示boot空间不足 于是赶紧看了下 还有9.2M,刚安装的时候好好的,为什么用了一段时间后就提示空间不足呢? 原因是使用yum update升级内核后  boot分区中就多了 ...

  10. scrapy爬虫学习系列一:scrapy爬虫环境的准备

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...