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: 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)
请求时会出现下列问题:
直接进行解锁即可
点击请求之后出现
方法2:使用eth_call形式
{"jsonrpc":"2.0","method": "eth_call", "params": [{ "to":"0xf2395D74e852e736D595D558d68D877d3DBB7B25", "data":"0x993937e6"},"latest"], "id": 8}
- to是合约地址
- data是通过下列命令获取(同上)
3、注意后面需要加上latest