tencent cloud

腾讯云区块链服务平台 TBaaS

产品动态
产品简介
产品概述
产品功能
底层引擎
产品优势
应用场景
基本概念
购买指南
购买页说明
欠费说明
定价与规格说明
快速入门
Hyperledger Fabric
操作指南
联盟
事件中心
网络概览
通道管理
合约管理
组织管理
节点管理
区块链浏览器
证书管理
审计日志
节点监控与日志
开发指南
Hyperledger Fabric
应用系统对接
API 文档
History
Introduction
API Category
Making API Requests
Hyperledger Fabric 2.3 APIs
Data Types
Error Codes
常见问题
产品协议
数据处理和安全协议
联系我们

合约示例

PDF
聚焦模式
字号
最后更新时间: 2025-04-10 00:41:07

基本示例

本示例以一个基本的智能合约用例为例,只包含智能合约的必须部分,没有实现任何业务逻辑。
/* * SimpleAssetDemo implements a simple chaincode to manage an asset */ public class SimpleAssetDemo extends ChaincodeBase { /* * Init is called during chaincode instantiation to initialize any data. */ @Override public Response init(ChaincodeStub stub) { } /* * Invoke is called per transaction on the chaincode. Each transaction is * either a 'get' or a 'set' on the asset created by Init function. The 'set' * method may create a new asset by specifying a new key-value pair. */ @Override public Response invoke(ChaincodeStub stub) { } public static void main(String[] args) { new SimpleAssetDemo().start(args); } }

官方示例

Hyperledger Fabric 提供了很多官方的智能合约样例,具体请参考 fabric 官方示例。本示例以 Hyperledger Fabric 官方提供的 ABstore 样例为例。该示例的 init 函数用于初始化两个 key/value 键值对,invoke 函数用于根据不同业务逻辑进行细分调用,最终调用以下业务逻辑接口:
invoke:用于 key 之间的 value 转移。
delete:删除一个键值对。
query:查询 key 所对应的值。

init 函数示例

init 函数在智能合约实例化以及升级的时候会被调用。本例通过调用 API getFunction 和 getParameters 获取到用户输入参数。在获取用户输入参数后,通过调用 API putStringState 将数据写到账本中。具体代码如下:
/* * init函数用于初始化两个键值对,用户输入的参数为KEY1_NAME, VALUE1, * KEY2_NAME, VALUE2 */ @Override public Response init(ChaincodeStub stub) { try { _logger.info("Init java simple chaincode"); List<String> args = stub.getParameters(); if (args.size() != 4) { newErrorResponse("Incorrect number of arguments. Expecting 4"); } // Initialize the chaincode String account1Key = args.get(0); int account1Value = Integer.parseInt(args.get(1)); String account2Key = args.get(2); int account2Value = Integer.parseInt(args.get(3)); _logger.info(String.format("account %s, value = %s; account %s, value %s", account1Key, account1Value, account2Key, account2Value)); stub.putStringState(account1Key, args.get(1)); stub.putStringState(account2Key, args.get(3)); return newSuccessResponse(); } catch (Throwable e) { return newErrorResponse(e); } }

invoke 函数示例

invoke 函数对用户的不同的智能合约业务逻辑进行拆分。本例通过调用 API getFunction 和 getParameters 获取到用户的具体业务类型和参数,根据用户的不同业务类型,分别调用不同的业务函数,如 invoke,delete 和 query 函数。具体代码如下:
// invoke把用户调用的function细分到几个子function, 包含invoke, delete和query @Override public Response invoke(ChaincodeStub stub) { try { _logger.info("Invoke java simple chaincode"); String func = stub.getFunction(); List<String> params = stub.getParameters(); if (func.equals("invoke")) { return invoke(stub, params); } if (func.equals("delete")) { return delete(stub, params); } if (func.equals("query")) { return query(stub, params); } return newErrorResponse("Invalid invoke function name. Expecting one of: [\\"invoke\\", \\"delete\\", \\"query\\"]"); } catch (Throwable e) { return newErrorResponse(e); } }

业务逻辑 invoke 函数示例

业务逻辑 invoke 函数主要用于实现业务逻辑中的资产转移。本例中通过调用 API getStringState 获取到 KEY 对应的资产总值,通过调用用户业务逻辑实现资产转移,通过调用 API putStringState 将用户最终资产写入账本。具体代码如下:
// invoke实现两个键之间的value转移,输入为KEY1_NAME, KEY2_NAME,VALUE private Response invoke(ChaincodeStub stub, List<String> args) { if (args.size() != 3) { return newErrorResponse("Incorrect number of arguments. Expecting 3"); } String accountFromKey = args.get(0); String accountToKey = args.get(1); String accountFromValueStr = stub.getStringState(accountFromKey); if (accountFromValueStr == null) { return newErrorResponse(String.format("Entity %s not found", accountFromKey)); } int accountFromValue = Integer.parseInt(accountFromValueStr); String accountToValueStr = stub.getStringState(accountToKey); if (accountToValueStr == null) { return newErrorResponse(String.format("Entity %s not found", accountToKey)); } int accountToValue = Integer.parseInt(accountToValueStr); int amount = Integer.parseInt(args.get(2)); if (amount > accountFromValue) { return newErrorResponse(String.format("not enough money in account %s", accountFromKey)); } accountFromValue -= amount; accountToValue += amount; _logger.info(String.format("new value of A: %s", accountFromValue)); _logger.info(String.format("new value of B: %s", accountToValue)); stub.putStringState(accountFromKey, Integer.toString(accountFromValue)); stub.putStringState(accountToKey, Integer.toString(accountToValue)); _logger.info("Transfer complete"); return newSuccessResponse("invoke finished successfully", ByteString.copyFrom(accountFromKey + ": " + accountFromValue + " " + accountToKey + ": " + accountToValue, UTF_8).toByteArray()); }

delete 函数示例

业务逻辑 delete 函数主要用于实现业务逻辑中的账户删除功能,本示例通过调用 API delState 删除对应账户。具体代码如下:
// delete用于从账本中删除指定的键,输入为KEY_NAME private Response delete(ChaincodeStub stub, List<String> args) { if (args.size() != 1) { return newErrorResponse("Incorrect number of arguments. Expecting 1"); } String key = args.get(0); // Delete the key from the state in ledger stub.delState(key); return newSuccessResponse(); }

query 函数示例

业务逻辑 query 函数主要用于实现业务逻辑中账户查询功能,本示例通过调用 API getStringState 查询对应账户的资产。具体代码如下:
// query主要是查询键对应的值,输入为KEY_NAME private Response query(ChaincodeStub stub, List<String> args) { if (args.size() != 1) { return newErrorResponse("Incorrect number of arguments. Expecting name of the person to query"); } String key = args.get(0); //byte[] stateBytes String val = stub.getStringState(key); if (val == null) { return newErrorResponse(String.format("Error: state for %s is null", key)); } _logger.info(String.format("Query Response:\\nName: %s, Amount: %s\\n", key, val)); return newSuccessResponse(val, ByteString.copyFrom(val, UTF_8).toByteArray()); }


帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