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

рдпрд╣ рдХреНрдпрд╛ рд╣реИ
рдбрд┐рд╕реНрдХреНрд▓реЗрдорд░: рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдирд╛ рдХрд╛ рдореБрдЦреНрдп рд╕реНрд░реЛрдд рдпреЗрд▓реЛ рдкреЗрдкрд░ рдерд╛, рд╕рд╛рде рд╣реА рд╕реНрд░реЛрдд рдХреЛрдб рд╕рдорддрд╛-рдЗрдереЗрд░рд┐рдпрдо рдФрд░ рдЧреЛ-рдПрдереЗрд░рд┐рдпрдо рдерд╛ ред рдХреБрдЫ рдирд┐рд░реНрдгрдпреЛрдВ рдХреЗ рдФрдЪрд┐рддреНрдп рдкрд░ рдиреНрдпреВрдирддрдо рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдереА, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрд░реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╣реИрдВред рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рдХреБрдЫ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИ - рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред
рдПрдХ рдкреЗрдбрд╝ рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рдПрдХ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдЪрдХреНрд░реАрдп рдЧреНрд░рд╛рдл рд╣реИред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рд╣рд░ рдХреЛрдИ рдЗрд╕рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИред
рдЙрдкрд╕рд░реНрдЧ рд╡реГрдХреНрд╖ рд░реВрдЯ рдЯреНрд░реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреА-рд╡реИрд▓реНрдпреВ рдкреЗрдпрд░ рдХреЛ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдиреЛрдбреНрд╕ рдХреЛ рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рд╡реЗ рдЬрд┐рдирдореЗрдВ рдкрде (рдЙрдкрд╕рд░реНрдЧ) рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдкрддреНрддреА рдиреЛрдбреНрд╕ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИред рдПрдХ рдореВрд▓реНрдп рдПрдХ рдкреЗрдбрд╝ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ рдпрджрд┐ рдФрд░ рдХреЗрд╡рд▓ рдпрджрд┐, рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдкреЗрдбрд╝ рдХреА рдЬрдбрд╝ рд╕реЗ рд╕рднреА рддрд░рд╣ рд╕реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдПрдХ рдиреЛрдб рдвреВрдВрдв рд╕рдХрддреЗ рд╣реИрдВред
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 рдХреБрддрд░рдирд╛ рд▓реЗрддрд╛ рд╣реИред рдпрджрд┐ рдкрде рдХреА рд▓рдВрдмрд╛рдИ (рдЙрдкрд╕рд░реНрдЧ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рд╡рд┐рд╖рдо рд╣реИ, рддреЛ рдкрде рдЙрдкрд╕рд░реНрдЧ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдкрде рдХреА рд▓рдВрдмрд╛рдИ рд╕рдорд╛рди рд╣реИ, рддреЛ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рдмрд╛рдж рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдмрд▓ 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
рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЦреБрдж рдХреЛ рдЗрд╕рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдХрдВрдзреЛрдВ рдкрд░ рдЗрд╕ рдХрдмреНрдЬреЗ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ ред_
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЦреБрдж рдкреЗрдбрд╝ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВ, рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬреЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:
NibblePath
рдХреНрд▓рд╛рд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдЬреЛ рдирд┐рдмрд▓реНрд╕ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ, рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдирдХреЛрдб рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред- рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░
Node
рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - Extension
, Leaf
рдФрд░ Branch
ред
NibblePath
рддреЛ, NibblePath
ред рдЪреВрдВрдХрд┐ рд╣рдо рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдкреЗрдбрд╝ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдореЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЖрдзрд╛рд░ рдкрде рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ "рдСрдлрд╕реЗрдЯ" рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреБрддрд░рдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЬрд╛рдирдХрд░, рд╣рдо рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЗ рдЖрдзрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рд╕рд╛рде рд╣реА рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╕реНрдерд┐рд░рд╛рдВрдХ):
class NibblePath: ODD_FLAG = 0x10 LEAF_FLAG = 0x20 def __init__(self, data, offset=0): self._data = data
рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ, рд╣реИ рдирд╛?
рдпрд╣ рдирд┐рдмрд▓реНрд╕ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред
class NibblePath:
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдирд┐рдмрд▓реНрд╕ рдХреЗ рд╕рд╛рде рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдмреЗрд╢рдХ, рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЕрднреА рднреА рдХрдИ рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ (рдЬреИрд╕реЗ 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):
рдПрдХреНрд╕рдЯреЗрдВрд╢рди:
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
рдбреЗрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдпрджрд┐ рдПрдиреНрдХреЛрдбреЗрдб рдиреЛрдб 32 рд╡рд░реНрдгреЛрдВ рд╕реЗ рдХрдо рд▓рдВрдмрд╛ рд╣реИ)ред рджреЛ рд╕реНрд╡рд░реВрдкреЛрдВ рдореЗрдВ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ - рд╣реИрд╢ рдмрд╛рдЗрдЯреНрд╕ рдФрд░ рдПрдХ рдбрд┐рдХреЛрдбреЗрдб рдиреЛрдб - рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рджреЛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗ, рдЬреЛ рдиреЛрдб рдХреЛ рдбреАрдХреЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдмрд╛рдЗрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдмрдЪрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдбреАрдХреЛрдб рдХрд░реЗрдВред рдпреЗ рдХрд╛рд░реНрдп рд╣реИрдВ:
def _prepare_reference_for_encoding(ref):
рдиреЛрдбреНрд╕ рдХреНрд▓рд╛рд╕ рд▓рд┐рдЦрдХрд░ рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВред рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ 2 рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреА: рдиреЛрдб рдХреЛ рдбреАрдХреЛрдб рдХрд░реЗрдВ рдФрд░ рдиреЛрдб рдХреЛ рдПрдХ рд▓рд┐рдВрдХ рдореЗрдВ рдмрджрд▓ рджреЗрдВред
class 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:
рд╣рд╛рд▓рд╛рдВрдХрд┐, _get
рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ: рд╡рд╛рдВрдЫрд┐рдд рдиреЛрдб рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд░реВрдЯ рд╕реЗ рдкреВрд░реЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдкрде рдкрд░ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЕрдВрдд рдореЗрдВ рд╣рдореЗрдВ рдбреЗрдЯрд╛ (рд▓реАрдл рдпрд╛ рдмреНрд░рд╛рдВрдЪ) рдХреЗ рд╕рд╛рде рдПрдХ рдиреЛрдб рдорд┐рд▓рд╛ - рд╣реБрд░реНрд░реЗ, рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛, рддреЛ рдкреЗрдбрд╝ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХреБрдВрдЬреА рдЧрд╛рдпрдм рд╣реИред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
class MerklePatriciaTrie:
рдареАрдХ рд╣реИ, рдЙрд╕реА рд╕рдордп, рд╣рдо рдиреЛрдбреНрд╕ рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд▓рд┐рдЦреЗрдВрдЧреЗред рд╡реЗ рд╕рд░рд▓ рд╣реИрдВ:
class MerklePatriciaTrie:
рдЕрджреНрдпрддрди
update
рд╡рд┐рдзрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдмрд╕ рдЕрдВрдд рддрдХ рдЬрд╛рдПрдВ рдФрд░ рд▓реАрдл рдиреЛрдб рдбрд╛рд▓реЗрдВ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдХреБрдВрдЬреА рдкреГрдердХреНрдХрд░рдг рдмрд┐рдВрджреБ рдкрд╣рд▓реЗ рд╕реЗ рд╕рд╣реЗрдЬреЗ рдЧрдП рд▓реАрдл рдпрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдиреЛрдб рдХреЗ рдЕрдВрджрд░ рдХрд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХрдИ рдирдП рдиреЛрдбреНрд╕ рдмрдирд╛рдиреЗ рд╣реЛрдВрдЧреЗред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рднреА рддрд░реНрдХ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
- рдЬрдмрдХрд┐ рдкрде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореМрдЬреВрджрд╛ рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рд╣рдо рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдкреЗрдбрд╝ рд╕реЗ рдЙрддрд░рддреЗ рд╣реИрдВред
- рдпрджрд┐ рдкрде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рдо рд╢рд╛рдЦрд╛ рдпрд╛ рд▓реАрдл рдиреЛрдб рдореЗрдВ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐
update
рдХреЗрд╡рд▓ рдЗрд╕ рдХреБрдВрдЬреА рдХреЗ рдЕрдиреБрд░реВрдк рдореВрд▓реНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред - рдпрджрд┐ рдкрде рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВ (рдЕрд░реНрдерд╛рдд, рд╣рдо рдорд╛рди рдХреЛ рдЕрджреНрдпрддрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдирдпрд╛ рдбрд╛рд▓реЗрдВ), рдФрд░ рд╣рдо рд╢рд╛рдЦрд╛ рдиреЛрдб рдореЗрдВ рд╣реИрдВ, рдПрдХ рд▓реАрдл рдиреЛрдб рдмрдирд╛рдПрдБ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╢рд╛рдЦрд╛ рд╢рд╛рдЦрд╛ рд╢рд╛рдЦрд╛ рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред
- рдпрджрд┐ рдкрде рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВ рдФрд░ рд╣рдо рдПрдХ рдкрддреНрддреА рдпрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдиреЛрдб рдореЗрдВ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рд╢рд╛рдЦрд╛ рдиреЛрдб рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдкрдереЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдкрде рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдиреЛрдбред
рдзреАрд░реЗ-рдзреАрд░реЗ рдЗрд╕реЗ рдХреЛрдб рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рд╣реИрдВред рдзреАрд░реЗ-рдзреАрд░реЗ рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдзрд┐ рдмрдбрд╝реА рд╣реИ рдФрд░ рдЗрд╕реЗ рдереЛрдХ рдореЗрдВ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдпрд╣рд╛рдВ рдкреВрд░реА рд╡рд┐рдзрд┐ рдХрд╛ рд▓рд┐рдВрдХ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред
class MerklePatriciaTrie:
рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рд╕рднреА рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк if
рдЕрдВрджрд░ рд╣реИред
if type(node) == Node.Leaf
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд▓реАрдл рдиреЛрдбреНрд╕ рд╕реЗ рдирд┐рдкрдЯреЗрдВред рдХреЗрд╡рд▓ 2 рдкрд░рд┐рджреГрд╢реНрдп рдЙрдирдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рд╣реИрдВ:
рд╣рдо рдЬрд┐рд╕ рдкрде рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкрддреНрддреА рдиреЛрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдкрдеред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдмрд╕ рдорд╛рди рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдирдП рдиреЛрдб рдХреЛ рдмрдЪрд╛рдПрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рдПрдВред
рд░рд╛рд╕реНрддреЗ рдЕрд▓рдЧ рд╣реИрдВред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рд╢рд╛рдЦрд╛ рдиреЛрдб рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рджреЛ рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдХреЛрдИ рдПрдХ рдкрде рдЦрд╛рд▓реА рд╣реИ, рддреЛ рдЙрд╕рдХрд╛ рдорд╛рди рд╕реАрдзреЗ рд╢рд╛рдЦрд╛-рдиреЛрдб рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдиреНрдпрдерд╛, рд╣рдореЗрдВ рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рдЖрдо рд╣рд┐рд╕реНрд╕реЗ рдХреА рд▓рдВрдмрд╛рдИ рд╕реЗ рдЫреЛрдЯреЗ рджреЛ рд▓реАрдл рдиреЛрдбреНрд╕ рдмрдирд╛рдиреЗ рд╣реЛрдВрдЧреЗ + 1 рдХреБрддрд░рдирд╛ (рдпрд╣ рдХреБрддрд░рдирд╛ рд╢рд╛рдЦрд╛ рдиреЛрдб рдХреЗ рдЗрд╕реА рд╢рд╛рдЦрд╛ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред
рдЖрдкрдХреЛ рдпрд╣ рднреА рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдиреЛрдб рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдорд╛рд░реНрдЧ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдХреЛрдб рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
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
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдиреЛрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдПрдХ рд▓реАрдл рдиреЛрдб рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред
рдпрджрд┐ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдиреЛрдб рд╕реЗ рдкрде рд╣рдорд╛рд░реЗ рдкрде рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╣реИ, рддреЛ рд╣рдо рдмрд╕ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред
рдЕрдиреНрдпрдерд╛, рд╣рдореЗрдВ рд╢рд╛рдЦрд╛ рдиреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреГрдердХреНрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИред
рддрджрдиреБрд╕рд╛рд░, рдХреЛрдб:
elif type(node) == Node.Extension: if path.starts_with(node.path):
_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:
, 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 . ! , .