为 Solidity 项目构建 React 前端

Building React front end for Solidity project

我有一组 onlyOwner 方法,我需要在部署合同(在合同中创建游戏)时 运行 立即使用这些方法。出于测试目的自动启动状态的最佳方法是什么?使用 Truffle、React、Ganache

假设您有这样的迁移并且文件名为 2_cat.js

var Cat = artifacts.require("./Cat.sol");

module.exports = function(deployer) {
  deployer.deploy(Cat);
};

运行 以上迁移会将 Cat 合约部署到网络,具体取决于您提供的 --network 标志,即 truffle migrate --network development.

您还将在 build/contracts 文件夹中获得一个文件。该文件应该是 Cat.json,您会发现这样一个块:

  "networks": {
    "xxx": {
      "events": {},
      "links": {},
      "address": "0x...",
      "transactionHash": "0x..."
    }
  }

address是部署的猫合约地址。您可以获取该地址并在新终端中启动 truffle console 以开始与其交互。

例如,要从 Cat 合同中读取内容,您可以这样做:

c = Cat.at("0x_put_address_here")
c.method_name.call()

要写东西(改变合同状态),你可以这样做:

c = Cat.at("0x_put_address_here")
c.method_name(arg1, arg2)

如果您需要从特定地址发送交易,您可以这样做:

c = Cat.at("0x_put_address_here")
c.method_name(arg1, arg2, {from: "0x_account_address"}) // for example, the owner

确保这是一个帐户地址。不是合约地址。当然,该帐户需要有一些 ETH 来支付 gas。

好的,这就是设置合同状态的手动过程。要自动执行此操作,您可以使用 truffle exec 命令并传递 JS 文件路径。

例如,那个 JS 文件可以是这样的:

let Cat = artifacts.require("./Cat");

module.exports = async function() {
  let c = await Cat.deployed()
  await ct.method_name(arg1, arg2, {from: "0x_account_address"})
}

将其保存在 Truffle 项目根目录或目录中。然后,运行 在您的终端中执行此命令:

$ cd /path/to/your/truffle/project/root
$ truffle exec path/to/that/js/file.js --network development

运行执行上述命令后,您的合约状态应该会更新。 deployed() 函数会去查找 build/contracts/Cat.json 文件并取出 networks.

中的 address

类似于c = Cat.at("0x_put_address_here")。但是,它会智能地找到 Cat 地址并为您创建合约实例,而无需您每次更新和部署该合约时都对 Cat 地址进行硬编码。

这里最重要的是要记住,你需要先运行 truffle migrate命令。否则,Cat.jsonnetworks 中的 address 值将不会更新,您可能正在更新旧合同。

更糟糕的是,您可能会尝试创建一个尚未部署的合约实例,因为 build/contracts/Cat.json 文件不存在。

希望这对您有所帮助。我还在推特上发布了一些关于 deploy()new()deployed() 函数和 truffle exec 的更多提示 here.