рд╕рдордп-рд╕рдордп рдкрд░, рд╡реЗрдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХреЛ рднреА рдбрд░рд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЙрди рд╕рд░реНрд╡рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рдЧрд▓рддрд┐рдпрд╛рдБ рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдЙрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд┐рдирдореЗрдВ рд╡рд┐рдлрд▓рддрд╛ рдХреА рд▓рд╛рдЧрдд рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд▓реЗрдЦрдХ, рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдЖрдЬ рд╣рдо рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдХрд┐рд╕ рд╕реНрддрд░ рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
рдЕрддреНрдпрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕рд░реНрд╡рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рджреЗрд░реА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рдЙрдЪреНрдЪрддрдо рд╕реНрддрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХрд╛рд░реНрдп рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рддреНрд░реБрдЯрд┐ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рддрдмрд╛рд╣реА рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬреНрдпрд╛рджрд╛рддрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИрдВред
рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдХреА рд▓рд╛рдЧрдд рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рдирд┐рдХрд▓рддреА рд╣реИ, рддреЛ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдЪрд┐рдд рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ, рддреЛ рд╡рд╣ рдмрд╕ рдЙрдиреНрд╣реЗрдВ рд╕рдордЭрддрд╛ рд╣реИред рдЖрдзреБрдирд┐рдХ рдирд┐рдЧрд░рд╛рдиреА рдЙрдкрдХрд░рдг рдФрд░ рдирд┐рд░рдВрддрд░ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдкрдХреЛ рдЙрддреНрдкрд╛рджрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкрд╣рдЪрд╛рдирдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓рдЧрднрдЧ рддреБрд░рдВрдд рдареАрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдЖрдЬ рдореИрдВ рдЬрд┐рд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЙрд╕рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо
рдмреНрд▓реЙрдХрдЪреИрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ - рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реБрдП рдирд┐рдореНрди рд╕реНрддрд░ рдХреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╡рд╛рд▓реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХреЛрдб рдХреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рддрд░рд┐рдд рд╕рд░реНрд╡рд░ рдЕрд╡рд╕рдВрд░рдЪрдирд╛ред рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдПрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдбрд┐рдЬрд┐рдЯрд▓ рдореБрджреНрд░рд╛рдПрдВ рд╣реИрдВред рдпрд╣ рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЙрдЪреНрдЪ рд▓рд╛рдЧрдд рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдмрд╣реБрдд рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреБрдЫ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рднрд▓реЗ рд╣реА рд╡реЗ рд╡рд┐рддреНрдд рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рди рд╣реЛрдВ, рдЙрдЪреНрдЪрддрдо рдХреЛрдб рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХрд╛ рдкреАрдЫрд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдмрд╛рд░-рдмрд╛рд░ рдмреНрд░реЗрдХрд┐рдВрдЧ рдХреЛрдб рдЖрдзрд╛рд░ рдХреА рд╕рд░реНрд╡рд┐рд╕рд┐рдВрдЧ рдХреА рд▓рд╛рдЧрдд рдмрд╣реБрдд рдЬрд▓реНрджреА рдЦрдЧреЛрд▓реАрдп рдореВрд▓реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреА рд╣реИред рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╢реБрд░реБрдЖрддреА рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рдЬрдм рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рдЕрднреА рднреА рдХрдо рд╣реИ, рд╕рдордп рдкрд░ рдирд┐рд╡реЗрд╢ рдФрд░ рдЕрддреНрдпрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЗрдирд╛рдо рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред
рд╢рд╛рдпрдж рд╕рдорд╛рдзрд╛рди TDD рд╣реИ?
рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдХрд╛рд╕ (
рдЯреЗрд╕реНрдЯ рдбреНрд░рд┐рд╡реЗрди рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ , рдЯреАрдбреАрдбреА) рдХреЛ рдЕрдХреНрд╕рд░ рдЦрд░рд╛рдм рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЗрд▓рд╛рдЬ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЯреАрдбреАрдбреА рдПрдХ рд╢реБрджреНрдз рд╡рд┐рдХрд╛рд╕ рдкрджреНрдзрддрд┐ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдкрд╣рд▓реЗ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА - рдХреЛрдб рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ 100% рдХрд╡рд░реЗрдЬ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреА рд╣реИ рдФрд░ рдЕрдХреНрд╕рд░ рдпрд╣ рднреНрд░рдо рджреЗрддреА рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╡реЗрд░рд┐рдПрдВрдЯ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЯреАрдбреАрдбреА рдПрдХ рд╢рд╛рдирджрд╛рд░ рдкрджреНрдзрддрд┐ рд╣реИ рдЬреЛ рдХреБрдЫ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдб рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, рдЯреАрдбреАрдбреА рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЭреВрдареЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдЖрд╡реЗрджрди рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЛ рдЬрдиреНрдо рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХреЗрд╡рд▓ рдЖрд▓рд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдгрд╛рд▓реА рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддрд╛ рд╣реИ, рдЬреЛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИред рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рдЯреЗрд╕реНрдЯ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреА рдХреБрдВрдЬреА рд╣реИ
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдЯреАрдбреАрдбреА рдЬреИрд╕реА рд╡рд┐рдХрд╛рд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдореБрдЦреНрдп рдмрд╛рдд рдкрд░реАрдХреНрд╖рдг рд╣реЛрдиреЗ рдХрд╛ рддрдереНрдп рд╣реИред рдЯреЗрд╕реНрдЯ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд░рдХреНрд╖рд╛рддреНрдордХ рдХрд┐рд▓реЗрдмрдВрджреА рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдЙрддреНрдкрд╛рджрди рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред
рдЪреВрдВрдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдмрд╣реБрдд рдмрд╛рд░ рдЪрд▓рд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдирдИ рд▓рд╛рдЗрди рдХреЛ рдХреЛрдб рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реЛрдВред рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рд╣рдорд╛рд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЗрд╕рдХреЗ рдореИрдиреБрдЕрд▓ рдЪреЗрдХ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдЧрд▓рддрд┐рдпрд╛рдБ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХрдИ рдмрд╛рд░ рдПрдХ рд╣реА рдЪреБрдиреМрддреАрдкреВрд░реНрдг рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╡рд┐рд╡рд░рдг рдкрд░ рдзреНрдпрд╛рди рдХрдордЬреЛрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдЯреЗрд╕реНрдЯ рдЬрд▓реНрджреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдмрд╣реБрдд рддреЗрдЬ рд╣реИред
рдпрджрд┐ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЖрд▓рд╕реА рд╣реЛрдВрдЧреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд┐рдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЛрдб рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдкреАрдб рдЧреЛ рдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЦреВрдмрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЗрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдЯреВрд▓рдХрд┐рдЯ рдореМрдЬреВрджрд╛ рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рддреЗрдЬ рд╣реИред рд╕рдВрдХрд▓рди, рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг, рдФрд░ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╕реЗрдХрдВрдбреЛрдВ рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВред
рдЯреЗрд╕реНрдЯ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдбреНрд░рд╛рдЗрд╡рд┐рдВрдЧ рдлреЛрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдмреНрд▓реЙрдХрдЪреЗрди рддрдХрдиреАрдХ рд╕реЗ рдЬреБрдбрд╝реА рд╣рд░ рдЪреАрдЬ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд▓рдЧрднрдЧ рдПрдХ рдзрд░реНрдо рд╣реИред рдЬреЛ рд▓реЛрдЧ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЙрдирдореЗрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЖрдзрд╛рд░ рдЦреБрд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рдСрдбрд┐рдЯ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рд╡рд┐рдХреЗрдВрджреНрд░реАрдХрд░рдг рдХрд╛ рдорд╛рд╣реМрд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд╕реНрдерд╛рдПрдВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреА рд╣реИрдВред
рдмрд╛рд╣рд░реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдпреЛрдЧрджрд╛рди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдЕрдЧрд░ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЧреБрдгрд╡рддреНрддрд╛ рдкрд░реАрдХреНрд╖рдг рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВред рдмрд╛рд╣рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЛ рдЗрд╕ рдмрд╛рдд рдХреА рдЕрдиреБрдХреВрд▓рддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЬреЛ рдХреБрдЫ рдЬреЛрдбрд╝рд╛ рд╣реИ рдЙрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдкреВрд░рд╛ рд╕реЗрдЯ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдирдпрд╛ рдХреЛрдб рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреБрдЫ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдРрд╕рд╛ рд╣реЛрдиреЗ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХреЛ рддреБрд░рдВрдд рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдЖрдзрд╛рд░ рдХреА рдкреВрд░реНрдг рдХрд╡рд░реЗрдЬ рдПрдХ рднреНрд░рд╛рдордХ рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореАрдЯреНрд░рд┐рдХ рд╣реИред рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде 100% рдХреЛрдб рдХрд╡рд░реЗрдЬ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд▓рдХреНрд╖реНрдп рдЕрддреНрдпрдзрд┐рдХ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХреЛрдб рдХрд╛ рдХреБрдЫ рд╣рд┐рд╕реНрд╕рд╛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдмрд┐рдирд╛ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкрд╣рд▓реЗ рдХрднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреА рдкреВрд░реНрдг рдХрд╡рд░реЗрдЬ рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ, рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпреЗ рдРрд╕реЗ рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ рдЬреЛ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рд╕рд╛рде, рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ 100% рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рддреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЛрдб рдХреА рдкреВрд░реНрдг рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрдкрд░реЛрдХреНрдд рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реИрдВ рдЬрдм рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд░реАрдХреНрд╖рдг рд╣реЛрддреЗ рд╣реИрдВред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐ рдХреЛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреА рд╡рд┐рдлрд▓рддрд╛ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрддреНрдпрдзрд┐рдХ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╡рд┐рднрд┐рдиреНрди рдкрд░реАрдХреНрд╖рдг рд╕рдорд╛рди рдХреЛрдб рдЕрдВрд╢реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдореМрдЬреВрджрд╛ рд╕рд┐рд╕реНрдЯрдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рддрдереНрдп рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдореМрдЬреВрджрд╛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдирдП рдХреЛрдб рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдиреЗ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред ред
рдЕрддреНрдпрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╡рд┐рдХрд▓реНрдк рдХреНрдпреЛрдВ рд╣реИ?
рдЧреЛ рдПрдХ рд╕реНрдерд┐рд░ рдЯрд╛рдЗрдк рдХреА рднрд╛рд╖рд╛ рд╣реИред рдкреНрд░рдХрд╛рд░ рдХреЛрдб рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдиреБрдмрдВрдз рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрд╕реЗрдВрдмрд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдмрд┐рдирд╛, рдпрджрд┐ рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЦреНрдд рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЙрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрди "рдЕрдиреБрдмрдВрдзреЛрдВ" рдХреЛ рдЕрдкрдиреЗ рджрдо рдкрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдЬрд╛рдБрдЪ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдЬрдЯрд┐рд▓ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХрд╛ рдорддрд▓рдм рд╣реИ, рдЬреЛ рдХрд┐ рдЧреЛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЯрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЧреЛ рдПрдХ рд╕рд░рд▓ рдФрд░ рд╣рдардзрд░реНрдореА рднрд╛рд╖рд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЧреЛ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рдВрдкрд░рд┐рдХ рдХрдИ рд╡рд┐рдЪрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╢рд╛рд╕реНрддреНрд░реАрдп рдУрдУрдкреА рд╡рд┐рд░рд╛рд╕рддред рдЬрдЯрд┐рд▓рддрд╛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдб рдХрд╛ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рджреБрд╢реНрдорди рд╣реИред рд╕рдорд╕реНрдпрд╛рдПрдВ рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдЬреЛрдбрд╝реЛрдВ рдореЗрдВ рдЫрд┐рдк рдЬрд╛рддреА рд╣реИрдВред рдпрд╣ рдЗрд╕ рддрдереНрдп рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдХрд▓реНрдк рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИрдВ, рдРрд╕реЗ рд╡рд┐рдЪрд┐рддреНрд░ рд╕реАрдорд╛ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдкрд░рд┐рдпреЛрдЬрдирд╛, рдЕрдВрдд рдореЗрдВ, рдЗрдирдореЗрдВ рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рдорд╛рдорд▓реЗ рдХреЛ рдиреАрдЪреЗ рд▓рд╛рдПрдЧреАред рдЗрд╕ рдЕрд░реНрде рдореЗрдВ, dogmatism рднреА рдЙрдкрдпреЛрдЧреА рд╣реИред рдЧреЛ рдореЗрдВ, рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рд╕реНрд╡рддрдВрддреНрд░ рднрд╛рд╡рдирд╛ рдХреЛ рд╡рд╛рдкрд╕ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдХрд╛рд░рдХ рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдХреБрдЫ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рдЧрд▓рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
рдЧреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ рд▓реЗрдХрд┐рди рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╣реИред рдкрдардиреАрдп рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдСрдбрд┐рдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдпрджрд┐ рдХреЛрдб рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рд╕рд╣рд╛рдпрдХ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ "рд╢реЛрд░" рдореЗрдВ рдбреВрдм рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдб рдмрд╣реБрдд рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ, рддреЛ рдЙрд╕ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЧреЛ, рд╕реБрдЧрдорддрд╛ рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмреАрдЪ рд╕рдВрддреБрд▓рди рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рдХрдИ рд╕рд╣рд╛рдпрдХ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЬрд╛рд╡рд╛ рдпрд╛ рд╕реА ++ рдЬреИрд╕реА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВред рдЙрд╕реА рд╕рдордп, рдЧреЛ рдирд┐рд░реНрдорд╛рдг, рд╕рдВрдмрдВрдзрд┐рдд, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдЬреИрд╕реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ, рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдФрд░ рдХрд╛рдлреА рд╡рд┐рд╕реНрддреГрдд рд╣реИрдВ, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрд╕реЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐ рдЙрд╕рдиреЗ рд╡рд╣ рд╕рдм рдХреБрдЫ рдЬрд╛рдВрдЪ рд▓рд┐рдпрд╛ рд╣реИ рдЬреЛ рд╕рдВрднрд╡ рд╣реИред
рдХреНрд░реИрд╢ рдХреЗ рдмрд╛рдж рдЧреЛ рдореЗрдВ рдХреНрд▓рд┐рдпрд░ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдФрд░ рд░рд┐рдХрд╡рд░реА рдореИрдХреЗрдирд┐рдЬреНрдо рд╣реИред рд╡реЗрд▓-рдЯреНрдпреВрдирдб рд░рдирдЯрд╛рдЗрдо рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореИрдХреЗрдирд┐рдЬреНрдо рдЕрддреНрдпрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдб рдХреА рдЖрдзрд╛рд░рд╢рд┐рд▓рд╛ рд╣реИред рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдФрд░ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХреЗ рд╕рдЦреНрдд рдирд┐рдпрдо рд╣реИрдВред Node.js рдЬреИрд╕реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдирд╛, рдЬреИрд╕реЗ рдХреЙрд▓рдмреИрдХ, рд╡рд╛рджреЗ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп, рдЕрдХреНрд╕рд░ рдЕрдирд╣реЗрд▓реНрдб рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐
рдПрдХ рд╡рд╛рджреЗ рдХреА рдЕрдирд╣реЗрд▓реНрджреА рдЕрд╕реНрд╡реАрдХреГрддрд┐ ред рдЗрд╕реА рддрд░рд╣ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рдмрд╛рдж рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдирд╛ рд▓рдЧрднрдЧ
рдЕрд╕рдВрднрд╡ рд╣реИ ред
рдЧреЛ рдореЗрдВ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред рдирд┐рд░реНрднрд░рддрд╛ рдПрдХ рдЬреЛрдЦрд┐рдо рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдЙрдирдХрд╛ рд╕реНрд░реЛрдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдб рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдкрд░ рдЕрдкрд░реНрдпрд╛рдкреНрдд рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╕рд░реНрд╡рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЬреЛ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ рдЙрд╕рдореЗрдВ рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдХреБрдЫ рдЧрд▓рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рддреИрдпрд╛рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдбреЗрд╡рд▓рдкрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛, рди рдХрд┐ рдЙрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрдирд╛рдиреЗ рд╡рд╛рд▓рд╛ред рдирддреАрдЬрддрди, рдРрд╕реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЬрд╣рд╛рдВ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИрдВ, рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЫреЛрдЯреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрдирд╛рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИред
рдирд┐рд░реНрднрд░рддрд╛ рднреА рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдЦрд┐рдо рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рднреЗрджреНрдпрддрд╛ рд╕реНрддрд░ рдЙрд╕рдХреЗ рд╕рдмрд╕реЗ
рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рднреЗрджреНрдпрддрд╛ рд╕реНрддрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рд╡реНрдпрд╛рдкрдХ рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЧреЛ рдХреЛ рдЗрд╕рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрдирд╛рдП рд░рдЦрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред
рдЙрдЪреНрдЪ рд╡рд┐рдХрд╛рд╕ рдХреА рдЧрддрд┐ред Node.js рдЬреИрд╕реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреА рдПрдХ рдкреНрд░рдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЗрд╕рдХрд╛ рдЕрддреНрдпрдВрдд рдЫреЛрдЯрд╛ рд╡рд┐рдХрд╛рд╕ рдЪрдХреНрд░ рд╣реИред рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдХрдо рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ рдмрди рдЬрд╛рддрд╛ рд╣реИред
рдЧреЛ рдореЗрдВ рднреА рдЙрдЪреНрдЪ рд╡рд┐рдХрд╛рд╕ рдХреА рдЧрддрд┐ рд╣реИред рдирд┐рд░реНрдорд╛рдг рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдХрд╛рдлреА рддреЗрдЬреА рд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдХреЛрдб рдХреЛ рддреБрд░рдВрдд рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рд╕рдВрдХрд▓рди рд╕рдордп рдмреЗрд╣рдж рдХрдо рд╣реИ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЧреЛ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЧрдИ рдереАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рднрд╛рд╖рд╛ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рд░ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдгрд╛рд▓реА, рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рди рдХрд┐ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкреНрд░рдпреЛрдЧ
рдЕрдм рдЬрдм рд╣рдордиреЗ рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдорд╛рдиреНрдп рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЖрд╡рд╛рдЬрд╝ рджреА рд╣реИ, рддреЛ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рд╣рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЗрддрдирд╛ рд╕рд░рд▓ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╕рдордп, рд╣рдо рд╡рд┐рдХрд╛рд╕ рдкрджреНрдзрддрд┐ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА, рдЗрд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЙрдиреНрдирдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд╣рдо, рдЗрд╕рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдмрд╛рдд рдХрд░ рд╕рдХреЗрдВред рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВ рдЬреЛ рдХреБрдЫ рднреА рджреИрдирд┐рдХ рдХрд░рддрд╛ рд╣реВрдВ, рдЙрд╕рд╕реЗ рдХреБрдЫ рд▓реЗрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдПрдХ рд╕рд░реНрд╡рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рд╡рд┐рддреНрддреАрдп рд▓реЗрдирджреЗрди рд╕реЗ рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рд╣реИред рдЗрд╕ рд╕рд░реНрд╡рд░ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреЗ рдЦрд╛рддреЛрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рдЦрд╛рддреЗ рдХреА рд╢реЗрд╖ рд░рд╛рд╢рд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ рдПрдХ рдЦрд╛рддреЗ рд╕реЗ рджреВрд╕рд░реЗ рдЦрд╛рддреЗ рдореЗрдВ рдзрдирд░рд╛рд╢рд┐ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХреЗрдВрдЧреЗред
рд╣рдо рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рд╕рд░реНрд╡рд░ рд╣реЛрдЧрд╛ред рд╣рдо рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдФрд░ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд╕рдВрдкрд░реНрдХ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдпреЗ рдХрд╛рд░реНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдЕрднрд┐рдиреНрди рдЕрдВрдЧ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдореВрд▓ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕реЗ рдпрдерд╛рд╕рдВрднрд╡ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред
That рдПрдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЙрди рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдЬреЛ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдВ
рдЬрдЯрд┐рд▓рддрд╛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХрд╛ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рджреБрд╢реНрдорди рд╣реИред рдЬрдЯрд┐рд▓ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ "рд╡рд┐рднрд╛рдЬрд┐рдд рдФрд░ рдЬреАрддрдирд╛" рдХреЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЬреНрдЮрд╛рдд рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред рдХрд╛рд░реНрдп рдХреЛ рдЫреЛрдЯреЗ рдЙрдк-рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рдкрдХреНрд╖? рд╣рдо
рд╕рд╛рдЭрд╛ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреА рдЕрдкрдиреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд▓реЛрдХрдкреНрд░рд┐рдп
microservice рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реЗрд╡рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреАред рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рдореЗрдВ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреНрд╖реЗрддреНрд░ рдФрд░ рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдЧрд╛ред
рд╕рд░реНрд╡рд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдпрд╣ рдирд┐рд░реНрдгрдп рд▓реЗ рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рдХреЛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рднреА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗ рдЖрдк рдПрдХ рдЕрд▓рдЧ рд╕рд░реНрд╡рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрд░рдкреАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдмрд╛рддрдЪреАрдд рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рдХрд╛рд░реНрдп рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд╣рдо рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рдЪреБрдиреЗрдВрдЧреЗред рдЕрд░реНрдерд╛рддреН, рд╕рднреА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдПрдХ рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╡реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рддрд░рд╣ рд╕реАрдзреЗ рд╕реВрдЪрдирд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕ рд╡рд╛рд╕реНрддреБ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдореАрдХреНрд╖рд╛ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рддреЛ рд╣рдореЗрдВ рдХрд┐рди рд╕реЗрд╡рд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рд╣рдорд╛рд░рд╛ рд╕рд░реНрд╡рд░ рд╢рд╛рдпрдж рдЗрд╕реЗ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди, рд╢реИрдХреНрд╖рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо, рдлрд┐рд░ рднреА, рдЗрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗред рд╣рдореЗрдВ рдЧреНрд░рд╛рд╣рдХ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╢реЗрд╖ рд░рд╛рд╢рд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдФрд░ рд▓реЗрдирджреЗрди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реИред рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ HTTP рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред
PublicApi
рдЗрд╕реЗ
PublicApi
рдХрд╣рддреЗ рд╣реИрдВред рдПрдХ рдЕрдиреНрдп рд╕реЗрд╡рд╛ рдкреНрд░рдгрд╛рд▓реА рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЧреА - рдмреИрд▓реЗрдВрд╕ рд╢реАрдЯред рдЗрд╕реЗ
StateStorage
рдХрд╣рддреЗ рд╣реИрдВред рддреАрд╕рд░реА рд╕реЗрд╡рд╛ рдЙрдкрд░реЛрдХреНрдд рд╡рд░реНрдгрд┐рдд рджреЛ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ рдФрд░ рдмрджрд▓рддреЗ рд╢реЗрд╖ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ "рдЕрдиреБрдмрдВрдз" рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧреАред рддреАрд╕рд░реА рд╕реЗрд╡рд╛ рдХрд╛ рдХрд╛рд░реНрдп рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╣реЛрдЧрд╛ред
VirtualMachine
рдЗрд╕реЗ
VirtualMachine
рдХрд╣рддреЗ рд╣реИрдВред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдЗрди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдХреЛрдб рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░
/services/publicapi
,
/services/virtualmachine
рдФрд░
/services/statestorage
ред
Ibilities рд╕реЗрд╡рд╛ рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рдХреА рд╕реНрдкрд╖реНрдЯ рдкрд░рд┐рднрд╛рд╖рд╛
рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рджреМрд░рд╛рди, рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд╕рд╛рде рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЗ рдмреАрдЪ рдЗрди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИред рдЪреВрдВрдХрд┐ рд╕реЗрд╡рд╛рдПрдВ рдЕрдиреНрдпреЛрдиреНрдпрд╛рд╢реНрд░рд┐рдд рд╣реИрдВ, рдФрд░ рд╣рдо рдЙрдирдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЙрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рд╕реНрдкрд╖реНрдЯ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд╕реНрд╡рд╛рдпрддреНрдд рд░реВрдк рд╕реЗ рдЙрди рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕реНрдЯрдмреНрд╕ рддреИрдпрд╛рд░ рдХрд░рдХреЗ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдмрд╛рд╣рд░ рд╣реИрдВред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХреИрд╕реЗ рдХрд░реЗрдВ? рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕рдм рдХреБрдЫ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реЛрдиреЗ рдХреА рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдХреЛрдб рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдЬрдорд╛ рд╣реЛрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЧреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рдгрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╡рд┐рд╡рд░рдг рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдкрд░ рдирд┐рд░реНрднрд░ рди рд╣реЛред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рдЕрдЧрд░ рдХрд┐рд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЗрд╕рдХреА рдХреБрдЫ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рдирдХреА рдХреНрд╖рдорддрд╛ рдЙрдирдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдЕрдиреБрдХреВрд▓ рд╣реИред
рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк
рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рд╕рдВрджреЗрд╢ рдФрд░ рд╕реЗрд╡рд╛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рднрд╛рд╖рд╛ рдФрд░ рднрд╛рд╖рд╛ рд╕реНрд╡рддрдВрддреНрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИред
StateStorage
рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рджреГрд╢реНрдп рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╡реЗрджрди рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВрдЧреЗред рдпрд╣рд╛рдБ
statestorage.proto
рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
syntax = "proto3"; package statestorage; service StateStorage { rpc WriteKey (WriteKeyInput) returns (WriteKeyOutput); rpc ReadKey (ReadKeyInput) returns (ReadKeyOutput); } message WriteKeyInput { string key = 1; int32 value = 2; } message WriteKeyOutput { } message ReadKeyInput { string key = 1; } message ReadKeyOutput { int32 value = 1; }
рд╣рд╛рд▓рд╛рдБрдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ
PublicApi
рд╕реЗрд╡рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рд╕реНрдкрд╖реНрдЯ рдорд╛рдзреНрдпрдореЛрдВ (
publicapi.proto
рдлрд╝рд╛рдЗрд▓) рдХреЗ рд╕рдорд╛рди рд╕реНрдкрд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
syntax = "proto3"; package publicapi; import "protocol/transactions.proto"; service PublicApi { rpc Transfer (TransferInput) returns (TransferOutput); rpc GetBalance (GetBalanceInput) returns (GetBalanceOutput); } message TransferInput { protocol.Transaction transaction = 1; } message TransferOutput { string success = 1; int32 result = 2; } message GetBalanceInput { protocol.Address from = 1; } message GetBalanceOutput { string success = 1; int32 result = 2; }
рдЕрдм рд╣рдореЗрдВ
Transaction
рдФрд░
Address
рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ (
transactions.proto
рдлрд╛рдЗрд▓) рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
syntax = "proto3"; package protocol; message Address { string username = 1; } message Transaction { Address from = 1; Address to = 2; int32 amount = 3; }
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЛ-рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрд╢рди рдХреЛ
/types/services
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп-рдкреНрд░рдпреЛрдЬрди рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╡рд┐рд╡рд░рдг
/types/protocol
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВред
рдПрдХ рдмрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд╡рд░рдг рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЗрдВ рдЧреЛ рдХреЛрдб рдореЗрдВ
рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдлрд╛рдпрджреЗ рдЙрд╕ рдХреЛрдб рд╣реИрдВ рдЬреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд╡рд░рдг рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ рдмрд╕ рд╕рдВрдХрд▓рди рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдореЗрдВ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдХреЛрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд╡рд░рдг рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
рдкреВрд░реНрдг рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ, рдЬрдирд░реЗрдЯ рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЗрдВ, рдФрд░ рд╕рдВрдХрд▓рди рдирд┐рд░реНрджреЗрд╢
рдпрд╣рд╛рдБ рдорд┐рд▓ рд╕рдХрддреЗ
рд╣реИрдВ ред
рд╕реНрдХреНрд╡рд╛рдпрд░ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдФрд░
рдЧреЛрдкреНрд░реЛрдЯреНрд░реЙрд╡ рдХреЗ рдЙрдирдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡ рд╣реИред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкрд░рд┐рд╡рд╣рди рдкрд░рдд RPC рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рд╕рд╛рдорд╛рдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЙрд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдЬрдм рд╣рдо рд╡рд┐рднрд┐рдиреНрди рд╕рд░реНрд╡рд░реЛрдВ рдкрд░ рд╕реЗрд╡рд╛рдПрдБ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ
gRPC рдЬреИрд╕реА рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рд▓реЗрдпрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
Used рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкреНрд░рдХрд╛рд░
рдЪреВрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рдЕрддреНрдпрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдб рдХреА рдХреБрдВрдЬреА рд╣реИрдВ, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВрдЧреЗред
рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг
рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг
рдкрд░реАрдХреНрд╖рдг рдкрд┐рд░рд╛рдорд┐рдб рдХреЗ рдореВрд▓ рд╣реИрдВред рд╣рдо рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗред рдореЙрдбреНрдпреВрд▓ рдХреНрдпрд╛ рд╣реИ? рдЧреЛ рдореЗрдВ, рд╣рдо рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлрд╝рд╛рдЗрд▓
/services/publicapi/handlers.go
, рддреЛ рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЙрд╕реА рдкреИрдХреЗрдЬ рдореЗрдВ
/services/publicapi/handlers_test.go
рдкрд░
/services/publicapi/handlers_test.go
ред
рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдкреИрдХреЗрдЬ рдореЗрдВ рд░рдЦрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЬреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдЪрд░ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╕реЗрд╡рд╛ рдЯреЗрд╕реНрдЯ
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдирд╛рдореЛрдВ рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреЗ рддрдерд╛рдХрдерд┐рдд рд╕реЗрд╡рд╛, рдПрдХреАрдХрд░рдг рдпрд╛ рдШрдЯрдХ рдкрд░реАрдХреНрд╖рдг рд╣реИрдВред рдЙрдирдХрд╛ рд╕рд╛рд░ рдХрдИ рдореЙрдбреНрдпреВрд▓ рд▓реЗрдирд╛ рдФрд░ рдЙрдирдХреЗ рд╕рдВрдпреБрдХреНрдд рдХрд╛рд░реНрдп рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реИред рдпреЗ рдкрд░реАрдХреНрд╖рдг рдкрд░реАрдХреНрд╖рдг рдкрд┐рд░рд╛рдорд┐рдб рдореЗрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рд╕реНрддрд░ рдЕрдзрд┐рдХ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╕рдВрдкреВрд░реНрдг рд╕реЗрд╡рд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпреЗ рдкрд░реАрдХреНрд╖рдг рд╕реЗрд╡рд╛ рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
StateStorage
рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг
/services/statestorage/spec
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦреЗ рдЬрд╛рдПрдВрдЧреЗред
рдЗрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рд░рдЦрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕ рдХреЛрдб рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗрд╡рд▓ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛред
рдЕрдВрдд-рд╕реЗ-рдЕрдВрдд рдкрд░реАрдХреНрд╖рдг
рдпреЗ рдкрд░реАрдХреНрд╖рдг рдкрд░реАрдХреНрд╖рдг рдкрд┐рд░рд╛рдорд┐рдб рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╣реИрдВ, рдЙрдирдХреА рдорджрдж рд╕реЗ рдкреВрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЗрд╕рдХреА рд╕рднреА рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдг рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдВрдб-рдЯреВ-рдПрдВрдб, e2e рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдиреНрд╣реЗрдВ
/e2e/spec
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦреЗрдВрдЧреЗред
рдПрдВрдб-рдЯреВ-рдПрдВрдб рдкрд░реАрдХреНрд╖рдг, рд╕рд╛рде рд╣реА рд╕реЗрд╡рд╛ рдкрд░реАрдХреНрд╖рдг, рдПрдХ рдкреИрдХреЗрдЬ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рд╕реНрдерд┐рдд рд╣реИ рддрд╛рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЗрд╡рд▓ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдкрд╣рд▓реЗ рдХреМрди рд╕реЗ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП? "рдкрд┐рд░рд╛рдорд┐рдб" рдХреА рдиреАрдВрд╡ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдКрдкрд░ рдЬрд╛рдПрдВ? рдпрд╛ рд╢реАрд░реНрд╖ рдкрд░ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдиреАрдЪреЗ рдЬрд╛рдПрдВ? рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЬреАрд╡рди рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИред рдкреВрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдореЗрдВ рдЯреЙрдк-рдбрд╛рдЙрди рдПрдкреНрд░реЛрдЪ рдХрд╛ рд▓рд╛рдн рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЖрдорддреМрд░ рдкрд░ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднреА рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдВрдЧреЗред рдпрд╣, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреБрдЫ, рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдкрд░, рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЯреЙрдк-рдбрд╛рдЙрди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдорд╛рдЗрдирд╕ рдпрд╣ рд╣реИ рдХрд┐ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдкрд░реАрдХреНрд╖рдг рд╡реЗ рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ, рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рд╕рднреА рдХреЗ рдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдкреВрд░реА рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╕рдордп, рд╣рдо рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
Development рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рдХрд╛рд╕
рдЕрдВрдд-рд╕реЗ-рдЕрдВрдд рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдХрд╛рд╕
рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рд╕рд╣рд╛рдпрдХ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд▓рд┐рдЦреЗрдВрдЧреЗ рдпрд╛ рдХрд┐рд╕реА рддрд░рд╣ рдХреЗ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╡рд┐рдХрд╛рд╕ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдврд╛рдВрдЪреЗ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛, рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдореЗрдВ рдврд╛рдВрдЪреЗ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдиреЗ рд╕реЗ рдХрдо рдЦрддрд░рдирд╛рдХ рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЪреВрдВрдХрд┐ рдорд╛рдирдХ рдЧреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕рднреНрдп
рдмреАрдбреАрдбреА рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкреНрд░рд╛рд░реВрдк рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рд╣рдо рдПрдХ рдХрд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЪрдпрди рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИред
рдХрдИ рдорд╣рд╛рди рд░реВрдкрд░реЗрдЦрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рд╡рд╣ рджреЗрддреА рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рдЙрдирдореЗрдВ рд╕реЗ
рдЧреЛрдХреЗрдирд╡реЗ рдФрд░
рдЬрд┐рдиреНрдХрдЧреЛ рд╣реИрдВ ред
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ
рдЬрд┐рдиреНрдХрдЧреЛ рдФрд░
рдЧреЛрдореЗрдЧрд╛ (рднрдпрд╛рдирдХ рдирд╛рдо, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ) рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рд╣реИ, рдЬреЛ
Describe()
рдЬреИрд╕реЗ
Describe()
рдФрд░
Describe()
рдФрд░
It()
ред
рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреНрдпрд╛ рджрд┐рдЦреЗрдВрдЧреЗ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрддреБрд▓рди рдЬрд╛рдВрдЪ рддрдВрддреНрд░ (
sanity.go
file) рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
package spec import ... var _ = Describe("Sanity", func() { var ( node services.Node ) BeforeEach(func() { node = services.NewNode() node.Start() }) AfterEach(func() { node.Stop() }) It("should show balances with GET /api/balance", func() { resp, err := http.Get("http://localhost:8080/api/balance?from=user1") Expect(err).ToNot(HaveOccurred()) Expect(resp.StatusCode).To(Equal(http.StatusOK)) Expect(ResponseBodyAsString(resp)).To(Equal("0")) }) })
рдЪреВрдВрдХрд┐ рд╕рд░реНрд╡рд░ HTTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ рд╕реЗ рд╕реБрд▓рдн рд╣реИ, рд╣рдо
http.Get рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рд╡реЗрдм рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рд▓реЗрди-рджреЗрди рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдпрд╣рд╛рдБ рдЗрд╕реА рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
It("should transfer funds with POST /api/transfer", func() { resp, err := http.Get("http://localhost:8080/api/transfer?from=user1&to=user2&amount=17") Expect(err).ToNot(HaveOccurred()) Expect(resp.StatusCode).To(Equal(http.StatusOK)) Expect(ResponseBodyAsString(resp)).To(Equal("-17")) resp, err = http.Post("http://localhost:8080/api/balance?from=user2", "text/plain", nil) Expect(err).ToNot(HaveOccurred()) Expect(resp.StatusCode).To(Equal(http.StatusOK)) Expect(ResponseBodyAsString(resp)).To(Equal("17")) })
рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдирдХреЗ рд╕рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рднреА рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдирдХрд╛рд░рд╛рддреНрдордХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦрд╛рддрд╛ рд╢реЗрд╖ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдирд┐рд╖рд┐рджреНрдз рдерд╛, рддреЛ рдпрд╣ рдирд┐рд░реНрдгрдп рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрдЧрд╛ред
тЖТ
рдпрд╣рд╛рдБ рдкреВрд░реНрдг рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рд╕реЗрд╡рд╛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдХрд╛рд╕
рдЕрдм, рдПрдВрдб-рдЯреВ-рдПрдВрдб рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкрд░реАрдХреНрд╖рдг рдкрд┐рд░рд╛рдорд┐рдб рдХреЛ рдиреАрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реЗрд╡рд╛ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдРрд╕реА рд╕реЗрд╡рд╛ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕ рдкрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реЗрд╡рд╛ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рд╣реЛ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред
VirtualMachine
рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рдЖрдк рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЛ-рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐
VirtualMachine
рд╕реЗрд╡рд╛
StateStorage
рд╕реЗрд╡рд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ
VirtualMachine
рд╕реЗрд╡рд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
StateStorage
рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ
рдирдХрд▓реА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рд╕реНрдЯрдм рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди
StateStorage
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЧреЛ рдореЗрдВ рд╕реНрдЯрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ? рдпрд╣ рд╕рд╣рд╛рдпрдХ рдЙрдкрдХрд░рдг рдХреЗ рдмрд┐рдирд╛ рднрд╛рд╖рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЖрдк рдЙрдкрдпреБрдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдмрдпрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджреЗрдЧрд╛ред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП, рдореИрдВ
рдЧреЛ-рдореЙрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред
рд╣рдо рдлрд╝рд╛рдЗрд▓
/services/statestorage/mock.go
рдореЗрдВ рд╕реНрдЯрдм рдХреЛрдб
/services/statestorage/mock.go
ред рдпрд╣ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдЬрдЧрд╣ рдкрд░ рд╕реНрдЯрдм рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдЪрд░ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдХрд▓ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╕реНрдЯрдм рд╕реЗрд╡рд╛ рдХрд╛ рдПрдХ рдпреЛрдЬрдирд╛рдмрджреНрдз рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рд╕реЗрд╡рд╛ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддреА рд╣реИ, рд╣рдореЗрдВ рд╕реНрдЯрдм рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣рд╛рдБ рд╕реНрдЯрдм рдСрдмреНрдЬреЗрдХреНрдЯ (
mock.go
рдлрд╝рд╛рдЗрд▓) рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
package statestorage import ... type MockService struct { mock.Mock } func (s *MockService) Start() { s.Called() } func (s *MockService) Stop() { s.Called() } func (s *MockService) IsStarted() bool { return s.Called().Bool(0) } func (s *MockService) WriteKey(input *statestorage.WriteKeyInput) (*statestorage.WriteKeyOutput, error) { ret := s.Called(input) return ret.Get(0).(*statestorage.WriteKeyOutput), ret.Error(1) } func (s *MockService) ReadKey(input *statestorage.ReadKeyInput) (*statestorage.ReadKeyOutput, error) { ret := s.Called(input) return ret.Get(0).(*statestorage.ReadKeyOutput), ret.Error(1) }
рдпрджрд┐ рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдкрд╣рд▓реЗ рд╕реНрдЯрдмреНрд╕ рдмрдирд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЯреАрдо рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдЪрд▓рд┐рдП
VirtualMachine
рд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ
VirtualMachine
рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХрд┐рд╕ рдкрд░рд┐рджреГрд╢реНрдп рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП? рдкреНрд░рддреНрдпреЗрдХ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рд╣рдо
"GetBalance"
рд╡рд┐рдзрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде
"GetBalance"
CallContract()
рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб (
contracts.go
рдлрд╝рд╛рдЗрд▓) рд╣реИ:
package spec import ... var _ = Describe("Contracts", func() { var ( service uut.Service stateStorage *_statestorage.MockService ) BeforeEach(func() { service = uut.NewService() stateStorage = &_statestorage.MockService{} service.Start(stateStorage) }) AfterEach(func() { service.Stop() }) It("should support 'GetBalance' contract method", func() { stateStorage.When("ReadKey", &statestorage.ReadKeyInput{Key: "user1"}).Return(&statestorage.ReadKeyOutput{Value: 100}, nil).Times(1) addr := protocol.Address{Username: "user1"} out, err := service.CallContract(&virtualmachine.CallContractInput{Method: "GetBalance", Arg: &addr}) Expect(err).ToNot(HaveOccurred()) Expect(out.Result).To(BeEquivalentTo(100)) Expect(stateStorage).To(ExecuteAsPlanned()) }) })
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдЬрд┐рд╕ рд╕реЗрд╡рд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ,
VirtualMachine
, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
Start()
рд╡рд┐рдзрд┐ рдореЗрдВ рдЕрдкрдиреА рдирд┐рд░реНрднрд░рддрд╛,
StateStorage
рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рд╕реНрдЯрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд╛рдЗрди
stateStorage.When("ReadKey", &statestorage.ReadKeyInput{KeyтАж
рдзреНрдпрд╛рди рджреЗрдВред
stateStorage.When("ReadKey", &statestorage.ReadKeyInput{KeyтАж
, рдЬрд╣рд╛рдВ рд╣рдо рд╕реНрдЯрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╕рдордп рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
ReadKey
рд╡рд┐рдзрд┐ рдХреЛ
ReadKey
, рддреЛ рдЗрд╕реЗ рдПрдХ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред 100. рдлрд┐рд░, рд▓рд╛рдЗрди
Expect(stateStorage).To(ExecuteAsPlanned())
, рд╣рдо
Expect(stateStorage).To(ExecuteAsPlanned())
рдХрд┐ рдпрд╣ рдХрдорд╛рдВрдб рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕реА рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдг рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдмрди рдЬрд╛рддреЗ рд╣реИрдВред
VirtualMachine
рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдкреВрд░рд╛ рд╕реЗрдЯ
рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЯреЗрд╕реНрдЯ рд╕реВрдЯ
рдпрд╣рд╛рдВ рдФрд░
рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ
рд╣реИрдВ ред
рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ
рд╢рд╛рдпрдж
"GetBalance"
рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдмрдВрдз рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рддреЛ
"GetBalance"
рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓
"Transfer"
рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдП рдЧрдП рдзрди рдХреЛ рдПрдХ рдЦрд╛рддреЗ рд╕реЗ рджреВрд╕рд░реЗ рдЦрд╛рддреЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрдмрдВрдз рдХреЛ рдирдП рд╢реЗрд╖ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдФрд░ рдЖрд╡реЗрджрди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреНрдпрд╛ рд╣реБрдЖ рд╣реИ, рдпрд╣ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд╖рдХ рдФрд░ рдзрди рдХреЗ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЗ рд╢реЗрд╖ рдкрд░ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рд╕рдм рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рдкрд░реАрдХреНрд╖рдг рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП (
transactions.go
рдлрд╝рд╛рдЗрд▓) рдХреЗ рд╕рдорд╛рди рд╣реИ:
It("should support 'Transfer' transaction method", func() { stateStorage.When("ReadKey", &statestorage.ReadKeyInput{Key: "user1"}).Return(&statestorage.ReadKeyOutput{Value: 100}, nil).Times(1) stateStorage.When("ReadKey", &statestorage.ReadKeyInput{Key: "user2"}).Return(&statestorage.ReadKeyOutput{Value: 50}, nil).Times(1) stateStorage.When("WriteKey", &statestorage.WriteKeyInput{Key: "user1", Value: 90}).Return(&statestorage.WriteKeyOutput{}, nil).Times(1) stateStorage.When("WriteKey", &statestorage.WriteKeyInput{Key: "user2", Value: 60}).Return(&statestorage.WriteKeyOutput{}, nil).Times(1) t := protocol.Transaction{From: &protocol.Address{Username: "user1"}, To: &protocol.Address{Username: "user2"}, Amount: 10} out, err := service.ProcessTransaction(&virtualmachine.ProcessTransactionInput{Method: "Transfer", Arg: &t}) Expect(err).ToNot(HaveOccurred()) Expect(out.Result).To(BeEquivalentTo(90)) Expect(stateStorage).To(ExecuteAsPlanned()) })
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╣рдо рдЕрдВрдд рдореЗрдВ рдЗрд╕рдХреЗ рдЖрдВрддрд░рд┐рдХ рддрдВрддреНрд░ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдлрд╝рд╛рдЗрд▓
processor.go
рдореЗрдВ рд╕реНрдерд┐рдд рдПрдХ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
processor.go
, рдЬрд┐рд╕рдореЗрдВ рдЕрдиреБрдмрдВрдз рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣рд╛рдБ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ (
processor.go
рдлрд╝рд╛рдЗрд▓):
package virtualmachine import ... func (s *service) processTransfer(fromUsername string, toUsername string, amount int32) (int32, error) { fromBalance, err := s.stateStorage.ReadKey(&statestorage.ReadKeyInput{Key: fromUsername}) if err != nil { return 0, err } toBalance, err := s.stateStorage.ReadKey(&statestorage.ReadKeyInput{Key: toUsername}) if err != nil { return 0, err } _, err = s.stateStorage.WriteKey(&statestorage.WriteKeyInput{Key: fromUsername, Value: fromBalance.Value - amount}) if err != nil { return 0, err } _, err = s.stateStorage.WriteKey(&statestorage.WriteKeyInput{Key: toUsername, Value: toBalance.Value + amount}) if err != nil { return 0, err } return fromBalance.Value - amount, nil }
рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рд╕реЗрд╡рд╛ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреЗрд╡рд▓ рдореВрд▓ рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╣реЛрддрд╛ рд╣реИред рд╕реАрдорд╛рд╡рд░реНрддреА рдорд╛рдорд▓реЛрдВ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛
StateStorage
рдХреА рдЧрдИ рдХреЛрдИ рднреА рдХреЙрд▓ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрджрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХрд╛ 100% рдХрд╡рд░реЗрдЬ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрди рд╕рднреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдорд╣рд╛рди рд╣реИред
рдЪреВрдВрдХрд┐ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрдИ рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдХреА рд╕рднреА рд╢рд╛рдЦрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЯреЗрдмрд▓-рдЖрдзрд╛рд░рд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рджреЗрд╢реА рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдПрдВред рд╣рдо
рдЬрд┐рдиреНрдХрдЧреЛ рдХреЛ рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╣рдореЗрдВ
рдЧреЛрдореЗрдЧрд╛ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдирддреАрдЬрддрди, рдпрд╣рд╛рдВ рдХрд┐рдП рдЧрдП рдЪреЗрдХ рдкрд┐рдЫрд▓реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЧрдП рд╕рдорд╛рди рд╣реЛрдВрдЧреЗред рдпрд╣рд╛рдБ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рд╣реИ (рдлрд╝рд╛рдЗрд▓
processor_test.go
):
package virtualmachine import ... var transferTable = []struct{ to string // , read1Err error // read2Err error // write1Err error // write2Err error // output int32 // errs bool // }{ {"user2", errors.New("a"), nil, nil, nil, 0, true}, {"user2", nil, errors.New("a"), nil, nil, 0, true}, {"user2", nil, nil, errors.New("a"), nil, 0, true}, {"user2", nil, nil, nil, errors.New("a"), 0, true}, {"user2", nil, nil, nil, nil, 90, false}, } func TestTransfer(t *testing.T) { ╬й := NewGomegaWithT(t) for _, tt := range transferTable { s := NewService() ss := &_statestorage.MockService{} s.Start(ss) ss.When("ReadKey", &statestorage.ReadKeyInput{Key: "user1"}).Return(&statestorage.ReadKeyOutput{Value: 100}, tt.read1Err) ss.When("ReadKey", &statestorage.ReadKeyInput{Key: "user2"}).Return(&statestorage.ReadKeyOutput{Value: 50}, tt.read2Err) ss.When("WriteKey", &statestorage.WriteKeyInput{Key: "user1", Value: 90}).Return(&statestorage.WriteKeyOutput{}, tt.write1Err) ss.When("WriteKey", &statestorage.WriteKeyInput{Key: "user2", Value: 60}).Return(&statestorage.WriteKeyOutput{}, tt.write2Err) output, err := s.(*service).processTransfer("user1", tt.to, 10) if tt.errs { ╬й.Expect(err).To(HaveOccurred()) } else { ╬й.Expect(err).ToNot(HaveOccurred()) ╬й.Expect(output).To(BeEquivalentTo(tt.output)) } } }
┬л╬й┬╗ тАФ , тАФ (
Gomega ). .
, TDD, , , .
processTransfer()
.
VirtualMachine
.
.
100% . , . .
, ? . , , , .
тЦН -
. ? HTTP- Go (goroutine). , тАФ , . , , , .
- . , , , , . -
/e2e/stress
. - (
stress.go
):
package stress import ... const NUM_TRANSACTIONS = 20000 const NUM_USERS = 100 const TRANSACTIONS_PER_BATCH = 200 const BATCHES_PER_SEC = 40 var _ = Describe("Transaction Stress Test", func() { var ( node services.Node ) BeforeEach(func() { node = services.NewNode() node.Start() }) AfterEach(func() { node.Stop() }) It("should handle lots and lots of transactions", func() { // HTTP- transport := http.Transport{ IdleConnTimeout: time.Second*20, MaxIdleConns: TRANSACTIONS_PER_BATCH*10, MaxIdleConnsPerHost: TRANSACTIONS_PER_BATCH*10, } client := &http.Client{Transport: &transport} // ledger := map[string]int32{} for i := 0; i < NUM_USERS; i++ { ledger[fmt.Sprintf("user%d", i+1)] = 0 } // HTTP rand.Seed(42) done := make(chan error, TRANSACTIONS_PER_BATCH) for i := 0; i < NUM_TRANSACTIONS / TRANSACTIONS_PER_BATCH; i++ { log.Printf("Sending %d transactions... (batch %d out of %d)", TRANSACTIONS_PER_BATCH, i+1, NUM_TRANSACTIONS / TRANSACTIONS_PER_BATCH) time.Sleep(time.Second / BATCHES_PER_SEC) for j := 0; j < TRANSACTIONS_PER_BATCH; j++ { from := randomizeUser() to := randomizeUser() amount := randomizeAmount() ledger[from] -= amount ledger[to] += amount go sendTransaction(client, from, to, amount, &done) } for j := 0; j < TRANSACTIONS_PER_BATCH; j++ { err := <- done Expect(err).ToNot(HaveOccurred()) } } // for i := 0; i < NUM_USERS; i++ { user := fmt.Sprintf("user%d", i+1) resp, err := client.Get(fmt.Sprintf("http://localhost:8080/api/balance?from=%s", user)) Expect(err).ToNot(HaveOccurred()) Expect(resp.StatusCode).To(Equal(http.StatusOK)) Expect(ResponseBodyAsString(resp)).To(Equal(fmt.Sprintf("%d", ledger[user]))) } }) }) func randomizeUser() string { return fmt.Sprintf("user%d", rand.Intn(NUM_USERS)+1) } func randomizeAmount() int32 { return rand.Int31n(1000)+1 } func sendTransaction(client *http.Client, from string, to string, amount int32, done *chan error) { url := fmt.Sprintf("http://localhost:8080/api/transfer?from=%s&to=%s&amount=%d", from, to, amount) resp, err := client.Post(url, "text/plain", nil) if err == nil { ioutil.ReadAll(resp.Body) resp.Body.Close() } *done <- err }
, - . (
rand.Seed(42)
) , . . , , тАФ , .
- HTTP ,
TCP- ( , , ). , , 200
IdleConnection
TCP- . , 100.
тАж :
fatal error: concurrent map writes goroutine 539 [running]: runtime.throw(0x147bf60, 0x15) /usr/local/go/src/runtime/panic.go:616 +0x81 fp=0xc4207159d8 sp=0xc4207159b8 pc=0x102ca01 runtime.mapassign_faststr(0x13f5140, 0xc4201ca0c0, 0xc4203a8097, 0x6, 0x1012001) /usr/local/go/src/runtime/hashmap_fast.go:703 +0x3e9 fp=0xc420715a48 sp=0xc4207159d8 pc=0x100d879 services/statestorage.(*service).WriteKey(0xc42000c060, 0xc4209e6800, 0xc4206491a0, 0x0, 0x0) services/statestorage/methods.go:15 +0x10c fp=0xc420715a88 sp=0xc420715a48 pc=0x138339c services/virtualmachine.(*service).processTransfer(0xc4201ca090, 0xc4203a8097, 0x6, 0xc4203a80a1, 0x6, 0x2a4, 0xc420715b30, 0x1012928, 0x40) services/virtualmachine/processor.go:19 +0x16e fp=0xc420715ad0 sp=0xc420715a88 pc=0x13840ee services/virtualmachine.(*service).ProcessTransaction(0xc4201ca090, 0xc4209e67c0, 0x30, 0x1433660, 0x12a1d01) Ginkgo ran 1 suite in 1.288879763s Test Suite Failed
?
StateStorage
(
map
), . , , . ,
map
sync.map . .
processTransfer() . , тАФ . , , , , . ,
processTransfer()
.
.
, . , , .
e2e/stress/transactions.go:44 Expected <string>: -7498 to equal <string>: -7551 e2e/stress/transactions.go:82 ------------------------------ Ginkgo ran 1 suite in 5.251593179s Test Suite Failed
, . , , ( , ). ,
, .
тАФ . TDD . ? , 100%?! , тАФ .
processTransfer()
, , .
. ,
, .
.
рдкрд░рд┐рдгрд╛рдо
, , , -, , , ? ? тАФ .
, -. , ┬л┬╗
processTransfer()
. , ,
. , тАФ . , - . , , .
. ,
. ,
StateStorage
WriteKey
, , , ,
WriteKeys
, , .
, : . ┬л ┬╗. -, , , , , . тАФ . , , тАФ .
, тАФ
GitHub. . , , , , , , .
рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! ?
