рд╡рд┐рджреЗрд╢реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ: рд╕рдВрд╢реЛрдзрд┐рдд рдорд░реНрдХрд▓ рдкреЗрдЯреНрд░реАрд╕рд┐рдпрд╛ рдЯреНрд░рд╛рдЗ

"рдореБрдЭреЗ рдЗрди рд╕рднреА рд▓рдШреБрд░реВрдк рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдФрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рд╢реИрддрд╛рди рдХреЛ рджрд┐рд▓ рд╕реЗ рдпрд╛рдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?"


рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрдХрдиреАрдХреА рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреЗ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЗрдЦреЛрдВ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИред рдореБрдЦреНрдп рдереАрд╕рд┐рд╕, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджрд╕ рдмрд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛ред рдЦреИрд░, рдХреБрдЫ рд╣рдж рддрдХ рдпрд╣ рд╕рдЪ рд╣реИред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рд╕рдм рдХреБрдЫ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдореИрдВ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ (рдпрд╛ рд╕реМрднрд╛рдЧреНрдп рд╕реЗ?) рдлрд┐рд░ рднреА рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдерд╛ред


рдорд┐рд╕реНрдЯреАрд░рд┐рдпрд╕ рдореЙрдбрд┐рдлрд╛рдЗрдб рдорд░реНрдХрд▓ рдкреЗрдЯреНрд░реАрд╕рд┐рдпрд╛ рдЯреНрд░рд╛рдИред


рдЪреВрдБрдХрд┐ рдЗрд╕ рдкреЗрдбрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдмреНрд░ рдФрд░ рдореАрдбрд┐рдпрдо рдореЗрдВ рд╣реИ - рдереЛрдбрд╝рд╛ рдФрд░, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдЬрд╛рдирд╡рд░ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


KDPV


рдпрд╣ рдХреНрдпрд╛ рд╣реИ


рдбрд┐рд╕реНрдХреНрд▓реЗрдорд░: рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдирд╛ рдХрд╛ рдореБрдЦреНрдп рд╕реНрд░реЛрдд рдпреЗрд▓реЛ рдкреЗрдкрд░ рдерд╛, рд╕рд╛рде рд╣реА рд╕реНрд░реЛрдд рдХреЛрдб рд╕рдорддрд╛-рдЗрдереЗрд░рд┐рдпрдо рдФрд░ рдЧреЛ-рдПрдереЗрд░рд┐рдпрдо рдерд╛ ред рдХреБрдЫ рдирд┐рд░реНрдгрдпреЛрдВ рдХреЗ рдФрдЪрд┐рддреНрдп рдкрд░ рдиреНрдпреВрдирддрдо рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдереА, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрд░реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╣реИрдВред рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рдХреБрдЫ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИ - рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред


рдПрдХ рдкреЗрдбрд╝ рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рдПрдХ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдЪрдХреНрд░реАрдп рдЧреНрд░рд╛рдл рд╣реИред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рд╣рд░ рдХреЛрдИ рдЗрд╕рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИред


рдЙрдкрд╕рд░реНрдЧ рд╡реГрдХреНрд╖ рд░реВрдЯ рдЯреНрд░реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреА-рд╡реИрд▓реНрдпреВ рдкреЗрдпрд░ рдХреЛ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдиреЛрдбреНрд╕ рдХреЛ рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рд╡реЗ рдЬрд┐рдирдореЗрдВ рдкрде (рдЙрдкрд╕рд░реНрдЧ) рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдкрддреНрддреА рдиреЛрдбреНрд╕ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИред рдПрдХ рдореВрд▓реНрдп рдПрдХ рдкреЗрдбрд╝ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ рдпрджрд┐ рдФрд░ рдХреЗрд╡рд▓ рдпрджрд┐, рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдкреЗрдбрд╝ рдХреА рдЬрдбрд╝ рд╕реЗ рд╕рднреА рддрд░рд╣ рд╕реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдПрдХ рдиреЛрдб рдвреВрдВрдв рд╕рдХрддреЗ рд╣реИрдВред


PATRICIA рдкреЗрдбрд╝ рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╡реГрдХреНрд╖ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрдкрд╕рд░реНрдЧ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╣реЛрддреЗ рд╣реИрдВ - рдЕрд░реНрдерд╛рдд, рдкреНрд░рддреНрдпреЗрдХ рдХреБрдВрдЬреА рдиреЛрдб рдПрдХ рдмрд┐рдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред


рдорд░реНрдХрд▓ рдЯреНрд░реА рдПрдХ рд╣реИрд╢ рдЯреНрд░реА рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдбреЗрдЯрд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдКрдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрди рд╕рднреА рд╣реИрд╢ рдХреЛ рдПрдХ (рдореВрд▓) рдореЗрдВ рдорд┐рд▓рд╛рдХрд░, рд╕рднреА рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рд░реВрдЯ рд╣реИрд╢ рдмреНрд▓реЙрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ "рдбрд┐рдЬрд┐рдЯрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░" рд╣реИред рдмреНрд▓реЙрдХрдЪреЗрди рдореЗрдВ рдЗрд╕ рдЪреАрдЬ рдХрд╛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ ред


рдХрдбрд╝реА рдореЗрд╣рдирдд рд╣реИ ...


рдХреБрд▓: рд╕рдВрд╢реЛрдзрд┐рдд рдорд░реНрдХрд▓ рдкреЗрдЯреНрд░реАрд╕рд┐рдпрд╛ рдЯреНрд░рд╛рдЗ (рдмрд╛рдж рдореЗрдВ рдПрдордкреАрдЯреА рд╢реЙрд░реНрдЯ рдХреЗ рд▓рд┐рдП) рдПрдХ рд╣реИрд╢ рдЯреНрд░реА рд╣реИ рдЬреЛ рдХреА-рд╡реИрд▓реНрдпреВ рдкреЗрдпрд░ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдмрд╛рдЗрдирд░реА рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рд╕рдВрд╢реЛрдзрд┐рдд" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ, рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдкрд░ рдереЛрдбрд╝рд╛ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗред


