학습 비디오: 베이징대학교 쇼젠 선생님’ 블록체인 기술 및 응용’
노트 참고: 베이징대학교 쇼젠 선생님’ 블록체인 기술 및 응용’ 공개 수업 시리즈 노트-카탈로그 내비게이션 페이지
에테르에는 상태 트리, 영수증 트리, 거래 트리 등 세 그루의 나무가 있습니다세계 랭킹 1 위오피스타공식 홈페이지 장소. 이 세 그루의 나무를 이해하면 에테르의 기본 데이터 구조 설계를 알 수 있다.
구현할 기능: 주소 대 상태 매핑
ETH 의 계정 주소는 160 비트이며 일반적으로 40 개의 16 진수로 표시됩니다
상태는 잔액, 거래 수, 계약 계정, 코드 및 저장 등 외부 계정과 계약 계정의 상태입니다.
시각적으로 주소 대 상태 매핑은 해시 테이블로 저장하는 것이 더 간단합니다. 해시 테이블로 저장하는 것이 왜 필요하지 않습니까?
해시 테이블을 사용하여 Merkle Proof 를 제공하는 방법은 무엇입니까? 해시 테이블 내용을 비트코인처럼 Merkle Proof 를 제공하는 Merkle tree 로 구성합니다. 하지만 새 블록이 게시되면 해시 테이블 내용이 변경되므로 다시 새로운 청크가 생성될 때마다 Merkle Tree 로 구성해야 합니다 (ETH 의 새 청크 생성 시간은 약 10s)
Bitcoin 시스템에는 계정 개념이 없고, 거래는 블록으로 관리되며, 블록에는 최대 4000 개의 거래가 포함되어 있으며, 한 번에 한 블록씩 새로운 Merkle tree 에 해당하며, 일단 발표되면 변경되지 않으므로 Merkle Tree 는 무한히 커지지 않습니다. ETH 에서 Merkle tree 는 계정 정보를 구성하는 데 사용되며, 모든 Etherbank 계정을 하나의 Merkle tree 로 만드는 것입니다. 이 숫자는 BTC 의 Merkle Tree 보다 몇 배나 더 많을 것입니다.
실제로, 변화의 일부분은 극히 일부에 불과하며, 우리는 매번 Merkle Tree 를 재구성할 때마다 비용이 많이 든다.
해시 테이블을 사용하지 않고 직접 Merkle tree 를 사용하여 변경할 때 Merkle tree 에서 직접 변경할 수 있습니까?
Merkle tree 는 효율적인 찾기 및 업데이트 방법을 제공하지 않습니다. 모든 노드의 일관성과 검색 속도를 보장하려면 순서를 지정해야 합니다. 에테르가 정렬하지 않으면 각 노드마다 유지 관리되는 계정 순서가 다르면 계산된 Merkle tree 의 루트 해시도 다릅니다. 비트코인 시스템에서는 순서가 지정되지 않았지만 거래 순서는 게시 블록의 노드에 의해 결정되며 순서는 고유합니다. 에테르가 실현하려면 모든 계좌의 상태도 블록에 게시해야 하는데, 규모급이 큰 것은 불가능하다.
정렬된 Merkle tree 를 사용하면 어떤 문제가 생길까요?
계좌를 넣으면 비용이 많이 든다
요약하면, 위의 두 가지 간단한 데이터 구조는 실현 가능하지 않습니다. 실제 종이 항공기 공식 홈페이지는 어느 시점에서 에테르가 채택한 데이터 구조는 MPT 입니다.
Trie: 사전 트리, 가장자리는 문자를 나타내고, 루트 매듭에서 트리의 한 노드까지의 경로는 문자열을 나타냅니다
특징:
노드당 분기 수는 키 값에 있는 각 요소의 값 범위에 따라 달라집니다
범례의 분기 수는 27 (최대 26 자의 소문자 영문자+1 개의 끝 플래그 비트) 입니다. 에테르의 주소는 40 개의 16 진수이므로 분기 수가 17(16 개의 16 진수+1 개의 끝 표시자) 인 조회 효율성은 키 값의 길이에 따라 달라집니다. 에테르의 모든 키 값은 길이가 같고 모두 40 자리 16 진수입니다
Ps: 비트코인과 에테르의 주소는 일반적이지 않습니다세계 랭킹 1 위오피스타입구의 방법은 무엇입니까?. 형식 길이가 다릅니다. 이더넷방의 주소는 공개키 해시입니다. 앞에서 한 단락 (160bit) 을 가로채서 얻은 해시 테이블 저장은 이론적으로 해시 충돌이 발생할 수 있습니다. trie 는 충돌이 발생하지 않는 지정된 입력 세트의 trie 가 동일합니다. 순서와 상관없이 업데이트되는 지역성이 좋습니다. 요소만 변경하면 됩니다.
단점:
스토리지 낭비, 많은 중간 노드에 하위 노드가 하나만 있어 통합할 수 있다면 스토리지 오버헤드를 줄이고 검색 효율성을 높일 수 있습니다. 그래서 이 문제를 해결하기 위해 우리는 Patricia tree/Patricia trie 를 도입했습니다.
경로 압축을 거친 접두사 트리
단어를 새로 삽입하면 원래 압축된 패스를 확장해야 할 수 있습니다.
경로 압축은 어떤 경우에 더 효과적입니까? 키 값 분포가 비교적 희소합니다
Trie:
Patricia tree:
에테르의 주소는 160bit 로 총 2160 종으로 매우 희소하여 충돌을 피할 수 있습니다. 이것이 중앙화 시스템을 제거하여 충돌을 방지하는 유일한 방법입니다.
Merkle tree 와 binary tree 의 차이점: 일반 포인터를 해시 포인터로 변환
Merkle Patricia tree: 모든 계정을 Patricia tree 로 구성하고 경로 압축을 통해 효율성을 높인 다음 일반 포인터를 해시 포인터로 바꾸면 루트 해시 값을 계산할 수 있습니다. (비트코인의 block header 에는 블록에 포함된 거래로 구성된 Merkle tree 의 루트 해시 값인 하나의 루트 해시 값만 있습니다. (에테르방 중 세 개)
이 루트 해시 값의 역할:
변조 방지 Merkle proof, 계정 잔액 증명 계정이 존재하지 않습니다. 존재할 경우 어느 분기에 있어야 하는지, 이 분기를 Merkle proof 로 보내면 존재하지 않음을 증명할 수 있습니다
새 청크가 게시될 때마다 상태 트리의 일부 노드 상태가 변경됩니다. * * 그러나 변경은 제자리에서 수정되는 것이 아니라 일부 분기를 새로 만들어 원래 상태를 유지합니다. * * 다음 그림에서는 새로 변경된 노드만 수정해야 하고 수정되지 않은 다른 노드는 이전 블록의 해당 노드를 직접 가리킵니다.
계약 계정의 저장도 MPT 형식으로 저장되고, MPT 한 그루로, 에테르의 구조는 큰 MPT 에 작은 MPT 가 많이 들어 있고, 각 계약 계정의 저장은 작은 MPT 입니다.
따라서 시스템의 전체 노드는 MPT 한 그루를 유지하는 것이 아니라 새 블록이 게시될 때마다 새 MPT 를 만들어야 합니다. 대부분의 노드가 공유할 뿐입니다.
왜 역사 상태를 유지해야 합니까?
시스템에 분기점이 생기기도 하고, 출블록 시간이 10 여 초로 떨어지기도 하는데, 일시적인 분기점은 매우 보편적이다.
롤백을 용이하게 하기 위해 과거 상태를 유지합니다.
아래 그림 1 에서 분기점이 생성되고 위쪽 노드가 승리하여 2 중 상태가 됩니다. 다음 노드의 상태 수정은 롤백이 필요하고, 이 노드의 상태를 취소하고, 이전 블록으로 돌아간 다음, 이전 체인을 따라 뒤로 밀어야 합니다.
따라서 이러한 기록을 유지 관리해야 합니다.
비트코인의 거래는 간단한 역거래를 통해 이전 상태로 되돌아갈 수 있지만, 에테르에는 스마트계약이 있어 일단 집행이 끝나면 이전 상태를 추정할 수 없기 때문에 롤백하려면 역사적 상태를 보존해야 한다.
블록 헤드의 구조:
블록의 구조:
청크가 실제로 인터넷에 게시되었을 때의 정보:
상태 트리에는 (키, 값) 이 저장됩니다
키는 주소이고, value 는 RLP(Recursive telegram 공식 중국어 버전 다운로드 URL 은 얼마나 많은 Length Prefix) 인코딩으로 직렬화되어 저장됩니다
RLP 특징: 단순함, 단 하나의 유형-nested array of bytes 만 지원