Skip to content

Latest commit

Β 

History

History
947 lines (679 loc) Β· 44.6 KB

types.rst

File metadata and controls

947 lines (679 loc) Β· 44.6 KB
.. index:: type

νƒ€μž…

solidityλŠ” 컴파일 μ‹œμ μ— 각 λ³€μˆ˜(μƒνƒœλ³€μˆ˜μ™€ μ§€μ—­λ³€μˆ˜)의 νƒ€μž…μ΄ λͺ…μ‹œλ˜μ–΄μ•Όν•˜λŠ” (λ˜λŠ” μ΅œμ†Œν•œ μΆ”λ‘ κ°€λŠ₯ν•΄μ•Όν•˜λŠ” - :ref:`type-deduction` μ°Έμ‘°) 정적 νƒ€μž… μ–Έμ–΄μž…λ‹ˆλ‹€. solidityλŠ” λͺ‡ κ°€μ§€μ˜ κΈ°λ³Έ νƒ€μž…μ„ μ œκ³΅ν•˜λ©° 이λ₯Ό μ‘°ν•©ν•΄μ„œ 볡합 νƒ€μž…μ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, νƒ€μž…μ€ μ—°μ‚°μžκ°€ ν¬ν•¨λœ ν‘œν˜„μ‹μ—μ„œ μ„œλ‘œ μƒν˜Έμž‘μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬λŸ¬ 가지 μ—°μ‚°μžμ— λŒ€ν•œ λ‚΄μš©μ€ :ref:`order` λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

.. index:: ! value type, ! type;value

κ°’ νƒ€μž…

λ‹€μŒμ˜ νƒ€μž…λ“€μ€ λ³€μˆ˜κ°€ 전달될 λ•Œ κ°’(value)이 μ „λ‹¬λ˜λ―€λ‘œ κ°’ νƒ€μž…μ΄λΌκ³ λ„ λΆˆλ¦½λ‹ˆλ‹€. 즉, 이 νƒ€μž…μ΄ ν•¨μˆ˜μ˜ 인자둜 μ‚¬μš©λ˜κ±°λ‚˜ ν• λ‹Ήκ°’μœΌλ‘œ μ‚¬μš©λ  땐, 값이 λ³΅μ‚¬λ©λ‹ˆλ‹€.

.. index:: ! bool, ! true, ! false

Booleans

bool: κ°€λŠ₯ν•œ 값은 μƒμˆ˜ true 그리고 false μž…λ‹ˆλ‹€.

μ—°μ‚°μž:

  • ! (논리 λΆ€μ •)
  • && (논리 AND, "and")
  • || (논리 OR, "or")
  • == (κ°™μŒ)
  • != (같지 μ•ŠμŒ)

|| κ³Ό && μ—λŠ” 일반적인 short-circuiting rules이 μ μš©λ©λ‹ˆλ‹€. 이것은 f(x) || g(y) μ—μ„œ λ§Œμ•½ f(x) κ°€ true 라면, g(y) 의 값을 ν™•μΈν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ λΆ€μž‘μš©μ΄ μžˆμ„ 수 μžˆμŒμ—λ„ λΆˆκ΅¬ν•˜κ³  값을 ν™•μΈν•˜μ§€ μ•ŠλŠ”κ²ƒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

.. index:: ! uint, ! int, ! integer

μ •μˆ˜

int / uint: λ‹€μ–‘ν•œ 크기의 λΆ€ν˜ΈμžˆλŠ” μ •μˆ˜ νƒ€μž…, λΆ€ν˜Έμ—†λŠ” μ •μˆ˜ νƒ€μž…μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€. uint8 μ—μ„œ uint256 κΉŒμ§€, 그리고 int8 λΆ€ν„° int256 κΉŒμ§€ 8λΉ„νŠΈ λ‹¨μœ„λ‘œ ν‚€μ›Œλ“œκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. uint 와 int λŠ” 각각 uint256 와 int256 의 λ³„μΉ­μž…λ‹ˆλ‹€.

μ—°μ‚°μž:

  • 비ꡐ μ—°μ‚°μž: <=, <, ==, !=, >=, > (bool 결과값을 가짐)
  • λΉ„νŠΈ μ—°μ‚°μž: &, |, ^ (배타적 λΉ„νŠΈ or), ~ (λΉ„νŠΈ 보수)
  • μ‚°μˆ  μ—°μ‚°μž: +, -, 단항 -, 단항 +, *, /, % (λ‚˜λ¨Έμ§€), ** (κ±°λ“­μ œκ³±), << (μ™Όμͺ½ μ‹œν”„νŠΈ), >> (였λ₯Έμͺ½ μ‹œν”„νŠΈ)

λ‚˜λˆ—μ…ˆμ˜ κ²°κ³ΌλŠ” 항상 μ •μˆ˜μ΄λ©° μ†Œμˆ˜λΆ€λΆ„μ€ μ ˆμ‚¬λ©λ‹ˆλ‹€(EVM의 DIV opcode둜 컴파일 λ©λ‹ˆλ‹€). κ·ΈλŸ¬λ‚˜ 두 μ—°μ‚°μžκ°€ :ref:`literals<rational_literals>` (λ˜λŠ” λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹)인 경우 μ†Œμˆ˜λΆ€λΆ„μ€ μ ˆμ‚¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

0으둜 λ‚˜λˆ„κ±°λ‚˜ 0으둜 λͺ¨λ“ˆλ‘œ 연산을 ν•˜λ©΄ λŸ°νƒ€μž„ μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€.

μ‹œν”„νŠΈ μ—°μ‚° 결과의 νƒ€μž…μ€ μ™Όμͺ½ ν”Όμ—°μ‚°μžμ˜ νƒ€μž…μ„ λ”°λ¦…λ‹ˆλ‹€. x << y λŠ” x * 2**y 와 λ™μΌν•˜λ©°, x >> y λŠ” x / 2**y 와 λ™μΌν•©λ‹ˆλ‹€. μ΄λŠ” 음수λ₯Ό μ‹œν”„νŠΈν•˜λŠ” 경우 λΆ€ν˜Έκ°€ ν™•μž₯됨을 μ˜λ―Έν•©λ‹ˆλ‹€.(This means that shifting negative numbers sign extends.) 음수만큼 μ‹œν”„νŠΈ 연산을 μ‹€ν–‰ν•˜λŠ” 경우 λŸ°νƒ€μž„ μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€.

Warning

λΆ€ν˜ΈμžˆλŠ” 음의 μ •μˆ˜λ₯Ό 우츑 μ‹œν”„νŠΈ μ—°μ‚° ν•œ 결과값은 λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œμ˜ κ²°κ³Όκ°’κ³Ό λ‹€λ¦…λ‹ˆλ‹€. solidityμ—μ„œλŠ”, 우츑 μ‹œν”„νŠΈλŠ” λ‚˜λˆ—μ…ˆκ³Ό λ§€ν•‘λ˜λ©° 그둜 인해 μ‹œν”„νŠΈλœ 음의 값은 0으둜 λ°˜μ˜¬λ¦Όλ˜μ–΄ κ°‘λ‹ˆλ‹€(μ ˆμ‚¬). λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œλŠ”, 음의 값을 우츑 μ‹œν”„νŠΈμ—°μ‚° ν•˜λŠ” 경우, λ‚˜λˆ—μ…ˆκ³Ό μ†Œμˆ˜μ  μ΄ν•˜ 버림이 λ™μ‹œμ— μž‘λ™ν•˜λŠ”κ²ƒκ³Ό μœ μ‚¬ν•˜κ²Œ λ™μž‘ν•©λ‹ˆλ‹€(음의 λ¬΄ν•œλŒ€ λ°©ν–₯).

.. index:: ! ufixed, ! fixed, ! fixed point number

뢀동 μ†Œμˆ˜μ  숫자

Warning

κ³ μ • μ†Œμˆ˜μ  μˆ˜λŠ” 아직 solidityμ—μ„œ μ™„λ²½ν•˜κ²Œ μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ³ μ • μ†Œμˆ˜μ  μˆ˜λŠ” 선언될 μˆ˜λŠ” μžˆμ§€λ§Œ 할당될 μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.

fixed / ufixed: λ‹€μ–‘ν•œ 크기의 λΆ€ν˜ΈμžˆλŠ” κ³ μ • μ†Œμˆ˜μ , λΆ€ν˜Έμ—†λŠ” κ³ μ • μ†Œμˆ˜μ  νƒ€μž…μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€. ν‚€μ›Œλ“œ ufixedMxN 와 fixedMxN μ—μ„œ M 은 νƒ€μž…μ— μ˜ν•΄ 취해진 λΉ„νŠΈμ˜ 수λ₯Ό λ‚˜νƒ€λ‚΄λ©° N 은 μ†Œμˆ˜μ μ΄ν•˜ 자리수λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. M 은 8μ—μ„œ 256λΉ„νŠΈ μ‚¬μ΄μ˜ 값이며 λ°˜λ“œμ‹œ 8둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ Έμ•Ό ν•©λ‹ˆλ‹€. N 은 0κ³Ό 80 μ‚¬μ΄μ˜ κ°’μ΄μ–΄μ•Όλ§Œ ν•©λ‹ˆλ‹€. ufixed 와 fixed λŠ” 각각 ufixed128x19 와 fixed128x19 의 λ³„μΉ­μž…λ‹ˆλ‹€.

μ—°μ‚°μž:

  • 비ꡐ μ—°μ‚°μž: <=, <, ==, !=, >=, > (bool 결과값을 가짐)
  • μ‚°μˆ  μ—°μ‚°μž: +, -, 단항 -, 단항 +, *, /, % (λ‚˜λ¨Έμ§€)

Note

뢀동 μ†Œμˆ˜μ  μˆ˜μ™€ κ³ μ • μ†Œμˆ˜μ  수의 μ£Όμš”ν•œ 차이점은, 뢀동 μ†Œμˆ˜μ  μˆ˜λŠ” μ •μˆ˜μ™€ μ†Œμˆ˜μ  뢀뢄을 ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” λΉ„νŠΈμ˜ μˆ˜κ°€ μœ λ™μ μΈλ° λ°˜ν•΄, κ³ μ • μ†Œμˆ˜μ μ˜ 경우 μ—„κ²©νžˆ μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 일반적으둜, 뢀동 μ†Œμˆ˜μ  λ°©μ‹μ—μ„œλŠ” 거의 λͺ¨λ“  곡간이 μ†Œμˆ˜ 뢀뢄을 λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ μ‚¬μš©λ˜μ§€λ§Œ κ³ μ • μ†Œμˆ˜μ  λ°©μ‹μ—μ„œλŠ” 적은 수의 λΉ„νŠΈλ§Œμ΄ μ†Œμˆ˜ 뢀뢄을 μ •μ˜ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€.

