首页 > 其他分享 >JSON-RPC调用智能合约相关方法

JSON-RPC调用智能合约相关方法

时间:2023-03-21 16:04:31浏览次数:27  
标签:batchNum 调用 string uint256 JSON RPC uint16 memory productNum


1、首先remix部署智能合约获取合约地址,如图所示:

JSON-RPC调用智能合约相关方法_智能合约

 

所示箭头分别表示

(1)在以太坊私链上面进行部署(这里不演示私链搭建)

(2)部署获取合约地址进行复制

2、通过此命令获取发送交易的矿工地址(可以直接CV)

curl -H "Content-Type":application/json --data '{"jsonrpc":"2.0","method":"eth_coinbase", "id":1}' localhost:8545

JSON-RPC调用智能合约相关方法_json_02

 如图result即为矿工地址 (0xb3fd719dcfed41f3cc921bd63eace9606bcb68a1)

3、在Postman中或者是直接用curl形式进行RPC调用

{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{"from":"0xb3fd719dcfed41f3cc921bd63eace9606bcb68a1","to":"0xf2395D74e852e736D595D558d68D877d3DBB7B25","data":"0x993937e6"}],"id":1}
  1. from是上一步获取的矿工地址
  2. to是在remix里面复制的智能合约地址
  3. data是截取的sha3编码

 如何获取sha3编码呢?

1、先放智能合约代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
pragma experimental ABIEncoderV2;
import "./SafeMath.sol";

/*this is a Contract
@auth:caojun
*/

contract ProductManager {
using SafeMath for uint256;

uint256 productNum;

event NewProduct(
string name,
uint8 productMode,
uint8 productType,
uint16 price,
uint16 weight,
uint16 batchNum,
uint256 productNum,
string productionOfDate
);


struct Product {
address owner; //生产商钱包地址
uint8 productMode; //产品生产方式
uint8 productType; //产品类型
uint16 price; //商品价格
uint16 weight; //商品重量
uint16 batchNum; //批次编号
uint16 providerNum; //生产商编号
uint256 productNum; //产品编号
string productionOfDate; //产品生产日期
string name; //产品名称
string photoURL; //商品的照片
string ownerName; //生产商负责人姓名
string phoneNum; //生产商电话号码
}

mapping (uint256 => Product) product;
mapping (uint16 => uint256[]) getbatchNumProduct ; //根据商品的批次编号获取所有的商品上链数据
mapping (uint16 => uint256[]) getproviderNumProduct ;
//构造函数
constructor() {
productNum=0;
}

//添加商品数据上链
function addProduct(uint8 _productMode ,uint8 _productType, string memory _name, uint16 _batchNum, uint16 _providerNum,
uint16 _price, uint16 _weight, string memory _productionOfDate, string memory _photoURL,string memory _ownerName,string memory _phoneNum )
public returns(bool) {
productNum = SafeMath.add(productNum, 1);
Product memory product1 = Product({
owner: msg.sender,
productMode: _productMode,
productType: _productType,
price: _price,
weight: _weight,
batchNum: _batchNum,
providerNum: _providerNum,
productNum: productNum,
productionOfDate: _productionOfDate,
name: _name,
photoURL: _photoURL,
ownerName: _ownerName,
phoneNum: _phoneNum
});
product[productNum] = product1;
getbatchNumProduct[_batchNum].push(product1.productNum);
emit NewProduct(_name, _productMode, _productType, _price, _weight, _batchNum, productNum, _productionOfDate);
return true ;
}

//获取商品溯源信息根据溯源码编号
function getProductData(uint256 _productId) public view returns(Product memory) {
Product memory pro = product[_productId];
return pro;
}

//根据批次编号获取所有的商品上链的编码数据
function getProductBybatchNum(uint16 _batchNum) public view returns (uint256[] memory) {
return getbatchNumProduct[_batchNum];
}

//根据生产商编号获取所有的商品上链的编码数据
function getProductByproviderNum(uint16 _providerNum) public view returns (uint256[] memory) {
return getproviderNumProduct[_providerNum];
}

//获取上链的商品数量
function getTotalGoods() public view returns(uint){
return productNum;
}

function getNow() public view returns(uint) {
// 获取当前块的时间戳
return block.timestamp;
}
}

 如要调用getTotalGoods函数,使用如下命令即可,在私链geth console下面输入

 web3.sha3("getTotalGoods()").substring(0, 10)

