๐Ÿฌ Solidity 3๊ฐ• ๐Ÿฌ

3472 ๋‹จ์–ด soliditysolidity

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

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

์ด๋Ÿฐ ์ด์œ ๋กœ DApp์•ˆ์— ์ค‘์š”ํ•œ ์ผ๋ถ€๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋†“๋Š”๊ฒŒ ํ•ฉ๋ฆฌ์ !

๐Ÿ“Œ ์†Œ์œ  ๊ฐ€๋Šฅํ•œ ์ปจํŠธ๋ž™ํŠธ

๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ ์ปจํŠธ๋ž™ํŠธ ์ˆ˜์ • ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋ฅผ external ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด๋†“์œผ๋ฉด
๋ˆ„๊ตฌ๋‚˜ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ปจํŠธ๋ž™ํŠธ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฑธ ๋Œ€์ฒ˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ปจํŠธ๋ž™ํŠธ๋ฅผ ์†Œ์œ  ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ!
์ปจํŠธ๋ž™ํŠธ๋ฅผ ๋Œ€์ƒ์œผ๋กœ, ํŠน๋ณ„ ๊ด€๋ฆฌ์ž๊ฐ€ ์žˆ์Œ์„ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ

๐Ÿ“Œ onlyOwner ํ•จ์ˆ˜ ์ œ์–ด์ž

ํ•จ์ˆ˜ ์ œ์–ด์ž๋Š” modifier ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ

์ง์ ‘ ํ˜ธ์ถœ์€ x. ํ•จ์ˆ˜ ์ •์˜๋ถ€ ๋์— ํ•ด๋‹น ํ•จ์ˆ˜ ์ž‘๋™ ๋ฐฉ์‹ ๋ฐ”๊พธ๋„๋ก ์ œ์–ด์ž์˜ ์ด๋ฆ„ ๋ถ™์ผ ์ˆ˜ ์žˆ์Œ

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

_; : ๋ณธ๋ฌธ์ฝ”๋“œ๋กœ ๋˜๋Œ์•„๊ฐ€๊ฒŒ ํ•จ.

contract MyContract is Ownable {
  event LaughManiacally(string laughter);

  // ์•„๋ž˜ `onlyOwner`์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ณด๊ฒŒ:
  function likeABoss() external onlyOwner {
    LaughManiacally("Muahahahaha");
  }
}

likeABoss ๊ฐ€ ์‹คํ–‰๋˜๋ฉด, onlyOwner ๊ฐ€ ๋จผ์ € ์‹คํ–‰๋จ.
_;์— ์˜ํ•ด ๋‹ค์‹œ ๋ณธ๋ฌธ ์ฝ”๋“œ likeABoss ๋กœ ๋Œ์•„๊ฐ€์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

๐Ÿ“Œ ๊ฐ€์Šค(Gas)

์†”๋ฆฌ๋””ํ‹ฐ์—์„œ๋Š” ์‚ฌ์šฉ์ž๋“ค์ด ๋‚ด๊ฐ€ ๋งŒ๋“  DApp์˜ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ€์Šค ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํ™”ํ๋ฅผ ์ง€๋ถˆํ•˜๊ฒŒ ๋œ๋‹ค.

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

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ€์Šค ๋‹จ์ถ•์„ ์–ด๋–ป๊ฒŒ?

uint ๋Œ€์‹ ์— uint8์„ ์“ฐ๋”๋ผ๋„ ์•„๋ฌด ์˜ํ–ฅ์ด ์—†๋‹ค.
์†”๋ฆฌ๋””ํ‹ฐ์—์„œ๋Š” uint์˜ ํฌ๊ธฐ์— ์ƒ๊ด€์—†์ด 256๋น„ํŠธ์˜ ์ €์žฅ ๊ณต๊ฐ„์„ ๋ฏธ๋ฆฌ ์žก์•„๋†“๊ธฐ ๋•Œ๋ฌธ