рдпрд╣ рдХреНрдпреЛрдВ рд╣реИ?


рдПрдордкреАрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдереЗрд░рд┐рдпрдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЦрд╛рддреЛрдВ, рд▓реЗрдирджреЗрди, рдЙрдирдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдХрд╛рдордХрд╛рдЬ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЕрдиреНрдп рдбреЗрдЯрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдмрд┐рдЯрдХреЙрдЗрди рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд┐рд╕рдореЗрдВ рд░рд╛рдЬреНрдп рдирд┐рд╣рд┐рдд рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдЦрд╛рддреЗ рдХрд╛ рд╕рдВрддреБрд▓рди (рд╕рд╛рде рд╣реА рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдбреЗрдЯрд╛) рд╕реАрдзреЗ рд╣рд╡рд╛ рдкрд░ рдмреНрд▓реЙрдХрдЪреЗрди рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбреЗрдЯрд╛ рдХреЗ рд╕реНрдерд╛рди рдФрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЛ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдХреБрдЫ рд▓реЛрдЧ рдХреНрд░рд┐рдкреНрдЯреЛрдХреНрдпреВрд░реЗрдВрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЦрд╛рддреЗ рдХрд╛ рд╕рдВрддреБрд▓рди рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред


рдЗрдереЗрд░рд┐рдпрдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдордирд╛ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реИ рдЬреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреА рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рддреЛ рдПрдордкреАрдЯреА рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред


рд╡рд╣ рдХреИрд╕реЗ рд╣реИ?


рдПрдордкреАрдЯреА рдПрдХ рдЙрдкрд╕рд░реНрдЧ PATRICIA рдкреЗрдбрд╝ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдЕрдиреБрдХреНрд░рдо рд╣реИрдВред


рдЗрд╕ рдкреЗрдбрд╝ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдХреБрддрд░рдиреЗ рдХреЗ рдХреНрд░рдо (рдЖрдзреЗ рдмрд╛рдЗрдЯреНрд╕) рд╣реИрдВред рддрджрдиреБрд╕рд╛рд░, рдПрдХ рдиреЛрдб рдореЗрдВ рд╕реЛрд▓рд╣ рд╡рдВрд╢рдЬ (0x0 рд╕реЗ 0xF рддрдХ рдХреА рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк) рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред


рдиреЛрдбреНрд╕ рдХреЛ 3 рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


  • рд╢рд╛рдЦрд╛ рдиреЛрдбред рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреБрдХреНрдд рдиреЛрдбред рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдбреНрд╕ рдореЗрдВ 1 рд╕реЗ 16 рд▓рд┐рдВрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдПрдХ рдорд╛рди рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  • рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдиреЛрдбред рдПрдХ рд╕рд╣рд╛рдпрдХ рдиреЛрдб рдЬреЛ рдкрде рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдХрдИ рдмрдЪреНрдЪреЗ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдЖрдо рддреМрд░ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╢рд╛рдЦрд╛ рдиреЛрдб рдХрд╛ рд▓рд┐рдВрдХ рднреА рд╣реИ, рдЬреЛ рдиреАрдЪреЗ рд╕реНрдерд┐рдд рд╣реИред
  • рдкрддреНрддреА рдХрд╛ рдиреЛрдбред рдкрде рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдпреБрдХреНрдд рдиреЛрдбред рдпрд╣ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЕрдВрдд рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдордкреАрдЯреА рдПрдХ рдЕрдиреНрдп рдХреЗрд╡реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдиреЛрдбреНрд╕ рдХреЛ "рд▓рд┐рдВрдХ" => " RLP рдПрдирдХреЛрдбреЗрдб рдиреЛрдб" рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред


