취약의 사례들 모음집 :
https://consensys.github.io/smart-contract-best-practices/known_attacks/
Courses 01 솔리디티_문법공부
'좀비공장만들기 '
<Chapter별로 모르는 부분정리 >
Chapter05 : 구조체(struct)
솔리디티에서는 구조체라는 데이터 타입이있다.
*처음에는 구조체가 class의 개념인줄 알았는데 그게 아니고 데이터 타입이였다.
안에 속성만 넣을 수 있으며, 함수는 선언 하지 못한다.
-> 구조체를 통해 여러 특성을 가진, 보다 복잡한 자료형을 생성할 수 있다.
*contract이 class개념 이고 , contract 간의 상속이 가능하다.
Chapter06 : 배열
어떤것의 모음집이 필요할때 배열을 사용할 수 있다.
솔리디티에는 정적배열 과 동적배열 두 종류의 배열이 있다.
또한 내가 정의한 구조체(struct)의 배열을 생성 할 수도 있다.
이것은 상태변수가 블록체인에 영구적으로 저장되는데, 이렇게 구조체의 동적 배열을 생성하면 마치 데이터베이스처럼
컨트랙트에 구조화된 데이터를 저장하는데 유용하다.
Public배열
솔리디티는 이런 배열을 위해 getter메소드를 자동적으로 생성한다. 구문은 다음과 같다.
Person[ ] public people;
그러면 다른 컨트랙트들이 이 배열을 읽을 수 있게된다.(쓸 수는 없다.)
이는 컨트랙트에 공개 데이터를 저장 할 때 유용한 패턴이다.
Chapter08 : 구조체와 배열 활용하기
Chapter05에서 배웠던 Person 구조체의 Person를생성하고, people배열에 추가하는 방법을 살펴보자.
두 코드를 조합해서 깔끔하게 한 줄로 표현하는 방법은 아래와 같다.
또한 array.push( )는 무언가를 배열의 끝에 추가해서 모든 원소가 순서를 유지하도록한다.
예시.
Chapter10 : 반환값과 함수 제어자
반환값 :
함수에서 어떤 값을 반환 받으려면?
솔리디티에서 함수 선언은 반환값 종류를 포함한다.
함수 제어자:
sayHello( ) 함수는 솔리디티에서 상태를 변화시키지 않는다.
즉, 어떤 값을 변경하거나 무언가를 쓰지않는다.
이 경우에는 함수를 view함수로 선언한다. 이는 함수가 데이터를 보기만하고 변경하지 않는다는 뜻이다.
또한 pure함수도 있는데, 이는 함수가 앱에서 어떤 데이터도 접근하지 않는것을 의미한다.
위의 함수는 앱에서 읽는 것도 하지않고, 다만 반환값이 함수에 전달된 인자값에 따라서 달라지니
이 경우는 함수를 pure로 선언한다.
Chapter11 : Keccak256 과 형 변환
Keccak256 :
함수의 반환값이 (반)랜덤인 uint가 되기를 원하면 어떻게 하면 될까?
이더리움은 SHA3의 한 버전인 keccak256를 내장 해시 함수로 가지고있다.
해시 함수는 기본적으로 입력 스트링을 랜덤 256비트 16진수로 매핑 한다.
스트링에 약간의 변화라도 있으면 해시 값은 크게 달라진다.
해시함수는 이더리움에서 여러 용도로 활용된다.
형 변환 :
가끔씩 자료형간에 변환을 할 필요가 있다.
위의 예시에서 a * b는 uint를 반환한다. 하지만 우리는 이 반환값을 uint8에 저장하려고하니
잠재적으로 문제를 야기할 수 있다. 반환값을 uint8으로 형 변환하면 코드가 제대로 작동하고,
컴파일러도 에러 메시지를 주지 않을 것이다.
아래 부분은 잊지않게 작성해 두었다.
**부호없는정수 : uint
uint 자료형은 부호없는 정수로, 값이 음수가 아니어야 한다.
부호있는 정수를 위한 int자료형도 있다.
생긴 이유: 메모리를 효율적으로 담기기위해서 만들어졌다. 0~256bit
uint8, uint16, uint32 등과 같이 uint를 더 작은 비트로 선언할 수 있다.
Chapter12 : 이부분은 , 자바스크립트로 변환해보고싶다.
Chapter13 : 이벤트
솔리디티에서의 이벤트는 컨트랙트가 블록체인 상에서 앱의 사용자 단에서 무언가 액션이 발생했을 때 의사소통하는 방법이다. 컨트랙트는 특정 이벤트가 일어나는지 "귀를 기울이고" 그 이벤트가 발생하면 행동을 취한다.
이랬을 경우, 앱의 사용자 단 은 해당 이벤트가 일어나는지 귀를 기울인다.
자바스크립트로 이를 구현하면 다음과 같다.
오..그럼 어쨌든 또 자바스크립트로 사용하는건가...?
게임에서의 이벤트는 아래코드처럼 좀비가 생성 될 때 마다 우리 앱의 사용자 단에서 이에 대해 알고,
이를 표시하도록 하는 이벤트로써 사용하였다.
Courses 01 마지막 Chapter
Chapter14 : Web3.js
솔리디티 컨트랙트가 완성되었다.
이 컨트랙트와 상호작용하는 사용자단의 자바스크립트 코드를 작성해야한다.
헙..강사님이랑 할 때 너무 대충봤었는데,
혼자해보니 여기서 js를 통해 컨트랙트와 통신을 하는구나 .. 라는 결론을 얻게되었다.
열심히 JavaScript를 공부해야겠다.
우선 오늘 참여하는 공모전끝나구, 다음주부터 JavaScript 공부 Go!
https://cryptozombies.io/ko/lesson/1/chapter/14
#1 Solidity Tutorial & Ethereum Blockchain Programming Course | CryptoZombies
CryptoZombies is The Most Popular, Interactive Solidity Tutorial That Will Help You Learn Blockchain Programming on Ethereum by Building Your Own Fun Game with Zombies — Master Blockchain Development with Web3, Infura, Metamask & Ethereum Smart Contracts
cryptozombies.io
+
솔리디티는 console을 찍을 수 없다.
크립토 좀비나 솔리디티 code작성을 하면서 console찍어보고싶었던 적이 여러번 ....있었다.
나는 당연히 나는 remit이나 크립토좀비가 ui가 잘 되어있어서, console찍혀질 줄알았다.
그래서 나는 강사님께 console어떻게 찍냐고 여쭤봤는데
뭔가 다른 장치가 필요하다고한다.
이건 vsCode하면서 차차 배우는걸로...
그리구 방금 생각났던건, 솔리디티가 node.js의 처럼 서버의역할을 한다면.... 진짜 콘솔로 찍을 수 있는 방법이 ..다른 장치가 확실히 필요하겠구나 라고 생각이들었다. 예를들어 웹브라우저의 콜솔로 찍히게 하는것처럼말이다.
최근댓글