前言
在以太坊智能合约的开发中,有时需要在前端应用程序中调用智能合约函数。为了简化这一过程,我们可以使用 truffle-contract 包快速创建 JS 对象,并与智能合约进行交互。不过,当智能合约由多个源文件构成时,这一过程会变得更加复杂。
为了处理这一问题,truffle-contract-sources 包应运而生。此包提供了一种使用多个 Solidity 文件的方法,以便在前端代码中简单而直接地调用智能合约函数。本文将介绍如何使用 truffle-contract-sources 包,并提供一个详细的示例。
安装
我们可以使用 npm 即可安装 truffle-contract-sources 包:
npm install truffle-contract-sources
同时,我们也需安装 truffle-contract 和 web3.js 包:
npm install truffle-contract npm install web3
使用
在我们的前端应用程序中,我们首先需要导入服务提供商和 truffle-contract-sources 包:
import Web3 from "web3"; import TruffleContract from "truffle-contract"; import provideService from "@truffle/provider"; import { createArtifact, normalizeContract } from "truffle-contract-sources";
然后,我们需要定义一些帮助函数来获取提供商和工件。这些函数将从应用程序的配置文件中获取应用程序的 Web3 提供商和智能合约工件:
-- -------------------- ---- ------- ----- ----------- - -------- -- - ----- -------- - ----------------- -- --- ------------------------------------------------- ------ --------- -- ----- ----------- - -------- -- - ----- -------- - -------------------------------- ------ --------- --
现在我们已准备好使用 truffle-contract-sources 初始化我们的智能合约。这可以通过调用 normalizeContract 函数实现:
const provider = getProvider(config); const artifact = getArtifact(config); const normalizedContract = normalizeContract({ artifact, provider, contractName: "MyContract", });
通过传入智能合约工件和提供商,我们创建了一个新的 truffle-contract-sources 实例。由于智能合约工件具有多个源文件,因此我们还需要指定主合约的名称。
接下来,我们可以简单地调用智能合约函数:
const MyContract = TruffleContract(normalizedContract); MyContract.setProvider(provider); const instance = await MyContract.deployed(); const result = await instance.myFunction();
这里使用 TruffleContract 来包装我们的智能合约实例,并向其提供我们的提供商。然后,我们使用部署的智能合约实例来调用智能合约函数。
示例
让我们通过一个示例来演示如何使用 truffle-contract-sources。
假设我们有一个简单的智能合约,它由两个源文件组成。合约实现了加法运算:
-- -------------------- ---- ------- -- ------------- ------ -------- ------- ------- ------- --------- - -------- ----------- -- ------- -- ------ ---- ------- --------- - ------ - - -- - -
-- -------------------- ---- ------- -- -------------- ------ -------- ------- ------- ------ ------------------ -------- ---------- - -------- ------------ ------ ---- ------- --------- - ------ ------------------- - -
我们需要将这些代码编译为智能合约工件,以便在前端应用程序中使用。为此,我们可以使用 Truffle 并提供以下 truffle.js 配置文件:
-- -------------------- ---- ------- -------------- - - ---------- - ----- - -------- --------- --------- - ---------- - -------- ------ ----- ---- -- ----------- ------------ -- -- -- --
我们运行以下命令以编译智能合约代码:
truffle compile
现在,我们需要在前端应用程序中使用智能合约。我们可以创建一个配置文件来指定我们需要的提供商和工件路径:
const config = { providerUrl: "http://localhost:8545", artifact: "build/contracts/MyContract.json", };
接下来,我们使用前文提到的函数初始化智能合约:
const provider = getProvider(config); const artifact = getArtifact(config); const normalizedContract = normalizeContract({ artifact, provider, contractName: "MyContract", });
最后,我们可以简单地调用智能合约函数:
const MyContract = TruffleContract(normalizedContract); MyContract.setProvider(provider); const instance = await MyContract.deployed(); const result = await instance.myFunction(); console.log(result); // Output: 4
结论
truffle-contract-sources 是一个非常有用的工具,可帮助我们在前端应用程序中轻松调用多个源文件组成的智能合约。虽然这对于智能合约开发者来说是一个非常便捷的工具,但我们应该记得,它仅是一个工具,而不应滥用。我们应该仔细思考我们的应用程序需要使用的智能合约,并谨慎使用这些包。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/70331