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