.. index:: address, balance, send, call, callcode, delegatecall, transfer

Address

address : 20λ°”μ΄νŠΈ(이더리움 address의 크기)λ₯Ό 담을 수 μžˆμŠ΅λ‹ˆλ‹€. address νƒ€μž…μ—λŠ” 멀버가 있으며 λͺ¨λ“  μ»¨νŠΈλž™νŠΈμ˜ 기반이 λ©λ‹ˆλ‹€.

μ—°μ‚°μž:

  • <=, <, ==, !=, >= and >

Note

0.5.0으둜 μ‹œμž‘ν•˜λŠ” λ²„μ „μ˜ μ»¨νŠΈλž™νŠΈλŠ” address νƒ€μž…μ—μ„œ νŒŒμƒλ˜μ§€ μ•Šμ•˜μ§€λ§Œ, address νƒ€μž…μœΌλ‘œ λͺ…μ‹œμ  λ³€ν™˜λ  수 μžˆμŠ΅λ‹ˆλ‹€.

address의 members
  • balance 와 transfer

λΉ λ₯΄κ²Œ ν›‘μœΌλ €λ©΄ :ref:`address_related` λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

balance 속성을 μ΄μš©ν•˜μ—¬ address의 μž”κ³ λ₯Ό μ‘°νšŒν•˜κ³  transfer ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ λ‹€λ₯Έ address에 Etherλ₯Ό (wei λ‹¨μœ„λ‘œ) 보낼 수 μžˆμŠ΅λ‹ˆλ‹€:

address x = 0x123;
address myAddress = this;
if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10);

Note

x κ°€ μ»¨νŠΈλž™νŠΈ address인 경우, μ½”λ“œ(더 κ΅¬μ²΄μ μœΌλ‘œλŠ”: fallback ν•¨μˆ˜κ°€ μ‘΄μž¬ν•˜λŠ” 경우)λŠ” transfer 호좜과 ν•¨κ»˜
싀행될 κ²ƒμž…λ‹ˆλ‹€(이건 EVM의 νŠΉμ„±μ΄λ©° 막을 수 μ—†μŠ΅λ‹ˆλ‹€). μ½”λ“œκ°€ μ‹€ν–‰λ λ•Œ κ°€μŠ€κ°€ λΆ€μ‘±ν•˜κ±°λ‚˜ μ–΄λ–€μ‹μœΌλ‘œλ“  μ‹€νŒ¨ν•œλ‹€λ©΄, Ether 전솑은 μ›μƒλ³΅κ΅¬λ˜λ©° ν˜„μž¬μ˜ μ»¨νŠΈλž™νŠΈλŠ” μ˜ˆμ™Έλ₯Ό λ°œμƒν•˜λ©° μ€‘μ§€λ©λ‹ˆλ‹€.
  • send

SendλŠ” low-level μˆ˜μ€€μ—μ„œ transfer 에 λŒ€μ‘λ©λ‹ˆλ‹€. 싀행이 μ‹€νŒ¨ν•˜λ©΄ μ»¨νŠΈλž™νŠΈλŠ” μ€‘λ‹¨λ˜μ§€ μ•Šκ³  λŒ€μ‹  send κ°€ false λ₯Ό λ°˜ν™˜ν•  κ²ƒμž…λ‹ˆλ‹€.

Warning

send λ₯Ό μ‚¬μš©ν•  땐 λͺ‡κ°€μ§€ μ£Όμ˜μ‚¬ν•­μ΄ μžˆμŠ΅λ‹ˆλ‹€: call stack의 κΉŠμ΄κ°€ 1024라면 전솑은 μ‹€νŒ¨ν•˜λ©°(이것은 항상 ν˜ΈμΆœμžμ— μ˜ν•΄ κ°•μ œ 될 수 μžˆμŠ΅λ‹ˆλ‹€) 그리고 μˆ˜μ‹ μžμ˜ gasκ°€ μ „λΆ€ μ†Œλͺ¨λ˜μ–΄λ„ μ‹€νŒ¨ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ―€λ‘œ μ•ˆμ „ν•œ Ether 전솑을 μœ„ν•΄μ„œ, 항상 send 의 λ°˜ν™˜κ°’μ„ ν™•μΈν•˜κ³ , transfer λ₯Ό μ‚¬μš©ν•˜μ„Έμš”: ν˜Ήμ€ 더 쒋은 방법은 μˆ˜μ‹ μžκ°€ λˆμ„ μΈμΆœν•˜λŠ” νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

  • call, callcode 그리고 delegatecall

λ˜ν•œ, ABIλ₯Ό μ€€μˆ˜ν•˜μ§€ μ•ŠλŠ” μ»¨νŠΈλž™νŠΈμ™€ μƒν˜Έμž‘μš©ν•˜κΈ° μœ„ν•˜μ—¬ μž„μ˜ 숫자의 인자λ₯Ό μ·¨ν•˜λŠ” call ν•¨μˆ˜κ°€ 제곡되며 인자의 νƒ€μž… μ—­μ‹œ λͺ¨λ“  νƒ€μž…μ„ μ·¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μΈμžλŠ” 32λ°”μ΄νŠΈκ°€ 될 λ•ŒκΉŒμ§€ μ±„μ›Œμ§€κ³  μ—°κ²°λ©λ‹ˆλ‹€. ν•œ 가지 μ˜ˆμ™ΈλŠ” 첫 번째 μΈμžκ°€ μ •ν™•νžˆ 4λ°”μ΄νŠΈλ‘œ 인코딩 λ˜λŠ” κ²½μš°μž…λ‹ˆλ‹€. 이 κ²½μš°μ—λŠ”, ν•¨μˆ˜ μ„œλͺ…이 μ‚¬μš©λ˜λ„λ‘ ν•˜κΈ° μœ„ν•΄ μΈμžκ°€ μ±„μ›Œμ§€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

address nameReg = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2;
nameReg.call("register", "MyName");
nameReg.call(bytes4(keccak256("fun(uint256)")), a);

call 은 호좜된 ν•¨μˆ˜κ°€ μ’…λ£Œλ˜μ—ˆλŠ”μ§€(true) μ•„λ‹ˆλ©΄ EVM μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œμΌ°λŠ”μ§€λ₯Ό(false) λ‚˜νƒ€λ‚΄λŠ” boolean을 λ°˜ν™˜ν•©λ‹ˆλ‹€. λ°˜ν™˜λœ 데이터 μžμ²΄μ— μ ‘κ·Όν•˜λŠ”κ±΄ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€(이λ₯Ό μœ„ν•΄μ„  μš°λ¦¬λŠ” 인코딩과 크기λ₯Ό 미리 μ•Œκ³  μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€).

.gas () μ œμ–΄μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 제곡된 κ°€μŠ€λ₯Ό μ‘°μ ˆν•  수 μžˆμŠ΅λ‹ˆλ‹€:

namReg.call.gas(1000000)("register", "MyName");

이와 μœ μ‚¬ν•˜κ²Œ, 제곡된 Ether의 값도 μ—­μ‹œ μ‘°μ ˆν•  수 μžˆμŠ΅λ‹ˆλ‹€:

nameReg.call.value(1 ether)("register", "MyName");

λ§ˆμ§€λ§‰μœΌλ‘œ, 이 μ œν•œμžλ“€μ€ ν•¨κ»˜ μ‚¬μš©ν•  수 있으며 μˆœμ„œλŠ” 상관 μ—†μŠ΅λ‹ˆλ‹€:

nameReg.call.gas(1000000).value(1 ether)("register", "MyName");

Note

ν˜„μž¬λ‘œμ„œλŠ” μ˜€λ²„λ‘œλ”©λœ ν•¨μˆ˜μ—μ„œ κ°€μŠ€ μ œν•œμžλ‚˜ κ°’ μ œν•œμžλ₯Ό μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

이λ₯Ό μœ„ν•œ 해결책은 κ°€μŠ€μ™€ 값에 κ΄€ν•΄ νŠΉμˆ˜ν•œ κ²½μš°κ°€ μžˆλ‹€λŠ”κ±Έ μ†Œκ°œν•˜κ³  λ‹€μ‹œ ν•œλ²ˆ 더 문제λ₯Ό μΌμœΌν‚€μ§€ μ•ŠλŠ”μ§€ ν™•μΈν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

이와 μœ μ‚¬ν•˜κ²Œ, ν•¨μˆ˜ delegatecall 을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€: 차이점은, 주어진 μ£Όμ†Œμ—μ„  였직 μ½”λ“œλ§Œ μ‚¬μš©λ˜κ³ , λ‹€λ₯Έ 것듀(μ €μž₯μ†Œ, μž”κ³ , ...)은 ν˜„μž¬ μ»¨νŠΈλž™νŠΈμ˜ 것을 μ‚¬μš©ν•©λ‹ˆλ‹€. delegatecall 의 λͺ©μ μ€ λ‹€λ₯Έ μ»¨νŠΈλž™νŠΈμ— μ €μž₯된 라이브러리 μ½”λ“œλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€. μ‚¬μš©μžλŠ” μ–‘μͺ½ μ»¨νŠΈλž™νŠΈμ˜ μ €μž₯μ†Œ λ ˆμ΄μ•„μ›ƒμ΄ delegatecall을 톡해 μ‚¬μš©λ˜κΈ° μ ν•©ν•œμ§€ λ°˜λ“œμ‹œ 확인해야 ν•©λ‹ˆλ‹€. homestead 단계 μ „κΉŒμ§€λŠ”, callcode 라고 λΆˆλ¦¬λŠ” delegatecall의 μ œν•œλœ λ³€ν˜•ν˜•νƒœλ§Œμ΄ μ΄μš©κ°€λŠ₯ν–ˆλŠ”λ°, 이 λ³€ν˜•λœ ν˜•νƒœλŠ” msg.sender 와 msg.value 에 μ ‘κ·Όν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

μ„Έ 가지 ν•¨μˆ˜ call, delegatecall 및 callcode λŠ” 맀우 low-level ν•¨μˆ˜μ΄λ―€λ‘œ Solidity의 νƒ€μž… μ•ˆμ „μ„±μ„ κΉ¨λœ¨λ¦¬λ‹ˆ μ΅œν›„μ˜ μˆ˜λ‹¨ μœΌλ‘œμ„œλ§Œ μ‚¬μš©ν•΄μ•Όν•©λ‹ˆλ‹€.

.gas () μ˜΅μ…˜μ€ μ„Έ 가지 λ©”μ†Œλ“œ λͺ¨λ‘μ—μ„œ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, .value () μ˜΅μ…˜μ€ delegatecall μ—μ„œ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

