블록체인
chain of blocks. block = database
블록체인은 append만 가능한 데이터베이스이다
추가만 가능하고 편집은 불가능한 DB이다
특정 개인이 DB를 관리할 수없다 모두가 DB의 복제본을 가지고 있다. 분산된 DB이다
수천/수만대의 컴퓨터에 동일한 데이터베이스의 복사본을 가지고 있다.
많은 비트코인 노드가 있고 모든 노드가 꺼져야 비트코인이 죽을 수 있다.
블록들의 Linked List형태라고 할 수 있다.
모든 거래기록이 추적 가능하다.
블록체인은 서버가 모든것을 담당하고 있는 중앙화 서비스와 달리 누구든 노드를 돌려서 채굴을 할 수 있으며 중앙화된 주체가 없다. 노드가 하나라도 블록체인 정보를 들고 있으면 사라지지 않는다.
블록체인이 풀고자 하는 문제
서로 신뢰할 수 없는 노드들이 위변조가 어려운 데이터의 체인을 어떻게 만들 수 있을까?
자료구조
•
블록: 트랜잭션의 컨테이너
•
블록체인: singly-linked list
아키텍쳐: P2P네트워크 구조의 분산시스템
합의 알고리즘: 비잔틴 장군 문제를 풀 수 있는 분산합의 알고리즘
블록
블록은 정보를 DB에 추가하는 방법이다.
블록 안에는 해시값, 이전 블록 해시값, 데이터 등이 들어있다.
비트코인인 경우 데이터는 누구에게 얼마를 보냈다 등의 transaction.
해시는 일방향 함수이고 deterministic하다.
어떤것을 해시했을때의 결과가 정해져있고, 일방향이라는것은 아웃풋을 통해 인풋을 추측할 수 없다는것이다.
비트코인 블록은 트랜잭션 데이터들을 모아서 데이터로 저장하고 이전 블록의 해시를 가져오고 내 데이터와 이전 블록의 해시를 합친값을 해싱해서 내 해시값을 만든다. 모든 블록이 이전 블록과 연결이 되어있는것
이전에 들어있는 내용중 어떤것이 조금이라도 바뀌면 아웃풋이 전부 달라지므로 변경이 불가함.
PoW(Proof of Work) 작업증명
블록체인이 비트코인같은 결제내역 등을 기록하는거라면 아무나 블록체인에 블록을 생성할 수 있어서는 안된다
블록에 추가되는 데이터가 true인지 어떻게 증명할수있을까
작업증명으로 블록체인을 보호한다.
작업증명은 BFT를 해결하기 위한 또 다른 방법으로 블록체인에서 가장 널리 사용되는 프로토콜 중 하나이다.
블록은 생성하기 위해 노드는 특정 조건을 만족하는 해시값을 찾기 위해 연산을 수행한다.
여러 노드가 동시에 블록 생성 경쟁에 참여하며, 가장 먼저 해시를 찾은 노드가 블록을 추가한다.
블록을 성공적으로 추가한 노드는 보상으로 암호화폐를 받는다.
채굴자는 블록체인에 들어오는 데이터를 확인하고 데이터를 블록 안에 넣어서 블록체인에 보낸다.
채굴자가 비트코인 거래내역을 보고 돈을 보낸 내역을 체크하고 사실 체크가 끝나면 데이터에 추가한다. 여러개의 데이터를 체크해서 블록에 들어갈 수 있는 데이터가 꽉 차면 블록을 닫고 블록체인에 올린다
누구나 원하면 채굴자가 될 수 있다. transaction을 confirm할때마다 수수료를 받을 수 있다.
작업증명을 위해서 네트워크가 채굴자에게 질문을 한다.모든 네트워크의 노드가 질문을 받고,
채굴자가 답을 찾으면 블록을 추가할 수 있다.
채굴자는 transaction을 confirm할때 commission을 받고 질문의 답을 찾아서 블록을 체인에 추가하면서 bitcoin을 받는다. bitcoin을 생성하면 coinbase transaction이 생성된다.
처음에는 블록을 추가할 때마다 50개의 코인이 생성되었으나 비트코인은 4년마다 반감기가 온다.
비트코인의 생산량은 2100만개로 정해져있다.
Consensus Algorithm
누구든 블록체인 네트워크에 들어가서 블록체인을 제안할 수 있다. 하지만 그 사람이 해커나 블록체인을 파괴하려는 사람일 수 있다. 여러개의 프로세스들이 같은 값을 갖고 있다는 합의에 도달해야한다.
Byzantine General’s Problem
분산 시스템에서 합의 문제를 설명하는 문제. 여러 장군들이 서로 통신하여 공격을 수행할지 철수할지 결정해야할 때, 일부 장군이 배신자일 수 있는 상황을 가정함.
BFT (Byzantine Fault Tolerance)
BFT는 비잔틴 장군 문제를 해결하기 위해서 설계된 알고리즘으로 시스템의 일부 노드가 실패하거나 악의적인 행동을 해도 나머지 노드들이 올바른 결정을 내릴 수 있도록 보장한다.
모든 충실한 노드가 같은 결정을 내려야 하며 문제가 발생하지 않으려면 2/3이상이 loyal해야한다.
faulty node의 수가 f라면 honest node의 수가 2f+1이어야 하고 따라서 총 노드의 수는 N≥3f+1이다.
비잔틴 장군 문제는 완벽하게 해결할 수 없으며 practical한 레벨에서 해결하는게 필요하다.
가장 잘 알려진 BFT알고리즘은 PBFT(practical BFT)이다.
클라이언트가 각 노드들에게 transaction을 전파하고, block을 propose하는 리더가 선정되고, 받은 메세지를 확인하고 동일한 내용을 받은게 맞다고 확인되면 합의에 이른다.
마이닝(채굴)
임의의 논스값을 대입하여 블록 해시 결과값을 생성하고 생성된 결과값이 제시된 target보다 작은 블록 해시를 찾는 과정 = 결론적으로 leading zero가 몇개인지를 뜻함.
공격자가 블록체인 네트워크를 지배하기 위해서는 전체 해시 파워의 과반수를 확보해야 하므로 거의 불가능하고 이로 인해서 BFT문제를 간접적으로 해결한다.
해시 알고리즘은 역함수를 구할수 없다 SHA-256을 사용해서 해싱한다.
논스값이 겹치지 않게 나눠서 마이닝을 하고 해시값을 찾으면 풀에 소속된 노드끼리 나눠가지는 마이닝 풀도 있다.
1.
해시 조건: 예를 들어, 해시 값의 앞에 0이 20개 있어야 합니다.
2.
논스 사용: 무작위 값을 변경하며 해시 값을 찾습니다.
3.
블록 전파: 해시 조건을 만족한 블록이 생성되면, 이를 네트워크에 전파합니다.
PoW는 global agreement가 발생하지 않으므로 consensus알고리즘이 아니다.
PoW에서는 2/3이상의 동의가 필요하지 않고 가장 긴 체인이 유효한 것으로 간주된다.
해시파워가 많은 쪽이 더 많은 블록을 생성하게 되므로 자연스럽게 그 체인이 canonical chain이 된다.
여러 채굴자가 해시값을 찾았다면 먼저 네트워크에 전파되는 노드가 선정된다. 조건을 만족하는 해시가 하나 이상일 수 있기 때문에 다른 블럭이 생길 수 있지만 가장 긴 체인인 canonical chain이 되고 다른 데이터는 무효화된다. 따라서 블록이 생기자마자 확정되었다고 할 수 없고 평균 6개 정도가 더 연결되어야 확정된다.
블록체인에 참여하는 노드가 적으면 블럭생성속도가 느리고 해시 앞에 들어가야하는 0의 개수를 너무 크게 잡으면 블록이 너무 느리게 생긴다. 너무 적게 0을 넣으면 새로운 체인을 더 길게 만들어서 자신의 체인을 canonical chain으로 할 위험이 있다.
블록체인에서 분기가 발생하는 이유는 블록 A,B가 동시에 생성될 수 있기 때문이다. 전파 지연으로 인해서 어떤 노드는 블록 A를 먼저 받아들이고, 다른 노드는 B를 먼저 받아들일 수 있다. 이로 인해 서로 다른 블록을 기반으로 한 체인이 생성될 수 있다.
51% Attack
블록체인을 장악하는 방법. 작업증명을 위해서 컴퓨터끼리 경쟁하면서 작업을 하고 블록을 올려서 전체 네트워크가 승인하면 블록체인에 영원히 남게 된다. winner컴퓨터에 의해 블록이 블록체인에 추가된 이후에는 나머지 컴퓨터들이 verification을 해줘야함. 거짓임이 판명나면 그 블록을 reject한다. 그것을 consensus라고 한다.
블록체인의 노드들은 기존 블록 중 하나를 선택하여 새 블록을 생성하는데 시간이 지남에 따라서 한 체인이 다른 체인보다 많은 블록을 추가하게 될 가능성이 높아지고 6개가 대립하게 될 가능성은 0에 가깝다. 따라서 일시적으로 합의가 깨질 수 있으나 확률적으로 마지막에는 하나의 블록체인으로 합의하게 된다.
만약에 어떤 노드가 전체 네트워크의 51%의 컴퓨팅 파워를 가지고 있다면 계속해서 자신의 체인에 블록을 추가하여 그 체인을 canonical 체인으로 만들수도 있다. PoW알고리즘은 컴퓨팅 파워가 많을수록 안전성이 높다.
비트코인 노드는 2021년기준 7만개 정도이기 때문에 쉽지 않고 작업증명에서 블록을 추가하는것부터 내 컴퓨터가 먼저 블록을 올릴수 있어야하기 때문에 결론적으로 전체 네트워크의 51퍼센트의 컴퓨팅 파워를 차지해야 논스를 찾고 하지만 그걸 위해서는 채굴만을 위한 하드웨어인 ASIC을 굉장히 많이 운용해야하는데 비용이 엄청나다.
그리고 이상이 감지될 경우 그 노드를 무시해버릴 수 있기 때문에 안전하다고 할 수 있다.
규모가 작은 블록체인이라면 51% 공격에 취약하다.
canonical chain에 포함되지 못한 블록은 유효하지 않은 블록이 되고 그 안에 있던 transaction들은 transaction pool에 저장되어 다음 블록이 추가될 때 포함된다.
PoS(Proof of Stake)
Proof of Stake. 지분증명.
지분 보유량에 기반해서 블록 생성자를 선택한다. 블록 생성자는 무작위로 선택되지만 보유한 지분의 양이 많을수록 선택될 확률이 높다. 제안된 블록은 노드들이 검증하고 문제가 없으면 합의가 이루어짐.
PoW보다 훨씬 적은 에너지를 소모하며 환경에 대한 부담이 적다. 공격자가 네트워크를 공격하려면 과반 이상의 지분을 보유해야 하며 자신의 자산의 손해를 입히는 방식으로 공격해야 하기 때문에 가능성이 낮다.
채굴자가 없고 validator만 존재한다. propose된 블럭을 검증하고 reward를 받는다.
블록 생성자가 정해지고, 생성자가 블록을 제안하고, validator가 검증하고 문제가 없어야 consensus가 완성됨
채굴과 같이 장비가 필요하지 않으니 join하기 쉽고 staking만 해놓으면 된다.
전체 토큰 유통량의 60퍼센트를 소유하면 블록체인을 조작할 수 있다.
지분증명 방식에서 검증자가 되는 방법은 프로젝트의 코인을 소유하는것이다.
네트워크에 고정적으로 맡기는것이다. 만약 네트워크에 해를 가한다면 자신의 자산의 가치도 떨어지게 된다.
그래서 이론적으로 51퍼센트 공격도 굉장히 어렵다. 하지만 staking해도 검증자로 선정될지는 모른다.
지분에 배례해서 선정된다. 많은 지분을 가지고 있으면 검증자로 더 많이 선정된다.
지분증명은 부자를 보상한다고 말할수 있다. 또한 먼저 참여한 사람이 더 우선순위를 가지면 더싼 가격에 사서 더 오래 가지고 있었으므로 검증자로 선정될 가능성이 낮다.
그래서 Delegated Proof of Stake방식을 사용하기도 한다. 위임받을 사람을 투표해서 지분을 일시적으로 그사람에게 맡기고 그사람이 선정되면 검증이후 수수료를 위임해준 사람들과 나눠갖는다.
nonce
채굴자는 데이터를 바꿀 수 없고 검증만 할 수 있다.
nonce만이 채굴자가 바꿀 수 있는 유일한 값이다. 비트코인 네트워크에 주어지는 질문은 특정 논스값을 찾는것이다. ex) 3개의 0으로 시작하는 해시를 만들기 위해서 필요한 nonce값은 무엇인가?
여기서 0의 개수가 늘어날수록 해당하는 해시를 찾는 난이도는 올라간다. 답을 찾는것은 어렵지만 증명은 쉽다.
비트코인 블록은 평균 10분에 하나 생성되지만 블록이 너무 빨리 생성되면 난이도를 높이고 너무 오래걸리면 난이도를 낮춘다. 현재 비트코인의 해시값은 19개의 0으로 시작한다고 함.
smart contract
smart contract을 통해서 탈중앙화 앱(dApp)을 만들 수 있다. 코드를 작성해서 공유 네트워크에 올리는것.
AWS에 올린다면 서버에 문제가 생겼을 때 내 앱을 돌아가지 않고지만 공유 네트워크에 올리면 영원히 네트워크상에 존재하고 다른 사람이 내 코드를 변경할 수는 없다. 높은 안전성과 보안성을 가진 주인이 없는 벡엔드에 올리는 것과 같다.
에를 들면 에어비엔비를 사용할 때 에어비엔비에 돈을 내고 중개를 해주면 내가 방을 쓰게 된다. 에어비엔비는 중개인이고 나는 에어비엔비를 신뢰해야함. 이것을 스마트 컨트랙으로 대체하면 스마트 컨트랙에 돈을 보내면 iot기술 등과 연결해서 문을 열어주도록 한다. 블록체인은 trustless 네트워크이다.
blockchain oracle은 스마트 컨트랙에 인풋을 제공하며 trustful데이터를 trustless 네트워크로 가져올 수 있게 해준다. 스마트 컨트랙을 지원하는 블록체인은 여러개가 있는데 이더리움이 가장 대표적이다
블록체인에 스마트 컨트랙이 배포되면 고유한 주소가 생성되고 블록체인 상에서 해당 계약을 호출할 때 사용할 수 있다. 스마트컨트랙은 바이트코드 형태로 영구적으로 저장되며 이더리움 가상머신은 스마트 컨트랙의 바이트코드를 실행한다. 스마트 컨트랙의 상태(변수 값)도 블록체인에 저장되며 컨트랙 실행 시 변경될 수 있으며 변경사항은 블록에 기록되어 누구나 계약의 코드와 상태를 조회할 수 있다.
토큰
이더리움 등에서는 블록체인을 기반으로 토큰을 발행할 수 있다. 이더리움 자체의 코인인 이더를 제외하고 이더리움을 기반으로 한 코인들이다. 스마트 컨트랙을 발행해서 토큰을 생성할 수 있다.
예를 들면 돈을 받으면 토큰을 보내준다는 컨트랙을 작성한다.
NFT
non-fungible token.
스마트 컨트랙을 통해서 토큰을 발행하는데, 토큰을 단 한개만 존재하도록 설정한다면? 그리고 그 토큰 안에 이미지 등의 정보를 넣으면 NFT가 된다. NFT를 산다는것은 그 토큰을 산다는것. NFT를 통해서 원본임을 증명할 수 있다. 게임에서 NFT로 만들어진 자산을 산다면 게임의 주인이 빼앗는것도 불가능하고 계정을 블록하거나 망하는 회사도 없다.
지갑
블록체인 지갑은 암호화폐를 저장하고 관리하는 디지털 도구입니다. 이 지갑은 실제 돈을 보관하는 지갑과 비슷하지만, 물리적인 형태는 없고 블록체인 네트워크와 연결되어 있습니다. 블록체인 지갑의 주요 기능과 구성 요소는 다음과 같습니다. ex) Metamask, Klayton의 Kaia
1. 주소와 키
•
공개 키: 다른 사람에게 암호화폐를 받을 때 사용하는 주소입니다. 이 주소는 공개적으로 공유할 수 있습니다.
•
개인 키: 암호화폐를 보내거나 지갑에 접근할 때 사용하는 비밀번호와 같은 것입니다. 개인 키는 절대 다른 사람과 공유해서는 안 됩니다.
2. 지갑의 종류
•
소프트웨어 지갑: 컴퓨터나 스마트폰에 설치하여 사용하는 앱입니다. 사용이 편리하지만 해킹의 위험이 있습니다.
•
하드웨어 지갑: USB 형태로 되어 있는 물리적인 장치로, 오프라인에서 암호화폐를 보관할 수 있어 보안성이 높습니다.
3. 기능
•
거래 관리: 암호화폐를 보내고 받을 수 있는 기능을 제공합니다.
•
잔액 확인: 현재 보유하고 있는 암호화폐의 잔액을 확인할 수 있습니다.
•
거래 기록: 과거의 거래 내역을 조회할 수 있습니다.
비트코인을 보낸다고 하면 실제로 뭔가를 보내는게 아님.
집을 산다고 하면 그 집이 움직이는것이 아니라 문서가 바뀌는것일 뿐이듯 비트코인도 내 소유인 비트코인을 다른사람의 소유로 데이터베이스를 변경하는것이지 실제로 전송하는것은 아니다.
비트코인 지갑은 긴 string이다.
비트코인 지갑을 잘못 저장하는 경우 다른사람이나 존재하지 않는 주소로 보내게되는것이다.
지갑은 비대칭키 암호화방식을 사용하며 공개키와 private키가 존재한다.
지갑을 생성한다는것은 private키, 공개키를 만든다는 것이고 공개키 주소가 내 지갑 주소가 된다.
지갑 주소를 통해서 비트코인을 주고받는다.
비트코인을 주고받는 과정에서는 네트워크에 나에게 비공개 키가 있음을 증명해야 한다.
비공개키 소유 여부가 나의 지갑임을 증명하는 방법이다. 만약 비공개키를 잃어버린다면 블록체인 상에서 코인의 주인은 내 지갑주소로 되어있지만 나는 내 지갑의 소유여부를 증명할 수 없는 상황이 된다.
DeFi
Decentralized Finance
중개자가 없는 금융 서비스. ex)스마트 컨트랙 은행 서비스
Stable Coin은 USD와 1대1로 대응된 코인이다. 회사가 가치를 보증한다.
가치는 보장되지만 여전히 암호화폐이기 때문에 스마트 컨트랙을 사용할 수 있다.
탈중앙화 거래소 DEX
바이낸스, 코인베이스, 빗썸 등은 중앙화된 거래소이다. 즉 수수료를 떼가고 내 계좌를 동결할수도 있다
uniswap등의 탈중앙화 거래소는 100퍼센트 코드로만 돌아간다.
유동성 풀이란 두개의 토큰을 연결해주는 스마트 컨트랙이다. BUSD로 ETH를 사고 유동성 풀에 넣으면 누군가 BUSD를 가지고 있는 사람이 ETH를 사기 위해서 내 유동성 풀을 사용한다. 그 대가로 나는 수수료를 받는다.
비트코인
비트코인은 1세대 블록체인으로 작업증명을 사용하며 작업증명은 전기를 많이 사용함 네트워크가 커질수록 환경이 파괴된다. 초당 거래가 5개밖에 안되므로 느리고 프로그래밍 불가해서 Defi나 NFT가 올라갈 수없다. 디지털 금에 비유할 수 있다. 초기 설정을 끝까지 유지하며 코드변경이 없다.
이더리움
이더리움은 분산된 공공 컴퓨터이다. 모든 데이터를 저장하는 state를 가지고 있다 모든 종류의 변수를 저장할 수 있는 ram이라고 할 수 있고 이 데이터는 수천개의 노드에 걸쳐 복제되고 블록체인에 블록을 추가함으로써 데이터를 변경한다. 상태전이를 촉발하는것은 인간이 아니라 스마트 컨트랙이다.
이더리움에는 두가지 계정이 있으며 외부에서 사람에 의해 소유되고 통제되는 외부소유계정과 코드에 의해 제어되는 contract account가 있다.
contract account를 생성해서 분산된 글로벌 컴퓨터를 이용해서 코드 배포,변수값 변경 기능을 실행한다.
정확히 어디서 코드가 돌아가는 것일까?
smart contract을 작성하는것이 contract account를 생성하는것이고 솔리디티를 사용한다.
스마트 컨트랙을 작성하고 byte코드로 컴파일 한 이후 EVM에서 돌아간다.
EVM은 이더리움 네트워크의 각 노드에서 실행되고 모든 노드들은 동시에 EVM을 실행한다. 누군가 스마트컨트랙에서 코드를 호출하면 노드들은 코드를 실행하고 동시에 검증한다. EVM덕분에 스마트 컨트랙 코드는 JVM처럼 운영체제에 상관없이 bytecode를 실행할 수 있다.
즉 이더리움은 전세계에 분산된 컴퓨터로 EVM이라는 가상머신에서 smart contract이라는 코드를 수행한다.
하지만 for-loop등을 이용해서 컴퓨터의 자원을 엄청나게 소비해서 네트워크를 다운시키려고 한다면?
Gas
그래서 스마트 컨트랙 실행에 필요한 수수료를 부과한다.
이 수수료를 가스라고 한다 더하기는 3개의 가스 유닛 등이다. 누군가 무한 루프 등을 시행한다고 해도 가스가 소진될때까지만 수행된다. 가스를 구매하기 위해서는 Ether를 사야한다. 문제점은 가스 값이 비싸다는것. 이를 해결하기 위해서 klaytn등 많은 프로젝트가 존재하는데 공통점은 모두 EVM을 기반으로 한다.
더 적은 수수료와 더 빠른 confirm속도를 위해서만들어졌다.
2세대 암호화폐는 스마트 컨트랙을 사용하는 이더리움이 대표적이다.
이더리움은 전세계가 공유하는 컴퓨터가 되는것이 목표이다.
과도한 네트워크 트래픽 때문에 거래 수수료가 엄청나게 올라간다.
Ethereum 2.0
이더리움은 2.0으로 업데이트하며 3세대 블록체인이 되려고 하고 있다. 작업증명방식을 사용한다.
이전보다 에너지를 99.98%적게 사용하고 초당 거래량이 25000이상이 되도록 계획하고 있다.
솔리디티
smart contract은 그냥 class이다. constructor, property, method가 존재한다.
EOA(human)계정은 컨트랙 계정으로 돈을 보낼 수 있다. 컨트랙 계정도 EOA로 돈을 보낼 수 있음
pragma solidity ~0.8.0; //솔리디티 컴파일러 버전 설정
contract Fundraising{
uint256 public targetAmount; //unsigned 256비트 정수
//string이지만 이더리움 주소의 올바른 형식이어야함. 프로젝트 소유자 지갑주소
address public owner;
mapping(address => uint256) public donations; //기부한 사람들 주소와 액수 맵
uint256 public raisedAmount = 0;
//block은 EVM에 의해 정의되는 객체. 블록이 생성되는 날짜로부터 2주후까지
uint256 public finishTime = block.timestamp + 2 weeks;
//constructor에서 초기화
constructor(uint256 _targetAmout){
//contract을 배포할때 얼마로 목표를 설정할지 정한다
targetAmount = _targetAmount
//msg.sender도 EVM에 의해서 정의되며 컨트랙을 작성하는 행위자의 주소
owner = msg.sender;
}
//컨트랙의 외부에서만 호출할 수 있다
//payable은 돈을 받을 수 있다는것을 나타냄
//누군가 돈을 보내려고 receive함수를 호출하면 실행된다
//다른 컴퓨터의 메소드를 호출하기때문에 RPC를 사용하는것
receive() external payable{
require(block.timestamp < finishTime, "This is over");
//누군가 돈을 보냈는데 끝나지 않은 경우 돈을 보낸 사람의 주소와 금액 추가
donations[msg.sender] +=msg.value;
raisedAmount += msg.value;
}
function withdrawDonations() external {
//함수를 호출한 사람과 owner가 동일한 사람인지 확인함
require(msg.sender == owner, "Fund will only be released by owner");
require(raisedAmount >=targetAmount, "The Project did not reach the goal");
require(block.timestamp > finishTime, "The campaign is not over yet");
payable(owner).transfer(raisedAmount);
}
function refund() extermal{
require(block.timestamp > finishTime, "The campaign is not over yet");
require(raisedAmount < targetAmount, "The camapign reached the goal");
require(donations[msg.sender] > 0, "You didn't participate");
uint toRefund = donations[msg.sender];
donations[msg.sender]=0;
payable(msg.sender).transfer(toRefund);
}
}
Solidity
복사
Hardhat
hardhat은 이더리움 블록체인 개발 프레임워크로 스마트 컨트랙을 컴파일하고 디버깅하고 배포,테스팅 기능 등을 제공한다. Truffle도 많이 사용한다. Hardhat은 ethers.js를 포함하고 있다.
contracts폴더에 smart contract을 넣고
hardhat.config.js에 배포할 네트워크와 내 지갑 account를 작성한다
//hardhat.config.js
require("@nomiclabs/hardhat-waffle");
task("check","check contract amounts", async() => {
const contract="0x컨트랙주소"
const abi = [
...
]
})
module.exports = {
solidity: "0.8.0",
networks: {
sepolia: {
url: "https://ethereum-sepolia.g.allthatnode.com/full/evm/..."
accounts: [""],
},
},
};
Solidity
복사
scripts폴더에 deploy.js를 생성하고 ethers.js를 사용한 contract배포 스크립트를 작성한다.
•
Web3.js/Ethers.js: 이 라이브러리들은 스마트 계약과 상호작용하거나 블록체인의 데이터를 조회하는 데 사용됩니다. 예를 들어, 특정 주소의 잔액을 확인하거나, 스마트 계약의 함수를 호출하는 등의 작업을 수행할 수 있습니다.
배포 스크립트의 주요 기능
•
스마트 계약 컴파일: 스크립트는 배포할 스마트 계약을 컴파일하여 바이트코드와 ABI(Application Binary Interface)를 생성합니다.
•
네트워크 연결: 배포할 블록체인 네트워크(예: 메인넷, 테스트넷)에 연결하여 트랜잭션을 전송할 수 있도록 설정합니다.
•
계정 설정: 배포할 계정을 설정하고, 해당 계정의 개인 키나 지갑 주소를 사용하여 트랜잭션에 서명합니다.
•
배포 트랜잭션 전송: 컴파일된 스마트 계약을 블록체인에 전송하여 배포합니다. 이 과정에서 가스 비용이 발생하며, 배포가 성공적으로 완료되면 계약 주소를 반환합니다.
blockchain explorer로 테스트넷에서 컨트랙 주소를 찾아보면 바이트코드로 컴파일된 컨트랙을 확인할 수 있다.
이제 컨트랙 주소에 돈을 송금할 수 있다.
//deploy.js
async function main() {
//ethers.js를 사용해서 Fundraising 컨트랙을 가져와서 컴파일하고
const Fundraising = await ethers.getContractFactory("Fundraising");
//인자(targetAmount)와 함께 배포한다.
const contract = await Fundraising.deploy(10000000000);
//배포이후 컨트랙 주소를 blockchain explorer에서 확인해볼수 있도록 log
console.log("Contract address is : ", contract.address);
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
Solidity
복사
ABI
Binary contract과 작업하기 위한 API와 같은 것. ABI는 단순한 json으로 컨트랙에 대해 설명하는 내용.
ABI를 사용함으로써 JS로 스마트 컨트랙과 상호작용할수 있고 스마트 컨트랙의 public property를 확인하거나 메소드도 호출할 수 있다.
Metamask
이더리움과 상호작용하기 위한 지갑 소프트웨어. 테스트넷도 지원한다. 이더리움 메인넷에서 컨트랙을 구축하려면 실제 비용이 들기 때문에 테스트넷에서 테스트거래를 해봐야함. 이 테스트 넷에서 ether는 아무런 가치가 없다.
DApp
1. 중앙화 vs 탈중앙화
•
일반 앱: 중앙 서버에서 데이터와 서비스를 관리합니다. 즉, 특정 기업이나 기관이 모든 데이터를 통제하고 운영합니다.
•
DApp: 블록체인 네트워크에서 운영되며, 데이터와 운영이 분산되어 있습니다. 여러 참여자가 네트워크에 기여하고, 중앙 권력이 없습니다.
2. 데이터 보안
•
일반 앱: 서버에서 데이터가 저장되므로 해킹이나 데이터 유출의 위험이 있습니다.
•
DApp: 블록체인에 데이터가 저장되어 보안성이 높고, 변경 불가능한 특성을 가지고 있어 데이터의 무결성이 보장됩니다.
3. 투명성
•
일반 앱: 데이터와 운영이 비공식적이고 불투명할 수 있으며, 사용자가 직접 확인하기 어렵습니다.
•
DApp: 거래 기록과 데이터가 블록체인에 공개되어 투명성을 제공합니다. 누구나 데이터를 검증할 수 있습니다.
4. 거래 비용
•
일반 앱: 거래 수수료는 중앙 기관에서 정하는 방식으로 발생합니다.
•
DApp: 블록체인 네트워크의 거래 수수료(가스 비용 등)가 발생하며, 이는 네트워크의 상태에 따라 변동할 수 있습니다.
5. 신뢰성
•
일반 앱: 사용자들은 중앙 기관을 신뢰해야 하며, 서비스가 중단되거나 문제가 발생할 경우 사용자의 신뢰가 흔들릴 수 있습니다.
•
DApp: 스마트 계약을 통해 자동화된 프로세스로 운영되며, 신뢰가 필요 없는 구조입니다. 조건이 충족되면 자동으로 실행됩니다.
Smart Contract
1.
Solidity로 smart contract 작성이후 Hardhat등을 이용해 컴파일
2.
Web3.js나 Ethers.js등의 라이브러리를 이용해서 Ethereum네트워크에 연결해서 배포
3.
smart contract배포 이후 Javascript를 사용해서 해당 계약과 상호작용
트랜잭션
블록체인은 전세계적으로 공유되어 트랜잭션이 일어나는 데이터베이스입니다. 이것은 네트워크에 참여하면 누구나 데이터베이스를 살펴볼 수 있다는 것을 뜻합니다. 만약 여러분이 데이터베이스의 어떤 것을 변경하려고 한다면, 소위 트랜잭션을 만들어야 하며 이는 다른 모두가 동의해야만 합니다.
그리고 트랜잭션은 항상 만든 사용자에 의해 암호화됩니다. 그래서 데이터베이스를 직접 수정하려는 것을 차단할 수 있습니다. 전자화폐의 경우 이 간단한 검사가 계좌의 키를 소유한 사용자만이 이체할 권한을 가지는 것을 보장합니다. 트랜잭션들은 "블록" 이라 불리는 곳에 합쳐집니다. 그리고 네트워크에 참여한 모든 노드들에 전파됩니다. 만약 두 개의 트랜잭션이 충돌한다면, 두 번째가 되는 트랜잭션은 거절될 것이며 블록의 일부가 되지 않습니다.이러한 블록들은 시간에 따라 선형의 순서를 가진 형태를 띄며 "블록체인"의 어원이 되었습니다. 블록들은 일정한 간격에 의해 체인으로 연결됩니다.
pragma solidity >=0.4.0 <0.6.0;
contract SimpleStorage {
uint storedData;
function set(uint x) public {
storedData = x;
}
function get() public view returns (uint) {
return storedData;
}
}
Bash
복사
Solidity의 관점에서 컨트랙트란 무수한 코드들(함수)과 데이터(상태)가 Ethereum 블록체인의 특정 주소에 존재하는 것입니다. 다음 줄의 uint storedData; 는 uint (256 비트의 부호없는 양의 정수) 타입의 storedData 로 불리는 변수를 선언한 것입니다.
이것은 데이터베이스에서 함수를 호출함으로써 값을 조회하거나 변경할 수 있는 하나의 영역으로 생각할 수 있습니다. Ethereum에서, 변수들은 컨트랙트에 포함되어 있으며 set 과 get 함수로 변수의 값을 변경하거나 조회할 수 있습니다.
상태 변수에 접근할 때 다른 프로그래밍 언어에서 일반적으로 사용되는 this. 키워드를 사용하지 않습니다.
이 컨트랙트는 누구나 접근 가능한 숫자를 저장하는 단순한 일 외에는 아직 할 수 있는게 많지 않습니다. 물론 누구나 set 을 호출하여 다른 값으로 덮어쓰는 것이 가능합니다. 하지만 이전 숫자는 블록체인 히스토리 안에 여전히 저장됩니다.
코인
다른 플랫폼에 종속되지 않은 자체 메인넷에서 동작하는 암호화폐. 개개인이 네트워크를 유지 및 관리하는데 기여하면 보상으로 코인을 받을 수 있고 이 과정을 채굴이라고 함. = 암호화폐의 거래내역을 기록한 블록을 생성하고 그 대가로 암호화폐를 받는것. = 레이어1코인
토큰
다른 코인의 메인넷 위에서 사용하는 암호화폐. 토큰은 다른 블록체인 메인넷에서 발행되고 사용되므로 개별적인 네트워크가 없고 독자적인 목적을 가지고 만들어진다. 밈 코인등도 사실 대부분은 토큰이다.
Subcurrency라고도 한다.
pragma solidity ^0.5.0;
contract Coin {
// The keyword "public" makes those variables
// easily readable from outside.
address public minter;
mapping (address => uint) public balances;
event Sent(address from, address to, uint amount);
// This is the constructor whose code is
// run only when the contract is created.
constructor() public {
minter = msg.sender;
}
function mint(address receiver, uint amount) public {
require(msg.sender == minter);
require(amount < 1e60);
balances[receiver] += amount;
}
function send(address receiver, uint amount) public {
require(amount <= balances[msg.sender], "Insufficient balance.");
balances[msg.sender] -= amount;
balances[receiver] += amount;
emit Sent(msg.sender, receiver, amount);
}
}
Solidity
복사
•
minter: 이 계약을 생성한 주소를 저장합니다. 이 주소만 토큰을 민팅할 수 있습니다.
•
balances: 주소를 키로 하고, 해당 주소의 잔액을 값으로 가지는 맵입니다. 각 사용자의 토큰 잔액을 추적합니다.
address public minter;
mapping (address => uint) public balances;
Solidity
복사
•
Sent: 토큰이 전송될 때 발생하는 이벤트입니다. 이 이벤트는 거래 정보를 외부에서 쉽게 확인할 수 있도록 합니다.
event Sent(address from, address to, uint amount);
Solidity
복사
민팅 함수
function mint(address receiver, uint amount) public {
require(msg.sender == minter);
require(amount < 1e60);
balances[receiver] += amount;
}
Solidity
복사
•
mint: 새로운 토큰을 생성하여 특정 주소에 할당하는 함수입니다.
◦
require(msg.sender == minter): 호출자가 minter와 동일한지 확인하여, 오직 계약의 소유자만 민팅할 수 있도록 합니다.
◦
require(amount < 1e60): 민팅할 수량이 너무 크지 않도록 제한합니다.
◦
balances[receiver] += amount;: 특정 주소의 잔액에 민팅된 양을 추가합니다.
송금 함수
function send(address receiver, uint amount) public {
require(amount <= balances[msg.sender], "Insufficient balance.");
balances[msg.sender] -= amount;
balances[receiver] += amount;
emit Sent(msg.sender, receiver, amount);
}
Solidity
복사
•
send: 사용자가 다른 주소로 토큰을 전송하는 함수입니다.
◦
require(amount <= balances[msg.sender], "Insufficient balance."): 송금하려는 양이 발신자의 잔액 이하인지 확인합니다.
◦
balances[msg.sender] -= amount;: 발신자의 잔액에서 송금할 양을 차감합니다.
◦
balances[receiver] += amount;: 수신자의 잔액에 송금할 양을 추가합니다.
◦
emit Sent(msg.sender, receiver, amount);: 송금이 완료되면 Sent 이벤트를 발생시켜 외부에서 이 정보를 확인할 수 있도록 합니다.
Ethereum Gateway, Public Endpoint
Geth같은 블록체인의 노드이자 클라이언트 프로그램은 이더리움의 노드에 접근하는 gateway의 역할을 한다.
Full node는 전체 블록체인을 다운로드하고 모든 트랜잭션을 검증하는 노드이다.
Geth를 실행하면 이더리움 블록체인에 저장된 트랜잭션과 상태정보를 조회할 수 있다.
DApp애서 생성한 트랜잭션을 Geth노드를 통해 이더리움 네트워크에 전송할 수 있다.
Geth는 이러한 요청을 처리해서 트랜잭션을 블록체인에 기록하는 API를 제공한다.
직접 블록체인에 연결할 경우 모든 데이터를 관리해야하기 때문에 매우 큰 용량을 요구하기에 Geth같은 소프트웨어를 사용해서 풀 노드에 연결한다.
Geth를 실행하면 내 컴퓨터가 이더리움에 연결된 노드가 된다.
go-ethereum(Geth)
•
다운로드 및 설치: Geth는 이더리움 블록체인에 참여하기 위한 소프트웨어로, 사용자가 자신의 컴퓨터에 설치해야함.
•
노드 참여: Geth를 실행하면, 사용자의 컴퓨터가 이더리움 네트워크의 풀 노드 또는 경량 노드로 작동한다.
블록체인 데이터를 다운로드하고 저장하며, 트랜잭션 검증 및 블록 생성에 참여한다.
BlastAPI
•
API 형태: BlastAPI는 블록체인과 상호작용하기 위한 RESTful API를 제공합니다. 사용자는 HTTP 요청을 통해 필요한 데이터를 조회할 수 있습니다.
•
노드 참여 없음: BlastAPI를 사용하는 경우, 사용자의 컴퓨터는 블록체인 네트워크의 노드로 참여하지 않습니다. 대신, BlastAPI 서비스가 블록체인과 상호작용하여 데이터를 제공하며, 사용자는 그 결과를 받아보는 방식입니다.
BlastAPI같은 서비스도 비트코인에 접근할 수 있는 퍼블릭 API를 제공하는 게이트웨이다.
지갑도 블록체인에 접근할 수 있는 게이트웨이 중 하나이다.
블록체인 네트워크의 인터페이스 역할을 하는 노드를 엔드포인트 노드라고 한다.
블록체인에 접근할 수 있는 public endpoint를 제공한다.
블록체인은 모바일 앱에 적합하지 않다?
TPS가 낮기 때문에 사용성이 떨어진다. 결제 한번에 몇분이 걸린다고 하면 아무도 사용하지 않는다.
채굴이 바로 끝난다고 해도 confirm이 발생할때까지 기다려야한다.
이더리움은 epoch단위= 32개의 블록을 하나로 묶어서 확정함. single slot finality를 시도하고 있는 중.
TPS비교
Blockchain Trillema
어떤 블록체인도 세가지 특성을 모두 갖출수는 없다. 3개중 2개를 선택해야한다.
이론적으로 완벽하게 설명된 것은 아님. 일반적으로 그렇다는것
Security는 데이터 조작이 어려운것
Decentralization은 많은 노드들이 존재하는것
Scalability는 많고 빠른 양을 처리할 수 있는것
Security는 포기하기 어렵다. 탈중앙화와 속도 사이의 딜레마.





