덮개 아래 이더리움 - 섹션 2(RLP 인코딩) - 버전 0.3

원시 출판일자: Apr 25, 2018·
업데이트:구문 수정
두 번째 부분, 만약 당신이 첫 번째 부분을 아직 읽지 않았다면, 읽으세요.본고는 이태방이 귀속 길이 접두사를 어떻게 사용하여 데이터와 상태를 인코딩하는지 소개할 것이다.
이것은 약간 긴 책이기 때문에 자신에게 커피를 좀 가져다 주고 곤혹스러울 준비를 해라. 나는 확실히 RLP에 관한 책을 읽은 적이 있다
문제는 다음과 같습니다.
이더리움은 전 세계 컴퓨터로 이더리움이 처리하는 데이터는 반드시 네트워크를 통해 치밀하고 효율적인 전송을 해야 한다.이더리움 팀이 귀속 링크 접두사 디코딩/코딩 알고리즘을 선택하여 상기 목표를 실현한다.이태방에 관한 글을 자세히 읽으면'stack machines와 이태방에서 사용하는 법을 볼 수 있으니 조금만 소개해 드리겠습니다.
계층 구조:
aStack가 무엇인지 간단하게 이야기합시다.
스태킹 머신
Source: Wiki
이더리움 가상기기(EVM)는 창고를 기반으로 하는 기계로 후진선출(후진선출) 방법을 사용하여 창고에 지령과 데이터를 저장한다.문자열'cat'을 예로 들어 창고에 어떻게 밀려들었는지 봅시다
['c','a','t'] 
so the PUSH operation will be:
**PUSH(‘c’)   
PUSH(‘a’)   
PUSH(‘t’)** When data has to be retrieved POP function is used in the order it was put in:
**POP('t')  
POP('a')  
POP('c')**  
이태방 창고에는 일정한 제한이 있다.스택 깊이는 최대 1024 요소이며, 명령마다 최대 글자 크기는 256비트 또는 32바이트입니다.나는 이것이 지령집의 폭을 가리킨다고 생각한다. 아래 그림과 같다.
이더넷 스택(최대 높이 1024 요소, 최대 32바이트)
창고 기계는 미니 컴파일러를 실현하는 이상적인 선택이다.저희가 표현을 해보도록 하겠습니다.
[**[0x12344**]**,[(a+b\*c/d**), **'x', 9]** ]
고려해야 할 것은 위의 수조에 두 항목이 있다는 것이다.16진수 값과 표현식.16진수 값(0x12344)을 이더리움 주소로 보고 표현식을 상태 변경 정보로 간주합니다.글자의 최대 크기는 256자리입니다.[(a+b*c/d),'x', 9]를 생각해 봅시다.전체 표현식은 32바이트보다 작습니다.32바이트를 왜 물어봐요?다음은 이 화제에 대한 좋은 토론stack exchange이다.
이 유튜브 영상 보세요.
바이트 배열과 항목:
우리 recap 지난 글에서 배운 개념들을 살펴보자.이태방의 모든 데이터는 serialized이고 반서열화byte-array되었다.다시 말하면 바이트 그룹은 byte-array로 바이트 그룹을 중복할 만한 예이다.
RLP 인코딩 함수는 하나의 항목이나 그룹의 항목을 받아들인다
  • 문자열(즉 바이트 그룹)은 하나의 항목
  • 이다.
  • 항목 목록도 하나의 항목
  • 프로젝트 및 프로젝트의 예
  • 비트코인
  • [[] ]
  • ["사자"]
  • ["고양이", 123, "d", "o", "g"]
  • 이제 반복 링크 접두사(RLP)는 무엇입니까?
    RLP는 구조와 데이터를 인코딩하고 디코딩하는 일련의 규칙이다.제2부분.나는 RLP 인코딩에 주목한다.두 번째 섹션에서는 RLP 디코딩에 대해 설명합니다.뒤의 게시물에서 나는 이 문장의 두 번째 부분을 소개할 것이다.RLP의 내부 구조를 살펴보겠습니다.앞에서 article 우리가 '항목' 을 논의한 것을 기억한다면, 모든 '항목' 은 바이트 그룹입니다.RLP 함수는 Object 유형의 매개변수를 받아들입니다.
    RLP의 중요한 부분은 특정 구조의 인코딩 규칙을 맨 위에 남겨두는 것이다. 예를 들어, 만약 다른 구조가 존재한다면, 예를 들어 {"abc"}.RLP는 문자열 요소로 간주하고 인코딩을 맨 위에 남깁니다.
    _function_ encodeRLP**(rawData)**{ 
      .....,
     return encodedData #type bytearray;
    }_function_ decodeRLP**(bytearray stateInfo)**{
      .....,
      return decodeData #raw;
    }
    
    이러한 객체에 대한 RLP 인코딩 규칙을 살펴보겠습니다.
    팁: ASCII 도표를 한 장 열어보는 것을 권장합니다.

    RLP 인코딩 규칙은 다음과 같이 정의됩니다.


    규칙 1: 1바이트 인코딩을 사용하여 유효 부하를 하고 이 바이트의 값이 아래 범위 [0x00, 0x7f] 안에 있을 때 [0127] 안에 있으면 단일 바이트를 RLP 자체로 인코딩한다.
    $ 120 to rlp
    **_78_**   
    $ 127 to rlp
    **_7F_**  
    $ "a" to rlp
    **a**
    
    이에 따라 120을 RLP로 인코딩하면 78, 127을 7F로 인코딩하고,'a'에 대해서는'a', 바이트 크기는 1로 인코딩 규칙 #1이 적용된다.
    규칙 2: 0에서 55 바이트 사이의 문자열 (바이트 그룹) 을 인코딩할 때 다음과 같은 논리를 적용합니다.
    0x80+ 길이(문자열), 문자열
    string "dog" to byte-array in hex is [0x64,0x6f,0x67] and size of the byte array is 3
    
    항목 "dog"을 RLP에 인코딩합니다. 바이트 그룹의 크기aka 길이는 3이기 때문에 RLP에 인코딩하면
    [0x80+3,0x64,0x6f,0x67]->[0x83,0x64,0x6f,0x67]
    e, g: 또 다른 예는 RLP 인코딩의'hello world'이다.'hello world'의 크기는 11바이트이다.
    $ "hello world" to rlp
     [**0x8B** 0x68 0x65 0x6C 0x6C 0x6F 0x20 0x77 0x6F 0x72 0x6C 0x64]
    
    규칙 3: 55바이트 이상의 문자열(바이트 배열)을 인코딩할 때 다음 규칙을 적용합니다.
    1)0xb7+length_in_bytes(byte_size(string)) 
    2)length(string)
    3)encoded string  
    Join 1,2,3
    
    우리는 하나의 문자열을 예로 들자. "안녕하세요. 저는 매우 긴 문자열입니다. 저는 RLP로 인코딩할 것입니다."문자열의 길이는 76이므로 규칙 3이 적용됩니다.우리들은 약간의 사전 요구를 한쪽에 두자.
    _a)len raw string = 76   
    b)byte\_size(string) =76   
    c)length\_in\_bytes(byte\_size(string) ) = 1_   
    
    규칙 #3에 따른 단계
  • 0xb7+1
  • 76
  • "안녕하세요. 저는 아주 긴 문자열입니다. RLP로 인코딩하겠습니다!"
  • (0xb7+1), 76, "안녕하세요. 저는 아주 긴 문자열입니다. RLP로 인코딩하겠습니다!"
  • 따라서 최종 16진수 RLP 인코딩은 다음과 같습니다.
    **B84C** _48656C6C6F2074686572652C204920616D206120766572792076657279206C6F6E6720737472696E6720616E64204920616D20676F696E672067657420656E636F64656420696E20524C5021_
    
    규칙 4: 목록을 인코딩하고 목록의 인코딩이 0에서 55 바이트 사이에 유효하게 부하될 때 다음과 같은 인코딩 규칙을 적용한다.
    1)0xc0+length of (list)) 
    2)Encoded string
    Join 1,2
    
    RLP 인코딩에 [개, 마우스, 호랑이, 127] 입력
    우리는 우선 목록의 유효 하중을 인코딩해야 한다.
  • 개: 0x83, 0x64, 0x6F, 0x67
  • 마우스: 0x85, 0x6D, 0x6F, 0x75, 0x73, 0x65
  • 호랑이: 0x86, 0x74, 0x69, 0x67, 0x65, 0x72, 0x73
  • 127:0x7F
  • 인코딩된 유효 로드 목록은 다음과 같습니다.
    [0x83 0x64 0x6F 0x67 0x85 0x6D 0x6F 0x75 0x73 0x65 0x86 0x74 0x69 0x67 0x72 0x73 0x7F] 목록 길이 18(12 16진수)
    그래서 이 규칙의 최종 출력은:
  • 0xc0+12:0xd2
  • [0x83 0x64 0x6F 0x67 0x85 0x6D 0x6F 0x75 0x73 0x65 0x86 0x74 0x69 0x67 0x65 0x72 0x73*0x7F*]
  • 1과 2의 결합
  • 최종 출력: 0xd2 0x83 0x64 0x6F 0x67 0x85 0x6D 0x6F 0x75 0x73 0x65 0x86 0x74 0x69 0x67 0x65 0x72 0x73 0x7F
  • 규칙 5: 목록을 인코딩하고 목록의 인코딩이 55바이트보다 부하가 많을 때 다음과 같은 인코딩 규칙을 적용한다.
    1)0xf7+length_in_bytes(item 2)
    2)length(payload)
    3)Encoded payload
    Join 1,2,3
    
    나는 너에게 남은 것을 시킬 것이다. 매우 위의 규칙과 유사하다.
    마지막으로 몇 개의 주석이 있다
  • RLP는 Big Endian format,의 정수를 인코딩하고 전도 0을 버리며 정수치 0은 빈 바이트 그룹과 같다.
  • 빈 목록, 문자열 및 정수 0에는 일부 상수가 있습니다.
  • 1) Empty List **[]** encoded to **0xC0**
    2) Empty String **""** encoded to **0x80**
    3) Integer **0** encoded to **0x80**
    
    다시 말해, 다시 말해, 다시 말해.
    나의 건의는 이 문장을 소화한 후에 다시 이 문장으로 돌아가는 것이다.나도 100% 더 세밀한 세부 사항을 확정할 수는 없지만, 나는 확실히 Stack exchange의 친절한 사람들로부터 디자인 결정에 대한 유용한 관점과 좋은 도움을 받았다.
    다시 살펴보겠습니다.
  • RLP는 프로젝트 또는 프로젝트 목록을 인코딩하는 일련의 규칙입니다.
  • RLP는 유효 하중의 크기에 따라 규칙이 다릅니다.
  • 문자열은 바이트 그룹입니다.
  • 목록에 미리 정의된 값이 있는 빈 문자열.
  • RLP는 due의 데이터 압축 기능에 사용되며 간단합니다.
  • 팁: rationale 이더리움 팀이 왜 RLP를 선택했는지에 대한 디자인 결정을 읽어 보세요.RLP에는 여러 가지 실현 방식이 있다.나는 네가 자세히 검사해 보라고 건의한다.나는 확실히 Elixir와 루비의 실현을 언급했다.
    RLP에 또 다른 훌륭한 중등 댓글이 있습니다. 저는 go를 완전히 언급했고 앞으로 참고할 수 있도록 계속 할 것입니다.implementation의 코드 세션을 통해 저의 girishramnani를 보았습니다. 교정과 귀중한 의견에 감사드립니다.
    다음 기사(3부분)에서 RLP 디코딩을 소개하고 몇 가지 실현을 참고할 것이다.
    참조 자료:
  • Ethereum Building Blocks - Part 1: RLP
  • Data structure in Ethereum. Episode 1: Recursive Length Prefix (RLP) Encoding/Decoding.
  • Understanding the ethereum trie
  • 좋은 웹페이지 즐겨찾기