Note

λͺ¨λ“  μ»¨νŠΈλž™νŠΈλŠ” address의 멀버λ₯Ό μƒμ†ν•˜λ―€λ‘œ, this.balance λ₯Ό μ΄μš©ν•˜μ—¬ ν˜„μž¬ μ»¨νŠΈλž™νŠΈμ˜ μž”μ•‘μ„ μ‘°νšŒν•˜λŠ”κ²ƒμ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

Note

callcode λŠ” μΆ”ν›„ λ²„μ „μ—μ„œ 제거 될 μ˜ˆμ •μ΄λΌ μ‚¬μš©μ„ ꢌμž₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

Warning

이 ν•¨μˆ˜λ“€μ€ low-level ν•¨μˆ˜μ΄λ―€λ‘œ μ£Όμ˜ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. 특히 μ•Œμ§€ λͺ»ν•˜λŠ” μ»¨νŠΈλž™νŠΈλŠ” μœ„ν—˜ν•  수 있으며 λ§Œμ•½ 이λ₯Ό ν˜ΈμΆœν•  경우 ν•΄λ‹Ή μ»¨νŠΈλž™νŠΈμ— λŒ€ν•œ μ œμ–΄ κΆŒν•œμ„ λ„˜κ²¨μ£Όλ―€λ‘œ 호좜이 λ°˜ν™˜λ  λ•Œ μƒνƒœ λ³€μˆ˜λ₯Ό λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

.. index:: byte array, bytes32


κ³ μ • 크기 λ°”μ΄νŠΈ λ°°μ—΄

bytes1, bytes2, bytes3, ..., bytes32. byte is an alias for bytes1.

μ—°μ‚°μž:

  • 비ꡐ μ—°μ‚°μž: <=, <, ==, !=, >=, > (bool 결과값을 가짐)
  • λΉ„νŠΈ μ—°μ‚°μž: &, |, ^ (배타적 λΉ„νŠΈ or), ~ (λΉ„νŠΈ 보수), << (μ™Όμͺ½ μ‹œν”„νŠΈ), >> (였λ₯Έμͺ½ μ‹œν”„νŠΈ)
  • 인덱슀 μ ‘κ·Ό: λ§Œμ•½ x κ°€ bytesI νƒ€μž…μ΄λΌλ©΄, 0 <= k < I μΌλ•Œ x[k] λŠ” k 번째 λ°”μ΄νŠΈλ₯Ό λ°˜ν™˜ν•œλ‹€(읽기 μ „μš©).

μ‹œν”„νŠΈ μ—°μ‚°μžλŠ” λͺ‡ λΉ„νŠΈλ§ŒνΌ 이동할건지λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 였λ₯Έμͺ½ ν”Όμ—°μ‚°μžλ‘œ λͺ¨λ“  μ •μˆ˜λ₯Ό μ·¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€(κ·Έλ ‡μ§€λ§Œ μ™Όμͺ½ ν”Όμ—°μ‚°μžμ˜ νƒ€μž…μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€). 음수만큼 μ‹œν”„νŠΈν•˜λŠ” 경우 λŸ°νƒ€μž„ μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€.

Members:

  • .length λŠ” λ°”μ΄νŠΈ λ°°μ—΄μ˜ κ³ μ •λœ 길이λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€(읽기 μ „μš©).

Note

λ°”μ΄νŠΈ 배열은 byte[] λ‘œλ„ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜μ§€λ§Œ, 이럴 경우 각 μš”μ†Œλ§ˆλ‹€ μ •ν™•νžˆ 31λ°”μ΄νŠΈμ˜ 곡간을 λ‚­λΉ„ν•˜κ²Œλ©λ‹ˆλ‹€. bytes λ₯Ό μ‚¬μš©ν•˜λŠ”κ²ƒμ΄ 더 λ‚«μŠ΅λ‹ˆλ‹€.

동적 크기 λ°”μ΄νŠΈ λ°°μ—΄

bytes:
동적 크기 λ°”μ΄νŠΈ λ°°μ—΄, :ref:`arrays` 을 μ°Έμ‘°ν•˜μ„Έμš”. κ°’ νƒ€μž…μ΄ μ•„λ‹™λ‹ˆλ‹€!
string:
동적 크기의 UTF-8 μΈμ½”λ”©λœ λ¬Έμžμ—΄, :ref:`arrays` 을 μ°Έμ‘°ν•˜μ„Έμš”. κ°’ νƒ€μž…μ΄ μ•„λ‹™λ‹ˆλ‹€!

κ²½ν—˜μ— λ”°λ₯΄λ©΄ μž„μ˜ 길이의 μ›μ‹œ λ°”μ΄νŠΈ λ°μ΄ν„°μ˜ κ²½μš°μ—λŠ” bytes λ₯Ό μ‚¬μš©ν•˜κ³  μž„μ˜ 길이의 λ¬Έμžμ—΄(UTF-8) λ°μ΄ν„°μ˜ κ²½μš°μ—λŠ” string 을 μ‚¬μš©ν•˜μ„Έμš”. λ§Œμ•½ 길이λ₯Ό νŠΉμ • λ°”μ΄νŠΈλ§ŒνΌ μ œν•œν• μˆ˜ μžˆλ‹€λ©΄, 항상 bytes1 μ—μ„œ bytes32 쀑 ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•˜μ„Έμš”. μ™œλƒν•˜λ©΄ 곡간을 더 μ ˆμ•½ν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

.. index:: address, literal;address

Address λ¦¬ν„°λŸ΄

address 체크섬 ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όν•œ 16μ§„μˆ˜ λ¦¬ν„°λŸ΄(예λ₯Ό λ“€λ©΄ 0xdCad3a6d3569DF655070DEd06cb7A1b2Ccd1D3AF)은 address νƒ€μž…μž…λ‹ˆλ‹€. 체크섬 ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όν•˜μ§€ λͺ»ν•œ 39자리 ~ 41자리 길이의 16μ§„μˆ˜ λ¦¬ν„°λŸ΄μ€ κ²½κ³ λ₯Ό λ°œμƒμ‹œν‚€κ³  일반적인 유리수 λ¦¬ν„°λŸ΄λ‘œ μ·¨κΈ‰λ©λ‹ˆλ‹€.

Note

ν˜Όν•© μΌ€μ΄μŠ€ address의 체크섬 ν˜•μ‹μ€ EIP-55 에 μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

.. index:: literal, literal;rational

유리수 λ¦¬ν„°λŸ΄ 및 μ •μˆ˜ λ¦¬ν„°λŸ΄

μ •μˆ˜ λ¦¬ν„°λŸ΄μ€ 0-9 λ²”μœ„μ˜ 일련의 숫자둜 κ΅¬μ„±λ©λ‹ˆλ‹€. μ •μˆ˜ λ¦¬ν„°λŸ΄μ€ μ‹­μ§„λ²•μœΌλ‘œ λ‚˜νƒ€λ‚΄μ–΄μ§‘λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 69 λŠ” μœ‘μ‹­κ΅¬λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 8진법 λ¦¬ν„°λŸ΄μ€ solidity에 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©° μ„ ν–‰ 0은 μœ νš¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ†Œμˆ˜μ  μ΄ν•˜ λ¦¬ν„°λŸ΄μ€ ν•œμͺ½μ— 적어도 ν•˜λ‚˜μ˜ μˆ«μžκ°€ μžˆμ„λ•Œ . 에 μ˜ν•΄ κ΅¬μ„±λ©λ‹ˆλ‹€. μ˜ˆλ‘œλŠ” 1., .1, 1.3 이 μžˆμŠ΅λ‹ˆλ‹€.

μ†Œμˆ˜κ°€ 밑이 될 수 μžˆμ§€λ§Œ μ§€μˆ˜λŠ” 될 수 μ—†λŠ” 과학적 ν‘œκΈ°λ²• λ˜ν•œ μ§€μ›λ©λ‹ˆλ‹€. 2e10, -2e10, 2e-10, 2.5e1 같은 μ˜ˆκ°€ μžˆμŠ΅λ‹ˆλ‹€.

숫자 λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μ€ λ¦¬ν„°λŸ΄μ΄ μ•„λ‹Œ νƒ€μž…μœΌλ‘œ λ³€ν™˜λ λ•ŒκΉŒμ§€(즉, λ¦¬ν„°λŸ΄μ΄ μ•„λ‹Œ ν‘œν˜„μ‹κ³Ό ν•¨κ»˜ μ‚¬μš©λ˜λŠ” 경우) μž„μ˜ 정밀도λ₯Ό μœ μ§€ν•©λ‹ˆλ‹€. μ΄λŠ” 계산이 μˆ˜ν–‰λ λ•Œ μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•˜μ§€ μ•ŠμœΌλ©° λ‚˜λˆ—μ…ˆμ΄ μˆ˜ν–‰λ λ•Œ 자릿수λ₯Ό μž˜λΌλ‚΄μ§€ μ•ŠλŠ”κ±Έ μ˜λ―Έν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, (2**800 + 1) - 2**800 의 κ²°κ³ΌλŠ” 비둝 쀑간 결과값이 machine word size에 μ ν•©ν•˜μ§€ μ•Šμ„μ§€λΌλ„ μƒμˆ˜ 1 (uint8 νƒ€μž…)μž…λ‹ˆλ‹€. κ²Œλ‹€κ°€ .5 * 8 의 결과값은 (비둝 쀑간에 μ •μˆ˜κ°€ μ•„λ‹Œ μˆ«μžκ°€ μ‚¬μš©λ˜μ—ˆμ„μ§€λΌλ„) μ •μˆ˜ 4 μž…λ‹ˆλ‹€.

μ •μˆ˜μ— μ‚¬μš©ν•  수 μžˆλŠ” μ—°μ‚°μžλŠ” ν”Όμ—°μ‚°μžκ°€ μ •μˆ˜μΈ 숫자 λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μ—λ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (ν”Όμ—°μ‚°μž) λ‘˜ 쀑 ν•˜λ‚˜λΌλ„ μ†Œμˆ˜μΌ κ²½μš°μ—λŠ”, λΉ„νŠΈ 연산이 ν—ˆμš©λ˜μ§€ μ•ŠμœΌλ©° μ§€μˆ˜κ°€ μ†Œμˆ˜μΌ κ²½μš°μ—λ„ μ§€μˆ˜ 연산이 ν—ˆμš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(λ¬΄λ¦¬μˆ˜κ°€ λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ).

Note

