#1 Solidity Tutorial & Ethereum Blockchain Programming Course | CryptoZombies
CryptoZombies is The Most Popular, Interactive Solidity Tutorial That Will Help You Learn Blockchain Programming by Building Your Own Fun Game with Zombies — Master Blockchain Development with Web3, Infura, Metamask & Ethereum Smart Contracts and Become
cryptozombies.io
상태변수 & 정수
상태변수 :
- 컨트랙트 저장소에 영구적으로 저장됨
- 이더리움 블록체인에 기록 됨
- 데이터베이스에 데이터를 쓰는 것과 동일
부호없는 정수 :
- uint
pragma solidity ^0.4.19;
contract ZombieFactory {
uint dnaDigits = 16; //dnaDigits 라는 변수는 블록체인에 영구적으로 저장된다.
}
|
수학 연산
- 덧셈/뺄셈/곱셈/나눗셈
- 나머지 : %
- 지수 연산 : **
pragma solidity ^0.4.19;
contract ZombieFactory {
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
}
|
구조체
- struct 구조체 이름 {}
pragma solidity ^0.4.19;
contract ZombieFactory {
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
}
|
배열
- 정적배열 : 고정길이 배열
- 동적배열 : 가변적으로 크기 변화
- 구조체 배열
- public 배열 :
- 솔리디티는 해당 배열을 위해 getter 메소드를 자동적으로 생성한다.
- 쓸 수는 없지만 다른 컨트랙트들이 이 배열들을 읽을 수 있게 된다.
- 결과적으로 컨트랙트에 공개 데이터를 저장할 때 유용한 패턴이다.
*정적배열*
uint[2] fixedArray; *동적배열* uint[] dynamicArray; *구조체 배열* Person[] people; // 계속 원소 추가 가능 *Public 배열* Person[] public people; pragma solidity ^0.4.19;
contract ZombieFactory {
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
Zombie[] public zombies; // Zombie 구조체의 public 배열을 생성하고, 이름은 zombies라고 설
}
|
함수선언
- function 함수명(매개변수) { }
구조체와 배열 활용하기
Zombie[] public zombies; //Zombie 구조체 배열의 이름은 zombies
Zombie z1 = Zombie("k", 123456) // z1이라는 Zombie를 생성
zombies.push(z1); //push함수를 사용해서 z1을 zombies라는 배열에 추가
-->위 두 문장 합쳐서 표현하면, z1.push(Zombie("k", 123456));
private / public 함수
- 솔리디티에서 함수는 기본적으로 public으로 선언된다.
- 하지만, 공격에 취약할 수 있기 때문에 공개할 함수만 public으로 선언하고 기본 함수를 private로 선언하는 것이 좋다.
- private는 컨트랙트 내의 다른 함수들만이 해당 함수를 호출할 수 있다.
- private 키워드는 함수명 다음에 적는다. 즉, function _함수명() private {}
- 또한 private 함수명도 _(언더바)로 시작하는 것이 관례이다.
함수 더 알아보기
- 함수 반환값
string greeting = "hello";
function sayhello() public returns (string) {
return greeting;
}
- 함수 제어자
- 함수가 데이터를 보기만하고 변경하지 않을 경우(어떤 값을 변경하거나 무언가를 쓰지 않을 경우), "view"키워드를 사용한다.
- funtion sayhello() public view returns (string) {}
- 함수가 앱에서 어떤 데이터도 접근하지 않을 경우 "pure"키워드를 사용한다. 앱에서 읽는 것을 하지 않고 반환값이 함수에 전달된 인자값에 따라서 달라진다.
- 참고로, pure를 쓸 지 view를 쓸 지 헷갈리는데 솔리디티 컴파일러는 어떤 제어자를 써야 하는지 경고 메시지를 통해 잘 알려준다.
function _multiply(uint a, uint b) private pure returns(uint) {
return a*b;
}
Keccak256과 형 변환
- 이더리움은 keccak256를 내장 함수로 가지고 있다.
- 해시 함수는 기본적으로 입력 스트링을 랜덤 256비트 16진수로 매핑한다.
- 형변환
uint8 a = 5; uint b = 6; uint8 c = a * b; (x) uint8 c = a * uint8(b); //형변환 |
이벤트
- 컨트랙트가 블록체인 상에서 앱의 사용자 단에 액션이 발생했을 때, 의사소통하는 법이다.
- 즉, 컨트랙트는 특정 이벤트가 일어나는지 귀를 기울이고, 그 이벤트가 발생하면 행동을 취한다.
- 선언 : event 함수이름();
- 예 : event IntegersAdded(uint x, uint y uint result);
- 자바스트립트로 구현 : YourContract.IntegersAdded(function(error, result){}
Web3.js
- 이더리움에서는 컨트랙트와 상호작용하는 사용자 단의 자바스크립트 라이브러리를 Web3.js라고 한다.