ããããã®ããŸããŸãããã¹ãŠã®ã¢ã«ãŽãªãºã ãšããŒã¿æ§é ããã©ã®ãããªæªéãšããŠæãåºãã¹ãã§ããããïŒã
ããã«ã€ããŠã¯ãæè¡é¢æ¥ã®ééã«é¢ããã»ãšãã©ã®èšäºã®ã³ã¡ã³ãã«åž°çããŸãã ååãšããŠãäž»ãªè«æã¯ãäœããã®æ¹æ³ã§äœ¿çšããããã¹ãŠã®ãã®ããã§ã«10åå®è£
ãããŠããããã®éåžžã®ããã°ã©ããŒã察åŠããªããã°ãªããªãå¯èœæ§ã¯ã»ãšãã©ãããŸããã ãŸããããçšåºŠããã¯æ¬åœã§ãã ããããçµå±ã®ãšããããã¹ãŠãå®è£
ãããããã§ã¯ãªããæ®å¿µãªããïŒãŸãã¯å¹žéãªããšã«ïŒããŒã¿æ§é ãäœæããå¿
èŠããããŸããã
ç¥ç§çãªä¿®æ£ããŒã¯ã«ãããªã·ã¢ãã©ã€ã
ãã®æšãšåªäœã«ã¯ãã®æšã«é¢ããæ
å ±ããŸã£ãããªãã®ã§ãããå°ããã©ã®ãããªåç©ã§ãäœãšäžç·ã«é£ã¹ãããã®ããäŒããããšæããŸãã

ããã¯äœã§ãã
å
責äºé
ïŒå®è£
ã®ããã®æ
å ±ã®äž»ãªæ
å ±æºã¯ã ã€ãšããŒããŒã㌠ãããã³ãœãŒã¹ã³ãŒãããªãã£ã€ãŒãµãªã¢ã ãšãŽãŒã€ãŒãµãªã¢ã ã§ãã ã ç¹å®ã®æ±ºå®ã®æ£åœåã«é¢ããæå°éã®çè«çæ
å ±ããã£ããããç¹å®ã®æ±ºå®ãäžããçç±ã«é¢ãããã¹ãŠã®çµè«ã¯ç§ã®å人çãªãã®ã§ãã ç§ãäœãã«ééããå Žå-ç§ã¯ã³ã¡ã³ãã®ä¿®æ£ã«åãã§ããã§ãããã
ããªãŒã¯ãæ¥ç¶ãããé埪ç°ã°ã©ãã§ããããŒã¿æ§é ã§ãã ããã§ã¯ãã¹ãŠãã·ã³ãã«ã§ã誰ããããã«ç²ŸéããŠããŸãã
ãã¬ãã£ãã¯ã¹ããªãŒã¯ãããŒãããã¹ã®äžéšïŒãã¬ãã£ãã¯ã¹ïŒãå«ãããŒããšãæ ŒçŽãããå€ãå«ããªãŒãããŒãã®2ã€ã®ã¿ã€ãã«åãããŠãããããããŒãšå€ã®ãã¢ãæ ŒçŽã§ããã«ãŒãããªãŒã§ãã ããŒã䜿çšããŠããªãŒã®ã«ãŒãããæåŸãŸã§ç§»åããæåŸã«å€ãæã€ããŒããèŠã€ããããšãã§ããå Žåã«ã®ã¿ãå€ãããªãŒã«ååšããŸãã
PATRICIAããªãŒã¯ããã¬ãã£ãã¯ã¹ããã€ããªã®ãã¬ãã£ãã¯ã¹ããªãŒã§ããã€ãŸããåããŒããŒãã¯1ãããã«é¢ããæ
å ±ãæ ŒçŽããŸãã
ããŒã¯ã«ããªãŒã¯ãããçš®ã®ããŒã¿ãã§ãŒã³äžã«æ§ç¯ãããããã·ã¥ããªãŒã§ããããããã®åãããã·ã¥ã1ã€ïŒã«ãŒãïŒã«éçŽãããã¹ãŠã®ããŒã¿ãããã¯ã®ç¶æ
ã«é¢ããæ
å ±ãæ ŒçŽããŸãã ã€ãŸããã«ãŒãããã·ã¥ã¯ããããã¯ãã§ãŒã³ã®ç¶æ
ã®äžçš®ã®ãããžã¿ã«çœ²åãã§ãã ãã®ããšã¯ãããã¯ãã§ãŒã³ã§ç©æ¥µçã«äœ¿çšãããŠããŸã ã詳现ã«ã€ããŠã¯ãã¡ããã芧ãã ãã ã