solidityλŠ” 각 μœ λ¦¬μˆ˜μ— λŒ€ν•΄ 숫자 λ¦¬ν„°λŸ΄ νƒ€μž…μ„ κ°€μ§‘λ‹ˆλ‹€. μ •μˆ˜ λ¦¬ν„°λŸ΄κ³Ό 유리수 λ¦¬ν„°λŸ΄μ€ 숫자 λ¦¬ν„°λŸ΄ νƒ€μž…μ— μ†ν•©λ‹ˆλ‹€. λ˜ν•œ λͺ¨λ“  숫자 λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹(즉, 였직 숫자 λ¦¬ν„°λŸ΄κ³Ό μ—°μ‚°μžλ‘œλ§Œ κ΅¬μ„±λœ ν‘œν˜„μ‹)은 숫자 λ¦¬ν„°λŸ΄ νƒ€μž…μ— μ†ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ―€λ‘œ 숫자 λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹ 1 + 2 와 2 + 1 λͺ¨λ‘ 유리수 3에 λŒ€ν•΄ 같은 숫자 λ¦¬ν„°λŸ΄ νƒ€μž…μ— μ†ν•©λ‹ˆλ‹€.

Warning

이전 λ²„μ „μ—μ„œλŠ” μ •μˆ˜ λ¦¬ν„°λŸ΄μ— λŒ€ν•œ λ‚˜λˆ—μ…ˆμ˜ κ²°κ³Όμ—μ„œ 자릿수λ₯Ό λ²„λ Έμ§€λ§Œ, ν˜„μž¬λŠ” 유리수둜 λ³€ν™˜λ©λ‹ˆλ‹€. 즉 5 / 2 λŠ” 2 κ°€ μ•„λ‹ˆλΌ 2.5 μž…λ‹ˆλ‹€.

Note

숫자 λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μ€ λ¦¬ν„°λŸ΄μ΄ μ•„λ‹Œ ν‘œν˜„μ‹κ³Ό ν•¨κ»˜ μ‚¬μš©λ˜λŠ” μ¦‰μ‹œ λ¦¬ν„°λŸ΄μ΄ μ•„λ‹Œ νƒ€μž…μœΌλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€. 비둝 μš°λ¦¬λŠ” λ‹€μŒ μ˜ˆμ œμ—μ„œ b 에 ν• λ‹Ήλœ 값이 μ •μˆ˜λ‘œ ν‰κ°€λœλ‹€λŠ”κ±Έ μ•Œκ³  μžˆμ§€λ§Œ, λΆ€λΆ„ ν‘œν˜„μ‹ 2.5 + a 은 νƒ€μž… 검사λ₯Ό ν•˜μ§€ μ•ŠμœΌλ©° μ½”λ“œλŠ” μ»΄νŒŒμΌλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

uint128 a = 1;
uint128 b = 2.5 + a + 0.5;
.. index:: literal, literal;string, string

λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄

λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄μ€ ν°λ”°μ˜΄ν‘œλ‚˜ μž‘μ€λ”°μ˜΄ν‘œμ™€ ν•¨κ»˜ μž‘μ„±λ©λ‹ˆλ‹€("foo" λ˜λŠ” 'bar'). solidity에선 Cμ—μ„œ 처럼 trailing zeroesλ₯Ό ν¬ν•¨ν•˜μ§„ μ•ŠμŠ΅λ‹ˆλ‹€; "foo" λŠ” 4λ°”μ΄νŠΈκ°€ μ•„λ‹Œ 3λ°”μ΄νŠΈλ₯Ό μ°¨μ§€ν•©λ‹ˆλ‹€. μ •μˆ˜ λ¦¬ν„°λŸ΄κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ, λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄μ˜ νƒ€μž…μ€ λ‹€μ–‘ν•˜λ©° bytes1, ..., bytes32 둜 μ•”μ‹œμ  λ³€ν™˜λ  수 μžˆμŠ΅λ‹ˆλ‹€. μ ν•©ν•œ 크기라면 bytes 와 string μœΌλ‘œλ„ λ³€ν™˜λ  수 μžˆμŠ΅λ‹ˆλ‹€.

λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄μ€ \n, \xNN, \uNNNN 와 같은 escape characters을 μ§€μ›ν•©λ‹ˆλ‹€. \xNN 은 16μ§„μˆ˜ 값을 μ·¨ν•΄ μ μ ˆν•œ λ°”μ΄νŠΈλ₯Ό μ‚½μž…ν•˜λŠ” 반면 \uNNNN 은 Unicode codepointλ₯Ό μ·¨ν•΄ UTF-8 sequenceλ₯Ό μ‚½μž…ν•©λ‹ˆλ‹€.

.. index:: literal, bytes

16μ§„μˆ˜ λ¦¬ν„°λŸ΄

16μ§„μˆ˜ λ¦¬ν„°λŸ΄μ€ ν‚€μ›Œλ“œ hex κ°€ μ ‘λ‘μ‚¬λ‘œ λΆ™κ³  ν°λ”°μ˜΄ν‘œλ‚˜ μž‘μ€λ”°μ˜΄ν‘œλ‘œ λ‘˜λŸ¬μ‹Έμ—¬μ§‘λ‹ˆλ‹€(hex"001122FF"). λ‚΄μš©μ€ 16μ§„μˆ˜ λ¬Έμžμ—΄μ΄μ–΄μ•Ό ν•˜λ©° 값은 λ°”μ΄λ„ˆλ¦¬λ‘œ ν‘œν˜„λ©λ‹ˆλ‹€.

16μ§„μˆ˜ λ¦¬ν„°λŸ΄μ€ λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄κ³Ό 같이 λ™μž‘ν•˜κΈ°μ— λ™μΌν•˜κ²Œ 변경에 μ œν•œμ΄ μžˆμŠ΅λ‹ˆλ‹€.

.. index:: enum

Enums

μ—΄κ±°ν˜•μ€ solidityμ—μ„œ μ‚¬μš©μž μ •μ˜ νƒ€μž…μ„ λ§Œλ“œλŠ” ν•œ 가지 λ°©λ²•μž…λ‹ˆλ‹€. μ—΄κ±°ν˜•μ€ λͺ¨λ“  μ •μˆ˜νƒ€μž…μœΌλ‘œ/μ •μˆ˜νƒ€μž…μ—μ„œ λͺ…μ‹œμ  λ³€ν™˜μ΄ κ°€λŠ₯ν•˜μ§€λ§Œ μ•”μ‹œμ  λ³€ν™˜μ€ ν—ˆμš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λͺ…μ‹œμ  λ³€ν™˜μ€ λŸ°νƒ€μž„λ•Œ κ°’ λ²”μœ„λ₯Ό μ²΄ν¬ν•˜κ³  μ‹€νŒ¨μ‹œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€. μ—΄κ±°ν˜•μ€ μ΅œμ†Œ ν•˜λ‚˜μ˜ 멀버λ₯Ό ν•„μš”λ‘œ ν•©λ‹ˆλ‹€.

pragma solidity ^0.4.16;

contract test {
    enum ActionChoices { GoLeft, GoRight, GoStraight, SitStill }
    ActionChoices choice;
    ActionChoices constant defaultChoice = ActionChoices.GoStraight;

    function setGoStraight() public {
        choice = ActionChoices.GoStraight;
    }

    // Since enum types are not part of the ABI, the signature of "getChoice"
    // will automatically be changed to "getChoice() returns (uint8)"
    // for all matters external to Solidity. The integer type used is just
    // large enough to hold all enum values, i.e. if you have more values,
    // `uint16` will be used and so on.
    function getChoice() public view returns (ActionChoices) {
        return choice;
    }

    function getDefaultChoice() public pure returns (uint) {
        return uint(defaultChoice);
    }
}
.. index:: ! function type, ! type; function

ν•¨μˆ˜ νƒ€μž…

ν•¨μˆ˜ νƒ€μž…μž…λ‹ˆλ‹€. ν•¨μˆ˜ νƒ€μž…μ˜ λ³€μˆ˜λŠ” ν•¨μˆ˜μ—μ„œ ν• λ‹Ή 될 수 있으며 ν•¨μˆ˜ νƒ€μž…μ˜ ν•¨μˆ˜λ§€κ°œλ³€μˆ˜λŠ” ν•¨μˆ˜κ°€ 호좜될 λ•Œ, ν•¨μˆ˜λ₯Ό μ „λ‹¬ν•˜κ±°λ‚˜ λ°˜ν™˜ν•˜λŠ”λ° μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜ νƒ€μž…μ—λŠ” 두 μ’…λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€ - λ‚΄λΆ€ 및 μ™ΈλΆ€ ν•¨μˆ˜ μž…λ‹ˆλ‹€:

λ‚΄λΆ€ ν•¨μˆ˜λŠ” 였직 ν˜„μž¬ μ»¨νŠΈλž™νŠΈμ˜ λ‚΄λΆ€μ—μ„œλ§Œ(더 κ΅¬μ²΄μ μœΌλ‘œλŠ”, λ‚΄λΆ€ 라이브러리 ν•¨μˆ˜μ™€ 상속받은 ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•œ ν˜„μž¬ μ½”λ“œ μœ λ‹› λ‚΄λΆ€μ—μ„œλ§Œ) 호좜될 수 μžˆμŠ΅λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ λ‚΄λΆ€ ν•¨μˆ˜λŠ” ν˜„μž¬ μ»¨νŠΈλž™νŠΈμ˜ μ»¨ν…μŠ€νŠΈ λ°–μ—μ„œ 싀행될 수 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λ‚΄λΆ€ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ”κ²ƒμ€ 마치 ν˜„μž¬ μ»¨νŠΈλž™νŠΈμ˜ ν•¨μˆ˜λ₯Ό λ‚΄λΆ€μ μœΌλ‘œ ν˜ΈμΆœν• λ–„μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ entry label둜 κ°€μ„œ μ‹€ν˜„λ©λ‹ˆλ‹€.

μ™ΈλΆ€ ν•¨μˆ˜λŠ” address와 ν•¨μˆ˜ μ„œλͺ…μœΌλ‘œ κ΅¬μ„±λ˜λ©° μ™ΈλΆ€ ν•¨μˆ˜ ν˜ΈμΆœμ„ 톡해 μ „λ‹¬λ˜κ³  λ°˜ν™˜ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•¨μˆ˜ νƒ€μž…μ€ λ‹€μŒκ³Ό 같이 ν‘œκΈ°λ©λ‹ˆλ‹€:

function (<parameter types>) {internal|external} [pure|constant|view|payable] [returns (<return types>)]

λ§€κ°œλ³€μˆ˜ νƒ€μž…κ³Ό 달리, λ°˜ν™˜ νƒ€μž…μ€ λΉ„μ›Œ λ‘˜ 수 μ—†μŠ΅λ‹ˆλ‹€. ν•¨μˆ˜ νƒ€μž…μ΄ 아무것도 λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ returns (<return types>) 이 λΆ€λΆ„ 전체λ₯Ό μƒλž΅ν•΄μ•Ό ν•©λ‹ˆλ‹€.

