RLP인코딩

이더리움은 데이터를 저장하기 위해 trie 구조를 사용하며,
해당 구조를 DB에 저장할땐, 다음그림과 같이 RLP인코딩을 한다고 알려져 있다.

 

RLP인코딩을 사용하는 이유


1.이더리움 내부에서 중첩된 바이너리 배열을 인코딩하기위해

2.해시값이 달라질수 있는 위험이 존재하기떄문 RLP라는 인코딩 패키지를 구현 인코딩 과정이 아주 단순하여 인코딩 크기를 줄이고 바이트 단위의 일관성을 확보하기위해서이다.

 

RLP란?


RLP(Recursive Length Prefix)는 임의의 깊이와 개수로 중첩된 배열을 binary data로 표현하는 인코딩 방식이다.
인코딩할 데이터 앞에 binary data의 길이를 추가하는 방식으로 동작하기 때문에 Length Prefix라는 이름이 붙었다 RLP의 input은 binary data이다.
그 값의 이름이 무엇이고, 어떤 타입이고, 어떤 representation을 가지는지는 RLP에서 정의하지 않는다.
이는 별도의 규약을 정하여 RLP 인코딩을 하기 전에 binary data로 변경해야 한다.
RLP가 인코딩하는 방법은 인코딩할 입력이 무엇인지에 따라 달라진다.

RLP Decoding reference: https://github.com/ethereum/wiki/wiki/RLP

State root
[0d9348243d7357c491e6a61f4b1305e77dc6acacdb8cc708e662f6a9bab6ca02, f8518080808080a018e3b46e84b35270116303fb2a33c853861d45d99da2d87117c2136f7edbd0b980a0717aef38e7ba4a0ae477856a6e7f6ba8d4ee764c57908e6f22643a558db737ff808080808080808080]

key: 0d9348243d7357c491e6a61f4b1305e77dc6acacdb8cc708e662f6a9bab6ca02
value:
f8: followed 1 byte is total length
51: 81 bytes
80: string(empty) // slot 
80: string(empty) // slot 
80: string(empty) // slot 
80: string(empty) // slot 
80: string(empty) // slot 
a0: 32 bytes      // slot 
18e3b46e84b35270116303fb2a33c853861d45d99da2d87117c2136f7edbd0b9
80: string(empty) // slot 
a0: 32 bytes      // slot 
717aef38e7ba4a0ae477856a6e7f6ba8d4ee764c57908e6f22643a558db737ff
80: string(empty) // slot 
80: string(empty) // slot 
80: string(empty) // slot 
80: string(empty) // slot 
80: string(empty) // slot 
80: string(empty) // slot 
80: string(empty) // slot 
80: string(empty) // slot 
80: string(empty) // slot 

key: 18e3b46e84b35270116303fb2a33c853861d45d99da2d87117c2136f7edbd0b9
value:
f8: followed 1 byte is total length
71: 113 bytes
	a0: 32 bytes
	36c96a349d905ad74b68851304d5dc5f111fbab2c24c4b4d02e96d2fc0727fd
	b8: followed 1 byte is string length
	4e: 78 bytes
		f8: followed 1 byte is total length
		4c: 76 bytes
			80: string(empty) // nonce 
			88: 8 bytes       // balance
			0de0b6b3a7640000  // 1,000,000,000,000,000,000
			a0: 32 bytes // empty root  = storage trie
			56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421
			a0: 32 bytes // nil code hash
			c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470

key: 717aef38e7ba4a0ae477856a6e7f6ba8d4ee764c57908e6f22643a558db737ff
value:
f8: followed 1 byte is total length
71: 113 bytes
	a0: 32 bytes
	361d5c42184a02cc64585ed2ff339fc39a907e82731d70313c83d2212b2da36b
	b8: followed 1 byte is string length
	4e: 78byte
		f8: followed 1 byte is total length
		4c: 76 bytes
			01: 1        //nonce 
			88:          //blance
			c249fdd327780000
			a0: 32 bytes // empty root  = storage trie
			56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421
			a0: 32 bytes // nil code hash
			c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470

