如何避免在 Solidity 中硬编码合约地址

How to avoid hardcoding contract address in Solidity

在看其他团队的智能合约时,经常看到这样的代码:

address constant public token = address(0xabc123...);

其中十六进制数是较早部署的智能合约的地址。来自 JS 和 C++ 背景,我不喜欢这个,因为它有效地将配置文件中应该包含的内容直接硬编码到智能合约代码中。当我看到这样的代码时,我会想到几个问题:

我对 Solidity 还是比较陌生,所以我可能遗漏了 truffle 的一些功能,这些功能允许我在部署时插入这些字符串,但我没有在任何我经历的教程。我宁愿为 testnet/mainnet/L2-chain/etc 使用类似 JSON 配置文件的东西,而不是让同一个文件的 N 个版本有细微差别。我应该如何处理这些情况?

您可以有一个包含 token 地址的变量(而不是常量)。这个变量可以从构造函数中设置。

所以你可以有效地将环境变量的值传递给合约构造函数,传递给合约存储。


示例:

.env

TOKEN_ADDRESS=0x123

deploy.js 例如使用 Truffle (docs)

MyContract.new(process.env.TOKEN_ADDRESS)

您还可以使用 Hardhat (docs) 或任何其他允许您根据配置部署到任何网络的库。

MyContract.sol

pragma solidity ^0.8;

contract MyContract {
    address token;

    constructor(address _token) {
        token = _token;
    }
}