рдЧреЛ рдкрд░ рдЕрд▓рд╡рд┐рджрд╛ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг: рдЕрд▓рд╡рд┐рджрд╛, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ

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

рдпрд╣ рдореЗрд░реЗ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдордзреНрдпрдо рдЕрдВрдЧреНрд░реЗрдЬреА рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╣реИ


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


рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд╛рд▓


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


let proposalExists = await voting.checkProposal(); assert.equal(proposalExists, true, 'Proposal should exist'); 

рдпрджрд┐ checkProposal рд╕реНрдЯреНрд░рд┐рдВрдЧ "рд╣рд╛рдБ" рдпрд╛ "рдирд╣реАрдВ" рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВрдЧреЗред рдбрд╛рдпрдиреЗрдорд┐рдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЗрди рдЬрд╛рд▓реЛрдВ рдХреЛ рдЫреБрдкрд╛рддреА рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдиреБрднрд╡реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпрд╛ рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд╕рд╛рде рдЯреАрдо рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдРрд╕реА рдЧрд▓рддрд┐рдпрд╛рдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреЛрдб рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред


рдЧреЛ рдХреА рд╕реНрдЯреИрдЯрд┐рдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП Node.js рдХреЗ рдмрдЬрд╛рдп рдЧреЛ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдЧреЛ-рдбреЗрд╡рд▓рдкрд░ рдХрд╛ рд╕рдкрдирд╛ рд╣реИ рдЬреЛ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред


рдореЗрд░реА рдЯреАрдо рдПрдХ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╕рд╛рде рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдирд┐рд╡реЗрд╢ рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реА рдереАред рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдХреЛрдб рдХреА 2,000 рд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЗрдВ рдереАрдВред рдЪреВрдБрдХрд┐ рдЯреАрдо рдХрд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╣рд┐рд╕реНрд╕рд╛ рдЧреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рдерд╛, рдЧреЛ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ Node.js. рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдерд╛ред


рдЧреЛ рдкрд░ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рд╡рд╛рддрд╛рд╡рд░рдг


2017 рдореЗрдВ, PolySwarm рдиреЗ Perigord , Truffle рдХреЗ рд╕рдорд╛рди рдПрдХ рдЙрдкрдХрд░рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрдЬрд╛рдп Go рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЕрдм рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рдПрдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЧрдирд╛рдЪреЗ (рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЬреАрдпреВрдЖрдИ рдХреЗ рд╕рд╛рде рдПрдереЗрд░рд┐рдпрдо рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдЬреА рдмреНрд▓реЙрдХрдЪреИрди) рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рдордиреЗ рдмрдЧреНрд╕ рдХреЛ рдЦрддреНрдо рдХрд░рдХреЗ рдФрд░ рджреЛ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдХреЗ рдкреЗрд░рд┐рдЧрд░реНрдб рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛: рдореЗрдиреЗрдореЛрдирд┐рдХ рдХреЛрдб рд╕реЗ рдкрд░реНрд╕ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдФрд░ рдЧрдирд╛рдЪреЗ рдмреНрд▓реЙрдХрдЪреЗрди рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдЖрдк рдпрд╣рд╛рдВ рд╕реЛрд░реНрд╕ рдХреЛрдб рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред


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


рдЙрдиреНрдирдд Perigord рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛: рдПрдХ рдкреВрд░реНрдг рдЧрд╛рдЗрдб


рдкреЗрд░реАрдЧреЙрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЧреЛ 1.7+, рд╕реЛрд▓, рдПрдмрд┐рдЬреЗрди рдФрд░ рдЧрдирд╛рдЪреЗ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХреГрдкрдпрд╛ рдЕрдкрдиреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦреЗрдВред


Perigord рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:


 $ go get gitlab.com/go-truffle/enhanced-perigord $ go build 

рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдкреЗрд░рд┐рдЧрд░реНрдб рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 $ perigord A golang development environment for Ethereum Usage: perigord [command] Available Commands: add Add a new contract or test to the project build (alias for compile) compile Compile contract source files deploy (alias for migrate) generate (alias for compile) help Help about any command init Initialize new Ethereum project with example contracts and tests migrate Run migrations to deploy contracts test Run go and solidity tests Flags: -h, --help help for perigord Use "perigord [command] --help" for more information about a command. 

