👆🏻 접근 제어자
함수가 언제, 어디서 호출될 수 있는지를 제어!
private
: 컨트랙트 내부의 다른 함수들에서만 호출 가능internal
: private
과 유사하지만, 컨트랙트를 상속하는 컨트랙트에서도 호출될 수 있음external
: 오직 컨트랙트 외부에서만 호출 가능public
: 내외부 모두에서 어디서든 호출 가능✌🏻 상태 제어자
블록체인과 상호작용하는 방법!
view
: 어떤 데이터도 저장/변경되지 않는 함수pure
: 어떤 데이터도 블록체인에 저장하지 않고, 읽지도 않는 함수🤟🏻 사용자 정의 제어자
제어자들이 함수에게 어떻게 영향을 줄지 개발자가 직접 로직을 정의할 수 있다
+) 제어자는 하나의 함수에 여러개 사용될 수 있다!
function buySomething() external payable {
// 함수 실행에 0.001이더가 보내졌는지 확실히 하기 위해 확인:
require(msg.value == 0.001 ether);
// 보내졌다면, 함수를 호출한 자에게 디지털 아이템을 전달하기 위한 내용 구성:
transferThing(msg.sender);
}
msg.value
: 컨트랙트로 보내진 ETH 값
ether
: ETH의 기본 단위
위의 함수를 web.js(Dapp프론트)에서 호출하는 예시
컨트랙트명.buySomething({from: web3.eth.defaultAccount, value: web3.utils.toWei(0.001)})
payable
이 아니라면! 트랜잭션은 거부당함. contract GetPaid is Ownable {
function withdraw() external onlyOwner {
owner.transfer(this.balance);
}
}
owner
와 onlyOwner
제어자를 사용할 수 있음 transfer
함수 : 이더를 특정 주소로 전달this.balance
: 컨트랙트에 저장되어있는 전체 잔액 반환🔽 transfer 함수 사용법
이더수신자주소.transfer(보낼 이더 값);
~.sol
파일 생성pragma solidity ^0.4.19;
: 솔리디티 버전 설정import "./컨트랙트명.sol"
: 상속할 컨트랙트 파일 import하기contract 컨트랙트명 is 상속컨트랙트명
: 컨트랙트 정의 시작// 1~100 난수 생성
uint randNonce = 0;
uint random = uint(keccak256(now, msg.sender, randNonce)) % 100;
randNonce++;
uint random2 = uint(keccak256(now, msg.sender, randNonce)) % 100;
oracle
을 통해 데이터를 받아오는 방법이 있다.🤍 좀비 싸움 로직
8. 공격으로 돌아가자!
uint attackVictoryProbability = 70;
winCount
, lossCount
가짐9. 좀비 승리와 패배
10. 좀비 승리
lossCount
만 증가)11. 좀비 패배
_triggerCooldown(myZombie);
반복적으로 사용되는 require문이 있다면, modifier
로 분리시키자.
(새로 배운 내용 없음)
Zombie storage myZombie = zombies[_zombieId];
Zombie storage enemyZombie = zombies[_targetId];
winCount
, lossCount
가짐 struct Zombie {
string name;
uint dna;
uint32 level;
uint32 readyTime;
// 1. 여기에 새로운 속성을 추가하게
uint16 winCount;
uint16 lossCount;
}
if (rand <= attackVictoryProbability) {
myZombie.winCount++;
myZombie.level++;
enemyZombie.lossCount++;
feedAndMultiply(_zombieId,enemyZombie.dna, "zombie");
}
lossCount
만 증가)else {
myZombie.lossCount++;
enemyZombie.winCount++;
}