主页 > imtoken下载最新版本 > 以太坊Web3j插件功能研究(二)

以太坊Web3j插件功能研究(二)

imtoken下载最新版本 2023-01-16 21:18:17

4 以太坊智能合约

4.1 智能合约语言

开发者可以选择三种语言来编写智能合约:

为了将智能合约部署到以太坊区块链上,必须首先将其编译成字节码格式以太坊区块浏览器api,然后在创建智能合约时将其作为交易请求的一部分发送。

考虑到 Solidity 是编写智能合约的首选语言,它是 web3j 支持的语言,适用于所有后续示例。

4.2 开始使用Solidity

4.2.1 编译Solidity源码

编译为字节码由 Solidity 的编译器 solc 执行

$ solc.sol --bin --abi --optimize -o

-bin 和 -abi 编译器参数都是充分利用 web3j 智能合约所必需的。

1. -bin 输出一个包含十六进制编码二进制文件的 Solidity 二进制文件,以提供交易请求(根据智能合约创建)。

2. -abi 输出一个Solidity应用程序二进制接口(ABI)文件,详细描述了所有公开的可执行合约方法及其相关参数。 这些详细信息以及合约地址对于与智能合约进行交互至关重要。 ABI 文件还用于生成 Solidity 的智能合约包装器。

-gas 参数提供了创建合约并通过绑定方法执行合约所需的 gas 的估计值,

1、可以通过Browser-Solidity在浏览器中编写和编译solidity代码。 浏览器稳定性非常适合较小的智能合约,但您可能会遇到较大合约的问题。

2. 也可以通过Geth和Parity的Ethereum客户端编译Solidity代码,使用jjson-rpc方法eth_compileSolidity,web3j也支持,但是客户端必须安装Solidity的编译器才能运行

4.2.2 部署智能合约并与之交互

1.如果你想避免使用智能合约的底层实现细节,web3j提供了Solidity的智能合约包装器,允许你通过生成的包装器对象直接与所有智能合约方法进行交互。

2. 如果您不想使用智能合约包装器并希望直接使用 json-rpc 调用,请参考 HumanStandardTokenIT。

4.2.3 智能合约包装器

1、Web3j命令行工具工具自带生成智能合约函数包装器的命令行工具:

$web3j solidity generate /path/to/.bin /path/to/.abi -o /path/to/src/main/java -p com.your.organisation.name

2.直接调用Java类:

org.web3j.codegen.SolidityFunctionWrapperGenerator /path/to/.bin /path/to/.abi-o/path/to/src/main/java-p com.your.organisation.name

1.创建和部署

2.调用交易和事件

3.调用常量方法

4.演示示例

任何需要进行底层 json-rpc 调用的方法调用都将返回一个避免阻塞的 Future。

智能合约的构建和部署发生在 deploy 方法中:

以太坊区块浏览器api_以太坊区块生成时间_基于以太坊的区块链

这将使用提供的凭据和构造函数参数值在以太坊区块链上创建一个新的智能合约实例,它返回一个包含智能合约底层地址的新智能合约包装器实例。如果你想使用现有的智能合约来构建智能合约包装器的实例,只需传递其地址

以太坊区块浏览器api_以太坊区块生成时间_基于以太坊的区块链

如果在提供的地址,智能合约字节码与部署的不匹配,则返回 false

使用这种方法,您可能希望确保您正在加载的智能合约地址是您期望的智能合约。 为此,您可以使用智能合约方法 isValid ,只有当部署在智能合约地址的字节码与智能合约包装器中的字节码匹配时,它才会返回 true 。

4.3 交易管理

Web3j 提供了一个 TransactionManager 抽象来控制您与以太坊客户端的连接方式。 默认机制使用 web3j 的 RawTransactionManager,它与以太坊钱包文件一起在提交到网络之前离线签署交易。如果你想修改交易管理器,你可以将交易管理器传递给智能合约部署和创建方法,而不是凭证对象

以太坊区块浏览器api_基于以太坊的区块链_以太坊区块生成时间

除了 RawTransactionManager 之外,web3j 还提供了一个 ClientTransactionManager,它将签署您的交易的责任传递给您正在连接的以太坊客户端。

4.3.1 在交易上指定链ID

RawTransactionManager 采用可选的链 ID 参数来指定要在交易中使用的链 ID,就像每个 EIP-155 一样。 这可以防止来自一条链的交易被重新广播到另一条链,例如从 Morden 到主网:

以太坊区块浏览器api_基于以太坊的区块链_以太坊区块生成时间

为了避免必须更改配置或代码来指定要使用的链,web3j 的默认行为是不在事务上指定链 id,以简化使用库的工作。 但是,以太坊社区的建议是使用它们。

4.3.2 调用交易和事件

所有交易智能合约方法都与它们的 Solidity 对应方法相同,它们采用相同的参数值。 无论方法中指定的返回类型如何,事务调用都不会返回任何值。 因此,对于所有的交易方式,都会返回与交易关联的交易收据。

TransactionReceipt transactionReceipt = contract.someMethod(new Type(...),...).get();

交易收据很有用,原因有二:

1. 它提供存放交易的开采区块的详细信息

2. 被调用的 Solidity 事件将被记录为交易的一部分,然后可以被提取

