Solidity

是否可以從 Solidity 中的外部合約中讀取常量?

  • June 2, 2022

假設您有這樣定義的契約:

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...

然後,您可以導入它並在兩者中使用FooBar

// 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; 
   }
}

引用自:https://ethereum.stackexchange.com/questions/129427