рдЕрдм рд╣рдо рдЙрдкрд▓рдмреНрдз рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдмрд╛рдЬрд╛рд░ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рдмрдирд╛рдПрдВрдЧреЗред


рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджрд░реНрдЬ рдХрд░реЗрдВ:


 $ perigord init market 

рдкрд░рд┐рдпреЛрдЬрдирд╛ GOPATH рдореЗрдВ src / folder рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред рдпрджрд┐ рдЖрдк рдЗрд╕рдХрд╛ рд╕реНрдерд╛рди рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдВ рдФрд░ рдЖрдпрд╛рдд рдкрде рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдмрд╛рдЬрд╛рд░ / рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреНрдпрд╛ рд╣реИред


 $ tree . тФЬтФАтФА contracts тФВ тФФтФАтФА Foo.sol тФЬтФАтФА generate.go тФЬтФАтФА main.go тФЬтФАтФА migrations тФВ тФФтФАтФА 1_Migrations.go тФЬтФАтФА perigord.yaml тФЬтФАтФА stub тФВ тФЬтФАтФА README.md тФВ тФФтФАтФА main.go тФЬтФАтФА stub_test.go тФФтФАтФА tests тФФтФАтФА Foo.go 

Truffle рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╣реИ рдирд╛? рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдЪрд▓ рд░рд╣рд╛ рд╣реИ! рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ perigord.yaml рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреНрдпрд╛ рд╣реИред


 networks: dev: url: /tmp/geth_private_testnet/geth.ipc keystore: /tmp/geth_private_testnet/keystore passphrase: blah mnemonic: candy maple cake sugar pudding cream honey rich smooth crumble sweet treat num_accounts: 10 

рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдЬреА geth рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рд╡реЙрд▓реЗрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ Ganache рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпреЗ рд╡рд┐рдХрд▓реНрдк рдкрд░рд╕реНрдкрд░ рдЕрдирдиреНрдп рд╣реИрдВред рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ mnemonics рд▓реЗрддреЗ рд╣реИрдВ, 10 рдЦрд╛рддреЗ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ Ganache рд╕реЗ рдЬреБрдбрд╝рддреЗ рд╣реИрдВред рдХреЛрдб рдХреЛ perigord.yaml рдореЗрдВ рдмрджрд▓реЗрдВ:


 networks: dev: url: HTTP://127.0.0.1:7545 mnemonic: candy maple cake sugar pudding cream honey rich smooth crumble sweet treat num_accounts: 10 

HTTP http://127.0.0.1:7545 - Ganache RPC рд╕рд░реНрд╡рд░ рдХрд╛ рдорд╛рдирдХ рдкрддрд╛ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЦрд╛рддреЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ Ganache (GUI) рдореЗрдВ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдЦрд╛рддреЛрдВ рдореЗрдВ рд╣реА рдзрди рд╣реЛрдЧрд╛ред


рд╣рдо Market.sol рдирд╛рдордХ рдПрдХ рдЕрдиреБрдмрдВрдз рдмрдирд╛рдПрдВрдЧреЗред рд╡рд╣ рдкрддреЗ рдХреЗ рдЬреЛрдбрд╝реЗ рдХрд╛ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рд░рдЦ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдЕрдиреБрдмрдВрдз рдЦрд╛рддреЗ рдореЗрдВ рдзрди рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдХреЛ рдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ рдЬрдм рдЕрдиреБрдмрдВрдз рдзрд╛рд░рдХ рдРрд╕реЗ рд▓реЗрдирджреЗрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЛ рдкреНрд░рддрд┐рднрд╛рдЧреА рдПрдХ-рджреВрд╕рд░реЗ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдиреБрдмрдВрдз рдХреЗ рдорд╛рд▓рд┐рдХ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╢рд░реНрдд рдкреВрд░реА рдХреА рдЬрд╛рддреА рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред


рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдВрдкрд░реНрдХ рдЬреЛрдбрд╝реЗрдВ:


 $ perigord add contract Market 

рдЙрдкрд╕рд░реНрдЧ .sol рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рдЕрдиреНрдп рдЕрдиреБрдмрдВрдз рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирдореВрдирд╛ рдЕрдиреБрдмрдВрдз Foo.sol рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдм рдЖрдк GOPATH рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛рдд рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди рд╕реЙрд▓рд┐рдбрд┐рдЯреА рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрдВрдЧреА: рдореБрдЦреНрдп рдмрд╛рдЬрд╛рд░ рдЕрдиреБрдмрдВрдз, рдпреЛрдЧреНрдп рдФрд░ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд╕рд╣рд╛рдпрдХ рдЕрдиреБрдмрдВрдз рдФрд░ рд╕реЗрдлрдореИрде рд▓рд╛рдЗрдмреНрд░реЗрд░реАред рдЖрдк рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред


рдЕрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реИ:


 . тФЬтФАтФА contracts тФВ тФЬтФАтФА Market.sol тФВ тФЬтФАтФА Ownable.sol тФВ тФФтФАтФА SafeMath.sol тФЬтФАтФА generate.go тФЬтФАтФА main.go тФЬтФАтФА migrations тФВ тФФтФАтФА 1_Migrations.go тФЬтФАтФА perigord.yaml тФЬтФАтФА stub тФВ тФЬтФАтФА README.md тФВ тФФтФАтФА main.go тФЬтФАтФА stub_test.go тФФтФАтФА tests тФФтФАтФА Foo.go 

EVM рдмрд╛рдпрдЯреЗрдХреЛрдб, ABI рдФрд░ рдЧреЛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛рдПрдВ:


 $ perigord build 

рдЙрди рд╕рднреА рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рддреИрдирд╛рдд рдХрд░реЗрдВрдЧреЗред рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ Market.sol рдХреА рддреИрдирд╛рддреА рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдирдпрд╛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЪрд╛рд╣рд┐рдП:


 $ perigord add migration Market 

