Ethereum blockain is composed of accounts(think of it as bank accounts)
Accounts have a balance of Ether(통화)
Ether을 다른 account들과 주고 받을 수 있음.
각 account는 고유의 adress를 지님
하나의 Address는 하나의 고유한 user에 의해 소유(종속)가됨.
유저가 zombie를 생성하면, zombie의 소유권은 create함수를 호출한 address에 감.
mapping
데이터 저장과 검색을 위한 key-value store
(address=>uint) // 주소-잔고
(uint=>string) / 아이디-이름
(형식) mapping (key type=>value type) public mapping_name;
(ex1) mapping (uint=>address) (public) zombieToOwner;
(ex2) mapping (address=>uint) (public) ownerZombieCount;
msg.sender
refers to the address(or smart contract) that called the current function
**solidity에서는 함수 실행은 항상 외부 호출자(caller)가 필요하므로 msg.sender은 항상 존재
다른 사람의 데이터를 조작할 수 있는 유일한 방법은 address에 대응되는 private key를 훔치는 것.
아까 저장해둔 mapping인 zombieToOnwer과 ownerZombieCount을
_createZombie안에 넣어두면 생성즉시 소유권 명시와 zombieCount 갱신 가능.
zombieToOwner[id] = msg.sender;
ownerZombieCount[msg.sender]++;
require(type:boolean)
require 속의 boolean이 false이면 error 발생시키고 작동을 중단시킴. true이면 그냥 실행 지속
*주의* Solidity는 string들을 비교하는 함수가 없으므로 keccak256 hash를 비교해야됨.
require(keccak256(abi.encodePacked(String1)) == keccak256(abi.encodePacked(String2)));
inheritance(상속) is
contract Doge{}
contract BabyDoge is Doge{}
를 통해서 BabyDoge는 Doge contract를 상속받게됨.
BabyDoge를 이용하면 BabyDoge 뿐만 아니라 Doge의 public 함수에 접근 가능.
Import
.sol 파일이 너무 길어지면, 하나의 .sol 파일을 더 만들고,
import를 통해서 이에 이어서 쓰면 됨.
(ex) oldFile.sol, newFile.sol이 있으면,
newFile.sol에
import "./oldFile.sol"; 라고 작성하면 import됨.
storage & memory
변수를 선언할때, blockchain에 permanent하게 남기고 싶으면 storage라고 선언을하고,
temporary하게 사용하고 싶을 경우에는 memory라고 선언을 함. Storage로 선언하면
일종의 pointer이 됨. 보통 이 과정은 compiler이 자동적으로 하지만, struct(구조체)의
경우에는 명시해주지 않을 경우에는 오류가 남.
internal & external
internal은 private과 비슷하지만,
private은 상속받은 contract에서는 접근할 수 없지만,
internal은 상속받은 contract에서 접근할 수 있다.
external은 public과 비슷하지만,
external은 public과는 다르게 선언한 contract내 접근 X, contract 밖 접근 O.
Interacting with other contracts
외부의 다른 contract와 소통하기 위해서는
contract의 interface를 정의해줘야함.
일반적인 contract를 정의하는 것처럼 contract 키워드를 사용하고,
function 키워드를 사용하는 것은 마찬가지이다.
하지만, {}즉, 함수의 내용은 작성하지 않고, )뒤에 바로 ;(semicolon)으로 마무리한다.
(ex)
contract NumberInterface {
function getNum(address _myAddress) public view returns (uint);
}
contract MyContract {
address NumberInterfaceAddress = 0xab38... // 이더리움에 있는 소통하려고하는 contract의 주소
NumberInterface numberContract = NumberInterface(NumberInterfaceAddress);
function someFunction() public {
uint num = numberContract.getNum(msg.sender);
}
}
Function with multiple return values
function function_name (arguments) return (uint _a, uint _b) {}
처럼 return 값이 2개 이상인 경우에는
uint a,b;
(a,b) = function_name(); 로 받는 것도 가능하고, 특정 값만 받고 싶을 경우에는
(,b) = function_name();
(a,) = function_name(); 처럼 해주면 된다. //(Ocaml과 비슷한듯)
'프로그래밍 > Solidity' 카테고리의 다른 글
Solidity - CryptoZombies - Lesson #1 (0) | 2022.09.13 |
---|