μ κ·Ό μ μ΄μ : public/private external/internal
μν μ μ΄μ : view, pure
μ¬μ©μ μ μ μ μ΄μ : onlyOwner, aboveLevel
payable?!
ν¨μλ₯Ό μ€ννλ κ²κ³Ό λμμ 컨νΈλνΈμ λ μ§λΆ κ°λ₯!!
contract OnlineStore {
function buySomething() external payable {
// ν¨μ μ€νμ 0.001μ΄λκ° λ³΄λ΄μ‘λμ§ νμ€ν νκΈ° μν΄ νμΈ:
require(msg.value == 0.001 ether);
// 보λ΄μ‘λ€λ©΄, ν¨μλ₯Ό νΈμΆν μμκ² λμ§νΈ μμ΄ν
μ μ λ¬νκΈ° μν λ΄μ© ꡬμ±:
transferThing(msg.sender);
}
}
msg.value
: ν¨μ μ€νμ 0.001μ΄λκ° λ³΄λ΄μ‘λμ§ νμ€ν νκΈ° μν΄ νμΈ
ether
: κΈ°λ³Έμ μΌλ‘ ν¬ν¨λ λ¨μ
transfer
ν¨μ μ¬μ©ν΄μ μ΄λλ₯Ό νΉμ μ£Όμλ‘ μ λ¬ν μ μλ€
this.balance
컨νΈλνΈμ μ μ₯λΌμλ μ 체 κΈμ‘λ°ν
// μ΄κ³Όμ§λΆμ νμ λ μ΄λλ₯Ό msg.senderλ‘ λλ €μ£Όλ ν¨μ
uint itemFee = 0.001 ether; msg.sender.transfer(msg.value - itemFee);
μ리λν°μμ λμλ₯Ό λ§λ€κΈ° κ°μ₯ μ’μ λ°©λ² : keccak256 ν΄μ ν¨μλ₯Ό μ°λ κ²
// Generate a random number between 1 and 100:
uint randNonce = 0;
uint random = uint(keccak256(now, msg.sender, randNonce)) % 100;
randNonce++;
uint random2 = uint(keccak256(now, msg.sender, randNonce)) % 100;
μ΄ μμμμλ nowμ νμμ€ν¬ν κ°, msg.sender, μ¦κ°νλ nonce(λ± ν λ²λ§ μ¬μ©λλ μ«μ, μ¦ λκ°μ μ λ ₯μΌλ‘ λ λ² μ΄μ λμΌν ν΄μ ν¨μλ₯Ό μ€νν μ μκ² ν¨)λ₯Ό λ°κ³ μλ€.
κ·Έλ¦¬κ³ μ keccakμ μ¬μ©νμ¬ μ΄ μ
λ ₯λ€μ μμμ ν΄μ κ°μΌλ‘ λ³ννκ³ ,
λ³νν ν΄μ κ°μ uintλ‘ λ°κΎΌ ν,
% 100μ μ¨μ λ§μ§λ§ 2μ리 μ«μλ§ λ°λλ‘ ν¨.
μ΄λ₯Ό ν΅ν΄ 0κ³Ό 99 μ¬μ΄μ μμ ν λμλ₯Ό μ»μ μ μλ€.
μ΄λ리μμμλ 컨νΈλνΈμ ν¨μλ₯Ό μ€ννλ©΄ νΈλμμ
μΌλ‘μ λ€νΈμν¬μ λ
Έλ νλ νΉμ μ¬λ¬ λ
Έλμ μ€νμ μλ¦¬κ² λλ€.
κ·Έ ν λ€νΈμν¬μ λ
Έλλ€μ μ¬λ¬ νΈλμμ
μ λͺ¨μΌκ³
κ³μ°μ΄ 볡μ‘ν μνμ λ¬Έμ "μμ
μ¦λͺ
" λ¨Όμ νκΈ° μν μλλ₯Ό νκ² λλ€
κ·Έλ¦¬κ³ ν΄λΉ νΈλμμ
κ·Έλ£Ήμ κ·Έλ€μ μμ
μ¦λͺ
(PoW)κ³Ό ν¨κ» λΈλ‘ μΌλ‘ λ€νΈμν¬μ λ°°ν¬
ν λ
Έλκ° μ΄λ€ PoWλ₯Ό νλ©΄, λ€λ₯Έ λ
Έλλ€μ κ·Έ PoW νΈλ κ±Έ λ©μΆκ³ ν΄λΉ λ
Έλκ° λ³΄λΈ νΈλμμ
λͺ©λ‘μ΄ μ ν¨ν κ²μΈμ§ κ²μ¦νκ² λλλ°,
-> μ΄λ λμ ν¨μ μ·¨μ½νκ² λ§λ€κ² λλ€
μ ν¬μ κ²°κ³Όλ₯Ό κ²°μ νλ λ° μ¬μ©ν μ μλ λμ μμ±κΈ° ꡬν
ν¨μλ₯Ό νΈμΆνλ μ¬λμ΄ κ·Έκ° μ¬μ©ν _zombieIdμ μμ μμΈμ§ νμΈν λ°©λ²
modifierλ‘ λ°λ‘ λΉΌλμ. κ·Έ ν μ’λΉ κ³΅κ²© κΈ°λ₯ ν¨μ ꡬν
μ’λΉλ€μ΄ μΌλ§λ λ§μ΄ μ΄κΈ°κ³ μ‘λμ§ μΆμ νκΈ° μν ν¨μ ꡬν