2020.코딩일지
실습4.솔리디티 크립토좀비_온라인19,20일차220531,220601_제주ICT이노베이션블록체인과정+스마트컨트랙트문법220919 본문
실습4.솔리디티 크립토좀비_온라인19,20일차220531,220601_제주ICT이노베이션블록체인과정+스마트컨트랙트문법220919
개발하는라푼젤 2022. 6. 2. 13:51[ICT]ERC-20실습 https://waytogo-anne.tistory.com/170
솔리디티이더리움공식문서
https://docs.soliditylang.org/en/v0.8.14/types.html#fixed-point-numbers
https://docs.soliditylang.org/en/v0.5.3/index.html
솔리디티
솔리디티는 스마트 컨트랙트를 실행하는 객체 지향(Object-Oriented), 정적 타입(Static Typed), 고급(High-Level) 스크립트 언어로, EVM에서 실행됩니다.
튜링 완전 언어이다.
어떤 프로그래밍 언어나 추상 기계가 튜링 머신과 동일한 연산 능력을 갖출 때, 우리는 그것이 튜링 완전(Turing-Complete)하다고 말함.
EVM은 반복문 Opcode들을 지원하는 대표적인 튜링 완전 머신이며,
솔리디티는 튜링 완전 머신을 동작하게 하는 튜링 완전 언어
Geth.정리해야하나말아야하나 (https://waytogo-anne.tistory.com/359)
Geth Wallet (https://waytogo-anne.tistory.com/364)
이더리움 EVM과 솔리디티solidity (solc사용) (https://waytogo-anne.tistory.com/363)
🤓솔리디티크립토좀비 + 스마트컨트랙트문법220919 (https://waytogo-anne.tistory.com/155)
솔리디티실습https://cryptozombies.io/ko/course/
리믹스공식문서(+플러그인설치) https://remix-ide.readthedocs.io/en/latest/plugin_manager.html
주요 기능
- 파일 익스플로러(File Explorers): 새로운 파일, 폴더를 만들거나, 깃허브 연동, 로컬 컴퓨터에서 파일 업로드를 할 수 있습니다.
- 솔리디티 컴파일러(Solidity Compiler): 작성한 컨트랙트 코드를 컴파일합니다.
- ABI, Bytecode를 비롯한 메타 데이터를 확인할 수 있습니다.
- 배포 및 트랜잭션 실행(Deploy & Run Transactions): 컴파일한 코드를 배포하고, 배포한 컨트랙트를 실행합니다.
- Remix에서 제공하는 가상 환경이나, 실제 이더리움 네트워크에 배포할 수 있습니다.
- 플러그인 매니저(Plugin Manager): 컨트랙트 개발에 필요한 모듈을 설치 및 관리합니다.
이더리움솔리디티를 웹기반IDE도구 리믹스 https://remix.ethereum.org/
[로컬에 remixd설치]
vscode로 `remixd_pratice`폴더생성/ 파일명'remixd_test.sol'작성
`remixd_pratice`폴더안에/ 'remixd_test.sol'파일작성
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;
contract SimpleStorage {
uint storedData;
function set(uint x) public {
storedData = x;
}
function get() public view returns (uint) {
return storedData;
}
}
터미널로 해당위치로 이동하여 `npm install` 하면 package.json파일생성됨
터미널에 명령어로 remixd설치 `npm install -g @remix-project/remixd`
해당 디렉토리를 Remix IDE와 웹소켓으로 연결 아래명령어
remixd -s <remixd_practice 폴더의 절대경로> --remix-ide https://remix.ethereum.org
리믹스 로컬호스트와연결하기 /폴더명(solidity)
remixd -s ~/Public/BEB06th_220706/solidity/solc_practice --remix-ide https://remix.ethereum.org/
//또는 폴더위치에서
remixd -s solidity --remix-ide https://remix.ethereum.org/
//https인거시다~~
리믹스접속 remix.ethereum.org 하여 왼쪽상단 workspaces부분을 '-connect to localhost'로변경. 로컬이 remix로 열리며
remixIDE에서 수정한것이
vscode에서도 자동반영됨
리믹스에서 deploy후 transaction hash값으로 etherscan.io 테스트넷에서 조회
->to부분의 컨트랙트계정정보로 이동
->contract 탭 (이진형태의 코드를 솔리디티형태로 이더스캔에등록해보자!!)다봐라음핳ㅅ핫핫
->Verify & Publish 링크클릭
->solidity클릭, 버전클릭, noLicense클릭, 솔리디티코드입력하면 코드가 공개됨
SOFTWARE PACKAGE DATA EXCHANGE
SPDX 라이센스 리스트는 https://spdx.org/licenses/ 에서 확인
스마트 컨트랙트에 대한 신뢰를 높이고, 저작권과 같은 문제를 해소하기 위해 명시. 주석으로표기
// SPDX-License-Identifier: MIT
// SPDX-License-Identifier: GPL-3.0
pragma 특정 컴파일러의 버전표기
pragma solidity >=0.4.0 <0.9.0; // 0.4.0 이상 0.9.0 미만의 버전을 사용합니다
pragma solidity ^0.8.14; // 0.8.14 이상의 버전을 사용합니다
pragma solidity 0.8.14; // 0.8.14 버전을 사용합니다
파일 임포트 import
import "파일이름";
// 임포트하는 파일을 symbolName이라는 이름으로 사용
import * as symbolName from "파일이름";
import "파일이름" as symbolName;
// 파일의 일부분만 임포트 하는 경우
import {symbol1 as alias, symbol2} from "파일이름";
2.11 인터페이스활용하기
3.11 메모리할당 ✨
4.4 케깎함수를 통해서 같은값이 나오지 않도록하기위해 사용
4.9
5.3
5.6 제어자에 왜 tokenId를 넣는가?
함수 인자명을 언더스코어(_)로 시작해 _함수내에서만쓰는인자
전역 변수와 구별
_함수명 프라이빗함수 private
솔리디티의 함수(function)에대한 설명
function (<parameter types>) {internal | external | public | private} [pure | constant | view | payable] [(modifiers)] [returns (<return types>)]
[1] parameter types : 함수에서 받아올 매개변수를 타입과 함께 선언
[2] Visibility Keyword (internal, external, public, private) : 접근제어자(access control) 역할
Solidity 언어에서 스마트 컨트랙트 내의 상태 변수(State variable)와 함수에 적용할 수 있는 Visibility는 4가지
- internal: internal은 Smart contract의 interface로 비공개한다는 것입니다. 계약서(Contract)의 해당 내용을 비공개한다는 의미이며, 계약서의 내부에서만 사용하는 함수라는 것을 표시합니다. 상태변수(state variable)는 internal이 기본값입니다. 아무것도 적용하지 않았다면 자동으로 internal입니다. 계약서 자신과 상속받은 계약서만 사용할 수 있습니다.
- external: external은 Smart contract의 interface로 공개한다는 것입니다. 계약서(Contract)의 해당 내용을 공개한다는 의미이며, 계약서의 외부에서 사용하는 함수라는 것을 표시합니다. 상태변수(state variable)는 external일 수 없습니다. 계약서 내부에서 사용할 경우 this를 사용해서 접근해야 합니다.
- public: 공개함수라고 말합니다. 공개 기능은 계약 인터페이스의 일부이며 내부적으로 또는 메시지를 통해 호출할 수 있습니다. 공개 상태 변수의 경우 자동 getter 함수가 생성됩니다.
- private: 비공개함수라고 말합니다. 비공개함수는 계약서 내부에서도 자신만 사용하는 함수라는 것을 표시합니다. 상태변수와 함수 모두 파생된 계약이 아닌 정의된 계약에서만 볼 수 있습니다.
[3] 함수의 동작과 관련된 키워드
- pure: storage에서 변수를 읽어오거나 쓰지 않는 함수임을 명시합니다.
//읽는 것도 하지 않고, 다만 반환값이 함수에 전달된 인자값에 따라서 달라진다
//function 밖의 변수들을 읽지 못하고, 변경도 불가능 - constant, view :
상태를 변경하지 않는 함수임을 명시합니다.
// view : function 밖의 변수들을 읽을수 있으나 변경 불가능 - payable: 입금을 받을 수 있는 함수임을 명시합니다.
가스란?
DApp의 함수를 실행할 때마다
그 함수의 로직(논리 구조)이 얼마나 복잡한지에 따라
수행하는 데에 소모되는 컴퓨팅 자원의 양이 이 비용을 결정
왜필요한가?
분산화하고, 데이터를 보존하며 누군가 검열할 수 없도록 하는 요소
무한 반복문을 못쓰게하려고( 네트워크를 방해/자원소모/
저장위치 | 스택 | 힙 | 메모리 | 스토리지 | calldata |
보통 | 보통 | 보통 | |||
솔리디티데이터 | 솔리디티데이터 | 솔리디티데이터 | |||
강제데이터 | 상태변수 | 외부함수의 매개변수 (반환값미포함) |
|||
기본데이터 | 함수의 매개변수 (반환값미포함) |
모든 지역변수 | |||
휘발 함수호출시에만 존재 |
영구저장 블록체인에저장 |
휘발 함수호출시 수정불가능 |
|||
참조형 데이터타입 |
new 배열array bytes 가변 문자열string 구조체struct - |
- byte[] - - 매핑 mapping |
배열array bytes 가변 문자열string 구조체struct - |
변수의 종류
상태변수 | 지역변수 | 전역변수 | |
컨트랙트 저장소(이더리움 블록체인)에 영구적으로 저장되는 변수 |
함수가 실행될 때까지만 존재하는 변수 | 다른언어와달리, 선언이나초기화x 불러와서 사용 |
|
변수 접근 수준 4가지 |
public : internal(default), 상속컨트랙트접근 private : constant / immutable: 선언시 값할당하여 상수화 = 변경불가능! |
글로벌한 블록체인 안에 있는 특수 변수 | |
contract { 여기에 타입과함께 선언 } | contract { function { 여기에 타입과함께 선언 }} | 블록체인 및 트랜잭션에 대한 속성 | |
함수 접근 수준 4가지 |
public(default) external : 상속가능 컨트랙트 내부 호출불가능. 컨트랙트 내부러부터 불릴경우 this.f() internal : 컨트랙트 멤버, 상속된 호출가능 private : 컨트랙트 멤버만 호출. |
||
qualifier 접근지정자 |
view 밖에 있는걸 가져다 쓸수있다. 읽기전용 / 수정불가 pure 변수만 못읽어옴(상수읽어옴) 수정불가 payable |
||
constructor 생성자함수 <>selfdestruct소멸 |
|||
에러핸들링 (조건미충족시) |
revert : 함수걍종료 require : 진행되지않음 assert : 원복(가스소모) |
contract SimpleStorage {
uint storedData; // 상태변수 선언
uint storedData2 = 20; // 상태변수 선언 및 초기화
}
전역변수
function f(uint start, uint daysAfter) public {
if (block.timestamp >= start + daysAfter * 1 days) {
// 여기서 block.timestamp는 전역변수
}
}
- block: 블록에 대한 정보를 가지고 있습니다.
- msg: 컨트랙트를 시작한 트랜잭션 콜이나 메시지 콜에 대한 정보를 가지고 있습니다.
- tx: 트랜잭션 데이터를 가지고 있습니다.
- This: 현재 컨트랙트를 참조합니다. 현재 컨트랙트 주소로 암시적으로 변환됩니다.
전역변수데이터 형식설명
blockhash(uint blockNumber) | bytes32 | 주어진 블록의 해시를 반한. bytes32 형식. |
block.basefee | uint | 현재 블록의 기본 수수료. uint 형식. |
block.chainid | uint | 현재 블록의 체인 ID. uint 형식. |
block.coinbase | address payable | 현재 블록의 채굴자 주소. address 형식. |
block.difficulty | uint | 현재 블록의 난이도. utint 형식. |
block.gaslimit | uint | 현재 블록의 가스 한도. uint 형식. |
block.number | uint | 현재 블록의 번호. uint 형식. |
block.timestamp | uint | 현재 블록의 유닉스 타임스탬프. uint 형식. |
gasleft() | uint256 | 남아있는 가스의 양을 반환. uint256 형식. |
msg.data | bytes calldata | 전체 콜데이터 본문. bytes 형식. |
msg.sender | address | 현재 호출을 수행하고 있는 메시지 발신자. address 형식. |
msg.sig | bytes4 | 호출 데이터의 첫 4바이트(함수 식별자). bytes4 형식. |
msg.value | uint | 메시지와 함께 보낸 이더(Wei) 금액. uint 형식. |
tx.gasprice | uint | 트랜잭션 가스 비용. uint 형식. |
tx.origin | address | 트랜잭션 발신자. address 형식. |
'Block Chain' 카테고리의 다른 글
Section3:블록체인 기술(1) - 암호화폐, 암호화, 지갑 [BEB 6th] (0) | 2022.08.26 |
---|---|
Section3:블록체인 기술(1) - 분산원장(1) [BEB 6th] (0) | 2022.08.24 |
[블록체인]Introduction(2)[BEB 6th] (0) | 2022.08.21 |
[블록체인]Introduction(1)[BEB 6th] (0) | 2022.08.16 |
블록체인 기술적 특징과 비즈니스 이해 (0) | 2021.07.19 |