블록체인 :: SmartContract

쩡쎈·2021년 8월 26일
0

블록체인

목록 보기
3/5

SmartContract

: 서면으로 이루어지던 계약을 코드로 구현하고 특정 조건이 충족되었을 때 해당 계약이 이행되게 하는 script
스마트 컨트랙트를 사용 -> 두 당사자가 서로를 모르거나 신뢰하지 않더라도 계약 체결 가능

스마트 컨트랙트는 조건에 맞는 정확한 작동을 수행하는 능력 有

블록체인에서 정의된 불변의 프로그램
불변 (immutable) : 한 번 배포되면 변경 불가
결정적 (deterministic) : 실행한 결과가 모두 같음
EVM 위에서 동작
탈중앙화된 Word Computer 동일한 상태를 유지

이더리움 스마트 컨트랙트의 배포 & 작동방식

  1. 스마트 컨트랙트로 구현하고자 하는 내용을 Solidity 등으로 구현.
  2. Solidity 코드를 컴파일 하여 네트워크에 배포할 수 있는 Bytecode를 생성.
  3. Transaction에 Bytecode를 담고, 마이너가 해당 Transaction이 담긴 블록을 채굴. 동시에 해당 Transaction은 블록체인 네트워크에 기록
  4. 유저는 ABI를 통해 배포된 스마트 컨트랙트 코드에 정의된 함수를 호출하는 Bytecode를 생성하고, Transaction에 담아 블록체인 네트워크에 전달.
  5. 채굴자는 유저로부터 받은 Bytecode를 배포된 스마트 컨트랙트 코드에 따라 EVM(Ethereum Virtual Machine) 위에서 실행. 이때, Gas Fee가 계산되면서 블록에 추가되고, 실행 결과가 유효한 경우 실행 결과가 State에 반영됨.

호출 과정

Run을 시키기 위해선 몇 가지 정보를 요구함

  • 사용자 계정 (EOA) : 직접 호출하는 사람이 누구인지에 대한 정보
  • 컨트랙트 계정 (CA)
  • ABI : 스마트 컨트랙트가 어떤 멤버와 function을 가지고 있는지에 대한 정보
  • 함수의 주소, 매개변수

컨트랙트 구현

FundRaising

상태 변수 추가

컨트랙트 배포 시 모금 기간과 모금액 수령자 지정

-unit public fundRaisingCloses : 해당 펀드가 언제 끝나는지 정의하는 unit 함수

  • unit duration : 몇 초동안 모금 유효한지 의미함. (*3600=1시간)
  • 정수형 연산자 '+' : 현재 타임스탬프 + duration을 ticketingCloses의 값으로 지정
  • block.timestamp : 특수 전역 변수 중 하나 (현재 시각의 유닉스 타임 스태프 값)
  • public 가시성 : 어디에서나 열람 가능
contract FundRaising {
    unit public fundRaisingCloses;
    address public beneficiary;
    constructor(unit _duration, address _beneficiary){
        fundRaisingCloses = block.timestamp + _duration;
        beneficiary = _beneficiary;
    }
}

상태 추가 - 최소 모금액 지정

  • 최소 모금액 : 0.01 ether

  • 이더리움 기본 단위 wei

  • 10^18 wei = 1 ether

  • 1e16 == 0.01 ether == 10**16

  • 단위 wei,ether 등

  • ** : 지수 연산자

함수 선언

  • 필수 함수
    1. 모금 - fund
    1. 현재 모금액 - currentCollection
    2. 모금액 수령 수령 - withdraw

모금함수 fund

function fund() public{
}
  • 요구사항
  1. 0.01 ether 이상으로 모금에 참여할 수 있다.
  2. 지정된 모금 시간 이내에만 참여할 수 있다.
  3. 모금이 완료되면 모금자를 저장한다.
  • 조건문 if
    - 논리형 변수 : bool

    • 논리 연산자 ==,!=,&&,|
  • 전송한 이더가 최소 금액 조건을 만족하는지 판별

  • 모금 유효시간인지 판별

  • 유효성 체크 함수
    - require(판별문, "에러 메시지");

    • 판별문이 true가 아닌 경우 "에러 메시지" 출력 후 함수 바로 종료
require(msg.value>= MINIMUM_AMOUNT, "MINIMUM AMOUNT : 0.01 ether");
        require(block.timestamp < fundRaisingCloses, "FUND RAISING CLOSED");
        

if문을 require로 대체 가능

  • 주소형 address
    - 이더리움 주소를 저장할 수 있는 자료형
    • 초기값은 0x0
  • msg.sender
    - 메시지 송신자를 알 수 있는 전역 변수
  • 자료형의 배열
    - uint[4] fixedArray;
    • uint[] dynamicArray;
  • push : 배열의 가장 뒤에 요소 추가

현재 모금액 : currentCollection

-요구사항
1. 현재까지 모금된 금액을 누구나 확인할 수 있다.

  • 수의 반환값 선언 : returns(type)
  • view : 상태 변수에 변화를 가하지 않고 읽기만 하는 함수

모금액 수령 : withdraw

  • 요구사항
  1. 지정된 수령자만 호출할 수 있다.
  2. 모금 종료 이후에만 호출할 수 있다.
  3. 수령자에게 컨트랙트가 보유한 이더를 송금한다.
  • 이더 전송이 일어나는 payable 함수

  • 함수 modifier 작성

  • address의 멤버 : balance, transfer
    - 컨트랙트가 보유한 이더 :

    .balance
    - 요청 주소에게 컨트랙트 보유 이더 송금 : .transfer(unit256 amount)

profile
모르지만 알아가고 있어요!

0개의 댓글