Contract-Development
這兩個智能合約有什麼區別?
我注意到一些智能合約有名稱、符號和供應設置,如範例 #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;
還是它們都一樣?
如果值相同,則最終結果將相同。這只是程式風格的問題。
如果您將值作為參數提供給建構子,您可能會使用不同的建構子參數啟動多個合約,並且合約會變得不同。如果這些值在程式碼中被硬編碼,則無法更改它們,並且您不能為不同的合約重用相同的程式碼。
所以這一切都取決於你想要實現什麼。通常,最好將此類值作為建構子參數提供,這樣您就可以在其他地方重用程式碼,並且您/或您不必在部署合約之前確定確切的值。
第一個變體的效率低於第二個變體。它在部署時消耗更多的氣體。它在訪問
symbol
、name
和時消耗更多的氣體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