.. index:: type
solidityλ μ»΄νμΌ μμ μ κ° λ³μ(μνλ³μμ μ§μλ³μ)μ νμ μ΄ λͺ μλμ΄μΌνλ (λλ μ΅μν μΆλ‘ κ°λ₯ν΄μΌνλ - :ref:`type-deduction` μ°Έμ‘°) μ μ νμ μΈμ΄μ λλ€. solidityλ λͺ κ°μ§μ κΈ°λ³Έ νμ μ μ 곡νλ©° μ΄λ₯Ό μ‘°ν©ν΄μ λ³΅ν© νμ μ λ§λ€ μ μμ΅λλ€.
λν, νμ μ μ°μ°μκ° ν¬ν¨λ ννμμμ μλ‘ μνΈμμ©ν μ μμ΅λλ€. μ¬λ¬ κ°μ§ μ°μ°μμ λν λ΄μ©μ :ref:`order` λ₯Ό μ°Έμ‘°νμΈμ.
.. index:: ! value type, ! type;value
λ€μμ νμ λ€μ λ³μκ° μ λ¬λ λ κ°(value)μ΄ μ λ¬λλ―λ‘ κ° νμ μ΄λΌκ³ λ λΆλ¦½λλ€. μ¦, μ΄ νμ μ΄ ν¨μμ μΈμλ‘ μ¬μ©λκ±°λ ν λΉκ°μΌλ‘ μ¬μ©λ λ, κ°μ΄ 볡μ¬λ©λλ€.
.. index:: ! bool, ! true, ! false
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
: 20λ°μ΄νΈ(μ΄λ리μ addressμ ν¬κΈ°)λ₯Ό λ΄μ μ μμ΅λλ€. address νμ
μλ λ©€λ²κ° μμΌλ©° λͺ¨λ 컨νΈλνΈμ κΈ°λ°μ΄ λ©λλ€.
μ°μ°μ:
<=
,<
,==
,!=
,>=
and>
Note
0.5.0μΌλ‘ μμνλ λ²μ μ 컨νΈλνΈλ address νμ μμ νμλμ§ μμμ§λ§, address νμ μΌλ‘ λͺ μμ λ³νλ μ μμ΅λλ€.
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 체ν¬μ¬ ν
μ€νΈλ₯Ό ν΅κ³Όν 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μ§μ 리ν°λ΄μ ν€μλ hex
κ° μ λμ¬λ‘ λΆκ³ ν°λ°μ΄νλ μμλ°μ΄νλ‘ λλ¬μΈμ¬μ§λλ€(hex"001122FF"
).
λ΄μ©μ 16μ§μ λ¬Έμμ΄μ΄μ΄μΌ νλ©° κ°μ λ°μ΄λλ¦¬λ‘ ννλ©λλ€.
16μ§μ 리ν°λ΄μ λ¬Έμμ΄ λ¦¬ν°λ΄κ³Ό κ°μ΄ λμνκΈ°μ λμΌνκ² λ³κ²½μ μ νμ΄ μμ΅λλ€.
.. index:: enum
μ΄κ±°νμ 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
λ§μ½ 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 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++) { ... }