рдФрд░ рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рд▓реЗрдХрд░ рдЖрдП рд╣реИрдВ: рдЖрд░рдПрд▓рдкреАред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рд╕реВрдЪрд┐рдпреЛрдВ рдпрд╛ рдмрд╛рдЗрдЯ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдПрдХ рд╡рд┐рдзрд┐ рд╣реИред рдЙрджрд╛рд╣рд░рдг: [ "cat", "dog" ] = [ 0xc8, 0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g' ] ред рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛, рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдореИрдВ рдПрдХ рддреИрдпрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╡рд┐рд╖рдп рдХрд╛ рдХрд╡рд░реЗрдЬ рднреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд▓реНрдХрд┐ рдмрдбрд╝реЗ рд▓реЗрдЦ рдХреЛ рдмрдврд╝рд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣рд╛рдВ рдФрд░ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЦреБрдж рдХреЛ рдЗрд╕ рддрдереНрдп рддрдХ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо RLP рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдПрдирдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдбрд┐рдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдиреЛрдб рдХрд╛ рд▓рд┐рдВрдХ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдпрджрд┐ RLP рдПрдиреНрдХреЛрдбреЗрдб рдиреЛрдб рдХреА рд▓рдВрдмрд╛рдИ 32 рдпрд╛ рдЕрдзрд┐рдХ рдмрд╛рдЗрдЯреНрд╕ рд╣реИ, рддреЛ рд▓рд┐рдВрдХ рдиреЛрдб рдХреЗ keccak рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реЗ рдПрдХ keccak рд╣реИрд╢ рд╣реИред рдпрджрд┐ рд▓рдВрдмрд╛рдИ 32 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдХрдо рд╣реИ, рддреЛ рд▓рд┐рдВрдХ рдиреЛрдб рдХрд╛ RLP рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИред


рдЬрд╛рд╣рд┐рд░ рд╣реИ, рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдиреЛрдб рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореВрд▓ рдиреЛрдб рдХреЗ рдЕрдВрджрд░ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред


рдиреЛрдбреНрд╕ рдЕрд▓рдЧ рд╣реИрдВ


рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдиреЛрдбреНрд╕ рдХрд╛ рд╕рдВрдпреЛрдЬрди рдЖрдкрдХреЛ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрдм рдХреБрдЫ рдЪрд╛рдмрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ (рддрдм рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрде рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рдкрддреНрддреА рдиреЛрдбреНрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рдХреБрдЫ рд╢рд╛рдЦрд╛ рдиреЛрдбреНрд╕ рд╣реЛрдВрдЧреЗ), рдФрд░ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рдХрдИ рдиреЛрдбреНрд╕ (рдкрде рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ) рд▓реЗрдХрд┐рди рд╡реЗ рд╢рд╛рдЦрд╛ рдиреЛрдбреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди "рдЗрдХрдЯреНрдард╛" рдХрд░реЗрдВрдЧреЗред


рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдиреЛрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдкреЗрдбрд╝ рдХрд╛ рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг:


рдкреЗрдбрд╝ рднрд░рд╛ рд╣реБрдЖ рд╣реИ рд▓реЗрдХрд┐рди рдореЛрдЯрд╛ рдирд╣реАрдВ рд╣реИ


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛, рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рднрд╛рдЧреЛрдВ рдореЗрдВ рдЙрдкрд╕рд░реНрдЧ рд╣реЛрддреЗ рд╣реИрдВред рдХрдИ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд╕рд░реНрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ:


  1. рдкрддреНрддреА рдиреЛрдбреНрд╕ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдиреЛрдбреНрд╕ рдХреЛ рднреЗрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
  2. рд╡рд┐рд╖рдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдирд┐рдмрд▓реНрд╕ рдХреЗ рдЕрдиреБрдХреНрд░рдо рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдирд╛ред

рдЙрдкрд╕рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреЗ рдирд┐рдпрдо рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИрдВ:


  • рдЙрдкрд╕рд░реНрдЧ 1 рдХреБрддрд░рдирд╛ рд▓реЗрддрд╛ рд╣реИред рдпрджрд┐ рдкрде рдХреА рд▓рдВрдмрд╛рдИ (рдЙрдкрд╕рд░реНрдЧ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рд╡рд┐рд╖рдо рд╣реИ, рддреЛ рдкрде рдЙрдкрд╕рд░реНрдЧ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдкрде рдХреА рд▓рдВрдмрд╛рдИ рд╕рдорд╛рди рд╣реИ, рддреЛ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рдмрд╛рдж рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдмрд▓ 0x0 рдкрд╣рд▓реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдЙрдкрд╕рд░реНрдЧ рд╢реБрд░реВ рдореЗрдВ 0x0 рд╣реИред
  • рдпрджрд┐ рдкрде рдХреА рд▓рдВрдмрд╛рдИ рд╡рд┐рд╖рдо рд╣реИ, рддреЛ 0x1 рдХреЛ рдЙрдкрд╕рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ - 0x0 рднреАред
  • рдпрджрд┐ рдкрде рд▓реАрдл рдиреЛрдб рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ 0x2 рдХреЛ рдЙрдкрд╕рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ 0x0 рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдиреЛрдб рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдмреАрдЯрд┐рдХреНрд╕ рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛:


 0b0000 =>  , Extension  0b0001 =>  , Extension  0b0010 =>  , Leaf  0b0011 =>  , Leaf  

рд╡рд┐рд▓реЛрдкрди рдЬреЛ рд╡рд┐рд▓реЛрдкрди рдирд╣реАрдВ рд╣реИ


рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдкреЗрдбрд╝ рдореЗрдВ рдиреЛрдбреНрд╕ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╣реЛрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬреЛ рдХреБрдЫ рдПрдХ рдмрд╛рд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рд╡рд╣ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдкреЗрдбрд╝ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред


рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдкреЗрдбрд╝ рдирд╣реАрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдкреЗрдбрд╝ рдХреЗ рдкреБрд░рд╛рдиреЗ рдФрд░ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред


рддрджрдиреБрд╕рд╛рд░, рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реВрдЯ рд╣реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЙрди рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреЗрдбрд╝ рдХрднреА рдЕрдВрджрд░ рд░рд╣реЗ рд╣реИрдВред


рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд▓рдо рд╕реЗ ...


рдпреЗ рд╕рднреА рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рд╣реИрдВред рдЕрдзрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ - рдФрд░ рдЗрд╕рд▓рд┐рдП рд▓реЗрдЦ рдмрдбрд╝рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдЕрдкрдиреЗ рд▓рд┐рдП рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ ред


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рд╕рд┐рджреНрдзрд╛рдВрдд рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЪрд▓реЛ рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВред рд╣рдо рдЖрдИрдЯреА рджреБрдирд┐рдпрд╛ рд╕реЗ рд▓рд┐рдВрдЧреБрдЖ рдлреНрд░реЗрдВрдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╡рд╣ python ред


рдЪреВрдВрдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд╣реЛрдВрдЧреЗ, рдФрд░ рд▓реЗрдЦ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП, рдмрд╣реБрдд рдХреБрдЫ рдХрдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдореИрдВ рддреБрд░рдВрдд рдЬреАрдердм рдХрд╛ рд▓рд┐рдВрдХ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк рдкреВрд░реА рддрд╕реНрд╡реАрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЯреНрд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:


 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__ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рдПрдХ dict рддрд░рд╣ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдиреЛрдбреНрд╕, рд╕рд╛рде рд╣реА root - рдкреЗрдбрд╝ рдХреЗ "рд╢реАрд░реНрд╖" рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ None рдХреЛ root рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд None рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ root , рддреЛ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкреЗрдбрд╝ рдЦрд╛рд▓реА рд╣реИ рдФрд░ рдЦрд░реЛрдВрдЪ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


_REDIA: рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдХрд┐ рддрд░реАрдХреЛрдВ рдореЗрдВ рдЪрд░ рдХреЛ encoded_key рдФрд░ encoded_value рд░реВрдк рдореЗрдВ рдХреНрдпреЛрдВ рдирд╛рдорд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ key / value ред рдЙрддреНрддрд░ рд╕рд░рд▓ рд╣реИ: рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рднреА рдХреБрдВрдЬрд┐рдпреЛрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ RLP рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЦреБрдж рдХреЛ рдЗрд╕рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдХрдВрдзреЛрдВ рдкрд░ рдЗрд╕ рдХрдмреНрдЬреЗ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ ред_


рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЦреБрдж рдкреЗрдбрд╝ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВ, рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬреЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:


  1. NibblePath рдХреНрд▓рд╛рд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдЬреЛ рдирд┐рдмрд▓реНрд╕ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ, рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдирдХреЛрдб рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
  2. рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ Node рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - Extension , Leaf рдФрд░ Branch ред

NibblePath


рддреЛ, NibblePath ред рдЪреВрдВрдХрд┐ рд╣рдо рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдкреЗрдбрд╝ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдореЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЖрдзрд╛рд░ рдкрде рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ "рдСрдлрд╕реЗрдЯ" рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреБрддрд░рдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЬрд╛рдирдХрд░, рд╣рдо рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЗ рдЖрдзрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рд╕рд╛рде рд╣реА рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╕реНрдерд┐рд░рд╛рдВрдХ):


 class NibblePath: ODD_FLAG = 0x10 LEAF_FLAG = 0x20 def __init__(self, data, offset=0): self._data = data # ,   . self._offset = offset #      def consume(self, amount): # "" N      . self._offset += amount return self def at(self, idx): #      idx = idx + self._offset #    ,   ,    , #   ,    -      . byte_idx = idx // 2 nibble_idx = idx % 2 #   . byte = self._data[byte_idx] #      . nibble = byte >> 4 if nibble_idx == 0 else byte & 0x0F return nibble 

рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ, рд╣реИ рдирд╛?


рдпрд╣ рдирд┐рдмрд▓реНрд╕ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред


 class NibblePath: # ... def decode_with_type(data): #   : # ,     ,    . is_odd_len = data[0] & NibblePath.ODD_FLAG == NibblePath.ODD_FLAG is_leaf = data[0] & NibblePath.LEAF_FLAG == NibblePath.LEAF_FLAG #    ,     #    . offset  , #       "" . offset = 1 if is_odd_len else 2 return NibblePath(data, offset), is_leaf def encode(self, is_leaf): output = [] #    ,       . nibbles_len = len(self._data) * 2 - self._offset is_odd = nibbles_len % 2 == 1 #  . prefix = 0x00 #    ,    . #      (self.at(0))     . #           (0x0). prefix += self.ODD_FLAG + self.at(0) if is_odd else 0x00 #  ,  Leaf node,  . prefix += self.LEAF_FLAG if is_leaf else 0x00 output.append(prefix) # ,      ,  . pos = nibbles_len % 2 #          , #     2 ,    , #     , #    . while pos < nibbles_len: byte = self.at(pos) * 16 + self.at(pos + 1) output.append(byte) pos += 2 return bytes(output) 

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдирд┐рдмрд▓реНрд╕ рдХреЗ рд╕рд╛рде рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдмреЗрд╢рдХ, рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЕрднреА рднреА рдХрдИ рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ (рдЬреИрд╕реЗ combine , рджреЛ рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рд╡рд┐рд▓рдп рдХрд░рдирд╛), рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рддреБрдЪреНрдЫ рд╣реИред рдпрджрд┐ рд░реБрдЪрд┐ рд╣реИ, рддреЛ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред


рдиреЛрдб


рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдиреЛрдбреНрд╕ рдХреЛ рддреАрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд▓реАрдл, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдФрд░ рдмреНрд░рд╛рдВрдЪред рдЙрди рд╕рднреА рдХреЛ рдПрдиреНрдХреЛрдб рдФрд░ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдВрддрд░ рдХреЗрд╡рд▓ рд╡рд╣ рдбреЗрдЯрд╛ рд╣реИ рдЬреЛ рдЕрдВрджрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдмреАрдЬреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ Rust , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрддреНрдорд╛ рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦреВрдВрдЧрд╛:


 pub enum Node<'a> { Leaf(NibblesSlice<'a>, &'a [u8]), Extension(NibblesSlice<'a>, NodeReference), Branch([Option<NodeReference>; 16], Option<&'a [u8]>), } 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЬрдЧрд░ рдореЗрдВ рдХреЛрдИ рдПрдбреАрдЯреА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо Node рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдиреЛрдб рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рддреАрди рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВред рд╣рдо рдиреЛрдб рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕реАрдзреЗ рдХреЛрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ Node рд╡рд░реНрдЧ рдореЗрдВ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВред


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рд╛рдердорд┐рдХ рд╣реИ:


рдкрддреНрддрд╛:


 class Leaf: def __init__(self, path, data): self.path = path self.data = data def encode(self): #    --    , #   -  ,   -  . return rlp.encode([self.path.encode(True), self.data]) 

рдПрдХреНрд╕рдЯреЗрдВрд╢рди:


 class Extension: def __init__(self, path, next_ref): self.path = path self.next_ref = next_ref def encode(self): #    --    , #   -  ,   -    . next_ref = _prepare_reference_for_encoding(self.next_ref) return rlp.encode([self.path.encode(False), next_ref]) 

рд╢рд╛рдЦрд╛:


 class Branch: def __init__(self, branches, data=None): self.branches = branches self.data = data def encode(self): #    --    ,  #  16 -     (  ), #   -   (  ). branches = list(map(_prepare_reference_for_encoding, self.branches)) return rlp.encode(branches + [self.data]) 

рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдкреНрд░рд╢реНрди рдкреИрджрд╛ рдХрд░ рд╕рдХрддреА рд╣реИ рд╡рд╣ рд╣реИ _prepare_reference_for_encoding рдлрд╝рдВрдХреНрд╢рдиред


рдлрд┐рд░ рдореИрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдПрдХ рдЫреЛрдЯреА рдмреИрд╕рд╛рдЦреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ rlp рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА rlp рдбрд┐рдХреЛрдб рдХрд░рддреА рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдиреЛрдб рдХрд╛ рд▓рд┐рдВрдХ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, rlp рдбреЗрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдпрджрд┐ рдПрдиреНрдХреЛрдбреЗрдб рдиреЛрдб 32 рд╡рд░реНрдгреЛрдВ рд╕реЗ рдХрдо рд▓рдВрдмрд╛ рд╣реИ)ред рджреЛ рд╕реНрд╡рд░реВрдкреЛрдВ рдореЗрдВ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ - рд╣реИрд╢ рдмрд╛рдЗрдЯреНрд╕ рдФрд░ рдПрдХ рдбрд┐рдХреЛрдбреЗрдб рдиреЛрдб - рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рджреЛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗ, рдЬреЛ рдиреЛрдб рдХреЛ рдбреАрдХреЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдмрд╛рдЗрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдмрдЪрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдбреАрдХреЛрдб рдХрд░реЗрдВред рдпреЗ рдХрд╛рд░реНрдп рд╣реИрдВ:


 def _prepare_reference_for_encoding(ref): #    ( ,   ) --  . #       :) if 0 < len(ref) < 32: return rlp.decode(ref) return ref def _prepare_reference_for_usage(ref): #     -   . #          . if isinstance(ref, list): return rlp.encode(ref) return ref 

