대부분의 블록체인은 블록을 생성하는데 많은 요구사항을 필요로 한다. 이러한 요구사항은 블록의 생성을 늦추고 비싸게 만들 뿐이다.
또한, 블록체인 업계가 가상 머신을 최적화하는데 집중하고 있지 않기에 전체 처리 성능이 개선되지 않았다.
탈중앙화는 많은 돈이 든다.
네트워크에 참여하려면 노드가 고성능 RAM 같은 값비싼 장비를 요구하기 때문에, 참여 시작 비용만 해도 수천 달러에 달한다. 이런 점에서 탈중앙화를 확장하는 것은 매우 어렵다.
스택 전반에 걸친 EVM 최적화가 필요
EVM 트랜잭션을 효율적으로 처리하기 위해서는, 데이터베이스, 가상 머신, 합의 및 네트워킹 계층 등 모든 단계에서 저수준 최적화가 필요하다.
이러한 최적화를 통해 고가의 하드웨어 없이도 소비자 수준의 장비로 뛰어난 성능을 구현하면서, 동시에 높은 탈중앙화를 유지할 수 있게 된다.
Monad(모나드) 의 해결 방안
1. Optimistic Parallel Execution (병렬 처리 최적화)
다수의 가상 머신을 이용해 트랜잭션을 병렬로 처리하고, 트랜잭션 간 의존성을 예측해 최적의 실행 순서를 계획한다. 이후 결과를 순차적으로 병합하여 실행 순서의 정확성을 유지하면서 자원 활용률을 극대화한다.
2. Asynchronous Execution (비동기 실행)
블록의 실행은 해당 블록에 대한 합의가 끝난 뒤 시작되며, 이 과정은 다음 블록의 합의 과정과 동시에(병렬로) 진행된다.
문제상황
합의와 실행이 섞인 방식
합의와 실행은 서로 기다려야 하는 점에 있어 거래 실행이 느려진다.
이더리움 블록 생성 시간은 12초지만, 실제 거래 실행에 쓰이는 시간은 0.1초
해결방법
비동기 실행
합의 : 노드들이 트랜잭션의 순서만 결정
실행 : 결정된 순서에 따라 실제 거래를 나중에 실행
서로를 기다리지 않아도 된다.
실행 속도가 매우 높아진다.
오류 가능성
트랜잭션 실패
거래가 실패해도 결정된 거래 순서대로 처리 되므로, 모든 노드가 동일하게 실패를 처리
3. MonadBFT
HotStuff를 기반으로 설계된 커스텀 BFT 합의 메커니즘은, 기존의 3단계 통신을 2단계로 줄여 효율성을 높였다.
또한 낙관적 응답 설계를 채택하여 네트워크 지연 시간이 짧을 경우 라운드 진행 속도가 이에 맞춰 빨라져, 전반적인 성능 향상에 기여한다.
다른 BFT와의 차별점
정상 작동 시 : 메시지 통신 복잡도가 선형으로 낮다. (O(N), N : 참여하는 노드의 개수)
타임 아웃 발생 시 : 메시지 통신 복잡도가 Quadratic 으로 증가. (O(N2))
블록 제안과 응답 인증서를 파이프라인 형태로 처리 ⇒ 블록을 빠르게 제안
블록의 최종 확정에 걸리는 시간 1초
작동원리
합의 과정은 매 라운드마다 리더가 바뀌며 반복적으로 진행
블록 제안
리더가 새로운 블록을 만들어 모든 노드에게 보냄.
이전 라운드의 결과가 담긴 인증서(QC or TC) 도 보냄.
투표
노드들은 블록이 규칙에 맞으면 YES 투표
이 투표는 다음 라운드의 리더에게 전달
QC 만들기
투표가 충분히 모이면 (2/3) 다음 라운드의 리더는 QC를 만듦.
TC 만들기
타임아웃 발생 시 (2/3) 의 투표를 통해 리더는 TC를 만듦
블록 확정하기
두 라운드에 갈쳐 QC 가 제대로 전달된다면 블록확정
4. MonadDB
머클 패트리샤 트리(Merkle Patricia Trie) 데이터의 저장 및 접근 방식을 최적화하여 블록체인 성능을 크게 향상시키는 맞춤형 상태 데이터베이스. 이를 통해 고성능의 병렬 접근이 가능해지며, Monad의 병렬 실행 기능을 실현하는 데 필수적인 역할.
MonadDB를 사용하면 대부분의 상태 데이터를 RAM 대신 SSD에 저장할 수 있으므로, 메모리 요구량과 비용이 감소하고 일반 소비자급 하드웨어에서도 네트워크 참여가 가능하다.
Time ───────────────────────────────────▶
Block N Block N+1 Block N+2
═════════ ══════════ ══════════
합의 진행 중 합의 진행 중 합의 진행 중
│ │ │
▼ ▼ ▼
[ Block N 실행 시작 ] [ Block N+1 실행 시작 ] ...
솔라나는 Rust 라는 언어로 컨트랙트를 작성해 배포한다. 하지만, 쌩 Rust 로는 너무너무나 어렵고 관리가 힘들기에 Anchor 라는 Rust 프레임 워크를 사용한다. 하지만, Windows 상에서 anchor 설치 및 관리가 꽤 복잡하기에 이렇게 문서로 작성한다.
위의 링크에 따라서 WSL 환경에서 구현하려고 한다.
WSL 이란?
간단하게 말해서 윈도우 위에서 돌아가는 작은 컴퓨터다. VM 이 있지 않나요? 하신다면, VM 은 진짜 OS 를 새로 띄워 구동부터 하는 반면, WSL 은 윈도우 운영체제 안에 작은 디스크 조각안에서 가상머신 운영체제 명령어를 이용할 수 있는 기능이다. 윈도우와 파일교환이 가능하다.
solana-keygen new
----
Generating a new keypair
For added security, enter a BIP39 passphrase
NOTE! This passphrase improves security of the recovery seed phrase NOT the
keypair file itself, which is stored as insecure plain text
BIP39 Passphrase (empty for none):
Wrote new keypair to /home/lkbrothers/.config/solana/id.json
=========================================================================
pubkey: "YOUR KEYCHAIN"
=========================================================================
Save this seed phrase and your BIP39 passphrase to recover your new keypair:
normal warm mercy fix leader crater cinnamon palm truly nice movie embark
=========================================================================
주소확인
solana address
앵커 인잇
Anchor 프로젝트가 생성된다.
anchor init my-project
4. 빌드 및 배포
로컬 밸리데이터 실행
로컬에서 실행되는 블록체인 환경이다. 실행하면 블록체인 시스템이 로컬에서 실행된다.
solana-test-validator
빌드
anchor build
배포
anchor deploy
에러 처리
솔라나 테스트 밸리데이터 오류
솔라나 테스트 밸리데이터 실행시 오류가 나왔다. 처음 ubuntu 실행환경에서는 bzip2 가 깔려있지 않아 깔아줘야한다.
The suggested solution is to change the lock file version from 4 to 3.
This is acherons answer to the issue which will be solved in Anchor version 2.x
You can fix this simply by changing the version field of Cargo.lock as #3393 (comment) suggested:
- version = 4
+ version = 3
The reason why it happens is because Anchor v0.30 uses Solana v1.18, and Solana v1.18 depends on rustc 1.75, but the new version (4) of Cargo.lock has only been stabilized in rustc 1.78 (as mentioned in rust-lang/cargo#14655 (comment)).
Solana build tools have recently been updated to use rustc 1.79, which is available since Solana v2.1, and it's also what the master branch of Anchor uses (#3339).
Anchor v0.31 (#3259) will support Solana v2, meaning this issue will be resolved automatically. In the meantime, you can just use the fix mentioned at the beginning of this comment.