Contract-Development

這兩個智能合約有什麼區別?

  • January 9, 2020

我注意到一些智能合約有名稱、符號和供應設置,如範例 #1 並設置定義的建構子。注意,他們沒有填寫“字元串公共符號”、“字元串公共名稱”或“單位小數”或“單位總供應量”。

範例 #1:

contract PucksToken is ERC20Interface, Owned, SafeMath {
   string public symbol;
   string public  name;
   uint8 public decimals;
   uint public _totalSupply;

   mapping(address => uint) balances;
   mapping(address => mapping(address => uint)) allowed;


   // ------------------------------------------------------------------------
   // Constructor
   // ------------------------------------------------------------------------
   constructor() public {
       symbol = "0PUCKS";
       name = "0 Pucks Token";
       decimals = 18;
       _totalSupply = 100000000000000000000000000;
       balances[0x5A86f0cafD4ef3ba4f0344C138afcC84bd1ED222] = _totalSupply;
       emit Transfer(address(0), 0x5A86f0cafD4ef3ba4f0344C138afcC84bd1ED222, _totalSupply);

還有一些這樣設置智能合約,使用“字元串公共常量”來定義。範例 #2:

contract BTClite is StandardToken, Ownable {

 string public constant name = "BTC LITE";
 string public constant symbol = "BTCL";
 uint8 public constant decimals = 8;

 uint256 public constant SUPPLY_CAP = 21000000 * (10 ** uint256(decimals));

 address NULL_ADDRESS = address(0);

我的問題是在編寫智能合約時,在範例 #1 中定義的“構造”程式碼資訊足以定義合約條款,您不必填寫資訊“字元串公共常量”嗎?

基本上為什麼範例#1沒有在下面填寫/輸入此資訊?

string public symbol;
   string public  name;
   uint8 public decimals;
   uint public _totalSupply;

還是它們都一樣?

如果值相同,則最終結果將相同。這只是程式風格的問題。

如果您將值作為參數提供給建構子,您可能會使用不同的建構子參數啟動多個合約,並且合約會變得不同。如果這些值在程式碼中被硬編碼,則無法更改它們,並且您不能為不同的合約重用相同的程式碼。

所以這一切都取決於你想要實現什麼。通常,最好將此類值作為建構子參數提供,這樣您就可以在其他地方重用程式碼,並且您/或您不必在部署合約之前確定確切的值。

第一個變體的效率低於第二個變體。它在部署時消耗更多的氣體。它在訪問symbolname和時消耗更多的氣體decimals。它有更長的字節碼。最後,它佔用了更多的儲存空間。

這裡有兩個合約和它們的一些統計數據(Solidity 0.5.7 啟用了優化):

pragma solidity 0.5.7;

contract First {
   string public name;
   string public symbol;
   uint8 public decimals;

   constructor () public {
       name = "Foo";
       symbol = "Bar";
       decimals = 18;
   }
}

contract Second {
   string public constant name = "Foo";
   string public constant symbol = "Bar";
   uint8 public constant decimals = 18;

   constructor () public {
       // Do nothing
   }
}

第一的:

Deployment cost: 270297 gas units
Byte code size: 1722 bytes
Access cost for `name`: 1172 gas units
Access cost for `decimals`: 412 gas units
Storage used: 3 slots

第二:

Deployment cost: 147621 gas units
Byte code size: 764 bytes
Access cost for `name`: 587 gas units
Access cost for `decimals`: 207 gas units
Storage used: 0 slots

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