рдиреЛрдбреНрд╕ рдХреНрд▓рд╛рд╕ рд▓рд┐рдЦрдХрд░ рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВред рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ 2 рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреА: рдиреЛрдб рдХреЛ рдбреАрдХреЛрдб рдХрд░реЗрдВ рдФрд░ рдиреЛрдб рдХреЛ рдПрдХ рд▓рд┐рдВрдХ рдореЗрдВ рдмрджрд▓ рджреЗрдВред


 class Node: # class Leaf(...) # class Extension(...) # class Branch(...) def decode(encoded_data): data = rlp.decode(encoded_data) # 17  -  Branch . if len(data) == 17: branches = list(map(_prepare_reference_for_usage, data[:16])) node_data = data[16] return Node.Branch(branches, node_data) #    17,   2.   - . #      ,     . path, is_leaf = NibblePath.decode_with_type(data[0]) if is_leaf: return Node.Leaf(path, data[1]) else: ref = _prepare_reference_for_usage(data[1]) return Node.Extension(path, ref) def into_reference(node): #    . #      32 , #   -   . #       . encoded_node = node.encode() if len(encoded_node) < 32: return encoded_node else: return keccak_hash(encoded_node) 

рдПрдХ рд╡рд┐рд░рд╛рдо


рдУрд╣! рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд░рд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдпрд╣рд╛рдБ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдмрд┐рд▓реНрд▓реА рд╣реИ:


рдЖрдкрдХреЛ рдмреНрд░реЗрдХ рдХреЗ рджреМрд░рд╛рди рдПрдХ рдХрд╛рдЯрдиреЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ


рдорд┐рд▓рд╛рддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдареАрдХ рд╣реИ, рд╣рдорд╛рд░реЗ рдкреЗрдбрд╝реЛрдВ рдкрд░ рд╡рд╛рдкрд╕ред


MerklePatriciaTrie


рд╣реБрд░реНрд░реЗ - рд╕рд╣рд╛рдпрдХ рддрддреНрд╡ рддреИрдпрд╛рд░ рд╣реИрдВ, рд╣рдо рд╕рдмрд╕реЗ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рд╣рдорд╛рд░реЗ рдкреЗрдбрд╝ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдБред рдЙрд╕реА рд╕рдордп, рд╣рдо __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 

рд▓реЗрдХрд┐рди рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдо рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред


рдкреНрд░рд╛рдкреНрдд


get рд╡рд┐рдзрд┐ (рдЬреИрд╕реЗ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЕрдиреНрдп рд╡рд┐рдзрд┐рдпрд╛рдВ) рджреЛ рднрд╛рдЧреЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рдмрдиреЗрдЧреАред рд╡рд┐рдзрд┐ рд╕реНрд╡рдпрдВ рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдЧреА рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рдореЗрдВ рд▓рд╛рдПрдЧреА, рдЬрдмрдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рд╣реЛрдЧрд╛ред


рдореВрд▓ рд╡рд┐рдзрд┐ рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд╣реИ:


 class MerklePatriciaTrie: # ... def get(self, encoded_key): if not self._root: raise KeyError path = NibblePath(encoded_key) #       #  ,    ,    . result_node = self._get(self._root, path) if type(result_node) is Node.Extension or len(result_node.data) == 0: raise KeyError return result_node.data 