智能合约中定义的任何事件都将通过名为 processEvent 的方法在智能合约包装器中表示,该方法接受交易收据并从中提取索引和非索引事件参数,这些参数在 EventValues 的实例中指定对象被解码返回。

EventValues eventValues = 合约。 processSomeEvent(交易收据);

或者你可以使用一个可观察的过滤器来监听智能合约相关的事件:

contract.someEventObservable(startBlock, endBlock).subscribe(event -> ...);

请记住,对于任何索引数组、字节和字符串 Solidity 参数类型,将返回 Keccak-256 哈希,请参阅文档以获取更多信息。

4.3.3 调用常量方法

不可变方法是那些读取智能合约中的值并且不改变智能合约状态的方法。 这些方法与生成它们的智能合约具有相同的方法签名,唯一的补充是调用被包装在未来。

输入结果 = 合同。 一些方法(新类型(...),...)。 得到();

5 过滤器和事件

5.1 Web3J过滤类型

过滤器提供以太坊网络中发生的某些事件的通知。

以太坊中存在三种类型的过滤器:

块过滤器和待处理交易过滤器提供网络上正在创建的新交易或块的通知,主题过滤器更灵活。 这允许您根据提供的特定条件创建过滤器。

5.2 区块和交易过滤器

除非您使用 WebSocket 连接到 Geth,否则通过 JSON-RPC API 使用过滤器是一个痛苦的过程,您需要调查 Ethereum 客户端以查明您的过滤器是否有任何更新作为同步 HTTP和IPC本质上是必需的。

此外,区块和交易过滤器仅提供交易或区块的哈希值,因此需要进一步的请求才能获得哈希值所引用的实际交易或区块。

Web3j 的托管过滤器实现解决了这些问题,因此您有一个完全异步的基于事件的 API 来处理过滤器。 它使用 RxJava 的 Observables,它提供一致的 API 来处理事件,通过函数组合促进 JSON-RPC 调用的链接。

基于以太坊的区块链_以太坊区块浏览器api_以太坊区块生成时间

5.3 重播Replay过滤器

Web3j 还提供了用于重放块和交易的历史过滤器。

以太坊区块生成时间_以太坊区块浏览器api_基于以太坊的区块链

您还可以让 web3j 重播当前最新的所有块,并在您捕获到该块时提供通知(通过提交的可观察对象)。

以太坊区块生成时间_以太坊区块浏览器api_基于以太坊的区块链

5.4 主题过滤器和EVM事件

主题过滤器捕获网络中发生的以太坊虚拟机 (EVM) 事件的详细信息。 这些事件由智能合约创建并存储在与智能合约关联的交易日志中。

您可以使用 EthFilter 类型来指定要应用过滤器的主题。 这可以包括您希望应用过滤器的智能合约的地址。 您还可以提供要过滤的特定主题。 在智能合约中,单个主题代表一个索引参数:

以太坊区块浏览器api_基于以太坊的区块链_以太坊区块生成时间

然后可以使用与上面的块和交易过滤器类似的语法来创建此过滤器:

web3j.ethLogObservable(filter).subscribe(log -> { });

过滤主题只能引用索引可靠的事件参数。 无法过滤非索引事件参数。 此外,对于任何索引事件参数,例如字符串和字节,它们值的 keccak-256 散列存储在 EVM 日志中。 不可能使用它们的完整值来存储或过滤。

如果你创建一个没有与之关联的主题的过滤器实例,那么网络中发生的所有 EVM 事件都将被过滤器捕获。

除了 send() 和 sendAsync 之外,web3j 中的所有 JSON-RPC 方法实现都支持 observable() 方法来创建异步执行请求的可观察方法。 这使得将 JSON-RPC 调用组合成新函数变得非常简单。

例如,block observable 本身由许多单独的 JSON-RPC 调用组成:

基于以太坊的区块链_以太坊区块生成时间_以太坊区块浏览器api

在这里,我们首先创建一个可观察对象以太坊区块浏览器api,为每个新创建的块提供块哈希的通知。 然后我们使用 flatMap 来调用 ethGetBlockByHash 以获取完整的块详细信息,这些详细信息将传递给可观察对象的订阅者。

6 个 Web3J 命令行工具

Web3j fatjar 随每个提供命令行工具的发行版一起分发。 命令行允许您从终端使用 web3j 的一些功能。 命令行工具可从项目存储库的发布页面、下载部分获得,或通过 Homebrew 为 OS X 用户提供 zipfile/tarball。

1. 钱包创建

$ web3j 钱包创建

2. 钱包密码管理

$ web3j 钱包更新

3. 从一个钱包转移到另一个

$ web3j 钱包发送

4. Solidity 智能合约包装器

命令行语句如下

brew tap web3j/web3j

酿造安装web3j

要运行 zip 文件,只需提取 zip 文件并运行二进制文件:

$ 解压 web3j-.zip

创建:web3j-1.0.2/lib/

充气:web3j-1.0.2/lib/core-1.0.2-all.jar

创建:web3j-1.0.2/bin/

充气:web3j-1.0.2/bin/web3j

充气:web3j-1.0.2/bin/web3j.bat

$./web3j-/bin/web3j