SlideShare a Scribd company logo
1 of 36
Download to read offline
직렬화 포맷 개량과 라이브러리 구현
플라네타리움 <planetariumhq.com>
이도건 <github.com/moreal>
이도건|Moreal
GitHub:<github.com/moreal>
Email:{dev.moreal@gmail.com,dogeon@planetariumhq.com}
Libplanet
https://libplanet.io/
게임에서갖다쓸수있는네트워크및스토리지라이브러리.
중앙에서누군가(≅게임사)가서버를운영하는대신,비트토렌트처럼게이머의기기끼리통신.
다음을위해블록체인기술을구현:
모든플레이어가일관된상태를볼수있도록(BFT합의).
중앙의관계형데이터베이스등을쓰지않고도영속성을구현할수있도록.
잠재적악의적플레이어(핵유저,치터)가있어도합의된세계가변조되지않도록.
[
블록체인과직렬화
블록체인의모든데이터는암호학적해시의입력이되거나,디지털서명의입력이된다.
해시나서명이일치하지않으면입력도동등하지않다고가정할수있어야한다.
그렇지않으면항상해시·서명에그입력까지동봉해야한다.
계산을줄이기위해서해시를쓰는것인데의미가퇴색한다.
동등한값은그해시도같아야한다
항목 값
Nonce 642
PublicKey 028763f8ada886a8df32bdd2893e1e086…
Signer 0xFe16BDed1DFB806FA6Ca6326dF2876cd1f0514A7
Timestamp 2020-08-11073109.094UTC
직렬화의대명사JSON
{
"nonce": 642,
"publicKey": "028763f8ada886a8df32bdd2893e1e086…",
"signer": "fe16bded1dfb806fa6ca6326df2876cd1f0514a7",
"timestamp": "2020-08-11T07:31:09.094Z"
}
$ sha1sum tx.json
02c14c49e16c142b3ef0746751004eb79599179a tx.json
직렬화의대명사JSON은같은값도다르게표현할수있다
{
"timestamp": "2020-08-11T07:31:09.094Z",
"signer": "fe16bded1dfb806fa6ca6326df2876cd1f0514a7",
"publicKey": "028763f8ada886a8df32bdd2893e1e086…",
"nonce": 642
}
$ sha1sum tx.json
e3e07657b7ac147eb5cbae3ac3bee013786961f6 tx.json
직렬화의대명사JSON은같은값도다르게표현할수있다
{"nonce":642,"publicKey":"028763f8ada886a8df32bdd2893e1e086…",
"signer":"fe16bded1dfb806fa6ca6326df2876cd1f0514a7","timestamp":
"2020-08-11T07:31:09.094Z"}
$ sha1sum tx.json
fa2a3813f85b7fc9221fe149d217234654b36f4a tx.json
우리가원하는부호화
(Y:입력,X출력)
X
1
2
3
4
Y
D
B
C
A
그림출처:Bijection—‘Wikipediaʼ
JSON
(Y:입력,X출력)
그림출처:Surjective_function—‘Wikipediaʼ
입력ː출력
직렬화포맷 입력ː출력
pickle 1∶N
JSON 1∶N
BSON 1∶N
msgpack 1∶N
선현의지혜를찾아
다른사람들은어떻게했을까?
Libplanet과비슷한문제를푸는프로젝트들엔뭐가있을까?
비트토렌트!
Bencoding
비트토렌트에서쓰기위해만든직렬화포맷.
마찬가지이유(1ːN대응)로당시많이쓰이던XML이나pickle등을쓸수없었다.
토렌트파일(*.torrent)은토렌트메타데이터를bencoding한결과.
매그닛주소는토렌트파일내용을해시한것.
1∶1대응이되므로같은파일은같은토렌트파일및매그닛으로표현된다.
→따라서다른사람과더잘겹치고공유가더잘된다.
입력ː출력
직렬화포맷 입력ː출력
pickle 1∶N
JSON 1∶N
BSON 1∶N
msgpack 1∶N
bencode 1∶1
Bencode의시대적한계
2001년에비트토렌트와함께만들어진포맷.
빈값( None )지원안함.
불논리값( True 또는 False )지원안함.
→파이썬에 bool 타입이2002년에야들어와서(PEP285).
문자열은모두바이트배열( b"..." ).
유니코드쓰려면알아서인코딩해야함( u"...".encode(...) ).
→당시파이썬3는나오기도전이라기본문자열은바이트배열이었다.
Bencodex:BencodingExtended
https://bencodex.org/
bencodex-python
<github.com/planetarium/bencodex-python>
Bencodex의모든자료형은파이썬에도빌트인으로있다
자료형 Bencodex Python
없음 n None
불 t / f True / False
정수 i3e 3
바이트열 4:spam b"Spam"
유니코드문자열 u6:단팥 u"단팥"
목록 l4:spamu4:eggse [b"spam", u"eggs"]
사상(사전) du4:spaml1:au1:bee {u"spam": [b"a", u"b"]}
파이썬직렬화모듈API
marshal → pickle → json 등으로이어져온사실상의표준
dump(obj: Any, file: IO[bytes]) -> None
dumps(obj: any) -> bytes
load(file: IO[bytes]) -> Any
loads(string: bytes) -> Any
typing그리고mypy지원
PEP484
타입검사
from bencodex import dump
with open("file.dat", "wb") as f:
dump(f, "value") # 인자 순서 틀림
# error: Argument 2 to "dump" has incompatible type "str"; expected "BinaryIO"
bencodex.types.BValue
파이썬자료형가운데Bencodex로부호화가능한것들만허용하는타입
…을의도했지만…
bencodex/types.py @1.0.1
from typing import Any
__all__ = 'BValue',
BValue = Any
# Mypy currently does not support recursive types.
# https://github.com/python/mypy/issues/731
Mypy는현재재귀타입미지원
BValue 는 bool , int 같은스칼라값외에도목록이나사전처럼복잡한값을포함.
그러나이를타입으로표현하려면 Sequence[BValue] 나 Mapping[Union[str, bytes],
BValue] 와같이타입정의안에다시 BValue 라는이름이등장할수있어야함.
타입정의안에정의하려는타입( BValue )을쓸수있게해주는게recursivetypes
(예: BValue = Union[..., Sequence[BValue]] ).
Mypy는아직이기능을미지원해서일단 BValue = Any 로정의해둘수밖에없었다.
그러나mypy측에서해당문제해결가능성도보임!
<github.com/python/mypy/issues/731>
Bencodex에서입력:출력1∶1만족하는원리
정규화
사전키정렬순서정의
정수42를표현하는경우
[X] i042e
[O] i42e
bencodex/writer.py @1.0.1
elif isinstance(value, collections.abc.Mapping):
…
items = [
(u, k.encode('utf-8') if u else k, v)
for k, v in value.items()
for u in [is_unicode(k)]
]
items.sort()
…
Bencodex명세및테스트데이터
Bencodex명세는테스트데이터도제공.
bencodex/test.py @1.0.1
def load_testsuite_data() -> Generator[Tuple[str, object, bytes], None, None]:
…
for filename in resource_listdir(pkg, 'spec/testsuite'):
if not filename.lower().endswith(('.yaml', '.yml')):
continue
yaml_filename = 'spec/testsuite/' + filename
data_filename = suffix_re.sub('.dat', yaml_filename)
if not resource_exists(pkg, data_filename):
continue
yaml = load_yaml(resource_string(pkg, yaml_filename).decode('utf-8'))
…
Bencodex구현체및보조도구
bencodex.net-.NET
bencodex-python-Python
disjukr/bencodex-TypeScript
bencodex-haskell-Haskell
bencodex-viewer-Bencodex웹기반시각화도구
질문과답변
트위터:@dev_moreal
디스코드:<discord.gg/planetarium>
이메일:{dev.moreal@gmail.com,dogeon@planetariumhq.com}

More Related Content

Similar to 직렬화 포맷 개량과 라이브러리 구현 - PyCon Korea 2020

[숭실대학교 SODA]깃(git) 명령 및 소스트리(sourceTree) 실습
[숭실대학교 SODA]깃(git) 명령 및 소스트리(sourceTree) 실습 [숭실대학교 SODA]깃(git) 명령 및 소스트리(sourceTree) 실습
[숭실대학교 SODA]깃(git) 명령 및 소스트리(sourceTree) 실습 Soongsil University
 
How to use Github? (For Cien)
How to use Github? (For Cien)How to use Github? (For Cien)
How to use Github? (For Cien)민수 김
 
슬랙에 귀여운 휴봇 하나 키워보자
슬랙에 귀여운 휴봇 하나 키워보자슬랙에 귀여운 휴봇 하나 키워보자
슬랙에 귀여운 휴봇 하나 키워보자명호 박
 
마이크로소프트 봇 프레임워크로 만드는 인공지능 봇
마이크로소프트 봇 프레임워크로 만드는 인공지능 봇마이크로소프트 봇 프레임워크로 만드는 인공지능 봇
마이크로소프트 봇 프레임워크로 만드는 인공지능 봇Dae Kim
 
[ETHCon Korea 2019] Kang Hyungseok 강형석
[ETHCon Korea 2019] Kang Hyungseok 강형석[ETHCon Korea 2019] Kang Hyungseok 강형석
[ETHCon Korea 2019] Kang Hyungseok 강형석ethconkr
 
제로부터시작하는 Git 두번째 이야기
제로부터시작하는 Git 두번째 이야기제로부터시작하는 Git 두번째 이야기
제로부터시작하는 Git 두번째 이야기Mario Cho
 
Open source engineering
Open source engineeringOpen source engineering
Open source engineeringYoungSu Son
 
하이퍼레저 프로젝트 개요
하이퍼레저 프로젝트 개요하이퍼레저 프로젝트 개요
하이퍼레저 프로젝트 개요TIMEGATE
 
하이퍼레저 프로젝트 개요
하이퍼레저 프로젝트 개요하이퍼레저 프로젝트 개요
하이퍼레저 프로젝트 개요Seung-Woo Kang
 

Similar to 직렬화 포맷 개량과 라이브러리 구현 - PyCon Korea 2020 (10)

[숭실대학교 SODA]깃(git) 명령 및 소스트리(sourceTree) 실습
[숭실대학교 SODA]깃(git) 명령 및 소스트리(sourceTree) 실습 [숭실대학교 SODA]깃(git) 명령 및 소스트리(sourceTree) 실습
[숭실대학교 SODA]깃(git) 명령 및 소스트리(sourceTree) 실습
 
How to use Github? (For Cien)
How to use Github? (For Cien)How to use Github? (For Cien)
How to use Github? (For Cien)
 
슬랙에 귀여운 휴봇 하나 키워보자
슬랙에 귀여운 휴봇 하나 키워보자슬랙에 귀여운 휴봇 하나 키워보자
슬랙에 귀여운 휴봇 하나 키워보자
 
마이크로소프트 봇 프레임워크로 만드는 인공지능 봇
마이크로소프트 봇 프레임워크로 만드는 인공지능 봇마이크로소프트 봇 프레임워크로 만드는 인공지능 봇
마이크로소프트 봇 프레임워크로 만드는 인공지능 봇
 
[ETHCon Korea 2019] Kang Hyungseok 강형석
[ETHCon Korea 2019] Kang Hyungseok 강형석[ETHCon Korea 2019] Kang Hyungseok 강형석
[ETHCon Korea 2019] Kang Hyungseok 강형석
 
제로부터시작하는 Git 두번째 이야기
제로부터시작하는 Git 두번째 이야기제로부터시작하는 Git 두번째 이야기
제로부터시작하는 Git 두번째 이야기
 
실시간통신
실시간통신실시간통신
실시간통신
 
Open source engineering
Open source engineeringOpen source engineering
Open source engineering
 
하이퍼레저 프로젝트 개요
하이퍼레저 프로젝트 개요하이퍼레저 프로젝트 개요
하이퍼레저 프로젝트 개요
 
하이퍼레저 프로젝트 개요
하이퍼레저 프로젝트 개요하이퍼레저 프로젝트 개요
하이퍼레저 프로젝트 개요
 

직렬화 포맷 개량과 라이브러리 구현 - PyCon Korea 2020