Solidity

[CryptoZombie] 1-3 Advanced Solidity Concepts

๐Ÿงก ์ปจํŠธ๋ž™ํŠธ์˜ ๋ถˆ๋ณ€์„ฑ

์ด๋”๋ฆฌ์›€์— ์ปจํŠธ๋ž™ํŠธ๋ฅผ ๋ฐฐํฌํ•˜๋ฉด ์ด ์ปจํŠธ๋ž™ํŠธ๋ฅผ ๋‹ค์‹œ๋Š” ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค. ๋‚ด๊ฐ€ ์ตœ์ดˆ๋กœ ๋ฐฐํฌํ•œ ์ปจํŠธ๋ž™ํŠธ๋Š” ๋ธ”๋ก์ฒด์ธ ์ƒ์— ์˜๊ตฌ์ ์œผ๋กœ ์กด์žฌํ•œ๋‹ค. ์ฆ‰, ๋งŒ์•ฝ ์ปจํŠธ๋ž™ํŠธ์— ์ทจ์•ฝ์ ์ด ์กด์žฌํ•ด๋„ ๋ฐฐํฌ ์ดํ›„์—๋Š” ๊ณ ์น  ์ˆ˜๊ฐ€ ์—†๋‹ค. 

 

๐Ÿงก OpenZeppelin์˜ Ownable ์ปจํŠธ๋ž™ํŠธ

๋ฌด์ง€์„ฑ์œผ๋กœ external ์ง€์‹œ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์™ธ๋ถ€์— ํ—ˆ๊ฐ€๋ฐ›์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๋„ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

์šฐ๋ฆฌ๋Š” OpenZeppelin์˜ Ownable์„ ์ด์šฉํ•ด ์•ˆ์ „ํ•œ ์ปจํŠธ๋ž™๋ฅด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

contract Ownable {
  address public owner;
  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  function Ownable() public {
    owner = msg.sender;
  }

  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }
}

 

์ƒ์„ฑ์ž: Ownable()๋Š” Ownable ์ปจํŠธ๋ž™ํŠธ์˜ ์ƒ์„ฑ์ž์ด๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ปจํŠธ๋ž™ํŠธ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค.

ํ•จ์ˆ˜ ์ œ์–ด์ž: modifier onlyOnwer()๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ์œ ์‚ฌ ํ•จ์ˆ˜๋‹ค. ๋ณดํ†ต ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์š”๊ตฌ์‚ฌํ•ญ์˜ ์ถฉ์กฑ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•œ๋‹ค. 

 

๐Ÿงก onlyOnwer ํ•จ์ˆ˜ ์ œ์–ด์ž

ํ•จ์ˆ˜ ์ œ์–ด์ž๋Š” function ๋Œ€์‹  modifier์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜ ์ œ์–ด์ž๋Š” ์ง์ ‘์ ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค. 

likeABoss ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด onlyOnwer๊ฐ€ ๋จผ์ € ํ˜ธ์ถœ๋˜์–ด require๋กœ ์ ์ ˆํ•˜๊ฒŒ ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

contract MyContract is Ownable {
  event LaughManiacally(string laughter);
  
  function likeABoss() external onlyOwner {
    LaughManiacally("Muahahahaha");
  }
}

 

๐Ÿงก Gas

Gas๋Š” dApp์ด ์‚ฌ์šฉํ•˜๋Š” ์ˆ˜์ˆ˜๋ฃŒ์ด๋‹ค. ์ด Gas๋Š” ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด ์–ผ๋งˆ๋‚˜ ๋ณต์žกํ•œ์ง€, ์–ด๋– ํ•œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ๋น„์šฉ์ด ๋‹ฌ๋ผ์ง„๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด Gas ๋น„์šฉ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ์ตœ์ ํ™”๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. (Type changing)

 

๐Ÿงก Time units

Solidity๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹œ๊ฐ„์„ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋Š” ๋‹จ์œ„๊ณ„๋“ค์„ ์ œ๊ณตํ•œ๋‹ค. now ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 1970/1/1 ๋ถ€ํ„ฐ ํ˜„์žฌ ์‹œ๊ฐ„๊นŒ์ง€ ์–ผ๋งˆ๋‚˜ ์‹œ๊ฐ„์ด ํ˜๋ €๋Š”์ง€ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ์™ธ์—๋„, seconds, minutes, hours ๋“ฑ์ด ์žˆ๋‹ค.

 

๐Ÿงก 'View'๋ฅผ ์ด์šฉํ•ด Gas๋ฅผ ์ ˆ์•ฝํ•˜๊ธฐ

view๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœ๋  ๋•Œ ๊ฐ€์Šค๋ฅผ ์ „ํ˜€ ์†Œ๋น„ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ์ด์œ ๋Š” view๋Š” ๋ธ”๋ก์ฒด์ธ ์ƒ์—์„œ ์–ด๋– ํ•œ ๊ฐ’๋„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

๐Ÿงก Storage is expensive

Solidity์—์„œ ๋น„์‹ผ ์—ฐ์‚ฐ ์ค‘ ํ•˜๋‚˜๊ฐ€ storage์ด๋‹ค. ์ด๋Š” ๋ธ”๋ก์ฒด์ธ ์ƒ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ ๋•Œ๋ฌธ์— ์ง„์งœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด storage ์‚ฌ์šฉ์„ ์ง€์–‘ํ•ด์•ผ ํ•œ๋‹ค. ์šฐ๋ฆฌ๋Š” memory์— ๋ฐฐ์—ด์„ ์„ ์–ธํ•ด์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

function getArray() external pure returns(uint[]) {  
  uint[] memory values = new uint[](3);
  
  values.push(1);
  values.push(2);
  values.push(3);
  
  return values;
}

 

https://share.cryptozombies.io/ko/lesson/3/share/bjloed?id=Y3p8MTIwMjIz