HyperLedger Fabric Java 合约参数传 JSON 字符串

HyperLedger Fabric Java 合约参数传 JSON 字符串

合约中交易函数可以传多个参数,但是对于一些复杂参数这种方式就比较低效。对于复杂参数可以使用传 json 字符串的方式简化开发。

定义参数接收对象

@DataType
@Data
public class UserInfo {

    @Property
    String key;

    @Property
    String idCard;

    @Property
    String name;

    @Property
    String sex;

    @Property
    String birthday;

    @Property
    String phone;


}

编写合约交易函数

@Contract(
        name = "UserContract",
        info = @Info(
                title = "User contract",
                description = "user contract",
                version = "0.0.1-SNAPSHOT",
                license = @License(
                        name = "Apache 2.0 License",
                        url = "http://www.apache.org/licenses/LICENSE-2.0.html"),
                contact = @Contact(
                        email = "f.carr@example.com",
                        name = "User contract",
                        url = "https://hyperledger.example.com")))
@Log
public class UserContract implements ContractInterface {

    @Transaction
    public UserInfo regUser(Context ctx , UserInfo userInfo) {
        ChaincodeStub stub = ctx.getStub();
        String user = stub.getStringState(userInfo.getKey());

        if (StringUtils.isNotBlank(user)) {
            String errorMessage = String.format("User %s already exists", userInfo.getKey());
            log.log(Level.ALL , errorMessage);
            throw new ChaincodeException(errorMessage);
        }

        stub.putStringState(userInfo.getKey() , JSON.toJSONString(userInfo));

        return userInfo;
    }
}

Fabric 实现方式

fabric-chaincode-shim 先将 json 字符串反序列化为 org.json.JSONObject 再通过反射的方式调用参数接收对象中字段的 set 函数将值绑定的目标参数接收对象中。

org.hyperledger.fabric.contract.execution.JSONTransactionSerializer#createComponentInstance

    Object createComponentInstance(final String format, final String jsonString, final TypeSchema ts) {

        final DataTypeDefinition dtd = this.typeRegistry.getDataType(format);
        Object obj;
        try {
            obj = dtd.getTypeClass().getDeclaredConstructor().newInstance();
        } catch (IllegalAccessException | InstantiationException | InvocationTargetException | NoSuchMethodException e1) {
            throw new ContractRuntimeException("Unable to to create new instance of type", e1);
        }

        final JSONObject json = new JSONObject(jsonString);
        // request validation of the type may throw an exception if validation fails
        ts.validate(json);
        try {
            final Map<String, PropertyDefinition> fields = dtd.getProperties();
            for (final Iterator<PropertyDefinition> iterator = fields.values().iterator(); iterator.hasNext();) {
                final PropertyDefinition prop = iterator.next();

                final Field f = prop.getField();
                f.setAccessible(true);
                final Object newValue = convert(json.get(prop.getName()).toString(), prop.getSchema());

                f.set(obj, newValue);

            }
            return obj;
        } catch (SecurityException | IllegalArgumentException | IllegalAccessException | InstantiationException | JSONException e) {
            throw new ContractRuntimeException("Unable to convert JSON to object", e);
        }

    }

CLI 客户端调用

peer chaincode invoke -o orderer0.example.com:7050 --ordererTLSHostnameOverride orderer0.example.com --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C businesschannel -n hyperledger-fabric-contract-java-demo --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"UserContract:regUser","Args":["{\"key\":\"user-0\",\"idCard\":\"610102198910210321\",\"name\":\"哈哈哈哈lx\",\"sex\":\"男\",\"birthday\":\"1980-01-27\"}"]}