ํ•˜์ง€๋งŒ struct ์•ˆ์—์„œ๋Š” ์˜ˆ์™ธ!
๊ตฌ์กฐ์ฒด ์•ˆ์—์„œ ์—ฌ๋Ÿฌ uint๋ฅผ ์“ด๋‹ค๋ฉด, ์ตœ๋Œ€ํ•œ ์ž‘์€ ๋น„ํŠธ์˜ uint์“ฐ๊ธฐ

๐Ÿ“Œ ์‹œ๊ฐ„ ๋‹จ์œ„

now ํ˜„์žฌ์˜ ์œ ๋‹‰์Šค ํƒ€์ž„์Šคํƒฌํ”„ ๊ฐ’ ์–ป์„ ์ˆ˜ ์žˆ์Œ
์ด๊ฑธ๋กœ ์ข€๋น„ ์žฌ์‚ฌ์šฉ๋Œ€๊ธฐ์‹œ๊ฐ„, ๋ ˆ๋ฒจ ๊ฐ’์„ ์ถ”๊ฐ€ํ•จ

๐Ÿ“Œ storage ํฌ์ธํ„ฐ

private ๋˜๋Š” internal ํ•จ์ˆ˜์— ์ธ์ˆ˜๋กœ์„œ ๊ตฌ์กฐ์ฒด์˜ storage ํฌ์ธํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ
ํ•จ์ˆ˜๋“ค ๊ฐ„์— ๊ตฌ์กฐ์ฒด ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์œ ์šฉ

๐Ÿ“Œ ํ•จ์ˆ˜ ์ œ์–ด์ž์˜ ๋˜ ๋‹ค๋ฅธ ํŠน์ง•

ํ•จ์ˆ˜ ์ œ์–ด์ž๋Š” ์ธ์ˆ˜ ๋˜ํ•œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค!

// ์‚ฌ์šฉ์ž์˜ ๋‚˜์ด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋งคํ•‘
mapping (uint => uint) public age;

// ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๋‚˜์ด ์ด์ƒ์ธ์ง€ ํ™•์ธํ•˜๋Š” ์ œ์–ด์ž
modifier olderThan(uint _age, uint _userId) {
  require (age[_userId] >= _age);
  _;
}

// ์ฐจ๋ฅผ ์šด์ „ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 16์‚ด ์ด์ƒ์ด์–ด์•ผ ํ•œ๋‹ค.
// `olderThan` ์ œ์–ด์ž๋ฅผ ์ธ์ˆ˜์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ์ด๋ ‡๊ฒŒ:
function driveCar(uint _userId) public olderThan(16, _userId) {
  // ํ•„์š”ํ•œ ํ•จ์ˆ˜ ๋‚ด์šฉ๋“ค
}

๐Ÿ“Œ ์ข€๋น„ ์ œ์–ด์ž

ํ•จ์ˆ˜ ์ œ์–ด์ž๋“ค ์ด์šฉํ•˜์—ฌ
๋ ˆ๋ฒจ์—…ํ•  ๋•Œ ์ข€๋น„ ์ด๋ฆ„ ๋ณ€๊ฒฝํ•˜๊ณ / ์ž„์˜์˜ dna๊ฐ’ ๋ถ€์—ฌํ• ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ธ์„ผํ‹ฐ๋ธŒ ๋ถ€์—ฌ
๊ทธ ํ•จ์ˆ˜ ๊ตฌํ˜„ํ•จ!

๐Ÿ“Œ 'view'ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ฐ€์Šค ์ ˆ์•ฝํ•˜๊ธฐ

view ํ•จ์ˆ˜๋Š” ๊ฐ€์Šค๊ฐ€ ๋“ค์ง€ ์•Š๋Š”๋‹ค
view ํ•จ์ˆ˜๊ฐ€ ๋ธ”๋ก์ฒด์ธ ์ƒ์—์„œ ์‹ค์ œ๋กœ ์–ด๋–ค ๊ฒƒ๋„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ
(์™ธ๋ถ€์—์„œ ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ๋งŒ)

