algorithm blockchain - 최종 일관성을 위해 Merkle Tree를 설명하십시오.




what is (2)

머클 나무 (Merkle Trees) 는 여러 개의 분산 된 복제 된 키 / 값 저장소에서 안티 엔트로피 메커니즘으로 사용됩니다.

의심의 여지가 안티 엔트로피 메커니즘은 좋은 일입니다 - 일시적인 오류는 생산에서 바로 발생합니다. Merkle Trees 가 인기있는 접근 방식 인 이유를 잘 모르겠다.

  • 피어에 완전한 Merkle 트리를 전송하는 것은 트리의 최하위 레벨에 저장된 각 키 값의 해시와 함께 해당 피어에 로컬 키 공간을 보내는 것을 포함합니다.

  • 또래 동료가 보낸 Merkle 나무를 뒤섞기 위해서는 자신의 Merkle 나무가 있어야합니다.

두 피어 모두 이미 정렬 된 키 / 값 해시 공간이 있어야하므로 불일치를 감지하기 위해 선형 병합을 사용하지 않는 이유는 무엇입니까?

나는 나무 구조가 유지 보수 비용을 고려할 때 어떤 종류의 절약도 제공한다는 것을 확신하지 못했습니다 . 트리 나뭇잎 위에 선형이 지나가고 있다는 사실 은 이미 와이어를 통해 표현을 직렬화하기 위해 이미 수행되고 있다는 사실입니다.

이를 해결하기 위해 스트로 맨 대체 방법은 노드가 해시 다이제스트 배열을 교환하도록하는 것일 수 있습니다. 해시 다이제스트 배열은 모듈 식 링 포지션으로 점진적으로 업데이트되고 버킷 화됩니다.

내가 뭘 놓치고 있니?


Answers

Merkle trees는 동기화 할 때 전송되는 데이터의 양을 제한합니다. 일반적인 가정은 다음과 같습니다.

  1. 네트워크 I / O는 로컬 I / O + 해시 컴퓨팅보다 비용이 많이 듭니다.
  2. 정렬 된 전체 키 공간을 전송하는 것은 점진적으로 여러 단계의 비교를 제한하는 것보다 비용이 많이 듭니다.
  3. 키 공간은 유사성보다 불일치가 적습니다.

Merkle Tree 교환은 다음과 같습니다.

  1. 트리 루트 (하나의 해시 값 목록)부터 시작하십시오.
  2. 원점은 현재 레벨에서 해시 목록을 보냅니다.
  3. 대상은 자체 해시 목록과 해시 목록을 비교 한 다음 서로 다른 하위 트리를 요청합니다. 차이가 없으면 요청을 종료 할 수 있습니다.
  4. 리프 노드에 도달 할 때까지 2 단계와 3 단계를 반복하십시오.
  5. 원점은 결과 집합의 키 값을 보냅니다.

일반적인 경우 키 공간을 동기화하는 복잡성은 log (N)입니다. 네, 공통점이없는 익스트림에서 작업은 정렬 된 전체 해시 목록 인 O (N)을 보내는 것과 같습니다. 쓰기가 발생하고 디스크에 직렬화 된 양식을 유지하면서 동적으로 빌드함으로써 Merkle 나무를 구축하는 비용을 상환 할 수 있습니다.

Dynamo 나 Cassandra가 Merkle tree를 사용하는 방법에 대해서는 말할 수 없지만 Riak은 클러스터 내 동기화 (힌트 된 핸드 오프 및 읽기 - 복구로 대부분의 경우 충분합니다)를 위해 클러스터를 사용하는 것을 중단했습니다. 나중에 내부 아키텍처 비트가 변경된 후에 다시 추가 할 계획입니다.

Riak에 대한 자세한 내용은 http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com 메일 링리스트에 가입하는 것이 좋습니다.


서브 - 최적 솔루션에 관심이 있다고 했잖아요. 그래서 제가 드릴게요. 그것은 알파벳 크기에 depens. 예를 들어, 26의 경우 배열 크기는 인코딩 할 단어의 양에 관계없이 100을 약간 넘을 것입니다.

두 개의 서로 다른 소수 ab 와 음수가 아닌 정수 kl ( k < a , l < b )이있는 경우, n % a == k 이고 n % b == l .
예를 들어 ( a = 7, a = 13, k = 6, l = 3 ) n = 7 * 13 + 7 * 3 + 13 * 6 있습니다. n % 7 == 6n % 13 == 3

동일한 수의 소수 (prime integer)에 대해서도 동일하게 적용됩니다.

이런 식으로 배열을 초기화 할 수 있습니다.

['a', 'b', 'c', ... 'z', 'z', 'z', 'z', ...]   # array size = 29
['a', 'b', 'c', ... 'z', 'z', 'z', 'z', ...]   # array size = 31
['a', 'b', 'c', ... 'z', 'z', 'z', 'z', ...]   # array size = 37
['a', 'b', 'c', ... 'z', 'z', 'z', 'z', ...]   # array size = 41
...

이제 단어가 '괴짜'라고 가정 해 보겠습니다. X % 29 == 6 , X % 31 == 4 , X % 37 == 4 , X % 41 == 10 과 같은 숫자 X가 필요합니다. 위에 표시된 것처럼 항상 X를 찾을 수 있습니다.

26 글자의 알파벳이있는 경우 너비 149의 행렬을 만들고 (소수 목록 참조) 모든 단어를 인코딩 할 수 있습니다.





algorithm nosql cassandra amazon-dynamodb riak