响应结果如图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Hyperledger Fabric是一个面向企业的开源分布式账本技术平台,它以模块化的方式架构,可以在多个利益相关方之间建立信任关系,为企业提供高度安全、可扩展和灵活的区块链解决方案。 Hyperledger FabricJava SDK将Hyperledger Fabric的能力以易于理解的方式呈现给Java开发人员,方便他们构建基于Hyperledger Fabric的分布式应用程序。该SDK包括API和工具,可以让Java开发人员轻松地创建和管理带有身份验证、身份管理和隐私的分布式账本网络。 Hyperledger FabricJava SDK支持以下功能: 1.管理通道:Java开发人员可以使用SDK创建和管理Hyperledger Fabric账本中的通道。通道是指两个或多个组织之间的私有信息流,可确保信息的安全性和隐私性。 2.身份管理:Java开发人员可以使用SDK为Hyperledger Fabric中的参与者创建和管理数字身份。数字身份是指Hyperledger Fabric账本中的参与者的数字表示。 3.创建和部署智能合约Hyperledger FabricJava SDK支持Java智能合约,并且可以将它们部署到Hyperledger Fabric区块链网络中。 总之,Hyperledger Fabric Java SDK从Java开发人员的角度提供了一个简单易用的抽象层,使他们可以很容易地使用Hyperledger Fabric平台的强大功能。 ### 回答2: Hyperledger Fabric Java 是一种基于 Java 编程语言的区块链开发框架,用于构建分布式应用程序。该框架使用可插入式的共识算法和智能合约引擎,提高了可扩展性和可定制性。Hyperledger Fabric Java 利用面向对象编程和通用 Java 语言的特性,使得区块链的开发更加方便、高效。 Hyperledger Fabric Java 利用 Java 语言优秀的特性,简化了开发过程。它提供了一组 Java API,使得程序员可以在 Hyperledger Fabric 框架上进行区块链应用程序的编写,包括封装了区块链交易、丰富的身份认证、链代码等。此外,由于 Java 运行时环境的跨平台特性,开发人员可以使用 Hyperledger Fabric Java 框架在任何平台上简单地构建区块链解决方案,从而大大提高了开发效率。 Hyperledger Fabric Java 的另一个优点是可以通过低级别 API 来集成底层服务。这些 API 使开发人员可以使用重要的 Hyperledger Fabric 框架服务,例如区块存储、共识模块和交易处理。这样一来,开发人员就可以使用自己熟悉的开发工具和编程语言来创建适合特定需求的区块链应用程序。 总之,Hyperledger Fabric Java 是一种灵活、可扩展的开发框架,具备高度定制化和可插拔性功能,可以大大降低区块链的开发难度。由于其强大的集成能力和开放的架构,该框架广泛应用于企业级区块链项目。 ### 回答3: Hyperledger Fabric是一个可扩展的区块链框架,可以在分布式环境中实现可编程的智能合约。该框架具有高度的灵活性和可定制性,可以根据具体需求进行相应的调整和扩展。Hyperledger Fabric JavaHyperledger Fabric框架的一个实现,其主要作用是在Java环境下开发Hyperledger Fabric应用。 Hyperledger Fabric Java主要使用Java语言和一些与之相关的技术来提供区块链解决方案。开发人员可以使用这个框架来开发和部署区块链应用,如供应链、农业、医疗、金融等领域。该框架提供了完整的开发套件和网络支持,可以与其他Hyperledger Fabric组件交互。 通过Hyperledger Fabric Java开发人员可以使用Java虚拟机(JVM)来开发和测试应用程序,而无需使用其他语言或环境。该框架提供了许多API和SDK,可以访问Hyperledger Fabric中的数据,使用智能合约,创建新的数据交易和发起交易。此外,该框架还包括一些安全功能,例如身份验证和访问控制,来保护网络中的数据和信息。 Hyperledger Fabric Java还提供了一个模拟网络,可以快速地创建和测试Hyperledger Fabric应用程序。使用该网络,开发人员可以模拟各种场景和条件,以测试其应用程序的可靠性和稳定性。 总之,Hyperledger Fabric Java是一个功能强大、灵活和可扩展的区块链框架。它为开发人员提供了一个全面的开发套件和API,可以帮助他们轻松开发Hyperledger Fabric应用,而无需担心底层技术的实现细节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值