Solidity
是否可以從 Solidity 中的外部合約中讀取常量?
假設您有這樣定義的契約:
pragam solidity >=0.8.0; contract Foo { uint256 public constant MY_CONSTANT = 6174; }
如果我只是導入
Foo
另一個契約,而不從它繼承,我可以閱讀MY_CONSTANT
嗎?我試著這樣做,但沒有奏效。
pragam solidity >=0.8.0; import { Foo } from "/path/to/Foo.sol"; contract Bar { function myFunction() external { uint256 myConstant = Foo.MY_CONSTANT; } }
我收到以下錯誤:
TypeError:成員“MY_CONSTANT”在類型中的參數相關查找後未找到或不可見(契約 SablierV2Pro)
如果我只是在另一個契約中導入 Foo ,而不從它繼承,我可以閱讀 MY_CONSTANT 嗎?
不強迫打電話,不。常量變數被硬編碼到字節碼中,它們不是變數,不佔用任何儲存空間,也不要進入 ABI,除非您將其指定為
public
但發出呼叫以通過自動生成的 getter 讀取常量變數只是沒有任何意義…如果兩者都
Foo
需要Bar
該常量,但由於某些原因繼承沒有意義,我認為常量定義一Foo
開始就不屬於其中。在這種情況下,它具有全域/應用程序範圍常量的特性。Solidity為這些情況留下了在文件級別聲明常量的可能性(這個問題也可能很有趣)。假設以下程式碼放置在一個名為的文件中,該文件
constants.sol
包含您的應用程序的各種全域常量,包括MY_CONSTANT
:// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; uint256 constant MY_CONSTANT = 6174; // other global constants...
然後,您可以導入它並在兩者中使用
Foo
它Bar
:// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "./constants.sol"; contract Foo { // Doesn't need to declare MY_CONSTANT as this is done // at the file level in constants.sol // Use the imported definition from ./constants.sol function myFunction() external pure returns (uint256) { return MY_CONSTANT; } } contract Bar { // Use the imported definition from ./constants.sol function myFunction() external pure returns (uint256) { return MY_CONSTANT; } }