FISCO BCOS Solidity智能合约Demo

一、solidity智能合约

pragma solidity ^0.4.24;

pragma experimental ABIEncoderV2;  //可以使用string[]

// import "./Table.sol";
 
contract AgricultureTracingTest1{
 
	address private _owner;
 
	modifier onlyOwner{
		require(_owner == msg.sender, "Auth: only owner is authorized");
		_;
	}
 
	constructor () public {
		_owner = msg.sender;
		create();
	}
 
	event createEvent(address owner, string tableName);
	event insertEvent(string tableName, string batchNUm, int c_type);
 
	// 创建农产品溯源表
	function create() private onlyOwner returns(int){
		TableFactory tf = TableFactory(0x1001);
		int count = tf.createTable("t_agriculture_tracing", "batch_num", "json_data, type");
		emit createEvent(msg.sender, "t_agriculture_tracing");
		return count;
	}
 
    /*
    描述 : 插入生产信息
    参数 : 
            batch_num : 批次号
            json_data : json格式数据
    返回值 :
            0 : 失败,该批次已有生产信息
            1 : 成功
    */
    function insertProduct(string memory batch_num, string memory json_data) public onlyOwner returns(int) {
        TableFactory tf = TableFactory(0x1001);
        Table table = tf.openTable("t_agriculture_tracing");
        int product_type = 1;
        // 插入生产信息
        Entry entry = table.newEntry();
        entry.set("batch_num", batch_num);
        entry.set("json_data", json_data);
        entry.set("type", product_type);
        int count = table.insert(batch_num, entry);
        emit insertEvent(batch_num, json_data, product_type);
        return count;
    }
    
    /*
    描述 : 插入流转信息
    参数 : 
            batch_num : 批次号
            qrcode :  二维码
            json_data : json格式数据
    返回值 :
            0 :  失败,该批次尚无生产信息
            1 : 成功
    */
    function insertTransfer(string memory batch_num, string memory json_data) public onlyOwner returns(int) {
        TableFactory tf = TableFactory(0x1001);
        Table table = tf.openTable("t_agriculture_tracing");
        int product_type = 1;
        int transfer_type = 2;
        Condition condition = table.newCondition();
        condition.EQ("batch_num",batch_num);
        condition.EQ("type", product_type);
        Entries entries = table.select(batch_num, condition);
        // 该批次尚无生产信息
        if (entries.size() == 0) {
            return 0;
        }
        // 插入流转信息
        else {
            Entry entry = table.newEntry();
            entry.set("batch_num", batch_num);
            entry.set("json_data", json_data);
            entry.set("type", transfer_type);
            int count = table.insert(batch_num, entry);
            
            emit insertEvent(batch_num, json_data, transfer_type);
            return count;
        }
    }
    
    /*
    描述 : 通过批次号查询
    参数 : 
            batch_num : 批次号
            c_type : 类型(1-生产+流转;2-生产;3-流转)
    返回值 : 
            json格式字符串数据,error-批次号不存在
    */
    function selectByBatch(string memory batch_num, int c_type) public view returns (string[]) {
        TableFactory tf = TableFactory(0x1001);
        Table table = tf.openTable("t_agriculture_tracing");
        Condition condition = table.newCondition();
        condition.EQ("batch_num",batch_num);
        if (c_type != 1) {
            // 只查生产信息
            if (c_type == 2) {
                condition.EQ("type", 1);
            }
            // 只查流转信息
            if (c_type == 3) {
                condition.EQ("type", 2);
            }
        }
        Entries entries = table.select(batch_num, condition);
        // 初始化数组大小
        string[] memory result_data = new string[](uint256(entries.size()));
        // 给数组赋值
		for(int i=0; i<entries.size(); ++i) {
		    
            Entry entry = entries.get(i);
            // 添加数组元素
            result_data[uint256(i)] = entry.getString("json_data");
        }
        return (result_data);
    }
    
}
 
// table.sol,因为在webase-front的IDE中无法直接引用,所以将源码放到代码文件中
 
contract TableFactory {
 
    function openTable(string memory) public view returns (Table) {} //open table
 
    function createTable(string memory, string memory, string memory) public returns (int256) {} //create table
 
}
 
 
 
//select condition
 
contract Condition {
 
    function EQ(string memory, int256) public {}
 
    function EQ(string memory, string memory) public {}
 
 
 
    function NE(string memory, int256) public {}
 
    function NE(string memory, string memory) public {}
 
 
 
    function GT(string memory, int256) public {}
 
    function GE(string memory, int256) public {}
 
 
 
    function LT(string memory, int256) public {}
 
    function LE(string memory, int256) public {}
 
 
 
    function limit(int256) public {}
 
    function limit(int256, int256) public {}
 
}
 
 
 
//one record
 
contract Entry {
 
    function getInt(string memory) public view returns (int256) {}
 
    function getUInt(string memory) public view returns (int256) {}
 
    function getAddress(string memory) public view returns (address) {}
 
    function getBytes64(string memory) public view returns (bytes1[64] memory) {}
 
    function getBytes32(string memory) public view returns (bytes32) {}
 
    function getString(string memory) public view returns (string memory) {}
 
 
 
    function set(string memory, int256) public {}
 
    function set(string memory, uint256) public {}
     
    function set(string memory, string memory) public {}
 
    function set(string memory, address) public {}
 
}
 
 
 
//record sets
 
contract Entries {
 
    function get(int256) public view returns (Entry) {}
     
    function size() public view returns (int256) {}
 
}
 
 
 
//Table main contract
 
contract Table {
 
    function select(string memory, Condition) public view returns (Entries) {}
 
    function insert(string memory, Entry) public returns (int256) {}
 
    function update(string memory, Entry, Condition) public returns (int256) {}
 
    function remove(string memory, Condition) public returns (int256) {}
     
 
 
    function newEntry() public view returns (Entry) {}
 
    function newCondition() public view returns (Condition) {}
 
}
 
 
 
contract KVTableFactory {
 
    function openTable(string memory) public view returns (KVTable) {}
 
    function createTable(string memory, string memory, string memory) public returns (int256) {}
 
}
 
 
 
//KVTable per permiary key has only one Entry
 
contract KVTable {
 
    function get(string memory) public view returns (bool, Entry) {}
 
    function set(string memory, Entry) public returns (int256) {}
 
    function newEntry() public view returns (Entry) {}
 
}

二、编译部署

在这里插入图片描述

三、发交易

1、新增生产信息

在这里插入图片描述
在这里插入图片描述

2、查询

在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w_tt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值