기본적으둜, ν•¨μˆ˜ νƒ€μž…μ€ λ‚΄λΆ€ν•¨μˆ˜μ΄λ―€λ‘œ, internal ν‚€μ›Œλ“œλŠ” μƒλž΅ κ°€λŠ₯ν•©λ‹ˆλ‹€. λ°˜λŒ€λ‘œ, μ»¨νŠΈλž™νŠΈ ν•¨μˆ˜ μžμ²΄λŠ” 기본적으둜 public이며 νƒ€μž…μ˜ μ΄λ¦„μœΌλ‘œ μ‚¬μš©λ  λ•Œλ§Œ 기본값이 internal μž…λ‹ˆλ‹€.

ν˜„μž¬ μ»¨νŠΈλž™νŠΈμ—μ„œ ν•¨μˆ˜μ— μ ‘κ·Όν•˜λŠ” 방법은 두가지가 μžˆμŠ΅λ‹ˆλ‹€: f μ΄λ ‡κ²Œ 직접 이름을 μ‚¬μš©ν•˜κ±°λ‚˜, this.f μ΄λŸ°μ‹μœΌλ‘œ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ „μžλŠ” λ‚΄λΆ€ν•¨μˆ˜, ν›„μžλŠ” μ™ΈλΆ€ν•¨μˆ˜κ°€ 될 κ²ƒμž…λ‹ˆλ‹€.

ν•¨μˆ˜ νƒ€μž… λ³€μˆ˜κ°€ μ΄ˆκΈ°ν™” λ˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ, 이λ₯Ό ν˜ΈμΆœν•˜λ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€. ν•¨μˆ˜μ— delete λ₯Ό μ‚¬μš© ν›„ κ·Έ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” κ²½μš°μ—λ„ λ™μΌν•˜κ²Œ μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€.

μ™ΈλΆ€ ν•¨μˆ˜ νƒ€μž…μ΄ solidity μ»¨ν…μŠ€νŠΈμ˜ μ™ΈλΆ€μ—μ„œ μ‚¬μš©λ˜λŠ” 경우, 이듀은 뒀에 ν•¨μˆ˜ μ‹λ³„μžκ°€ λΆ™λŠ” addressλ₯Ό 단일 bytes24 νƒ€μž…μœΌλ‘œ μΈμ½”λ”©ν•˜λŠ” function 으둜 μ·¨κΈ‰λ©λ‹ˆλ‹€.

ν˜„μž¬ μ»¨νŠΈλž™νŠΈμ˜ 퍼블릭 ν•¨μˆ˜λŠ” λ‚΄λΆ€ ν•¨μˆ˜λ‘œλ„ μ™ΈλΆ€ν•¨μˆ˜λ‘œλ„ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. f λ₯Ό λ‚΄λΆ€ ν•¨μˆ˜λ‘œ μ‚¬μš©ν•˜λ €λ©΄, f 만 μ‚¬μš©ν•˜κ³  μ™ΈλΆ€ ν•¨μˆ˜λ‘œ μ‚¬μš©ν•˜λ €λ©΄ this.f 둜 μ‚¬μš©ν•˜μ„Έμš”.

λ˜ν•œ 퍼블릭 (λ˜λŠ” external) ν•¨μˆ˜μ—λŠ” :ref:`ABI function selector <abi_function_selector>` λ₯Ό λ°˜ν™˜ν•˜λŠ” νŠΉμˆ˜ν•œ 멀버 selector κ°€ μžˆμŠ΅λ‹ˆλ‹€.

pragma solidity ^0.4.16;

contract Selector {
function f() public view returns (bytes4) {
return this.f.selector;

}

}

λ‚΄λΆ€ ν•¨μˆ˜ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 방법을 λ³΄μ—¬μ£ΌλŠ” 예제:

pragma solidity ^0.4.16;

library ArrayUtils {
  // internal functions can be used in internal library functions because
  // they will be part of the same code context
  function map(uint[] memory self, function (uint) pure returns (uint) f)
    internal
    pure
    returns (uint[] memory r)
  {
    r = new uint[](self.length);
    for (uint i = 0; i < self.length; i++) {
      r[i] = f(self[i]);
    }
  }
  function reduce(
    uint[] memory self,
    function (uint, uint) pure returns (uint) f
  )
    internal
    pure
    returns (uint r)
  {
    r = self[0];
    for (uint i = 1; i < self.length; i++) {
      r = f(r, self[i]);
    }
  }
  function range(uint length) internal pure returns (uint[] memory r) {
    r = new uint[](length);
    for (uint i = 0; i < r.length; i++) {
      r[i] = i;
    }
  }
}

contract Pyramid {
  using ArrayUtils for *;
  function pyramid(uint l) public pure returns (uint) {
    return ArrayUtils.range(l).map(square).reduce(sum);
  }
  function square(uint x) internal pure returns (uint) {
    return x * x;
  }
  function sum(uint x, uint y) internal pure returns (uint) {
    return x + y;
  }
}

μ™ΈλΆ€ ν•¨μˆ˜ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 또 λ‹€λ₯Έ 예제:

pragma solidity ^0.4.21;

contract Oracle {
  struct Request {
    bytes data;
    function(bytes memory) external callback;
  }
  Request[] requests;
  event NewRequest(uint);
  function query(bytes data, function(bytes memory) external callback) public {
    requests.push(Request(data, callback));
    emit NewRequest(requests.length - 1);
  }
  function reply(uint requestID, bytes response) public {
    // Here goes the check that the reply comes from a trusted source
    requests[requestID].callback(response);
  }
}

contract OracleUser {
  Oracle constant oracle = Oracle(0x1234567); // known contract
  function buySomething() {
    oracle.query("USD", this.oracleResponse);
  }
  function oracleResponse(bytes response) public {
    require(msg.sender == address(oracle));
    // Use the data
  }
}

Note

λžŒλ‹€ν•¨μˆ˜λ‚˜ μΈλΌμΈν•¨μˆ˜ μ—­μ‹œ κ³„νšλ˜μ–΄μžˆμ§€λ§Œ 아직 μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

.. index:: ! type;reference, ! reference type, storage, memory, location, array, struct

μ°Έμ‘° νƒ€μž…

볡합 νƒ€μž…, 즉 항상 256λΉ„νŠΈμ— λ“€μ–΄λ§žμ§€ μ•ŠλŠ” νƒ€μž…μ€ μš°λ¦¬κ°€ μ΄μ œκΉŒμ§€ λ‹€λ€˜λ˜ νƒ€μž…λ³΄λ‹€ λ”μš± μ‹ μ€‘ν•˜κ²Œ 닀뀄야 ν•©λ‹ˆλ‹€. 볡합 νƒ€μž…μ„ λ³΅μ‚¬ν•˜λŠ” 것은 λΉ„μ‹Ό 연산이 될 수 μžˆμœΌλ―€λ‘œ, μš°λ¦¬λŠ” 볡합 νƒ€μž…μ„ λ©”λͺ¨λ¦¬ (지속성이 μ—†μŒ) 와 μŠ€ν† λ¦¬μ§€ (μƒνƒœ λ³€μˆ˜κ°€ μ €μž₯λ˜λŠ” κ³³)쀑 어디에 μ €μž₯ν•˜κ³  싢은지 생각해보아야 ν•©λ‹ˆλ‹€.

데이터 μœ„μΉ˜

λͺ¨λ“  볡합 νƒ€μž…μ€ μžμ‹ μ΄ λ©”λͺ¨λ¦¬ λ‚˜ μŠ€ν† λ¦¬μ§€ 쀑 어디에 μ €μž₯λ˜μ—ˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” "데이터 μœ„μΉ˜"κ°€ μΆ”κ°€μ μœΌλ‘œ μ‘΄μž¬ν•©λ‹ˆλ‹€. μ»¨ν…μŠ€νŠΈμ— 따라 항상 기본값이 μ‘΄μž¬ν•˜μ§€λ§Œ, νƒ€μž…μ— μŠ€ν† λ¦¬μ§€ λ‚˜ λ©”λͺ¨λ¦¬ λ₯Ό μΆ”κ°€ν•˜μ—¬ μž¬μ •μ˜ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜ 맀개 λ³€μˆ˜(λ°˜ν™˜ 맀개 λ³€μˆ˜λ„ 포함)의 기본값은 λ©”λͺ¨λ¦¬ 이고, 지역 λ³€μˆ˜μ˜ 기본값은 μŠ€ν† λ¦¬μ§€ 이며 μƒνƒœ λ³€μˆ˜μ˜ μœ„μΉ˜λŠ” μŠ€ν† λ¦¬μ§€ 둜 κ°•μ œλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ μ„Έ 번째 데이터 μœ„μΉ˜μΈ calldata κ°€ 있으며, μ—¬κΈ°μ—λŠ” ν•¨μˆ˜ μΈμžκ°€ μ €μž₯되고 μˆ˜μ • λΆˆκ°€λŠ₯ν•˜λ©° 지속성이 μ—†μŠ΅λ‹ˆλ‹€. μ™ΈλΆ€ ν•¨μˆ˜μ˜ ν•¨μˆ˜ 맀개 λ³€μˆ˜(λ°˜ν™˜ λ§€κ°œλ³€μˆ˜ μ œμ™Έ)λŠ” calldata 에 κ°•μ œ μ €μž₯되며 거의 memory 처럼 μž‘λ™ν•©λ‹ˆλ‹€.

데이터 μœ„μΉ˜λŠ” λ³€μˆ˜κ°€ ν• λ‹Ήλ˜λŠ” 방식을 λ³€κ²½ν•˜κΈ° λ•Œλ¬Έμ— μ€‘μš”ν•©λ‹ˆλ‹€: assignments between storage and memory and also to a state variable (even from other state variables) always create an independent copy. Assignments to local storage variables only assign a reference though, and this reference always points to the state variable even if the latter is changed in the meantime. 반면, λ©”λͺ¨λ¦¬μ— μ €μž₯된 μ°Έμ‘° νƒ€μž…μ—μ„œ λ‹€λ₯Έ λ©”λͺ¨λ¦¬μ— μ €μž₯된 μ°Έμ‘° νƒ€μž…μ„ 할당할땐 볡사본을 λ§Œλ“€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

pragma solidity ^0.4.0;

