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}
  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)

 请求时会出现下列问题:

 直接进行解锁即可

 点击请求之后出现

 方法2:使用eth_call形式

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

 

    3、注意后面需要加上latest

 

猜你喜欢

转载自blog.csdn.net/weixin_46085718/article/details/127091580