我是靠谱客的博主 友好泥猴桃,最近开发中收集的这篇文章主要介绍java契约_杂谈Java合约代码 - FISCO-BCOS开源社区的个人空间 - OSCHINA - 中文开源技术交流社区...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

f9c8f096097e5ddbee3c8abd0f8d1486.png

FISCO BCOS提供了多种语言的SDK,包括Go、NodeJS、Python和Java。

Java SDK不同于其他语言SDK,调用合约时,用户需要使用合约编译工具将Solidity合约源码生成对应的Java代码。

这个由合约编译工具生成的与Solidity合约同名的Java代码,我们俗称Java合约代码,本文将介绍如何生成以及使用这份代码。

489bfd3b7fc493de182bed7218cdb301.png

如何生成Java合约代码

a906294b5a86476f79961d7b217a4749.png

合约编译工具可将Solidity源码生成对应的Java代码,具体使用方式可参考以下链接:

https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/console.html#id10

在说明合约编译工具如何生成Java合约代码之前,先介绍合约ABI的概念。

ABI的定义为:

The Contract Application Binary Interface (ABI) is the standard way to interact with contracts in the Ethereum ecosystem, both from outside the blockchain and for contract-to-contract interaction.

ABI是以太坊生态系统中与合约交互的标准方式,包括了外部客户端与合约的交互、合约与合约之间的交互。

更通俗的理解,ABI是合约接口的具体描述,包含合约的接口列表、接口名称、参数名称、参数类型、返回类型等等。

这种描述通常为JSON格式,ABI格式详情请参考以下链接:

https://solidity.readthedocs.io/en/develop/abi-spec.html#json

在EVM生态中,Solidity编译器可以生成合约ABI信息。

合约编译工具生成Java代码时,编译Solidity合约生成ABI信息,并解析ABI文件,根据ABI文件的描述内容,确定合约包含的接口列表、各个接口的输入参数名称/类型列表、返回类型等信息。

根据这些信息,合约编译工具为生成的Java合约合约类生成接口。具体可参考以下例子。

// 示例合约 HelloWorld.solpragma Solidity ^0.4.25;contract HelloWorld {string name;function HelloWorld(){name = "Hello, World!";}function get()constant returns(string){return name;}function set(string n){name = n;}}

HelloWorld合约ABI:

[{"constant":false,"inputs":[{"name":"n","type":"string"}],"name":"set","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function","stateMutability":"view"},{"inputs":[],"type":"constructor","payable":true,"stateMutability":"payable"}]

上述代码包含三个接口的描述信息:set、get、constructor(默认构造函数,无参数不处理)。关于set与get接口的生成可参考如下图示。

set接口

8445bc1c03b6d9bb88a07aa02d9d3bf0.png

get接口

3b1be87f5f662971a1e187bf02668cd4.png

最终生成的HelloWorld.java类:

// HelloWorld.java// 注意:这里省略了无关内容,只保留了核心接口public class HelloWorld {public RemoteCall set(String n);public RemoteCall get();}

HelloWorld.java类中set、get分别是对HelloWorld合约get、set调用的封装。从上述介绍中可以看出,合约编译工具通过编译获取合约ABI信息,通过解析ABI内容获取合约接口描述信息,为Java类生成对应接口。

面向Java对象

a906294b5a86476f79961d7b217a4749.png

了解了如何生成Java合约代码,接下来将会说明如何通过生成的接口实现对合约的调用。

这里仍然以HelloWorld合约说明如何调用接口:

HelloWorld helloWorld; // 初始化HelloWorld对象,省略TransactionReceipt receipt = helloWorld.set("HelloWorld").send();    // 调用set接口

Java SDK这种调用合约的姿势可以总结为:面向Java对象操作合约。

在这种方式下,用户只需使用合约编译工具生成Java合约类,对合约的所有操作基于构造的Java合约对象,不需要再关注合约ABI,发送接受细节、交易打包编码、结果返回的解码等屏蔽的细节。

具体调用合约方式请参考Java SDK教程:

https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/java_sdk.html

值得一提的是,在特定场景下,面向对象的Java调用方式显然无法满足需求,比如:无法预先生成Java合约代码,或者,交易签名与交易构造服务需要分离。在这些场景下,使用类似nodejs/python sdk的姿势会更灵活。

但最灵活的还是,用户自己关心交易编解码、打包、签名、发送、收回包、解码的整体流程。

3f59e00825d587cd8db531ca66e7d082.png

总结

a906294b5a86476f79961d7b217a4749.png

Java SDK的使用,帮助用户屏蔽编码、签名、发送、接收、解码等流程的细节,通过前期合约ABI转换生成Java合约代码,可以做到一次转义多处使用。

但是也有用户希望能够掌握交易发送的全过程,或者是在特定场景下要实现交易发送各个流程的解耦。这种情况下,NodeJS、Python、Go版本的客户端对这些细节的支持更为完善,Java SDK也会逐步开放各个模块的接口,敬请期待。

489bfd3b7fc493de182bed7218cdb301.png

FISCO BCOS的代码完全开源且免费

下载地址↓↓↓

https://github.com/FISCO-BCOS/FISCO-BCOS

最后

以上就是友好泥猴桃为你收集整理的java契约_杂谈Java合约代码 - FISCO-BCOS开源社区的个人空间 - OSCHINA - 中文开源技术交流社区...的全部内容,希望文章能够帮你解决java契约_杂谈Java合约代码 - FISCO-BCOS开源社区的个人空间 - OSCHINA - 中文开源技术交流社区...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部