RLP코드를 짜놓으신분이 있어 가져왔다.

 

장점과 단점

 

장점


RLP는 데이터의 길이를 prefix로 붙이는 것만으로 다양한 형태의 데이터를 인코딩할 수 있게 해준다
. 이로 인해 단순하지만 빠르고 효율적인 인코딩이 된다.

단점


길이를 prefix로 붙이는 것뿐이고 데이터 자체에는 아무런 가공을 하지 않기 때문에 변조나 오염에 매우 취약하다.
따라서 데이터를 전송하거나 저장할 때, RLP로 인코딩된 값을 그대로 사용하지 않고,
데이터가 변조된 것을 알 수 있게 하는 코드나 signature를 더 붙이는 가공을 해야 한다.


RLP 5가지 인코딩 규칙(곁가지로만 알아보자)


1.바이트 데이터가 127보다 작거나 같다면 해당바이트를 그대로사용
2.0바이트에서부터 55바이트 길이 사이의 문자열에 대해서는 인코딩할 문자열의 길이에 128을 더한 본래의 각바이트배열에추가한값으로 인코딩
3.55바이트 이상크기의 긴문자열을 인코딩할때는 183에 전체문자열의 바이트 길이를 더한 후 문자열의 전체 길이와 실제 문자열을 더해 인코딩 된다.
4.0과 55바이트 사이인 배열을 인코딩할 경우, 192에 해당 배열안에있는 각 항목의 바이너리 값들의 길이를 더한 후 배열 내 각항목에 대한 바이트들을 인코딩한다.
5.총 길이가 55바이트가 넘을경우 247에 해당 배열내 각학목의 바이너리 값들의 길이를 더한 후 인코딩할 배열들의 각항목의 바이트들을

인코딩 응용 계층 DApp 스마트컨트랙트 기반의 웹서비스 스마트컨트랙트를 개발한 후 블록체인에 배포하면
스마트컨트랙트의 어카운트 주소,ABI(어플리케이션 바이너리 인터페이스)등이 생성한다.


ABI에서는 스마트컨트랙트의 바이트코드를 일반프로그램에서 호출하고 실행시 킬 수 있는 정보와 인터페이스를 제공한다.

 

DApp


DApp의 구동환경 개발자는 이더리움 블록체인에 배포된 스마트 컨트랙트를 활용한 앱을 기존의 언어를 이용해개발가능!
이를위해 web3.js라는 자바스크립트 라이브러리 사용


web3.js


web3.js는json-rpc를 사용하여 블록체인의 데이터와 스마트 컨트 랙트의 바이트 코드를 자바스크립트로 다룰 수 있도록 다양한 객체와 함수를 제공한다.
개발 자는스마트 컨트랙트의 주소와 ABI를 알면 web3.js 라이브러리를통해 스마트 컨트랙트를 생 성하고 특정 함수를 실행시킬 수 있다






https://blog.seulgi.kim/2018/01/rlp-encoding.html
RLP에 관해좋은 사이트들

 

 

RLP가 어떻게 블록체인에서 사용하게되었는가?


RLP(Recursive Length Prefix)는 중첩된 배열 형태인 데이터를 인코딩하는 방법으로 이더리움 노드가 들고 있는 트랜잭션, 스마트 컨트랙트와 같은 오브젝트 데이터들을 직렬화(serialize)하기 위해 처음 제안 되었습니다.

 RLP는 두 가지 인코딩 형식을 사용합니다. 

첫 번째는 문자열(string)이고 다른 하나는 배열입니다.

 배열의 아이템은 다시 문자열과 배열 두 가지 형식으로 인코딩 되기 때문에 Recursive라는 이름이 붙었습니다. 

또한 단일 문자열 인코딩을 제외하고는 인코딩된 데이터의 길이를 결과물 앞쪽에 붙이기 때문에

 Length Prefix라고 할 수 있겠습니다. 

코드체인에서도 노드의 오브젝트를 직렬화 하고 다른 노드에 보낼 때 RLP를 이용하고 있습니다.

복사했습니다!