contract C {
    uint[] x; // the data location of x is storage

    // the data location of memoryArray is memory
    function f(uint[] memoryArray) public {
        x = memoryArray; // works, copies the whole array to storage
        var y = x; // works, assigns a pointer, data location of y is storage
        y[7]; // fine, returns the 8th element
        y.length = 2; // fine, modifies x through y
        delete x; // fine, clears the array, also modifies y
        // The following does not work; it would need to create a new temporary /
        // unnamed array in storage, but storage is "statically" allocated:
        // y = memoryArray;
        // This does not work either, since it would "reset" the pointer, but there
        // is no sensible location it could point to.
        // delete y;
        g(x); // calls g, handing over a reference to x
        h(x); // calls h and creates an independent, temporary copy in memory
    }

    function g(uint[] storage storageArray) internal {}
    function h(uint[] memoryArray) public {}
}
μš”μ•½
κ°•μ œ 데이터 μœ„μΉ˜:
  • μ™ΈλΆ€ ν•¨μˆ˜μ˜ 맀개 λ³€μˆ˜(λ°˜ν™˜κ°’ 미포함): calldata
  • μƒνƒœ λ³€μˆ˜: μŠ€ν† λ¦¬μ§€
κΈ°λ³Έ 데이터 μœ„μΉ˜:
  • ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜(λ°˜ν™˜κ°’ 포함): λ©”λͺ¨λ¦¬
  • λͺ¨λ“  지역 λ³€μˆ˜: μŠ€ν† λ¦¬μ§€
.. index:: ! array

λ°°μ—΄

배열은 μ»΄νŒŒμΌμ‹œ κ³ μ • 크기λ₯Ό κ°€μ§ˆ μˆ˜λ„ 있고 동적인 크기λ₯Ό κ°€μ§ˆ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μŠ€ν† λ¦¬μ§€ λ°°μ—΄μ˜ 경우, μš”μ†Œμ˜ νƒ€μž…μ€ μž„μ˜μ μΌ 수(즉, λ‹€λ₯Έ 배열이 될 μˆ˜λ„ 있고, λ§€ν•‘μ΄λ‚˜ κ΅¬μ‘°μ²΄μΌμˆ˜λ„ 있음) μžˆμŠ΅λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ λ°°μ—΄μ˜ 경우, 맀핑이 될 수 μ—†μœΌλ©° λ§Œμ•½ 곡개적으둜 λ³΄μ—¬μ§€λŠ” ν•¨μˆ˜μ˜ 인자라면 ABI νƒ€μž…μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.

ν¬κΈ°λŠ” k 둜 κ³ μ •λ˜μ—ˆκ³  μš”μ†Œμ˜ νƒ€μž…μ€ T 인 배열은 T[k] 둜 ν‘œμ‹œν•˜λ©°, 동적인 크기의 배열은 T[] 둜 ν‘œμ‹œν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μžλ©΄, uint νƒ€μž…μ„ μš”μ†Œλ‘œ ν•˜λŠ” 동적 크기 λ°°μ—΄ 5개둜 κ΅¬μ„±λœ 배열은 uint[][5] μž…λ‹ˆλ‹€(λ‹€λ₯Έ μ–Έμ–΄λ“€κ³ΌλŠ” 달리 ν–‰κ³Ό μ—΄μ˜ ν‘œν˜„μ΄ λ°”λ€Œμ–΄μžˆμŒμ— μœ μ˜ν•˜μ„Έμš”). μ„Έλ²ˆμ§Έ 동적 크기 λ°°μ—΄μ˜ λ‘λ²ˆμ§Έ uint에 μ ‘κ·Όν•˜λ €λ©΄, x[2][1] μ΄λ ‡κ²Œ ν•˜μ„Έμš” (μΈλ±μŠ€λŠ” 0λΆ€ν„° μ‹œμž‘ν•˜λ©° 접근은 μ„ μ–Έκ³ΌλŠ” λ°˜λŒ€λ˜λŠ” λ°©μ‹μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€. i.e. x[2] shaves off one level in the type from the right)

bytes 와 string νƒ€μž…μ˜ λ³€μˆ˜λŠ” νŠΉλ³„ν•œ ν˜•νƒœμ˜ λ°°μ—΄μž…λ‹ˆλ‹€. bytes λŠ” byte[] 와 μœ μ‚¬ν•˜μ§€λ§Œ calldata둜 꽉 μ°¨μ—¬μ Έ μžˆμŠ΅λ‹ˆλ‹€. string 은 bytes 와 λ™μΌν•˜μ§€λ§Œ (ν˜„μž¬λ‘œμ„œλŠ”) κΈΈμ΄λ‚˜ 인덱슀 접근을 ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€

κ·ΈλŸ¬λ―€λ‘œ bytes λŠ” μ–Έμ œλ‚˜ byte[] 보닀 μš°μ„ μˆœμœ„λ‘œ κ³ λ €λ˜μ–΄μ•Όν•©λ‹ˆλ‹€. 더 μ €λ ΄ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

Note

λ¬Έμžμ—΄ s 의 byte-representation에 μ ‘κ·Όν•˜κ³ μž ν•œλ‹€λ©΄, bytes(s).length / bytes(s)[7] = 'x'; μ΄λ ‡κ²Œ ν•˜μ„Έμš”. κ°œλ³„ λ¬Έμžκ°€ μ•„λ‹Œ UTF-8의 low-level λ°”μ΄νŠΈμ— μ ‘κ·Όν•˜κ³  μžˆλ‹€λŠ”κ±Έ λͺ…μ‹¬ν•˜μ„Έμš”!

배열을 public 으둜 μƒμ„±ν•˜κ³  solidityκ°€ :ref:`getter <visibility-and-getters>` λ₯Ό μƒμ„±ν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 숫자 μΈλ±μŠ€λŠ” getter의 ν•„μˆ˜ 맀개 λ³€μˆ˜κ°€ λ©λ‹ˆλ‹€.

.. index:: ! array;allocating, new

λ©”λͺ¨λ¦¬ λ°°μ—΄ ν• λ‹Ή

new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ 크기 변경이 κ°€λŠ₯ν•œ 배열을 λ©”λͺ¨λ¦¬μ— 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. μŠ€ν† λ¦¬μ§€ λ°°μ—΄κ³ΌλŠ” 달리, .length 멀버에 값을 ν• λ‹Ήν•¨μœΌλ‘œμ¨ λ©”λͺ¨λ¦¬ λ°°μ—΄μ˜ 크기λ₯Ό λ³€κ²½ν•˜λŠ”κ²ƒμ€ λΆˆκ°€λŠ₯ ν•©λ‹ˆλ‹€.

pragma solidity ^0.4.16;

contract C {
    function f(uint len) public pure {
        uint[] memory a = new uint[](7);
        bytes memory b = new bytes(len);
        // Here we have a.length == 7 and b.length == len
        a[6] = 8;
    }
}
.. index:: ! array;literals, !inline;arrays

λ°°μ—΄ λ¦¬ν„°λŸ΄ / 인라인 λ°°μ—΄

λ°°μ—΄ λ¦¬ν„°λŸ΄μ€ ν‘œν˜„μ‹μœΌλ‘œ μž‘μ„±λœ 배열이며 μ¦‰κ°μ μœΌλ‘œ λ³€μˆ˜μ— ν• λ‹Ήλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

pragma solidity ^0.4.16;

contract C {
    function f() public pure {
        g([uint(1), 2, 3]);
    }
    function g(uint[3] _data) public pure {
        // ...
    }
}

λ°°μ—΄ λ¦¬ν„°λŸ΄μ˜ νƒ€μž…μ€ κ³ μ •λœ 크기λ₯Ό κ°€μ§€λŠ” λ©”λͺ¨λ¦¬ 배열이며 base type은 주어진 μš”μ†Œλ“€μ˜ 곡톡 νƒ€μž…μ„ λ”°λ¦…λ‹ˆλ‹€. [1, 2, 3] 의 νƒ€μž…μ€ uint8[3] memory μž…λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ μ •μˆ˜ 각각의 νƒ€μž…μ΄ uint8 이기 λ•Œλ¬Έμž…λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ—, μœ„ 예제의 첫 번째 μš”μ†Œλ₯Ό uint 둜 λ³€ν™˜ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. ν˜„μž¬λ‘œμ„œλŠ”, κ³ μ •λœ 크기의 λ©”λͺ¨λ¦¬ 배열을 동적 크기의 λ©”λͺ¨λ¦¬ 배열에 ν• λ‹Ήν•  수 μ—†μŠ΅λ‹ˆλ‹€. 즉, λ‹€μŒκ³Ό 같은 것은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€:

// This will not compile.

pragma solidity ^0.4.0;

contract C {
    function f() public {
        // The next line creates a type error because uint[3] memory
        // cannot be converted to uint[] memory.
        uint[] x = [uint(1), 3, 4];
    }
}

이 μ œμ•½μ‚¬ν•­μ€ 좔후에 제거될 μ˜ˆμ •μ΄μ§€λ§Œ, ν˜„μž¬ μ΄λŸ¬ν•œ μ œμ•½μ‚¬ν•­μœΌλ‘œ 인해 배열이 ABI둜 μ „λ‹¬λ˜λŠ” 방식에 따라 λͺ‡κ°€μ§€ λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€.

.. index:: ! array;length, length, push, !array;push

멀버
length:
λ°°μ—΄μ—λŠ” μš”μ†Œμ˜ 갯수λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ length 멀버가 μ‘΄μž¬ν•©λ‹ˆλ‹€. (λ©”λͺ¨λ¦¬κ°€ μ•„λ‹Œ) μŠ€ν† λ¦¬μ§€μ— μ €μž₯된 동적 배열은 length λ©€λ²„μ˜ 값을 λ³€κ²½ν•˜μ—¬ 크기λ₯Ό μ‘°μ ˆν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν˜„μž¬ lengthλ₯Ό λ²—μ–΄λ‚˜λŠ” μš”μ†Œμ— 접근을 μ‹œλ„ν•œλ‹€κ³ ν•΄μ„œ 크기의 쑰절이 μžλ™μœΌλ‘œ λ˜λŠ”κ±΄ μ•„λ‹™λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ 배열은 생성될 λ•Œ 크기가 κ²°μ •λ˜λ©° 크기의 변경은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€(κ·ΈλŸ¬λ‚˜ 동적 λ°°μ—΄μ˜ 경우, λŸ°νƒ€μž„ λ§€κ°œλ³€μˆ˜μ— 따라 λ‹¬λΌμ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.).
push:
동적 크기의 μŠ€ν† λ¦¬μ§€ λ°°μ—΄κ³Ό bytes (string 은 μ œμ™Έ)λŠ” push λΌλŠ” 멀버 ν•¨μˆ˜λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” λ°°μ—΄μ˜ 끝에 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” μƒˆλ‘œμš΄ lengthλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

Warning

It is not yet possible to use arrays of arrays in external functions. μ™ΈλΆ€ ν•¨μˆ˜μ—μ„œ λ°°μ—΄μ˜ 배열을 μ‚¬μš©ν•˜λŠ”κ±΄ 아직 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