рд╣рд╛рд▓рд╛рдВрдХрд┐, _get рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ: рд╡рд╛рдВрдЫрд┐рдд рдиреЛрдб рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд░реВрдЯ рд╕реЗ рдкреВрд░реЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдкрде рдкрд░ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЕрдВрдд рдореЗрдВ рд╣рдореЗрдВ рдбреЗрдЯрд╛ (рд▓реАрдл рдпрд╛ рдмреНрд░рд╛рдВрдЪ) рдХреЗ рд╕рд╛рде рдПрдХ рдиреЛрдб рдорд┐рд▓рд╛ - рд╣реБрд░реНрд░реЗ, рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛, рддреЛ рдкреЗрдбрд╝ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХреБрдВрдЬреА рдЧрд╛рдпрдм рд╣реИред


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:


 class MerklePatriciaTrie: # ... def _get(self, node_ref, path): #      . node = self._get_node(node_ref) #    --   . #   ,      . if len(path) == 0: return node if type(node) is Node.Leaf: #     Leaf-,     , #      . if node.path == path: return node elif type(node) is Node.Extension: #    -- Extension,    . if path.starts_with(node.path): rest_path = path.consume(len(node.path)) return self._get(node.next_ref, rest_path) elif type(node) is Node.Branch: #    -- Branch,     . #   ,           #  :      . branch = node.branches[path.at(0)] if len(branch) > 0: return self._get(branch, path.consume(1)) #    ,        , #     . raise KeyError 

рдареАрдХ рд╣реИ, рдЙрд╕реА рд╕рдордп, рд╣рдо рдиреЛрдбреНрд╕ рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд▓рд┐рдЦреЗрдВрдЧреЗред рд╡реЗ рд╕рд░рд▓ рд╣реИрдВ:


 class MerklePatriciaTrie: # ... def _get_node(self, node_ref): raw_node = None if len(node_ref) == 32: raw_node = self._storage[node_ref] else: raw_node = node_ref return Node.decode(raw_node) def _store_node(self, node): reference = Node.into_reference(node) if len(reference) == 32: self._storage[reference] = node.encode() return reference 

рдЕрджреНрдпрддрди


update рд╡рд┐рдзрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдмрд╕ рдЕрдВрдд рддрдХ рдЬрд╛рдПрдВ рдФрд░ рд▓реАрдл рдиреЛрдб рдбрд╛рд▓реЗрдВ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдХреБрдВрдЬреА рдкреГрдердХреНрдХрд░рдг рдмрд┐рдВрджреБ рдкрд╣рд▓реЗ рд╕реЗ рд╕рд╣реЗрдЬреЗ рдЧрдП рд▓реАрдл рдпрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдиреЛрдб рдХреЗ рдЕрдВрджрд░ рдХрд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХрдИ рдирдП рдиреЛрдбреНрд╕ рдмрдирд╛рдиреЗ рд╣реЛрдВрдЧреЗред


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рднреА рддрд░реНрдХ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:


  1. рдЬрдмрдХрд┐ рдкрде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореМрдЬреВрджрд╛ рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рд╣рдо рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдкреЗрдбрд╝ рд╕реЗ рдЙрддрд░рддреЗ рд╣реИрдВред
  2. рдпрджрд┐ рдкрде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рдо рд╢рд╛рдЦрд╛ рдпрд╛ рд▓реАрдл рдиреЛрдб рдореЗрдВ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ update рдХреЗрд╡рд▓ рдЗрд╕ рдХреБрдВрдЬреА рдХреЗ рдЕрдиреБрд░реВрдк рдореВрд▓реНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред
  3. рдпрджрд┐ рдкрде рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВ (рдЕрд░реНрдерд╛рдд, рд╣рдо рдорд╛рди рдХреЛ рдЕрджреНрдпрддрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдирдпрд╛ рдбрд╛рд▓реЗрдВ), рдФрд░ рд╣рдо рд╢рд╛рдЦрд╛ рдиреЛрдб рдореЗрдВ рд╣реИрдВ, рдПрдХ рд▓реАрдл рдиреЛрдб рдмрдирд╛рдПрдБ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╢рд╛рдЦрд╛ рд╢рд╛рдЦрд╛ рд╢рд╛рдЦрд╛ рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред
  4. рдпрджрд┐ рдкрде рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВ рдФрд░ рд╣рдо рдПрдХ рдкрддреНрддреА рдпрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдиреЛрдб рдореЗрдВ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рд╢рд╛рдЦрд╛ рдиреЛрдб рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдкрдереЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдкрде рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдиреЛрдбред

рдзреАрд░реЗ-рдзреАрд░реЗ рдЗрд╕реЗ рдХреЛрдб рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рд╣реИрдВред рдзреАрд░реЗ-рдзреАрд░реЗ рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдзрд┐ рдмрдбрд╝реА рд╣реИ рдФрд░ рдЗрд╕реЗ рдереЛрдХ рдореЗрдВ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдпрд╣рд╛рдВ рдкреВрд░реА рд╡рд┐рдзрд┐ рдХрд╛ рд▓рд┐рдВрдХ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред


 class MerklePatriciaTrie: # ... def update(self, encoded_key, encoded_value): path = NibblePath(encoded_key) result = self._update(self._root, path, encoded_value) self._root = result def _update(self, node_ref, path, value): #       (,   ), #       . if not node_ref: return self._store_node(Node.Leaf(path, value)) #          #    . node = self._get_node(node_ref) if type(node) == Node.Leaf: ... elif type(node) == Node.Extension: ... elif type(node) == Node.Branch: ... 

рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рд╕рднреА рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк if рдЕрдВрджрд░ рд╣реИред