JSON-RPC调用智能合约相关方法_json_03

 请求时会出现下列问题:

JSON-RPC调用智能合约相关方法_ide_04

 直接进行解锁即可

JSON-RPC调用智能合约相关方法_ide_05

 点击请求之后出现

JSON-RPC调用智能合约相关方法_智能合约_06

 方法2:使用eth_call形式

{"jsonrpc":"2.0","method": "eth_call", "params": [{ "to":"0xf2395D74e852e736D595D558d68D877d3DBB7B25", "data":"0x993937e6"},"latest"], "id": 8}
  1. to是合约地址
  2. data是通过下列命令获取(同上)

 

JSON-RPC调用智能合约相关方法_智能合约_07

    3、注意后面需要加上latest

JSON-RPC调用智能合约相关方法_智能合约_08

 

JSON-RPC调用智能合约相关方法_ide_09

 

 

JSON-RPC调用智能合约相关方法_智能合约_10

 

标签:batchNum,调用,string,uint256,JSON,RPC,uint16,memory,productNum
From: https://blog.51cto.com/u_15738297/6140259

相关文章

  • 【python】多线程并发,rpc接口性能测试
    1、官方文档https://docs.python.org/3/library/concurrent.futures.html 2、安装python3.x中自带了concurrent.futures模块python2.7需要安装futures模块,使用命令......
  • 获取项目中调用的其他接口列表
    packagespringcloud_producer_8001;importjava.io.File;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.OutputStream;importjava.lang.reflect.M......
  • mybatis里的sqlSessionFactory无法调用Session
    //2、获取SqlSession对象,用它执行sqlSqlSessionsqlSession=sqlSessionFactory.();  我写的时候SqlSessionFactory调用的时候第一个s大写了应该小写的 ......
  • 【grpc】根据proto生成grpc接口Python代码
     1、编写自己的proto接口文件syntax="proto3";packagehelloworld;//对应包名//定义服务serviceGreeter{//SendsagreetingrpcSayHello(HelloR......
  • QT 调用python环境配置
    一、安装好python环境(python或anaconda都可)打包将python环境相关文件到一个文件夹中,如下图所示:打包的文件路径:  生成的依赖包目录结构:二、在QT工程......
  • 使用 Python 实现一个 RPC 框架
    1.概述RPC是什么?RPC(RemoteProcedureCallProtocol),RPC是指远程过程调用,比如现在有两台服务器A、B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方......
  • 使用Java调用百度搜索
    自己没搜索引擎,又想要大规模的数据源,怎么办?可以对百度搜索善加利用,以小搏大,站在巨人的肩膀上。有很多的应用场景可以很巧妙地借助百度搜索来实现,比如网站的新闻采集,比如技术......
  • Spring容器管理的配置Bean转换对象为json字符串时StackOverflowError问题
    背景项目中某配置类XxxConfig定义了很多配置参数,通过Spring的@Value注解与配置中心的项目yml里的配置项关联。@Slf4j@Getter@Setter@RefreshScope@Configurationpub......
  • vue-json-viewer 展示json数据
    main.jsimportJsonViewerfrom'vue-json-viewer'Vue.use(JsonViewer);vue<el-dialogtitle="退款数据详情":visible.sync="dialogvisible2"v-if="dialogvisible......
  • 初始JSON和JSON的3种形式以及常用方法
    初始JSONJSON全称是JavaScriptObjectNotation为什么需要JSONJSON有3种形式,每种形式的写法都和JS中的数据类型很像,可以很轻松和JS中的数据类型互相转换JS->JSO......