2020.코딩일지

실습4.솔리디티 크립토좀비_온라인19,20일차220531,220601_제주ICT이노베이션블록체인과정+스마트컨트랙트문법220919 본문

Block Chain

실습4.솔리디티 크립토좀비_온라인19,20일차220531,220601_제주ICT이노베이션블록체인과정+스마트컨트랙트문법220919

개발하는라푼젤 2022. 6. 2. 13:51
728x90

[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/

 

#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

리믹스공식문서(+플러그인설치) 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 형식.

 

 

 

 

 

 

 

 

 

 

 

 

 

Comments