Warning

EVM의 ν•œκ³„λ‘œ 인해, μ™ΈλΆ€ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν–ˆμ„λ•Œ 동적인 것을 λ°˜ν™˜ν•˜λŠ”κ±΄ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. contract C { function f() returns (uint[]) { ... } } λ‚΄λΆ€μ˜ ν•¨μˆ˜ f λŠ” web3.jsμ—μ„œ 호좜될 경우 무언가λ₯Ό λ°˜ν™˜ν•˜κ² μ§€λ§Œ solidityμ—μ„œ 호좜될 경우 λ°˜ν™˜μ΄ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

ν˜„μž¬λ‘œμ„  μœ μΌν•œ ν•΄κ²° 방법은 크기가 κ³ μ •λœ(동적이지 μ•Šμ€) κ±°λŒ€ν•œ 크기의 배열을 μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

pragma solidity ^0.4.16;

contract ArrayContract {
    uint[2**20] m_aLotOfIntegers;
    // Note that the following is not a pair of dynamic arrays but a
    // dynamic array of pairs (i.e. of fixed size arrays of length two).
    bool[2][] m_pairsOfFlags;
    // newPairs is stored in memory - the default for function arguments

    function setAllFlagPairs(bool[2][] newPairs) public {
        // assignment to a storage array replaces the complete array
        m_pairsOfFlags = newPairs;
    }

    function setFlagPair(uint index, bool flagA, bool flagB) public {
        // access to a non-existing index will throw an exception
        m_pairsOfFlags[index][0] = flagA;
        m_pairsOfFlags[index][1] = flagB;
    }

    function changeFlagArraySize(uint newSize) public {
        // if the new size is smaller, removed array elements will be cleared
        m_pairsOfFlags.length = newSize;
    }

    function clear() public {
        // these clear the arrays completely
        delete m_pairsOfFlags;
        delete m_aLotOfIntegers;
        // identical effect here
        m_pairsOfFlags.length = 0;
    }

    bytes m_byteData;

    function byteArrays(bytes data) public {
        // byte arrays ("bytes") are different as they are stored without padding,
        // but can be treated identical to "uint8[]"
        m_byteData = data;
        m_byteData.length += 7;
        m_byteData[3] = byte(8);
        delete m_byteData[2];
    }

    function addFlag(bool[2] flag) public returns (uint) {
        return m_pairsOfFlags.push(flag);
    }

    function createMemoryArray(uint size) public pure returns (bytes) {
        // Dynamic memory arrays are created using `new`:
        uint[2][] memory arrayOfPairs = new uint[2][](size);
        // Create a dynamic byte array:
        bytes memory b = new bytes(200);
        for (uint i = 0; i < b.length; i++)
            b[i] = byte(i);
        return b;
    }
}
.. index:: ! struct, ! type;struct

ꡬ쑰체

solidityλŠ” μ•„λž˜μ˜ μ˜ˆμ‹œμ²˜λŸΌ ꡬ쑰체의 ν˜•μ‹μœΌλ‘œ μƒˆλ‘œμš΄ νƒ€μž…μ„ μ •μ˜ν•˜λŠ” 방법을 μ œκ³΅ν•©λ‹ˆλ‹€.

pragma solidity ^0.4.11;

contract CrowdFunding {
    // Defines a new type with two fields.
    struct Funder {
        address addr;
        uint amount;
    }

    struct Campaign {
        address beneficiary;
        uint fundingGoal;
        uint numFunders;
        uint amount;
        mapping (uint => Funder) funders;
    }

    uint numCampaigns;
    mapping (uint => Campaign) campaigns;

    function newCampaign(address beneficiary, uint goal) public returns (uint campaignID) {
        campaignID = numCampaigns++; // campaignID is return variable
        // Creates new struct and saves in storage. We leave out the mapping type.
        campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0);
    }

    function contribute(uint campaignID) public payable {
        Campaign storage c = campaigns[campaignID];
        // Creates a new temporary memory struct, initialised with the given values
        // and copies it over to storage.
        // Note that you can also use Funder(msg.sender, msg.value) to initialise.
        c.funders[c.numFunders++] = Funder({addr: msg.sender, amount: msg.value});
        c.amount += msg.value;
    }

    function checkGoalReached(uint campaignID) public returns (bool reached) {
        Campaign storage c = campaigns[campaignID];
        if (c.amount < c.fundingGoal)
            return false;
        uint amount = c.amount;
        c.amount = 0;
        c.beneficiary.transfer(amount);
        return true;
    }
}

μ»¨νŠΈλž™νŠΈλŠ” ν¬λΌμš°λ“œνŽ€λ”©μ—μ„œμ˜ 계약에 ν•„μš”ν•œ λͺ¨λ“  κΈ°λŠ₯을 μ œκ³΅ν•˜μ§„ μ•Šμ§€λ§Œ ꡬ쑰체λ₯Ό μ΄ν•΄ν•˜λŠ”λ° ν•„μš”ν•œ 기본적인 κ°œλ…μ„ ν¬ν•¨ν•©λ‹ˆλ‹€. ꡬ쑰체 νƒ€μž…μ€ 맀핑과 λ°°μ—΄μ˜ λ‚΄λΆ€μ—μ„œ μ‚¬μš©λ  수 있으며 ꡬ쑰체 μ—­μ‹œ 내뢀에 맀핑과 배열을 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.

κ΅¬μ‘°μ²΄λŠ” 맀핑 λ©€λ²„μ˜ κ°’ νƒ€μž…μ΄ 될 순 μžˆμ§€λ§Œ, ꡬ쑰체가 λ™μΌν•œ ꡬ쑰체 νƒ€μž…μ˜ 멀버λ₯Ό 포함할 순 μ—†μŠ΅λ‹ˆλ‹€. ꡬ쑰체의 ν¬κΈ°λŠ” μœ ν•œν•΄μ•Ό ν•˜λ―€λ‘œ μ΄λŸ¬ν•œ μ œμ•½μ΄ ν•„μš”ν•œκ²ƒμ΄μ£ .

λͺ¨λ“  μ’…λ₯˜μ˜ ν•¨μˆ˜μ—μ„œ, μ–΄λ–»κ²Œ ꡬ쑰체 νƒ€μž…μ΄ (κΈ°λ³Έ μŠ€ν† λ¦¬μ§€ 데이터 μœ„μΉ˜μ˜) 지역 λ³€μˆ˜μ— ν• λ‹Ήλ˜λŠ”μ§€ μœ μ˜ν•˜μ‹­μ‹œμ˜€. μ΄λŠ” ꡬ쑰체λ₯Ό 볡사(copy)ν•˜μ§€ μ•Šκ³  μ°Έμ‘°(reference)만 μ €μž₯ν•˜λ―€λ‘œ 지역 λ³€μˆ˜μ˜ 멀버에 ν• λ‹Ήν•˜λŠ”κ²ƒμ€ μ‹€μ œλ‘œ μƒνƒœμ— κΈ°λ‘λ©λ‹ˆλ‹€.

λ¬Όλ‘  campaigns[campaignID].amount = 0 처럼 지역 λ³€μˆ˜μ— ν• λ‹Ήν•˜μ§€ μ•Šκ³ λ„ ꡬ쑰체의 멀버에 직접 μ ‘κ·Ό ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

.. index:: !mapping

맀핑

맀핑 νƒ€μž…μ€ mapping(_KeyType => _ValueType) 와 같이 μ„ μ–Έλ©λ‹ˆλ‹€. μ—¬κΈ°μ„œ _KeyType 은 맀핑, 동적 크기 λ°°μ—΄, μ»¨νŠΈλž™νŠΈ, μ—΄κ±°ν˜•, ꡬ쑰체λ₯Ό μ œμ™Έν•œ 거의 λͺ¨λ“  μœ ν˜•μ΄ 될 수 μžˆμŠ΅λ‹ˆλ‹€. _ValueType 은 맀핑 νƒ€μž…μ„ ν¬ν•¨ν•œ μ–΄λ–€ νƒ€μž…μ΄λ“  될 수 μžˆμŠ΅λ‹ˆλ‹€.

맀핑은 사싀상 λͺ¨λ“  κ°€λŠ₯ν•œ ν‚€κ°€ μ΄ˆκΈ°ν™”λ˜κ³  byte-representation이 λͺ¨λ‘ 0인 κ°’(νƒ€μž…μ˜ :ref:`κΈ°λ³Έ κ°’ <default-value>`)에 λ§€ν•‘λ˜λŠ” ν•΄μ‹œ ν…Œμ΄λΈ” 둜 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 맀핑과 ν•΄μ‹œν…Œμ΄λΈ”μ˜ μœ μ‚¬ν•œ 점이며 차이점은, ν‚€ λ°μ΄ν„°λŠ” μ‹€μ œλ‘œ 맀핑에 μ €μž₯λ˜μ§€ μ•Šκ³  였직 keccak256 ν•΄μ‹œλ§Œμ΄ 값을 μ°ΎκΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.

이둜 인해, λ§€ν•‘μ—λŠ” 길이 λ˜λŠ” 집합(set)을 μ΄λ£¨λŠ” ν‚€λ‚˜ κ°’μ˜ κ°œλ…μ„ 가지고 μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

맀핑은 μƒνƒœλ³€μˆ˜(λ˜λŠ” λ‚΄λΆ€ ν•¨μˆ˜μ—μ„œμ˜ μŠ€ν† λ¦¬μ§€ μ°Έμ‘° νƒ€μž…)μ—λ§Œ ν—ˆμš©λ©λ‹ˆλ‹€.

맀핑을 public 으둜 ν‘œμ‹œν•˜κ³  solidityκ°€ :ref:`getter <visibility-and-getters>` λ₯Ό 생성토둝 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. _KeyType 은 getter의 ν•„μˆ˜ 맀개 λ³€μˆ˜μ΄λ©° _ValueType 을 λ°˜ν™˜ ν•©λ‹ˆλ‹€.

맀핑 μ—­μ‹œ _ValueType 이 될 수 μžˆμŠ΅λ‹ˆλ‹€. getterλŠ” 각각의 _KeyType 에 λŒ€ν•˜μ—¬ ν•˜λ‚˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό μž¬κ·€μ μœΌλ‘œ κ°€μ§‘λ‹ˆλ‹€.

pragma solidity ^0.4.0;

contract MappingExample {
    mapping(address => uint) public balances;

    function update(uint newBalance) public {
        balances[msg.sender] = newBalance;
    }
}

contract MappingUser {
    function f() public returns (uint) {
        MappingExample m = new MappingExample();
        m.update(100);
        return m.balances(this);
    }
}

Note