if type(node) == Node.Leaf

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд▓реАрдл рдиреЛрдбреНрд╕ рд╕реЗ рдирд┐рдкрдЯреЗрдВред рдХреЗрд╡рд▓ 2 рдкрд░рд┐рджреГрд╢реНрдп рдЙрдирдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рд╣реИрдВ:


  1. рд╣рдо рдЬрд┐рд╕ рдкрде рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкрддреНрддреА рдиреЛрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдкрдеред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдмрд╕ рдорд╛рди рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдирдП рдиреЛрдб рдХреЛ рдмрдЪрд╛рдПрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рдПрдВред


  2. рд░рд╛рд╕реНрддреЗ рдЕрд▓рдЧ рд╣реИрдВред
    рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рд╢рд╛рдЦрд╛ рдиреЛрдб рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рджреЛ рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИред
    рдпрджрд┐ рдХреЛрдИ рдПрдХ рдкрде рдЦрд╛рд▓реА рд╣реИ, рддреЛ рдЙрд╕рдХрд╛ рдорд╛рди рд╕реАрдзреЗ рд╢рд╛рдЦрд╛-рдиреЛрдб рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
    рдЕрдиреНрдпрдерд╛, рд╣рдореЗрдВ рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рдЖрдо рд╣рд┐рд╕реНрд╕реЗ рдХреА рд▓рдВрдмрд╛рдИ рд╕реЗ рдЫреЛрдЯреЗ рджреЛ рд▓реАрдл рдиреЛрдбреНрд╕ рдмрдирд╛рдиреЗ рд╣реЛрдВрдЧреЗ + 1 рдХреБрддрд░рдирд╛ (рдпрд╣ рдХреБрддрд░рдирд╛ рд╢рд╛рдЦрд╛ рдиреЛрдб рдХреЗ рдЗрд╕реА рд╢рд╛рдЦрд╛ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред



рдЖрдкрдХреЛ рдпрд╣ рднреА рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдиреЛрдб рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдорд╛рд░реНрдЧ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред


рдХреЛрдб рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:


 if type(node) == Node.Leaf: if node.path == path: #  .       . node.data = value return self._store_node(node) #    . #    . common_prefix = path.common_prefix(node.path) #      . path.consume(len(common_prefix)) node.path.consume(len(common_prefix)) #  Branch . branch_reference = self._create_branch_node(path, value, node.path, node.data) # ,    Extension-. if len(common_prefix) != 0: return self._store_node(Node.Extension(common_prefix, branch_reference)) else: return branch_reference 

_create_branch_node рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:


 def _create_branch_node(self, path_a, value_a, path_b, value_b): #    Branch-. branches = [b''] * 16 # ,     Branch- . branch_value = b'' if len(path_a) == 0: branch_value = value_a elif len(path_b) == 0: branch_value = value_b #    Leaf-,  . self._create_branch_leaf(path_a, value_a, branches) self._create_branch_leaf(path_b, value_b, branches) #  Branch-     . return self._store_node(Node.Branch(branches, branch_value)) def _create_branch_leaf(self, path, value, branches): # ,     Leaf-. if len(path) > 0: #    ( ). idx = path.at(0) #  Leaf-   ,     . leaf_ref = self._store_node(Node.Leaf(path.consume(1), value)) branches[idx] = leaf_ref 

if type(node) == Node.Extension

рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдиреЛрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдПрдХ рд▓реАрдл рдиреЛрдб рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред


  1. рдпрджрд┐ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдиреЛрдб рд╕реЗ рдкрде рд╣рдорд╛рд░реЗ рдкрде рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╣реИ, рддреЛ рд╣рдо рдмрд╕ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред


  2. рдЕрдиреНрдпрдерд╛, рд╣рдореЗрдВ рд╢рд╛рдЦрд╛ рдиреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреГрдердХреНрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИред



рддрджрдиреБрд╕рд╛рд░, рдХреЛрдб:


 elif type(node) == Node.Extension: if path.starts_with(node.path): #         . new_reference = \ self._update(node.next_ref, path.consume(len(node.path)), value) return self._store_node(Node.Extension(node.path, new_reference)) #  Extension-. #     . common_prefix = path.common_prefix(node.path) #  . path.consume(len(common_prefix)) node.path.consume(len(common_prefix)) #  Branch- ,  ,    . branches = [b''] * 16 branch_value = value if len(path) == 0 else b'' #     Leaf-  Extension- . self._create_branch_leaf(path, value, branches) self._create_branch_extension(node.path, node.next_ref, branches) branch_reference = self._store_node(Node.Branch(branches, branch_value)) # ,    Extension-. if len(common_prefix) != 0: return self._store_node(Node.Extension(common_prefix, branch_reference)) else: return branch_reference 

_create_branch_extension рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ _create_branch_leaf рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдиреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


if type(node) == Node.Branch

рд▓реЗрдХрд┐рди рд╢рд╛рдЦрд╛-рдиреЛрдб рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рдпрджрд┐ рд░рд╛рд╕реНрддрд╛ рдЦрд╛рд▓реА рд╣реИ, рддреЛ рд╣рдо рд╡рд░реНрддрдорд╛рди рд╢рд╛рдЦрд╛ рдиреЛрдб рдореЗрдВ рдирдП рдорд╛рди рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред рдпрджрд┐ рд░рд╛рд╕реНрддрд╛ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕рдореЗрдВ рд╕реЗ рдПрдХ рдХреБрддрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рдиреАрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВред


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред


 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 рдХреА рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдерд╛, рдХреЗрд╡рд▓ рд╣рдЯрд╛рдП рдЧрдП рдХреБрдВрдЬреА рдХреЛ рдЫреЛрдбрд╝рдХрд░ред


, , , , . "", , .


. , N- , N+1 . enum тАФ DeleteAction , .


delete :


 class MerklePatriciaTrie: # ... # Enum, ,         . class _DeleteAction(Enum): #    . #     , #        (_DeleteAction, None). DELETED = 1, #    (,    ). #     ,    #    : (_DeleteAction, ___). UPDATED = 2, #    Branch-  .   -- #    : # (_DeleteAction, (___, ___)) USELESS_BRANCH = 3 def delete(self, encoded_key): if self._root is None: return path = NibblePath(encoded_key) action, info = self._delete(self._root, path) if action == MerklePatriciaTrie._DeleteAction.DELETED: #   . self._root = None elif action == MerklePatriciaTrie._DeleteAction.UPDATED: #   . new_root = info self._root = new_root elif action == MerklePatriciaTrie._DeleteAction.USELESS_BRANCH: #   . _, new_root = info self._root = new_root def _delete(self, node_ref, path): node = self._get_node(node_ref) if type(node) == Node.Leaf: pass elif type(node) == Node.Extension: pass elif type(node) == Node.Branch: pass 

, 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- :


  1. , Extension- . тАФ .
  2. _delete , "" .
  3. . :

  • . .
  • . .
  • Branch-. . , Branch- . , , Leaf-. тАФ Extension-.

:


 elif type(node) == Node.Extension: if not path.starts_with(node.path): raise KeyError #   . #       . action, info = self._delete(node.next_ref, path.consume(len(node.path))) if action == MerklePatriciaTrie._DeleteAction.DELETED: return action, None elif action == MerklePatriciaTrie._DeleteAction.UPDATED: #    ,     . child_ref = info new_ref = self._store_node(Node.Extension(node.path, child_ref)) return action, new_ref elif action == MerklePatriciaTrie._DeleteAction.USELESS_BRANCH: #     Branch-. stored_path, stored_ref = info # ,     Branch-. child = self._get_node(stored_ref) new_node = None if type(child) == Node.Leaf: #  branch-  . #     Leaf-  Extension. path = NibblePath.combine(node.path, child.path) new_node = Node.Leaf(path, child.data) elif type(child) == Node.Extension: #  Branch-  Extension-. #       . path = NibblePath.combine(node.path, child.path) new_node = Node.Extension(path, child.next_ref) elif type(child) == Node.Branch: #  Branch-      Branch-. #    Extension-    . path = NibblePath.combine(node.path, stored_path) new_node = Node.Extension(path, stored_ref) new_reference = self._store_node(new_node) return MerklePatriciaTrie._DeleteAction.UPDATED, new_reference 

if type(node) == Node.Branch


.


, . Branch-, тАж


рдХреНрдпреЛрдВ? Branch- Leaf- ( ) Extension- ( ).
, . , тАФ Leaf-. тАФ Extension-. , , 2 тАФ Branch- .


? :


:


  1. , .
  2. , _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: #   ,    . #    . idx = path.at(0) if len(node.branches[idx]) == 0: raise KeyError action, info = self._delete(node.branches[idx], path.consume(1)) #  ,   ,  . #      -    #    . node.branches[idx] = b'' 

_DeleteAction .


  1. Branch- , ( , ). .

 if action == MerklePatriciaTrie._DeleteAction.UPDATED: #   . next_ref = info node.branches[idx] = next_ref reference = self._store_node(node) return MerklePatriciaTrie._DeleteAction.UPDATED, reference elif action == MerklePatriciaTrie._DeleteAction.USELESS_BRANCH: #    . _, next_ref = info node.branches[idx] = next_ref reference = self._store_node(node) return MerklePatriciaTrie._DeleteAction.UPDATED, reference 

  1. ( , ), , .

. :


  • . , , , . , .
  • , . 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: # Branch- ,  . return MerklePatriciaTrie._DeleteAction.DELETED, None elif non_empty_count == 0 and len(node.data) != 0: #  ,   . path = NibblePath([]) reference = self._store_node(Node.Leaf(path, node.data)) return MerklePatriciaTrie._DeleteAction.USELESS_BRANCH, (path, reference) elif non_empty_count == 1 and len(node.data) == 0: #  ,   . return self._build_new_node_from_last_branch(node.branches) else: #  1+   ,  2+ . # Branch-  ,   - UPDATED. reference = self._store_node(node) return MerklePatriciaTrie._DeleteAction.UPDATED, reference 

_build_new_node_from_last_branch .


тАФ Leaf Extension, , .


тАФ Branch, Extension , , Branch.


 def _build_new_node_from_last_branch(self, branches): #    . idx = 0 for i in range(len(branches)): if len(branches[i]) > 0: idx = i break #     . prefix_nibble = NibblePath([idx], offset=1) #     child = self._get_node(branches[idx]) path = None node = None #   . if type(child) == Node.Leaf: path = NibblePath.combine(prefix_nibble, child.path) node = Node.Leaf(path, child.data) elif type(child) == Node.Extension: path = NibblePath.combine(prefix_nibble, child.path) node = Node.Extension(path, child.next_ref) elif type(child) == Node.Branch: path = prefix_nibble node = Node.Extension(path, branches[idx]) #  . reference = self._store_node(node) return MerklePatriciaTrie._DeleteAction.USELESS_BRANCH, (path, reference) 

рдмрд╛рдХреА


. , тАж root .


рдпрд╣рд╛рдВ:


 class MerklePatriciaTrie: # ... def root(self): return self._root 

, .


тАж . , , Ethereum . , , , . , :)


, , pip install -U eth_mpt тАФ .


That's all folks!


рдкрд░рд┐рдгрд╛рдо


?


, -, , - , , . тАФ , .


-, , , тАФ . , skip list interval tree, тАФ , , .


-, , . , - .


-, тАФ .


, , тАФ !



: 1 , 2 , 3 . ! , .

Source: https://habr.com/ru/post/hi446558/


All Articles