900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > JSON-RPC调用智能合约相关方法

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

时间:2022-04-13 02:52:12

相关推荐

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

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

所示箭头分别表示

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

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

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

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

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

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

{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{"from":"0xb3fd719dcfed41f3cc921bd63eace9606bcb68a1","to":"0xf2395D74e852e736D595D558d68D877d3DBB7B25","data":"0x993937e6"}],"id":1}

from是上一步获取的矿工地址to是在remix里面复制的智能合约地址data是截取的sha3编码

如何获取sha3编码呢?

1、先放智能合约代码

// SPDX-License-Identifier: MITpragma 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)

请求时会出现下列问题:

直接进行解锁即可

点击请求之后出现

方法2:使用eth_call形式

{"jsonrpc":"2.0","method": "eth_call", "params": [{ "to":"0xf2395D74e852e736D595D558d68D877d3DBB7B25", "data":"0x993937e6"},"latest"], "id": 8}

to是合约地址data是通过下列命令获取(同上)

3、注意后面需要加上latest

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。