åèšïŒä¿®æ£ããŒã¯ã«ãããªã·ã¢ãã©ã€ïŒä»¥äžãç¥ããŠMPTïŒã¯ãããŒãšå€ã®ãã¢ãæ ŒçŽããããã·ã¥ããªãŒã§ãããããŒã¯ãã€ããªåœ¢åŒã§æ瀺ãããŸãã ãããŠããä¿®æ£ããšã¯äœãªã®ãã«ã€ããŠã¯ãåŸã§å®è£
ã«ã€ããŠèª¬æãããšãã«å°ã調ã¹ãŸãã
ããã¯ãªãã§ããïŒ
MPTã¯ãEthereumãããžã§ã¯ãã§äœ¿çšãããã¢ã«ãŠã³ãããã©ã³ã¶ã¯ã·ã§ã³ããã®å®è¡çµæãããã³ã·ã¹ãã ã®æ©èœã«å¿
èŠãªãã®ä»ã®ããŒã¿ã«é¢ããããŒã¿ãä¿åããŸãã
ç¶æ
ãæé»çã§ãåããŒãã«ãã£ãŠåå¥ã«èšç®ããããããã³ã€ã³ãšã¯ç°ãªããåã¢ã«ãŠã³ãã®æ®é«ïŒããã³ããã«é¢é£ä»ããããŠããããŒã¿ïŒã¯ãæŸéäžã®ãããã¯ãã§ãŒã³ã«çŽæ¥ä¿åãããŸãã ããã«ãããŒã¿ã®çºèŠãšäžå€æ§ã¯æå·ã§æäŸãããã¹ãã§ã-客芳çãªçç±ãªãã«ã©ã³ãã ãªå£åº§ã®æ®é«ãå€åããæå·é貚ã䜿çšãã人ã¯ã»ãšãã©ããŸããã
Ethereuméçºè
ãçŽé¢ããäž»ãªåé¡ã¯ãããŒãšå€ã®ãã¢ãå¹æçã«ä¿åããåæã«ä¿åãããããŒã¿ã®æ€èšŒãæäŸã§ããããŒã¿æ§é ã®äœæã§ãã ããã§ãMPTãç»å ŽããŸããã
ã©ãïŒ
MPTã¯ãããŒããã€ãã®ã·ãŒã±ã³ã¹ã§ãããã¬ãã£ãã¯ã¹PATRICIAããªãŒã§ãã
ãã®ããªãŒã®ãšããžã¯ããã«ã·ãŒã±ã³ã¹ïŒããŒããã€ãïŒã§ãã ãããã£ãŠã1ã€ã®ããŒãã«ã¯æ倧16ã®åå«ïŒ0x0ãã0xFã®ãã©ã³ãã«å¯Ÿå¿ïŒãå«ããããšãã§ããŸãã
ããŒãã¯3ã€ã®ã¿ã€ãã«åããããŸãã
- ãã©ã³ãããŒãã åå²ã«äœ¿çšãããããŒãã åããŒããžã®æ倧1ã16åã®ãªã³ã¯ãå«ãŸããŸãã å€ãå«ããããšãã§ããŸãã
- æ¡åŒµããŒãã è€æ°ã®åããŒãã«å
±éãããã¹ã®äžéšãšããã®äžã«ãããã©ã³ãããŒããžã®ãªã³ã¯ãæ ŒçŽããè£å©ããŒãã
- èããŒãã ãã¹ã®äžéšãšæ ŒçŽãããå€ãå«ãããŒãã ãã§ãŒã³ã®çµããã§ãã
ãã§ã«è¿°ã¹ãããã«ãMPTã¯å¥ã®kvãªããžããªã®äžã«æ§ç¯ããããlinkã=>ã RLP
ãšã³ã³ãŒããããããŒããã®åœ¢åŒã§ããŒããä¿åããŸãã
ãããŠãããã§æ°ããæŠå¿µRLPã«åºäŒããŸãã èŠããã«ãããã¯ãªã¹ããŸãã¯ãã€ãã·ãŒã±ã³ã¹ãè¡šãããŒã¿ããšã³ã³ãŒãããæ¹æ³ã§ãã äŸïŒ [ "cat", "dog" ] = [ 0xc8, 0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g' ]
ã ç¹ã«è©³çŽ°ã«ã¯è§ŠããŸããããå®è£
ã§ã¯æ¢è£œã®ã©ã€ãã©ãªã䜿çšããŸãããã®ãããã¯ãåãäžãããšããã§ã«ããªã倧ããªèšäºãèšããããã§ãã ãŸã èå³ãããå Žåã¯ã ãã¡ããã芧ãã ãã ã RLP
ã§ããŒã¿ããšã³ã³ãŒããããã³ãŒãããŠæ»ãããšãã§ãããšããäºå®ã«éå®ããŠããŸãã
ããŒããžã®ãªã³ã¯ã¯æ¬¡ã®ããã«å®çŸ©ãããŸãkeccak
ãšã³ã³ãŒããããããŒãã®é·ãã32ãã€ã以äžã®å Žåããªã³ã¯ã¯ããŒãã®RLP
è¡šçŸããã®keccak
ããã·ã¥ã§ãã é·ãã32ãã€ãæªæºã®å Žåããªã³ã¯ã¯ããŒãèªäœã®RLP
è¡šçŸã§ãã
æããã«ã2çªç®ã®ã±ãŒã¹ã§ã¯ãããŒããããŒã¿ããŒã¹ã«ä¿åããå¿
èŠã¯ãããŸããã å®å
šã«èŠªããŒãå
ã«ä¿åãããŸãã

3çš®é¡ã®ããŒãã®çµã¿åããã«ãããããŒãå°ãªãå ŽåïŒã»ãšãã©ã®ãã¹ãæ¡åŒµããŒããšãªãŒãããŒãã«æ ŒçŽããããã©ã³ãããŒããå°ãªãå ŽåïŒãããã³ããŒââããå€ãå ŽåïŒãã¹ãæ瀺çã«æ ŒçŽãããªãå ŽåïŒãããŒã¿ãå¹æçã«æ ŒçŽã§ããŸãããã ãããã©ã³ãããŒããééãããšãã«ãåéããããŸãïŒã
ããããçš®é¡ã®ããŒãã䜿çšããããªãŒã®å®å
šãªäŸïŒ

ãæ°ã¥ããããããŸãããããã¹ã®ä¿åãããéšåã«ã¯ãã¬ãã£ãã¯ã¹ããããŸãã ãã¬ãã£ãã¯ã¹ã¯ããã€ãã®ç®çã«å¿
èŠã§ãã
- æ¡åŒµããŒããšãªãŒãããŒããåºå¥ããããã
- å¥æ°åã®ããã«ã®ã·ãŒã±ã³ã¹ãæŽåããŸãã
ãã¬ãã£ãã¯ã¹ãäœæããããã®ã«ãŒã«ã¯éåžžã«ç°¡åã§ãã
- ãã¬ãã£ãã¯ã¹ã«ã¯1ããã«ãå¿
èŠã§ãã ãã¹ã®é·ãïŒãã¬ãã£ãã¯ã¹ãé€ãïŒãå¥æ°ã®å Žåããã¹ã¯ãã¬ãã£ãã¯ã¹ã®çŽåŸããå§ãŸããŸãã ãã¹ã®é·ããå¶æ°ã®å Žå-ãã¬ãã£ãã¯ã¹ã®åŸã«æŽåããããã«ãããã«0x0ãæåã«è¿œå ãããŸãã
- ãã¬ãã£ãã¯ã¹ã¯æåã¯0x0ã§ãã
- ãã¹ã®é·ããå¥æ°ã®å Žåãå¶æ°ã®å Žåã¯0x1ããã¬ãã£ãã¯ã¹ã«è¿œå ãããŸã-0x0ã
- ãã¹ããªãŒãããŒãã«ã€ãªããå Žåã0x0ãæ¡åŒµããŒãã«è¿œå ããããšã0x2ããã¬ãã£ãã¯ã¹ã«è¿œå ãããŸãã
ãã¢ãã£ãã¯ã¹ã§ã¯ãããæ確ã«ãªããšæããŸãïŒ
0b0000 => , Extension 0b0001 => , Extension 0b0010 => , Leaf 0b0011 => , Leaf
é€å»ã§ã¯ãªãé€å»
ããªãŒã«ã¯ããŒããåé€ããæäœããããšããäºå®ã«ãããããããå®éã«ã¯ãäžåºŠè¿œå ããããã®ã¯ãã¹ãŠããªãŒã«æ°žä¹
ã«æ®ããŸãã
ããã¯ããããã¯ããšã«å®å
šãªããªãŒãäœæããã®ã§ã¯ãªããããªãŒã®å€ãããŒãžã§ã³ãšæ°ããããŒãžã§ã³ã®éãã®ã¿ãä¿åããããã«å¿
èŠã§ãã
ãããã£ãŠãç°ãªãã«ãŒãããã·ã¥ããšã³ããªãã€ã³ããšããŠäœ¿çšãããšãããªãŒããããŸã§ã«ãã£ãç¶æ
ãååŸã§ããŸãã

ãããã¯ãã¹ãŠæé©åãããŠããããã§ã¯ãããŸããã ä»ã«ããããŸãããããã«ã€ããŠã¯èª¬æããŸããããããã£ãŠãèšäºã¯å€§ãããªããŸãã ãã ããèªåã§èªãããšãã§ããŸãã
å®è£
çè«ã¯çµãããŸãããå®è·µã«ç§»ããŸãããã ITã®äžçã®å
±éèªãã€ãŸãpython
ãŸãã
ããããã®ã³ãŒãããããèšäºã®ãã©ãŒãããã®ããã«å€ãã®ã³ãŒããæžãããŠåå²ããå¿
èŠãããã®ã§ãããã«githubãžã®ãªã³ã¯ãæ®ããŸãã
å¿
èŠã«å¿ããŠãå
šäœåãèŠãããšãã§ããŸãã
ãŸããçµæãšããŠååŸããããªãŒã€ã³ã¿ãŒãã§ã€ã¹ãå®çŸ©ããŸãã
class MerklePatriciaTrie: def __init__(self, storage, root=None): pass def root(self): pass def get(self, encoded_key): pass def update(self, encoded_key, encoded_value): pass def delete(self, encoded_key): pass
ã€ã³ã¿ãŒãã§ã€ã¹ã¯éåžžã«ã·ã³ãã«ã§ãã å©çšå¯èœãªæäœã¯ãã«ãŒãããã·ã¥ã®ååŸãšåæ§ã«ãååŸãåé€ãæ¿å
¥ãããã³å€æŽïŒæŽæ°ã§çµåïŒã§ãã
ã¹ãã¬ãŒãžã¯__init__
ã¡ãœããã«è»¢éãããŸããããã¯ã root
ãšåæ§ã«ããŒããæ ŒçŽããdict
䌌ãããŒã¿æ§é ã§ãããããªãŒã®ãããããã§ãã None
ãroot
ãšããŠæž¡ãããå ŽåãããªãŒã¯ç©ºã§ããããŒãããåäœããŠãããšæ³å®ããŸãã
_泚éïŒã¡ãœããã®å€æ°ããªãkey
/ value
ã ãã§ãªãã encoded_key
ããã³encoded_value
ãšããååã«ãªã£ãŠããã®ãçåã«æããããããŸããã çãã¯ç°¡åã§ããä»æ§ã«ããã°ããã¹ãŠã®ããŒãšå€ã¯RLP
ã§ãšã³ã³ãŒãããå¿
èŠããããŸãã ç§ãã¡ã¯ããã«æ©ãŸãããããã®è·æ¥ãå³æžé€šå©çšè
ã®è©ã«ä»»ããŸãã
ãã ããããªãŒèªäœã®å®è£
ãéå§ããåã«ã2ã€ã®éèŠãªããšãè¡ãå¿
èŠããããŸãã
- æåã§ãšã³ã³ãŒãããªãããã«ãããã«ã®ãã§ãŒã³ã§ãã
NibblePath
ã¯ã©ã¹ãå®è£
ããŸãã - ãã®ã¯ã©ã¹ã®ãã¬ãŒã ã¯ãŒã¯å
ã«
Node
ã¯ã©ã¹ãå®è£
ããã«ã¯ã Extension
ã Leaf
ãããã³Branch
ãŸãã
ããã«ãã¹
ãããã£ãŠã NibblePath
ã ããªãŒå
ãç©æ¥µçã«ç§»åãããããã¯ã©ã¹ã®æ©èœã®åºç€ã¯ããã¹ã®å
é ããããªãã»ããããèšå®ããèœåãšãç¹å®ã®ããã«ãåãåãèœåã§ããå¿
èŠããããŸãã ãããç¥ã£ãŠãã¯ã©ã¹ã®åºç€ãå®çŸ©ããŸãïŒãŸãã以äžã®ãã¬ãã£ãã¯ã¹ãæäœããããã®ããã€ãã®äŸ¿å©ãªå®æ°ïŒïŒ
class NibblePath: ODD_FLAG = 0x10 LEAF_FLAG = 0x20 def __init__(self, data, offset=0): self._data = data
ãšãŠãç°¡åã§ããã
ããã«ã®ã·ãŒã±ã³ã¹ããšã³ã³ãŒãããã³ãã³ãŒãããããã®é¢æ°ã®ã¿ãèšè¿°ããããšãæ®ã£ãŠããŸãã
class NibblePath:
ååãšããŠãããã¯ããã«ã䜿çšãã䟿å©ãªäœæ¥ã«å¿
èŠãªæå°éã®ãã®ã§ãã ãã¡ãããçŸåšã®å®è£
ã«ã¯ãŸã ããã€ãã®è£å©ã¡ãœããããããŸãïŒããšãã°ã combine
ã2ã€ã®ãã¹ã1ã€ã«ããŒãžãããªã©ïŒãããããã®å®è£
ã¯éåžžã«ç°¡åã§ãã èå³ãããå Žåã¯ã ããã§ãã«ããŒãžã§ã³ãèŠã€ããããšãã§ããŸã ã
ããŒã
æ¢ã«ç¥ã£ãŠããããã«ãããŒãã¯ãªãŒãããšã¯ã¹ãã³ã·ã§ã³ããã©ã³ãã®3ã€ã®ã¿ã€ãã«åããããŸãã ãããã¯ãã¹ãŠãšã³ã³ãŒãããã³ãã³ãŒãã§ããå¯äžã®éãã¯å
éšã«ä¿åãããããŒã¿ã§ãã æ£çŽã«èšããšãããã代æ°çãªããŒã¿åãæ±ãããããã®ã§ãããããšãã°Rust
ã§ã¯ãç§ã¯ç²Ÿç¥ã®äžã§äœããæžãã§ãããïŒ
pub enum Node<'a> { Leaf(NibblesSlice<'a>, &'a [u8]), Extension(NibblesSlice<'a>, NodeReference), Branch([Option<NodeReference>; 16], Option<&'a [u8]>), }
ãã ããPythonã«ã¯ADTããªãããã Node
ã¯ã©ã¹ãå®çŸ©ãããã®äžã«ããŒãã¿ã€ãã«å¯Ÿå¿ãã3ã€ã®ã¯ã©ã¹ããããŸãã ããŒãã¯ã©ã¹ã«ãšã³ã³ãŒããçŽæ¥å®è£
ããããŒãã¯ã©ã¹ã«ãã³ãŒããå®è£
ããŸãã
ãã ããå®è£
ã¯åºæ¬ã§ãã
èïŒ
class Leaf: def __init__(self, path, data): self.path = path self.data = data def encode(self):
æ¡åŒµåïŒ
class Extension: def __init__(self, path, next_ref): self.path = path self.next_ref = next_ref def encode(self):
æ¯åºïŒ
class Branch: def __init__(self, branches, data=None): self.branches = branches self.data = data def encode(self):
ãã¹ãŠãéåžžã«ç°¡åã§ãã 質åãåŒãèµ·ããå¯èœæ§ãããã®ã¯ã _prepare_reference_for_encoding
é¢æ°ã®ã¿ã§ãã
ããããç§ã¯ãå°ããªæŸèæã䜿ããªããã°ãªããªãã£ãããšãåçœããŸãã å®éã rlp
ãŠããrlp
ã©ã€ãã©ãªã¯ããŒã¿ãååž°çã«ãã³ãŒãããå¥ã®ããŒããžã®ãªã³ã¯ã¯rlp
ããŒã¿ã«ãªãå¯èœæ§ãrlp
ãŸãïŒãšã³ã³ãŒããããããŒãã®é·ãã32æåæªæºã®å ŽåïŒã 2ã€ã®åœ¢åŒïŒããã·ã¥ãã€ããšãã³ãŒããããããŒãïŒã§ãªã³ã¯ãæäœããã®ã¯éåžžã«äžäŸ¿ã§ãã ãããã£ãŠãããŒãããã³ãŒãããåŸããã€ã圢åŒã§ãªã³ã¯ãè¿ããä¿åããåã«å¿
èŠã«å¿ããŠãã³ãŒããã2ã€ã®é¢æ°ãäœæããŸããã ãããã®æ©èœã¯æ¬¡ã®ãšããã§ãã
def _prepare_reference_for_encoding(ref):
Node
ã¯ã©ã¹ãäœæããŠã Node
çµäºããŸãã ãã®äžã«2ã€ã®ã¡ãœããã®ã¿ããããŸãïŒããŒãããã³ãŒãããããŒãããªã³ã¯ã«å€ããŸãã
class Node:
äŒæ©
ãµãïŒ å€ãã®æ
å ±ããããŸãã ãªã©ãã¯ã¹ããæéã ãšæããŸãã ããã«ããªãã®ããã®å¥ã®ç«ããããŸãïŒ

ããã¿ãããïŒ ããŠãç§ãã¡ã®æšã«æ»ããŸãããã
ããŒã¯ã«ãããªã·ã¢
äžæ³-è£å©èŠçŽ ã¯æºåãã§ããŠããŸããç§ãã¡ã¯æãããããã«æž¡ããŸãã 念ã®ãããããªãŒã®ã€ã³ã¿ãŒãã§ã€ã¹ãæãåºãããŸãã åæã«ã __init__
ã¡ãœãããå®è£
ããŸãã
class MerklePatriciaTrie: def __init__(self, storage, root=None): self._storage = storage self._root = root def root(self): pass def get(self, encoded_key): pass def update(self, encoded_key, encoded_value): pass def delete(self, encoded_key): pass
ãã ããæ®ãã®ã¡ãœããã§ã¯ã1ã€ãã€åŠçããŸãã
åŸã
get
ã¡ãœããïŒååãšããŠãä»ã®ã¡ãœãããšããŠïŒã¯2ã€ã®éšåã§æ§æãããŸãã ã¡ãœããèªäœãããŒã¿ãæºåããçµæãæåŸ
ããã圢åŒã«ããŸãããå®éã®äœæ¥ã¯è£å©ã¡ãœããå
ã§è¡ãããŸãã
åºæ¬çãªæ¹æ³ã¯éåžžã«ç°¡åã§ãã
class MerklePatriciaTrie:
ãã ãã _get
ããã»ã©è€éã§_get
ãŸãããç®çã®ããŒãã«å°éããã«ã¯ãã«ãŒãããæå®ããããã¹å
šäœã«ç§»åããå¿
èŠããããŸãã æåŸã«ããŒã¿ïŒãªãŒããŸãã¯ãã©ã³ãïŒãæã€ããŒããèŠã€ãã£ãå ŽåãããŒã¿ã¯åä¿¡ãããŸãã æåããªãã£ãå Žåãå¿
èŠãªããŒãããªãŒã«ãããŸããã
å®è£
ïŒ
class MerklePatriciaTrie:
åæã«ãããŒããä¿åããã³ããŒãããããã®ã¡ãœãããäœæããŸãã ãããã¯åçŽã§ãïŒ
class MerklePatriciaTrie:
æŽæ°ãã
update
æ¹æ³ã¯ãã§ã«èå³æ·±ããã®ã§ãã æåŸã«å°éããŠãªãŒãããŒããæ¿å
¥ããã ãã§ã¯ãåžžã«ããŸããããšã¯éããŸããã ããŒåé¢ãã€ã³ãã¯ããã§ã«ä¿åãããŠãããªãŒããŸãã¯æ¡åŒµããŒãå
ã®ã©ããã«ããå¯èœæ§ããããŸãã ãã®å Žåãããããåé¢ããããã€ãã®æ°ããããŒããäœæããå¿
èŠããããŸãã
äžè¬ã«ããã¹ãŠã®ããžãã¯ã¯æ¬¡ã®ã«ãŒã«ã§èšè¿°ã§ããŸãã
- ãã¹ã¯æ¢åã®ããŒããšå®å
šã«äžèŽããŸãããååž°çã«ããªãŒãäžéããŸãã
- ãã¹ãçµäºãããã©ã³ãããŒããŸãã¯ãªãŒãããŒãã«ããå Žåã
update
åã«ãã®ããŒã«å¯Ÿå¿ããå€ãupdate
ããšãæå³ããŸãã - ãã¹ãåå²ãããŠããå ŽåïŒã€ãŸããå€ãæŽæ°ããã«æ°ãããã¹ãæ¿å
¥ããå ŽåïŒããã©ã³ãããŒãã«ããå Žåã¯ããªãŒãããŒããäœæãã察å¿ãããã©ã³ããã©ã³ããã©ã³ãã«ãªã³ã¯ãæäŸããŸãã
- ãã¹ãåå²ãããŠããããªãŒãããŒããŸãã¯æ¡åŒµããŒãã«ããå Žåããã¹ãåé¢ãããã©ã³ãããŒããäœæããå¿
èŠããããå¿
èŠã«å¿ããŠããã¹ã®å
±ééšåã®æ¡åŒµããŒããäœæããå¿
èŠããããŸãã
ãããåŸã
ã«ã³ãŒãã§è¡šçŸããŸãããã ãªãã ãã ãïŒ ã¡ãœããã倧ãããäžæ¬ããŠç解ããã®ãé£ããããã§ãã
ãã ãã ããã§å®å
šãªã¡ãœãããžã®ãªã³ã¯ãæ®ããŸã ã
class MerklePatriciaTrie:
äžè¬çãªããžãã¯ã¯ååã§ã¯ãããŸãããæãèå³æ·±ãã®ã¯if
ã®å
éšif
ã
if type(node) == Node.Leaf
æåã«ããªãŒãããŒããæ±ããŸãããã ãããã§å¯èœãªã·ããªãªã¯2ã€ã ãã§ãã
ç§ãã¡ããã©ã£ãŠããæ®ãã®ãã¹ã¯ããªãŒãããŒãã«ä¿åãããŠãããã¹ãšãŸã£ããåãã§ãã ãã®å Žåãå€ãå€æŽããæ°ããããŒããä¿åããŠãªã³ã¯ãè¿ãã ãã§ãã
ãã¹ãç°ãªããŸãã
ãã®å Žåã2ã€ã®ãã¹ãåé¢ãããã©ã³ãããŒããäœæããå¿
èŠããããŸãã
ãã¹ã®1ã€ã空ã®å Žåããã®å€ã¯ãã©ã³ãããŒãã«çŽæ¥è»¢éãããŸãã
ãã以å€ã®å Žåããã¹ã®å
±ééšåã®é·ã+ 1ããã«ïŒãã®ããã«ã¯ãBranchããŒãã®å¯Ÿå¿ãããã©ã³ãã®ã€ã³ããã¯ã¹ã§ç€ºãããŸãïŒã§ççž®ããã2ã€ã®ãªãŒãããŒããäœæããå¿
èŠããããŸãã
ãŸããæ¡åŒµããŒããäœæããå¿
èŠããããã©ãããç解ããããã«ããã¹ã®å
±ééšåããããã©ããã確èªããå¿
èŠããããŸãã
ã³ãŒãã§ã¯ã次ã®ããã«ãªããŸãã
if type(node) == Node.Leaf: if node.path == path:
_create_branch_node
ããã·ãŒãžã£ã¯æ¬¡ã®ãšããã§ãã
def _create_branch_node(self, path_a, value_a, path_b, value_b):
if type(node) == Node.Extension
æ¡åŒµããŒãã®å Žåããã¹ãŠããªãŒãããŒãã®ããã«èŠããŸãã
ExtensionããŒãããã®ãã¹ããã¹ã®ãã¬ãã£ãã¯ã¹ã§ããå ŽåãåçŽã«ååž°çã«é²ã¿ãŸãã
ãã以å€ã®å Žåã¯ãäžèšã®å Žåã®ããã«ãåå²ããŒãã䜿çšããŠåé¢ãè¡ãå¿
èŠããããŸãã
ãããã£ãŠãã³ãŒãïŒ
elif type(node) == Node.Extension: if path.starts_with(node.path):
_create_branch_extension
ããã·ãŒãžã£_create_branch_extension
ã _create_branch_extension
ããã·ãŒãžã£_create_branch_extension
è«ççã«åç_create_branch_extension
ãExtensionããŒãã§æ©èœããŸãã
if type(node) == Node.Branch
ãããããã©ã³ãããŒãã§ã¯ããã¹ãŠãç°¡åã§ãã ãã¹ã空ã®å Žåãæ°ããå€ãçŸåšã®ãã©ã³ãããŒãã«ä¿åããã ãã§ãã ãã¹ã空ã§ãªãå Žå-ãã¹ãã1ããã«ããåãã§ãååž°çã«äœããªããŸãã
ã³ãŒãã«ã¯ã³ã¡ã³ãã¯å¿
èŠãªããšæããŸãã
elif type(node) == Node.Branch: if len(path) == 0: return self._store_node(Node.Branch(node.branches, value)) idx = path.at(0) new_reference = self._update(node.branches[idx], path.consume(1), value) node.branches[idx] = new_reference return self._store_node(node)
åé€ãã
ãµãïŒ æåŸã®ã¡ãœããã¯æ®ããŸãã 圌ã¯æãéœæ°ã§ãã åé€ã®è€éãã¯ãåé€ãããããŒã ããé€ããŠã update
ãã§ãŒã³å
šäœãå®è¡ããå Žåã«èœã¡ãŠããç¶æ
ã«æ§é ãæ»ãå¿
èŠãããããšã§ãã
ããããªããšãåãããŒã¿ãå«ã2ã€ã®ããªãŒã§ã«ãŒãããã·ã¥ãç°ãªãç¶æ³ãçºçããå¯èœæ§ããããããããã¯éåžžã«éèŠã§ãã "", , .
. , N- , N+1 . enum â DeleteAction
, .
delete
:
class MerklePatriciaTrie:
, get
update
. . .
if type(node) == Node.Leaf
. . â , , .
:
if type(node) == Node.Leaf: if path == node.path: return MerklePatriciaTrie._DeleteAction.DELETED, None else: raise KeyError
, "" â . , . .
if type(node) == Node.Extension
C Extension- :
- , Extension- . â .
_delete
, "" .- . å¯èœãªãªãã·ã§ã³ïŒ
- . .
- . .
- Branch-. . , Branch- . , , Leaf-. â Extension-.
ã³ãŒãã§ã¯ã次ã®ããã«ãªããŸãã
elif type(node) == Node.Extension: if not path.starts_with(node.path): raise KeyError
if type(node) == Node.Branch
.
ãŸããã»ãšãã©ã Branch-, âŠ
ãªãã§ïŒ Branch- Leaf- ( ) Extension- ( ).
, . , â Leaf-. â Extension-. , , 2 â Branch- .
? :
:
- , .
- ,
_delete
.
:
elif type(node) == Node.Branch: action = None idx = None info = None if len(path) == 0 and len(node.data) == 0: raise KeyError elif len(path) == 0 and len(node.data) != 0: node.data = b'' action = MerklePatriciaTrie._DeleteAction.DELETED else:
_DeleteAction
.
- Branch- , ( , ). .
if action == MerklePatriciaTrie._DeleteAction.UPDATED:
- ( , ), , .
. å¯èœãªãªãã·ã§ã³ïŒ
- . , , , . , .
- , . Leaf- . .
- , . , , .
- , , Branch- . ,
_DeleteAction
â UPDATED
.
if action == MerklePatriciaTrie._DeleteAction.DELETED: non_empty_count = sum(map(lambda x: 1 if len(x) > 0 else 0, node.branches)) if non_empty_count == 0 and len(node.data) == 0:
_build_new_node_from_last_branch
.
â Leaf Extension, , .
â Branch, Extension , , Branch.
def _build_new_node_from_last_branch(self, branches):
. , ⊠root
.
ããã«ïŒ
class MerklePatriciaTrie:
, .
⊠. , , Ethereum . , , , . , :)
, , pip install -U eth_mpt
â .

çµæ
?
, -, , - , , . â , .
-, , , â . , skip list interval tree, â , , .
-, , . , - .
-, â .
, , â !
: 1 , 2 , 3 . ! , .