рд╣рдорд╛рд░реЗ рдЕрдиреБрдмрдВрдз рдореЗрдВ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ {{NewContract} рдлрдВрдХреНрд╢рди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред:


 address, transaction, contract, err := bindings.Deploy{NewContract}(auth, network.Client(), тАЬFOOтАЭ, тАЬBARтАЭ) 

рдирдореВрдирд╛ рдлрд╝рд╛рдЗрд▓ Foo.go рд╣рдЯрд╛рдПрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдЕрдиреБрдмрдВрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ:


 $ perigord add test Market 

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


 func getMnemonic() string { viper.SetConfigFile("perigord.yaml") if err := viper.ReadInConfig(); err != nil { log.Fatal() } mnemonic := viper.GetStringMapString("networks.dev")["mnemonic"] return mnemonic } 

рдиреЗрдЯрд╡рд░реНрдХ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 func getNetworkAddress() string { viper.SetConfigFile("perigord.yaml") if err := viper.ReadInConfig(); err != nil { log.Fatal() } networkAddr := viper.GetStringMapString("networks.dev")["url"] return networkAddr } 

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


 func sendETH(s *MarketSuite, c *ethclient.Client, sender int, receiver common.Address, value *big.Int) { senderAcc := s.network.Accounts()[sender].Address nonce, err := c.PendingNonceAt(context.Background(), senderAcc) if err != nil { log.Fatal(err) } gasLimit := uint64(6721975) // in units gasPrice := big.NewInt(3700000000) wallet, err := hdwallet.NewFromMnemonic(getMnemonic()) toAddress := receiver var data []byte tx := types.NewTransaction(nonce, toAddress, value, gasLimit, gasPrice, data) chainID, err := c.NetworkID(context.Background()) if err != nil { log.Fatal(err) } privateKey, err := wallet.PrivateKey(s.network.Accounts()[sender]) signedTx, err := types.SignTx(tx, types.NewEIP155Signer(chainID), privateKey) if err != nil { log.Fatal(err) } ts := types.Transactions{signedTx} rawTx := hex.EncodeToString(ts.GetRlp(0)) var trx *types.Transaction rawTxBytes, err := hex.DecodeString(rawTx) err = rlp.DecodeBytes(rawTxBytes, &trx) err = c.SendTransaction(context.Background(), trx) if err != nil { log.Fatal(err) } } 

рдЕрдиреБрдмрдВрдз рдХреЙрд▓ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 func ensureAuth(auth bind.TransactOpts) *bind.TransactOpts { return &bind.TransactOpts{ auth.From, auth.Nonce, auth.Signer, auth.Value, auth.GasPrice, auth.GasLimit, auth.Context} } func changeAuth(s MarketSuite, account int) bind.TransactOpts { return *s.network.NewTransactor(s.network.Accounts()[account]) } 

рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛


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


 contractSession := contract.Session("Market") c.Assert(contractSession, NotNil) contractSessionActual, ok := contractSession.(*bindings.MarketSession) c.Assert(ok, Equals, true) c.Assert(contractSessionActual, NotNil) owner, _ := contractSessionActual.Owner() account0 := s.network.Accounts()[0] c.Assert(owner.Hex(), Equals, account0.Address.Hex()) //Owner account is account 0 

рдЕрдЧрд▓реА рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛ рд╡реЙрд▓реЗрдЯ рдХреЛ рдмрджрд▓ рд░рд╣реА рд╣реИ рдЬреЛ рдЕрдиреБрдмрдВрдз рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ:


 ownerInd := 0 sender := 5 receiver := 6 senderAcc := s.network.Accounts()[sender].Address receiverAcc := s.network.Accounts()[receiver].Address //Call contract on behalf of its owner auth := changeAuth(*s, ownerInd) _, err = contractSessionActual.Contract.SetSenderReceiverPair(ensureAuth(auth), senderAcc, receiverAcc) 

рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЙрд▓рд┐рдВрдЧ рдЕрдиреБрдмрдВрдз рдХреЛ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ, рдЪрд▓реЛ рдкреНрд░реЗрд╖рдХ рдХреА рдУрд░ рд╕реЗ рднреБрдЧрддрд╛рди рдХрд░реЗрдВ:


 auth = changeAuth(*s, sender) //Change auth fo senderAcc to make a deposit on behalf of the sender client, _ := ethclient.Dial(getNetworkAddress()) //Let's check the current balance balance, _ := client.BalanceAt(context.Background(), contract.AddressOf("Market"), nil) c.Assert(balance.Int64(), Equals, big.NewInt(0).Int64()) //Balance should be 0 //Let's transfer 3 ETH to the contract on behalf of the sender value := big.NewInt(3000000000000000000) // in wei (3 eth) contractReceiver := contract.AddressOf("Market") sendETH(s, client, sender, contractReceiver, value) balance2, _ := client.BalanceAt(context.Background(), contract.AddressOf("Market"), nil) c.Assert(balance2.Int64(), Equals, value.Int64()) //Balance should be 3 ETH 

рдкреВрд░реНрдг рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдпрд╣рд╛рдБ рд╣реИ ред


рдЕрдм stub_test.go рдЦреЛрд▓реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рднреА рдЖрдпрд╛рдд рдЖрдкрдХреЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╣реИ:


 import ( _ "market/migrations" _ "market/tests" "testing" . "gopkg.in/check.v1" ) 

рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ:


 $ perigord test 

рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╛рдж рдПрдХ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛:


 Running migration 2 Running migration 3 OK: 1 passed PASS ok market 0.657s 

рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рддреЛ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЪрд░рдгреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдПрдВред


рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ


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


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ PolySwarm рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХрд╛рдо рдФрд░ Inn4Science рджреНрд╡рд╛рд░рд╛ рдЬрд╛рд░реА рд░рдЦрд╛ рдЬрд╛рдирд╛ Go рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдФрд░ рдХрдо рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдШрдВрдЯреЛрдВ рддрдХ рдореБрдХреНрдд рд╣реЛрдЧрд╛ред

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


All Articles