맀핑은 iterableν•˜μ§„ μ•Šμ§€λ§Œ, κ·Έ μœ„μ— 자료ꡬ쑰(data structure)λ₯Ό κ΅¬ν˜„ν•˜λŠ”κ±΄ κ°€λŠ₯ν•©λ‹ˆλ‹€. μ˜ˆμ‹œλŠ” iterable mapping 을 μ°Έμ‘°ν•˜μ„Έμš”.

.. index:: assignment, ! delete, lvalue

Operators Involving LValues

λ§Œμ•½ a κ°€ LValue라면(즉, ν• λ‹Ή 될 수 μžˆλŠ” λ³€μˆ˜ λ˜λŠ” 무언가), λ‹€μŒμ˜ μ—°μ‚°μžλ₯Ό μ•½μžλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

a += e is equivalent to a = a + e. The operators -=, *=, /=, %=, |=, &= and ^= are defined accordingly. a++ and a-- are equivalent to a += 1 / a -= 1 but the expression itself still has the previous value of a. In contrast, --a and ++a have the same effect on a but return the value after the change.

a += e λŠ” a = a + e 와 λ™μΌν•©λ‹ˆλ‹€. μ—°μ‚°μž -=, *=, /=, %=, |=, &=, ^= μ—­μ‹œ λ™μΌν•œ λ°©μ‹μœΌλ‘œ μ •μ˜λ©λ‹ˆλ‹€. a++ 와 a-- λŠ” a += 1 / a -= 1``와 λ™μΌν•˜κ²Œ 값을 λ³€κ²½μ‹œν‚€μ§€λ§Œ, ν‘œν˜„μ‹ μžμ²΄λŠ” μ—¬μ „νžˆ ``a``의 변경이 μΌμ–΄λ‚˜μ§€ μ•Šμ€ 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€. 이와 λ°˜λŒ€λ‘œ, ``--a 와 ++a μ—­μ‹œ ``a``의 값을 λ³€ν™”μ‹œν‚€μ§€λ§Œ, 이 ν‘œν˜„μ‹μ€ λ³€κ²½λœ 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

delete

delete a λŠ” νƒ€μž…μ˜ 초기 값을 a 에 ν• λ‹Ήν•©λ‹ˆλ‹€. 즉, μ •μˆ˜μ˜ 경우라면 a = 0 μž…λ‹ˆλ‹€. λ°°μ—΄μ—μ„œλ„ μ‚¬μš©λ  수 μžˆλŠ”λ° 이 경우, 길이가 0인 동적 λ°°μ—΄μ΄λ‚˜ λ™μΌν•œ 길이의 정적 λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. ꡬ쑰체에 μ‚¬μš©ν•  경우, ꡬ쑰체의 λͺ¨λ“  멀버λ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.

delete λŠ” 맀핑에 μ•„λ¬΄λŸ° 영ν–₯을 λ―ΈμΉ˜μ§€ λͺ»ν•©λ‹ˆλ‹€(λ§€ν•‘μ˜ ν‚€λŠ” μž„μ˜μ μ΄λ©° 일반적으둜 μ•Œλ €μ Έμžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€). λ”°λΌμ„œ ꡬ쑰체λ₯Ό deleteν•  경우, 맀핑이 μ•„λ‹Œ λͺ¨λ“  멀버λ₯Ό μ΄ˆκΈ°ν™”ν•˜λ©° λ©€λ²„μ˜ 내뢀도 맀핑이 μ•„λ‹ˆλΌλ©΄ μž¬κ·€μ μœΌλ‘œ μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, κ°œλ³„ ν‚€ 그리고 κ·Έ ν‚€κ°€ 어디에 λ§€ν•‘λ˜μ—ˆλŠ”μ§€λŠ” μ‚­μ œλ  수 μžˆμŠ΅λ‹ˆλ‹€.

delete a λŠ” μ‹€μ œλ‘œ a 에 μ΄ˆκΈ°κ°’μ„ ν• λ‹Ήν•˜λŠ”κ²ƒμ²˜λŸΌ λ™μž‘ν•©λ‹ˆλ‹€. 즉, a 에 μƒˆλ‘œμš΄ 객체λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.

pragma solidity ^0.4.0;

contract DeleteExample {
    uint data;
    uint[] dataArray;

    function f() public {
        uint x = data;
        delete x; // sets x to 0, does not affect data
        delete data; // sets data to 0, does not affect x which still holds a copy
        uint[] storage y = dataArray;
        delete dataArray; // this sets dataArray.length to zero, but as uint[] is a complex object, also
        // y is affected which is an alias to the storage object
        // On the other hand: "delete y" is not valid, as assignments to local variables
        // referencing storage objects can only be made from existing storage objects.
    }
}
.. index:: ! type;conversion, ! cast

κΈ°λ³Έ νƒ€μž…κ°„μ˜ λ³€ν™˜

μ•”μ‹œμ  ν˜•λ³€ν™˜

ν”Όμ—°μ‚°μžκ°€ μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ΄λΌλ©΄, μ»΄νŒŒμΌλŸ¬λŠ” ν•˜λ‚˜μ˜ ν”Όμ—°μ‚°μžλ₯Ό λ‹€λ₯Έ ν”Όμ—°μ‚°μžμ˜ νƒ€μž…μœΌλ‘œ μ•”μ‹œμ  ν˜•λ³€ν™˜μ„ μ‹œλ„ν•©λ‹ˆλ‹€(ν• λ‹Ήμ˜ κ²½μš°μ—λ„ λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€). 일반적으둜, μ˜λ―Έκ°€ ν†΅ν•˜λ©° μ†μ‹€λ˜λŠ” 정보가 μ—†λ‹€λ©΄ value-typeκ°„ μ•”μ‹œμ  ν˜•λ³€ν™˜μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€: uint8 λŠ” uint16 둜 μ•”μ‹œμ  ν˜•λ³€ν™˜λ˜λ©° int128 λŠ” int256 둜 μ•”μ‹œμ  ν˜•λ³€ν™˜λ©λ‹ˆλ‹€, κ·ΈλŸ¬λ‚˜ int8 λŠ” uint256 으둜 μ•”μ‹œμ  ν˜•λ³€ν™˜λ  수 μ—†μŠ΅λ‹ˆλ‹€(μ™œλƒν•˜λ©΄ uint256 λŠ” -1 같은 값을 ν‘œν˜„ν•  수 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€). λ”μš±μ΄, λΆ€ν˜Έμ—†λŠ” μ •μˆ˜λŠ” κ°™κ±°λ‚˜ 큰 크기의 λ°”μ΄νŠΈλ‘œ λ³€ν™˜ 될 수 μžˆμ§€λ§Œ κ·Έ λ°˜λŒ€λŠ” λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. uint160 둜 λ³€ν™˜ κ°€λŠ₯ν•œ νƒ€μž…μ΄λΌλ©΄ address λ‘œλ„ λ³€ν™˜λ  수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ…μ‹œμ  ν˜•λ³€ν™˜

μ»΄νŒŒμΌλŸ¬κ°€ μ•”μ‹œμ  ν˜•λ³€ν™˜μ„ ν—ˆμš©ν•˜μ§€ μ•Šλ”λΌλ„ 당신이 ν˜„μž¬ 무엇을 ν•˜κ³ μžˆλŠ”μ§€ μ•Œκ³  μžˆλ‹€λ©΄ λͺ…μ‹œμ  ν˜•λ³€ν™˜μ΄ λ•Œλ•Œλ‘œ κ°€λŠ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ˜ˆμƒμΉ˜ μ•Šμ€ μž‘λ™μ„ λΆˆλŸ¬μΌμœΌν‚¬μˆ˜ μžˆμœΌλ―€λ‘œ ν™•μ‹€νžˆ 당신이 μ›ν•˜λŠ” κ²°κ³Όκ°€ λ‚˜μ˜€λŠ”μ§€ ν…ŒμŠ€νŠΈν•΄λ΄μ•Ό ν•©λ‹ˆλ‹€! 음수 int8 을 uint 둜 λ³€ν™˜ν•˜λŠ” λ‹€μŒμ˜ 예제λ₯Ό λ³΄κ² μŠ΅λ‹ˆλ‹€:

int8 y = -3;
uint x = uint(y);

이 μ½”λ“œ 쑰각의 λμ—μ„œ, x λŠ” 0xfffff..fd 값을 κ°€μ§ˆκ²ƒμ΄κ³ , (64 hex characters) μ΄λŠ” 256 λΉ„νŠΈμ˜ 2의 보수 ν‘œν˜„μ—μ„œ -3μž…λ‹ˆλ‹€.

크기가 더 μž‘μ€ νƒ€μž…μœΌλ‘œ λͺ…μ‹œμ  ν˜•λ³€ν™˜ 될 경우, μƒμœ„ λΉ„νŠΈκ°€ 잘렀져 λ‚˜κ°‘λ‹ˆλ‹€:

uint32 a = 0x12345678;
uint16 b = uint16(a); // b will be 0x5678 now
.. index:: ! type;deduction, ! var

νƒ€μž… μΆ”λ‘ 

νŽΈμ˜μƒ, 항상 λ³€μˆ˜μ˜ νƒ€μž…μ„ λͺ…μ‹œμ μœΌλ‘œ 지정할 ν•„μš”λŠ” μ—†μœΌλ©° μ»΄νŒŒμΌλŸ¬λŠ” λ³€μˆ˜μ— ν• λ‹Ήλœ 첫번째 ν‘œν˜„μ‹μ˜ νƒ€μž…μ—μ„œ μžλ™μœΌλ‘œ νƒ€μž…μ„ μΆ”λ‘ ν•©λ‹ˆλ‹€:

uint24 x = 0x123;
var y = x;

μ—¬κΈ°μ„œ, y 의 νƒ€μž…μ€ uint24 κ°€ λ κ²λ‹ˆλ‹€. var 은 ν•¨μˆ˜ 맀개 λ³€μˆ˜λ‚˜ λ°˜ν™˜ 맀개 λ³€μˆ˜μ—μ„  μ‚¬μš©λ  수 μ—†μŠ΅λ‹ˆλ‹€.

Warning

첫 번째 ν• λ‹Ήμ—μ„œλ§Œ νƒ€μž…μ΄ μΆ”λ‘ λ˜κΈ°μ—, iλŠ” uint8 νƒ€μž…μ΄κ³  이 νƒ€μž…μ˜ κ°€μž₯ 큰 값이 2000 보닀 μž‘κΈ°μ— μ•„λž˜ μ½”λ“œ 쑰각의 λ°˜λ³΅λ¬Έμ€ λ¬΄ν•œλ°˜λ³΅λ¬Έμž…λ‹ˆλ‹€. for (var i = 0; i < 2000; i++) { ... }