为 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.json
的 networks
中的 address
值将不会更新,您可能正在更新旧合同。
更糟糕的是,您可能会尝试创建一个尚未部署的合约实例,因为 build/contracts/Cat.json
文件不存在。
希望这对您有所帮助。我还在推特上发布了一些关于 deploy()
、new()
、deployed()
函数和 truffle exec
的更多提示 here.
我有一组 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.json
的 networks
中的 address
值将不会更新,您可能正在更新旧合同。
更糟糕的是,您可能会尝试创建一个尚未部署的合约实例,因为 build/contracts/Cat.json
文件不存在。
希望这对您有所帮助。我还在推特上发布了一些关于 deploy()
、new()
、deployed()
函数和 truffle exec
的更多提示 here.