์‚ฌ์šฉ์ž๋“ค์˜ ์ „์ฒด ์ข€๋น„ ๊ตฐ๋Œ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ๊ตฌํ˜„
์‚ฌ์šฉ์ž๋“ค์˜ ํ”„๋กœํ•„ ํŽ˜์ด์ง€์— ๊ทธ๋“ค์˜ ์ „์ฒด ๊ตฐ๋Œ€๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ•จ์ˆ˜ ๊ตฌํ˜„

๐Ÿ“Œ Storage๋Š” ๋น„์‹ธ๋‹ค

๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ๋ฐ”๊ฟ€ ๋•Œ, ๋ธ”๋ก์ฒด์ธ์— ์˜๊ตฌ์ ์œผ๋กœ ๊ธฐ๋ก๋˜๊ธฐ ๋•Œ๋ฌธ์—
storage์— ์“ฐ๊ธฐ ์—ฐ์‚ฐ์€ ๋งค์šฐ๋งค์šฐ ๋น„์Œˆ! ์ตœ๋Œ€ํ•œ ํ”ผํ•ด์ฃผ์ž.

storage์— ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ์“ฐ๊ณ ๋„ ํ•จ์ˆ˜ ์•ˆ์— ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“œ๋ ค๋ฉด ๋ฐฐ์—ด์— memory ํ‚ค์›Œ๋“œ๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค
์ด ๋ฐฐ์—ด์€ ํ•จ์ˆ˜๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€๋งŒ ์กด์žฌํ•จ.

function getArray() external pure returns(uint[]) {
  // ๋ฉ”๋ชจ๋ฆฌ์— ๊ธธ์ด 3์˜ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•œ๋‹ค.
  uint[] memory values = new uint[](3);
  // ์—ฌ๊ธฐ์— ํŠน์ •ํ•œ ๊ฐ’๋“ค์„ ๋„ฃ๋Š”๋‹ค.
  values.push(1);
  values.push(2);
  values.push(3);
  // ํ•ด๋‹น ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  return values;
}

ํŠน์ •ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์œ ํ•œ ๋ชจ๋“  ์ข€๋น„๋ฅผ uint[] ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜ ๊ตฌํ˜„

๐Ÿ“Œ For ๋ฐ˜๋ณต๋ฌธ

for ๋ฐ˜๋ณต๋ฌธ์„ ์“ฐ์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ๋ฐฐ์—ด์— ํ‚ค์›Œ๋“œ๋ฅผ ์“ฐ๋Š” ํ˜•ํƒœ๋งŒ ์“ฐ๋ฉด, ๋‚˜์ค‘์— ์‚ฌ์šฉ์ž์˜ ์ข€๋น„๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์ข€๋น„ ๋ฐฐ์—ด๋กœ ์˜ฎ๊ฒจ๊ฐ€๋Š” ๊ฒฝ์šฐ
๋ฐฐ์—ด์˜ ๋นˆ ์ž๋ฆฌ๋ฅผ ๋ฉ”์šฐ๋Š” ๋ฐ์— ์—ฐ์‚ฐ์ด ํˆฌ๋จธ์น˜ ์†Œ๋ชจ๋จ.
์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ์— ์ ‘๊ทผํ•œ ํ›„ ํŠน์ • ์‚ฌ์šฉ์ž์˜ ์ข€๋น„๋“ค๋กœ ๋‹ค์‹œ ์ถ”๋ ค์„œ ๋ฐฐ์—ด ๋‹ค์‹œ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

DApp ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ์ข€๋น„๋“ค์— ์ ‘๊ทผํ•˜๊ณ , ๊ทธ๋“ค์˜ ์†Œ์œ ์ž๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์ฐพ๋Š” ์ž์ธ์ง€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธํ•œ ํ›„, ์กฐ๊ฑด์— ๋งž๋Š” ์ข€๋น„๋“ค์„ result ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•œ ํ›„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ๊ตฌํ˜„

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