728x90

enum 사람이 읽을 수 있게 , 사용자/개발자에 의해 정의된 상수세트 타입이다. (uint8=0~255(2^8-1))

enum 이름 {

}

 

 

contract lec38{
    //자동차 상태 나타냄
    enum CarStatus{
        //0
        TurnOff,
        //1
        TurnOn,
        Driving,
        Stop
    }
    //상태의 변수
    CarStatus public carStatus;
    
    constructor(){
            // 이넘쓸때 이넘.안의 이름
        carStatus = CarStatus.TurnOff;
    }
    
    event carCurrentStatus(CarStatus _carStatus, uint256 _carStatusInInt);
    
    function turnOnCar() public {
        //자동차에 시동꺼져있어야한다.
          require(carStatus == CarStatus.TurnOff, "To turn on, your car must be turned off");
        //CarStatus화로 나타내는 방법.
        // require(carStatus == CarStatus(0), "To turn on, your car must be turned off");
        //시동켜기
        carStatus = CarStatus.TurnOn;
        //carStatus = CarStatus(1);
           //uint256으로 출력하려면 그렇게 형변환해야 출력할수잇음
        emit carCurrentStatus(carStatus,uint256(carStatus));
    }
    
    //자동차 상태를 운전중으로 변경시켜주는 함수
    function DrivingCar() public {
        //자동차 시동켜져있어야함
        require(carStatus == CarStatus.TurnOn, "To drive a car, your car must be turned on");
        carStatus = CarStatus.Driving;
        emit carCurrentStatus(carStatus,uint256(carStatus));
    }
    //자동차 멈추고 싶다
    function StopCar() public {
        require(carStatus == CarStatus.Driving, "To drive a car, your car must be turned on");
        carStatus = CarStatus.Stop;
        emit carCurrentStatus(carStatus,uint256(carStatus));
    }
    //시동끄기
    function turnOffCar() public {
        
        require(carStatus == CarStatus.TurnOn 
                || carStatus == CarStatus.Stop , "To turn off, your car must be turned on or driving");
        carStatus = CarStatus.TurnOff;
        emit carCurrentStatus(carStatus,uint256(carStatus));
    }
   //자동자가 무슨상태인지 나타내는 함수
    function CheckStatus() public view returns(CarStatus) {
        return carStatus;
    }
}
728x90
728x90

payable 이더를 받을때나 보낼때 쓰는 키워드

 

 

 

payable을 생성자에 넣을 때

 

 

생성자에 페이어블 넣으면 배포했을 때 생성자함수도 구현돼서 이더를 보낼수 있대

 

저 이더에 5넣고 배포 누르니까 빠져나감

 

 

 

특정계정 권한주기

 

 

modifier로 함수들에 조건 추가

 

 

 

 

강의: 인프런 솔리디티 깨부수기

728x90
728x90

주소.balance    주소의 현재 갖고 있는 이더의 잔액

( msg.value       송금액을 의미한다 달라! )

msg.sender      스마트컨트랙을 사용하는 주체, 보내는 자

주고 받는거 해봄

 

 

이더보내는 스마트컨트랙트 코드  (출처: https://github.com/D-One0914/BreakingSolidityBasic/blob/main/lec33.sol

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0 < 0.9.0;

//주소.balance
//주소의 현재 갖고 있는 이더의 잔액을 의미함.  //  msg.value는 송금액을 의미한다 달라!

// msg.sender
// msg.sender는 스마트컨트랙을 사용하는 주체라고 볼 수 있다 
// 앞으로 설명할 call 과 delegate call에서 주요 내용이니 관심잇게 봐라

contract MobileBanking{
    event SendInfo(address _msgSender, uint256 _currentValue);
    event MyCurrentValue(address _msgSender,uint256 _value);
    event CurrentValueOfSomeone(address _msgSender, address _to, uint256 _value);


   //이더를 보낼라면 
   //을 넣을 줄 알았지만!!! 보내는 주소, 받을 사람 주소만 있음 되는구나.. 이더를 받아야되기때문에 payable써준다 //함수전체도 이더보는거라 payable써줌
    function sendEther(address payable _to) public payable {
        require (msg.sender.balance >= msg.value , "your balance is not enough");
        //트랜스퍼 함수를 통해 이더 송금
        _to.transfer(msg.value);
        //보낸 나의 주소, 내 잔고
         emit SendInfo(msg.sender, (msg.sender).balance);
    }
    //그냥 현재 잔고확인 함수인듯?
    function checkValueNow() public{
        emit MyCurrentValue(msg.sender, (msg.sender).balance);
    }
    //어떤 계정의 잔고 확인하고 싶을때, 확인하고 싶은 주소 넣기
    function checkUserValue(address _to) public{
       emit CurrentValueOfSomeone(msg.sender, _to, _to.balance);
    }

}

 

 

이더송금하기 

sendEther함수 사용

 

1. 코드를 컴파일한다

또는 우클릭해서 원하는 코드 컴파일.

 

2. ACCOUNT 에서 현재 내 계정주소 확인하고  Deploy 배포한다.

 

1로 표시한거 &gt;&nbsp; 계정주소 넣을 부분 2로 표시한거 &gt; 이더금액 넣는 부분 3로 표시한거 &gt;&nbsp; Deploy 배포 4로 표시한거 &gt; 함수사용하는 부분 5로 표시한거 &gt;&nbsp; 내역&nbsp; &nbsp; &nbsp; &nbsp;(숫자 이거 순서 아님주의!!!)

3. 함수 실행

 

Deploy했으면

Deployed Contracts 가 생성될거다.

함수에 값넣어서 이더송금할 수 있다.

 

sendEther는 송금받을 주소를 넣는 곳이다.

 

Account에서 보낼 주소를 골라서 복사해서 sendEther에 넣는다.

그리고 Account에서 다시 내 계정주소로 와있는지 확인한 다음에

보낼 이더 값을 Value에 넣는다. Ether로 되어있는지 확인한다.

그리고 sendEther를 눌러 송금함수를 실행한다. 

 

잘보내졌으면 저렇게 내역이 뜬다.

ACCOUNT 눌러서 남은 잔고와 받은 잔고를 맨위에 사진처럼 확인할 수 있다. 

 

 

 

 

현재계정 잔고확인하기

checkValueNow함수 사용

 

 

 

 

 

 

특정계정의 잔고 확인하기 

checkUserValue함수

에 _to 확인할 계정주소 넣고

원래 보낼 주소로 되어있는지 ACCOUNT확인하고

 

함수 실행하면

_msgSender 주체

_to 확인한 계정

_value 잔고

 

 

 

 

 

728x90
728x90

이더리움 P2P(peer to peer) 네트워크는 두가지 요소로 구성되어 있다. 

  • 이더리움 클라이언트 (런타임 시 작동하며 네 가지 요소를 포함한다.)

-이더리움 가상머신 EVM ethereum virtual machine

-메모리 풀

노드가 수신한 거래내역을 네트워크에 전파하기 전에 저장한다. 투표 앱에서는 사용자가 제출한 투표 내역을 저장한다.

-클라이언트 프로세스

수신된 메시지 및 거래내역을 적절하게 EVM에 보내거나 거래내역을 메모리 풀에 저장하고 검색한다. 또한 피어 노드에서 받은 블록을 처리하고 블록체인 데이터베이스의 로컬 복사본에 추가한다.

-JSON-RPC API 

다른 노드나 외부에서 클라이언트의 기능을 사용할 수 있게 한다.

 

  • 블록체인 데이터베이스

유권자가 제출한 투표와 같은 거래 내역 외에도 블록체인은 네트워크 상에 배포된 모든 스마트 컨트랙트의 EVM 바이트 코드 복사본과 상태를 저장하고 있다. 채굴노드는 15초마다 정기적으로 새로운 블록을 불록체인에 추가한다.

 

설명 출처: <이더리움 디앱 개발>, 로베르토 인판테 지음, p70

728x90
728x90
//간단한 암호화폐 simplecoin의 첫번째 구현
pragma solidity ^0.4.0;  //pragma는 솔리디티 컴파일러의 지원버전을 나타낸다.
contract SimpleCoin {  //컨트랙트를 정의하는 코드. 컨트랙트는 다른 언어의 클래스와 비슷
  //상태변수를 주소와 정수 사이의 '매핑'으로 정의한다. 
  //상태변수는 클래스의 멤버 변수와 같음. 매핑은 해시 테이블 또는 해시맵과 동일함.
    mapping (address => uint256) public coinBalance ;
    //mapping(string => addresss) public tenDatabase;
  
   //
   event Transfer(address indexed from, address indexed to, uint256 value);
   // 생성자, 컨트랙트 생성자를 정의
    constructor(uint256 _initalSupply) public {
        coinBalance[msg.sender] = _initalSupply;
        //  [msg.sender] = 10000; //멤버필드 초기화
    }

    //메서드
    //해당주소에 얼마만큼 보내겟다
    //함수 호출자의 계정에서 지정된 계정으로 일정수의 simplecoin토큰을 전송하는 함수를 정의한다.
    function transfer(address _to, uint256 _amount) public {
        require(coinBalance[msg.sender] > _amount);
        require(coinBalance[_to] + _amount >= coinBalance[_to]);
        //메시지 발신자의 잔액을 지정된 토큰 수만큼 줄인다. msg.sender는 보낸사람의 주소를 나타냄.
        coinBalance[msg.sender] -= _amount;
        //지정된 코튼수만큼 동전잔고를 증가시킴
        coinBalance[_to] += _amount;
        emit Transfer(msg.sender, _to, _amount);
    }
}

솔리디티 컨트랙트는 

상태변수(예: coinBalance),

생성자(SimpleCoin 함수), 

함수(transfer 함수) 및 이벤트

로 구성됨

 

coinBalance 상태변수는 mapping으로 정의된다.

매핑은 자바의 해시맵, C#의 딕셔너리 또는 파이썬의 딕셔너리dict에 해당하는 해시맵이다.

키는 주소address이며 값은 uint256

 

coinBalance 상태변수는 각각 simpleCoin토큰을 보유하는 동전 계정의 모음을 나타낸다.

msg 수신된 메시지 객체를 나타내는 특수 변수

msg.sender 메시지 보낸 사람의 주소를 나타내는 msg객체의 속성

 

 

 

Deploy를 눌러

컨트랙트를 배포하면 Deployed Contracts 패널이 나타난다.  

 

 

이제 컨트랙트를 활용할 수 있다.

SimpleCoin 토큰 잔액을 확인하고 토큰을 다른 계정으로 전송할 수 있다. 

transfer 는 쓰기 작업 (지정한 수의 토큰을 지정된 주소로 전송할 수 있다.)

coinBalance는 읽기 작업 (coinBalance 상태변수를 가져오며 읽기 전용 작업이다., 계정의 잔고를 읽는 작업함)

 

 

리믹스에는 버튼색으로 나뉨

파란색 버튼

컨트랙트 읽기 작업을 수행, 상태변수의 값을 확인하거나 읽기 전용함수를 호출

빨간, 저 주황색 버튼

컨트랙트 쓰기 작업을 수행. 생성자를 통해서 컨트랙트를 생성하거나 상태변수를 수정하는 함수를 호출

 

 

 

설명 출처: <이더리움 디앱 개발>, 로베르토 인판테 지음, p60

 

 

728x90
728x90

솔리디티 (이더리움 등 블록체인 플랫폼에서 스마트 계약 작성과 구현에 사용되는 계약 지향 프로그래밍 언어)

쓸 때 여기서 바로 할 수 있긴한데

https://remix.ethereum.org/

 

Remix - Ethereum IDE

 

remix.ethereum.org

 

vscode 비주얼 스튜디오에서 작업하고 싶으니까 작업 환경을 설정해보자

 

먼저 당연히 깔려있어야할

 

비주얼스튜디오 설치

Visual Studio Code

Node.js 설치

Node.js

NPM설치

npm   (Node Packaged Manager를 전역에 설치. npm install -g npm)

 

트러플 설치!!

npm install -g truffle

 

 

트러플은 이더리움 프레임워크로 소스코드를 쉽게 compile,deploy 작업을 할 수있게 해줌

 

설치했으면 버전확인하고

 

이제

비주얼 스튜디오에 Solidity 솔리디티 확장자를 설치할거임!

vscode 열고 Ctrl + Shift + X 누르거나 여기 누르면 솔리디티 검색해서 깔면 됨!

 

(파이썬도 깔아줘야한대서 깔긴했는데 왜까는지 모르겠음..내가 본 문서에서는 얘기 없어서)

 

 

암튼 이제 됐고

truffle init

 

하면 

이렇게 생겨남

이제 내가 작업할 솔리디티 파일을 

constracts에 넣으면 됨 

클립토 좀비에서 레슨1의 완성된 코드 하나 가져와서 만듦

코드 복붙해보면 

 

지금은 안뜨는데 아까는 

이렇게 버전이 안맞다고 떴었음

여기 들어가서 Set compiler version을 0.4.19로 맞춰줘.

 

근데 난 이게 안됐음

알고보니까 솔리디티 확장자가 최신버전이더라고 

거기서 버전을 맞춰줘야됐었음

톱니바퀴 눌러서 환경설정 들어가면

 

여기서 버전 설정해주면 빨간줄 사라짐!!

 

환경설정 끝~~

 

 

 

이제 버전 문제 해결됐으면

 

truffle develop

디벨롭하고

run & deploy 누르고 

Activate하기 

 

 

 

 

그럼 이거 켜짐 

연결안되어있으면 connect

그리고 compile 누르면

 

여기서부터는 잘모르겠음..

deploy 누르고 

call해보고 했는데 뭘하려고 하는지 이해못함

 

 

 

728x90

+ Recent posts