рдХреЛрд░рдо рдмреНрд▓реЙрдХрдЪреИрди: рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ рдПрдХреАрдХрд░рдг

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░!


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


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


  • рдЬрд╛рд╡рд╛ 8
  • рдЧрд╛рдж 5.2.1
  • рд╡рд╕рдВрдд рдХреА рд░реВрдкрд░реЗрдЦрд╛
  • Web3j (Ethereum рдЬреИрд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп)
  • Web3j-quorum (рдХреЛрд░рдо рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдирд┐рдЬреА рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп)

рдХреЛрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА


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


рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдиреНрдХреНрд▓реЗрд╡ рд╕реЗрд╡рд╛рдПрдВ рднреА рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЖрдкрд╕ рдореЗрдВ рдирд┐рдЬреА рд▓реЗрдирджреЗрди рдХреЗ рднрдВрдбрд╛рд░рдг, рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдФрд░ рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рдЕрдм 2 рдРрд╕реА рдПрдиреНрдХреНрд▓реЗрд╡ рд╕реЗрд╡рд╛рдПрдВ рд╣реИрдВ:


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

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


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


рдЬрд╛рд╡рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╛рд╕


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдЬрд╛рд╡рд╛ / рд╕реНрдкреНрд░рд┐рдВрдЧ рдореЗрдВ рд▓рд┐рдЦрд╛ рдПрдХ рдЫреЛрдЯрд╛ RESTful API рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рдЧреНрд░реЗрдбрд▓ рдХреЗ рд╕рд╛рде рдмрд┐рд▓реНрдб рдФрд░ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдореИрдиреЗрдЬрдореЗрдВрдЯ рдЯреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рдХреЛ рдмреНрд▓реЙрдХрдЪреЗрди рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдЧрд╛, рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛ рдФрд░ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд╕реЗ рд╕реНрдЯреЗрдЯ рдХреЛ рдкрдврд╝реЗрдЧрд╛ред


рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдХреЛрд░рдо рдореЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ 2 рд▓реЗрдирджреЗрди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдореИрдВ рдЙрдиреНрд╣реЗрдВ 3 рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ:


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

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдмрд┐рд▓реНрдб рдлрд╝рд╛рдЗрд▓ gradle.build - gradle.build :


 plugins { id 'org.springframework.boot' version '2.1.6.RELEASE' id 'java' } apply plugin: 'io.spring.dependency-management' group = 'com.github' version = '1.0' sourceCompatibility = '1.8' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } test { testLogging.showStandardStreams = true } dependencies { implementation 'org.springframework.boot:spring-boot-starter-webflux' implementation group: 'org.web3j', name: 'quorum', version: '4.0.6' implementation group: 'org.web3j', name: 'core', version: '4.1.0' implementation group: 'org.web3j', name: 'codegen', version: '4.1.0' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'io.projectreactor:reactor-test' } task generateWrappers(type: JavaExec) { group 'Demo' description 'Generates wrappers for smart-contracts' classpath = sourceSets.main.runtimeClasspath main = 'com.github.quorum.utils.WrappersGenerator' } 

рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:


  1. org.web3j.core - рдХреЛрд░рдо рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ org.web3j.core рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд▓реЗрдирджреЗрди рдкрд░ рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛
  2. org.web3j.quorum - рдХреЛрд░рдо рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдирд┐рдЬреА рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛
  3. org.web3j.codegen - org.web3j.codegen рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП org.web3j.codegen рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛
  4. рдЬреЗрдирд░рд╡реИрдкрд░реНрд╕ - рд╕реЙрд▓рд┐рдбрд┐рдЯреА рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд╕реЗ рдЬрд╛рд╡рд╛ рд░реИрдкрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░реИрдбрд▓-рдЯрд╛рд╕реНрдХ

рдЕрдЧрд▓рд╛, рдореИрдВ рдЖрдкрдХреЛ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рдХреЛрдб QuorumDemo.sol рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: QuorumDemo.sol рдлрд╝рд╛рдЗрд▓:


 pragma solidity 0.5.0; /** * @dev Smart-Contract for demonstration purposes. */ contract QuorumDemo { string public user; /** * @dev Rewrite user name in storage. */ function writeUser(string calldata _user) public { user = _user; } } 

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


  • string public user - рдкреНрд░рдХрд╛рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рдирд╛рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЪрд░ред рдЬрд╛рд╡рд╛ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕реЙрд▓рд┐рдбрд┐рдЯреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЗрдЯреНрдЯрд░ рдмрдирд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  • function writeUser(...) - рдПрдХ рдЪрд░ рдХреЗ рдорд╛рди рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ - рд╕реЗрдЯрд░ ред

рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд╕реЗ Java-wrapper рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрд┐рд╕реА рднреА рдирд╛рдо рдХреЗ рд╕рд╛рде src/main/solidity/contracts QuorumDemo.sol src/main/solidity/contracts рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ QuorumDemo.sol , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП QuorumDemo.sol ред
рдЕрдЧрд▓рд╛, рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЧреНрд░реИрдбрд▓-рд╡рд░реНрдХ рдЬреЗрдирд░реЗрдЯрд░реНрд╕ рдЪрд▓рд╛рдПрдВ:


 gradle generateWrappers 

рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, src/main/java/com/github/quorum/component/wrappers Java-рдЖрд╡рд░рдг рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Java рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


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


 public static String getBinary() { return BINARY; } public static String getDataOnWriteUser(final String user) { final Function function = new Function( FUNC_WRITEUSER, Arrays.asList(new Utf8String(user)), Collections.emptyList() ); return FunctionEncoder.encode(function); } 

рдЙрдиреНрд╣реЗрдВ рдЙрддреНрдкрдиреНрди рдЬрд╛рд╡рд╛-рдЖрд╡рд░рдг рдореЗрдВ рдбрд╛рд▓рдХрд░, рдЖрдк рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рдкреЗрд▓реЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдирд┐рдЬреА рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде, рдмреНрд▓реЙрдХрдЪреИрди рдореЗрдВ рд▓реЗрдирджреЗрди рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ 2 рдмрдирд╛рдП:


  1. рдирд┐рдЬреА рд▓реЗрдирджреЗрди рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП TesseraTransactionManager
  2. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд▓реЗрдирджреЗрди рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП GethTransactionManager

рдЪрд▓реЛ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рд▓реЗ рдЬрд╛рдПрдВред TesseraTransactionManager рдХреЛрдб:


 @Slf4j public class TesseraTransactionManager implements TransactionManager { private static final byte ATTEMPTS = 20; private static final int SLEEP_DURATION = 100; private final Quorum quorum; private final String fromAddress; private final QuorumTransactionManager quorumTxManager; private final TransactionReceiptProcessor txReceiptProcessor; public TesseraTransactionManager( Quorum quorum, Credentials credentials, String publicKey, List<String> privateFor, Tessera tessera ) { this.quorum = quorum; this.fromAddress = credentials.getAddress(); this.quorumTxManager = new QuorumTransactionManager(quorum, credentials, publicKey, privateFor, tessera); this.txReceiptProcessor = new PollingTransactionReceiptProcessor(quorum, SLEEP_DURATION, ATTEMPTS); } @Override public TransactionReceipt executeTransaction( final BigInteger gasPrice, final BigInteger gasLimit, final String to, final String data) { while (true) { try { final EthSendTransaction ethSendTx = sendTransaction(gasPrice, gasLimit, to, data); if (ethSendTx.hasError() && NONCE_TOO_LOW_ERROR_MESSAGE.equals(ethSendTx.getError().getMessage())) { log.warn("[BLOCKCHAIN] try to re-send transaction cause error {}", ethSendTx.getError().getMessage()); continue; } return processResponse(ethSendTx); } catch (TransactionException ex) { log.error("[BLOCKCHAIN] exception while receiving TransactionReceipt from Quorum node", ex); throw new RuntimeException(ex); } catch (Exception ex) { log.error("[BLOCKCHAIN] exception while sending transaction to Quorum node", ex); throw new RuntimeException(ex); } } } private EthSendTransaction sendTransaction( final BigInteger gasPrice, final BigInteger gasLimit, final String to, final String data) throws IOException { final BigInteger nonce = getNonce(); final RawTransaction rawTransaction = RawTransaction.createTransaction(nonce, gasPrice, gasLimit, to, data); return this.quorumTxManager.signAndSend(rawTransaction); } private TransactionReceipt processResponse(final EthSendTransaction transactionResponse) throws IOException, TransactionException { if (transactionResponse.hasError()) { throw new RuntimeException( "[BLOCKCHAIN] error processing transaction request: " + transactionResponse.getError().getMessage() ); } final String transactionHash = transactionResponse.getTransactionHash(); return this.txReceiptProcessor.waitForTransactionReceipt(transactionHash); } private BigInteger getNonce() throws IOException { final EthGetTransactionCount ethGetTxCount = this.quorum.ethGetTransactionCount( this.fromAddress, DefaultBlockParameterName.PENDING).send(); return ethGetTxCount.getTransactionCount(); } } 

  • TransactionReceipt executeTransaction(...) - рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд▓реЗрдирджреЗрди рдХрд░рдиреЗ рдФрд░ рдпрджрд┐ рд╡реЗ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ред рд▓реЗрдирджреЗрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИ;
  • EthSendTransaction sendTransaction(...) - EthSendTransaction sendTransaction(...) рд▓реЗрдирджреЗрди рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдФрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ред рд▓реЗрдирджреЗрди рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдЙрд╕рдХреЗ рд╣реИрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИ;
  • TransactionReceipt processResponse(...) - рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рд▓реЗрдирджреЗрди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж TransactionReceipt рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддреА рд╣реИ;
  • BigInteger getNonce() - рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ " BigInteger getNonce() " рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдФрд░ GethTransactionManager рдХреЛрдб:


 @Slf4j public class GethTransactionManager extends FastRawTransactionManager implements TransactionManager { private static final byte ATTEMPTS = 20; private static final int SLEEP_DURATION = 100; private final TransactionReceiptProcessor txReceiptProcessor; public GethTransactionManager(Web3j web3j, Credentials credentials) { this(web3j, credentials, new PollingTransactionReceiptProcessor(web3j, SLEEP_DURATION, ATTEMPTS)); } public GethTransactionManager(Web3j web3j, Credentials credentials, TransactionReceiptProcessor txReceiptProcessor) { super(web3j, credentials, txReceiptProcessor); this.txReceiptProcessor = txReceiptProcessor; } @Override public TransactionReceipt executeTransaction( final BigInteger gasPrice, final BigInteger gasLimit, final String to, final String data) { while (true) { try { final EthSendTransaction ethSendTx = sendTransaction(gasPrice, gasLimit, to, data, BigInteger.ZERO); if (ethSendTx != null && ethSendTx.hasError() && NONCE_TOO_LOW_ERROR_MESSAGE.equals(ethSendTx.getError().getMessage())) { log.warn("[BLOCKCHAIN] try to re-send transaction cause error: {}", ethSendTx.getError().getMessage()); continue; } return this.txReceiptProcessor.waitForTransactionReceipt(ethSendTx.getTransactionHash()); } catch (TransactionException ex) { log.error("[BLOCKCHAIN] exception while receiving TransactionReceipt from Quorum node", ex); throw new RuntimeException(ex); } catch (IOException ex) { log.error("[BLOCKCHAIN] exception while sending transaction to Quorum node", ex); throw new RuntimeException(ex); } } } @Override public EthSendTransaction sendTransaction( final BigInteger gasPrice, final BigInteger gasLimit, final String to, final String data, final BigInteger value ) throws IOException { return super.sendTransaction(gasPrice, gasLimit.add(BigInteger.valueOf(21_000L)), to, data, value); } } 

  • TransactionReceipt executeTransaction(...) - рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд▓реЗрдирджреЗрди рдХрд░рдиреЗ рдФрд░ рдпрджрд┐ рд╡реЗ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ред рд▓реЗрдирджреЗрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИ;
  • EthSendTransaction sendTransaction(...) рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ EthSendTransaction sendTransaction(...) рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред

рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░:


 @Slf4j @Component public class RequestHandler { private final Web3j web3j; private final Quorum quorum; private final Tessera tessera; private final Credentials credentials; private final BlockchainConfig blockchainConfig; private String deployedContract; @Autowired public RequestHandler( @Qualifier("initWeb3j") Web3j web3j, Quorum quorum, Tessera tessera, Credentials credentials, BlockchainConfig blockchainConfig ) { this.web3j = web3j; this.quorum = quorum; this.tessera = tessera; this.credentials = credentials; this.blockchainConfig = blockchainConfig; } /** * Deploy new smart-contract. * * @param serverRequest * - {@link ServerRequest} object with request information * @return {@link ServerResponse} object with response data */ public Mono<ServerResponse> deployContract(final ServerRequest serverRequest) { return serverRequest .bodyToMono(APIRequest.class) .map(this::getTransactionManager) .map(this::deployContract) .flatMap(this::generateResponse); } private TransactionManager getTransactionManager(final APIRequest apiRequest) { log.info("[HANDLER] privateFor = {}", apiRequest.getPrivateFor()); TransactionManager txManager; if (isPrivate(apiRequest.getPrivateFor())) { if (apiRequest.getPrivateFor().size() == 0) { apiRequest.getPrivateFor().add(this.blockchainConfig.getTesseraPublicKey()); } txManager = new TesseraTransactionManager(this.quorum, this.credentials, this.blockchainConfig.getTesseraPublicKey(), apiRequest.getPrivateFor(), this.tessera); } else { txManager = new GethTransactionManager(this.web3j, this.credentials); } return txManager; } private boolean isPrivate(final List<String> limitedTo) { return limitedTo == null || limitedTo.size() == 0 || !limitedTo.get(0).equals("public"); } private APIResponse deployContract(final TransactionManager txManager) { log.info("[HANDLER] deploying new smart-contract"); final String data = QuorumDemo.getBinary(); final TransactionReceipt txReceipt = txManager.executeTransaction(GAS_PRICE, DEPLOY_GAS_LIMIT, null, data); final APIResponse apiResponse = APIResponse.newInstance(txReceipt); this.deployedContract = txReceipt.getContractAddress(); log.info("[HANDLER] contract has been successfully deployed. Result: {}", apiResponse.getMap()); return apiResponse; } private Mono<ServerResponse> generateResponse(final APIResponse apiResponse) { return ServerResponse .ok() .body(Mono.just(apiResponse.getMap()), Map.class); } /** * Send transaction on update user in smart-contract. * * @param serverRequest * - {@link ServerRequest} object with request information * @return {@link ServerResponse} object with response data */ public Mono<ServerResponse> updateUser(final ServerRequest serverRequest) { return serverRequest .bodyToMono(APIRequest.class) .map(this::sendTransaction) .flatMap(this::generateResponse); } private APIResponse sendTransaction(final APIRequest apiRequest) { final TransactionManager txManager = getTransactionManager(apiRequest); log.info("[HANDLER] sending new transaction"); final String data = QuorumDemo.getDataOnWriteUser(apiRequest.getUser()); final TransactionReceipt txReceipt = txManager.executeTransaction(GAS_PRICE, TX_GAS_LIMIT, this.deployedContract, data); final APIResponse apiResponse = APIResponse.newInstance(txReceipt); log.info("[HANDLER] transaction has been successfully executed. Result: {}", apiResponse.getMap()); return apiResponse; } /** * Read user from smart-contract. * * @param serverRequest * - {@link ServerRequest} object with request information * @return {@link ServerResponse} object with response data */ public Mono<ServerResponse> getUser(final ServerRequest serverRequest) { final APIResponse apiResponse = getUser(); return generateResponse(apiResponse); } private APIResponse getUser() { log.info("[HANDLER] reading user from smart-contract"); final QuorumDemo quorumDemo = QuorumDemo.load(this.deployedContract, this.web3j, this.credentials, new StaticGasProvider(GAS_PRICE, DEPLOY_GAS_LIMIT)); final String user = readUserFromSmartContract(quorumDemo); final APIResponse apiResponse = APIResponse.newInstance(user); log.info("[HANDLER] user: '{}'", user); return apiResponse; } private String readUserFromSmartContract(final QuorumDemo quorumDemo) { try { return quorumDemo.user().send().getValue(); } catch (Exception ex) { log.info("[HANDLER] exception while reading user from smart-contract: {}", ex); return null; } } } 

рдЕрдм рдореИрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреМрди рд╕реЗ рддрд░реАрдХреЗ рдХреНрдпрд╛ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред
Mono<ServerResponse> deployContract(...) рд╡рд┐рдзрд┐ Mono<ServerResponse> deployContract(...) - рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдФрд░ рдирд┐рдЬреА рджреЛрдиреЛрдВ рддрд░рд╣ рд╕реЗ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рдХреЛ Mono<ServerResponse> deployContract(...) рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
TransactionManager getTransactionManager(...) рд╡рд┐рдзрд┐ TransactionManager getTransactionManager(...) - рд▓реЗрди-рджреЗрди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЕрдиреБрд░реЛрдз рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ PrivateFor рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдЧрд╛, рдЬреЛ рдЯреЗрд╕реЗрд░рд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХреЗ рддрд╛рд░реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред
boolean isPrivate(...) рд╡рд┐рдзрд┐ boolean isPrivate(...) - "рд╕рд╣реА" рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдкреНрд░рд╛рдЗрд╡реЗрдЯрдлрд╝реЛрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рддреЛ рдЦрд╛рд▓реА ( рдирд┐рдЬреА рд▓реЗрдирджреЗрди) рд╣реИ рдпрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА ( рдЕрдиреБрдорддрд┐ рдкреНрд░рд╛рдкреНрдд рд▓реЗрдирджреЗрди) рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред рдпрджрд┐ рдирд┐рдЬреАрдлрд╝реЙрд░реНрдо рдкреИрд░рд╛рдореАрдЯрд░ рд░рд┐рдХреНрдд рдирд╣реАрдВ рд╣реИ, рддреЛ "рдЧрд▓рдд" рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд╣рд▓рд╛ рдПрд░реЗ рддрддреНрд╡ "рдкрдмреНрд▓рд┐рдХ" рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред
APIResponse deployContract(...) рд╡рд┐рдзрд┐ - APIResponse deployContract(...) рдХреЛ рддреИрдирд╛рддреА рд▓реЗрдирджреЗрди рднреЗрдЬрддрд╛ рд╣реИред
Mono<ServerResponse> generateResponse(...) рд╡рд┐рдзрд┐ Mono<ServerResponse> generateResponse(...) - рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдкреНрд░рддрд┐рд╕рд╛рдж рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
Mono<ServerResponse> updateUser(...) рд╡рд┐рдзрд┐ Mono<ServerResponse> updateUser(...) - рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
APIResponse sendTransaction(...) рд╡рд┐рдзрд┐ - APIResponse sendTransaction(...) рдПрдХ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рд▓реЗрдирджреЗрди рднреЗрдЬрддрд╛ рд╣реИред
APIResponse getUser() рд╡рд┐рдзрд┐ - рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддрд╛ рд╣реИред
String readUserFromSmartContract(...) рд╡рд┐рдзрд┐ String readUserFromSmartContract(...) - рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рд╕реЗ рд╕реНрдерд┐рддрд┐ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред


рдкреВрд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб GitHub рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдПрдХ рд▓рд┐рдВрдХ рдЬреЛ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣реЛрдЧрд╛ред


рдирд┐рд░реАрдХреНрд╖рдг


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


рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд▓реЗрдирджреЗрди


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


 gradle test --tests *.PublicTransactionsTests 

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


 [HANDLER] privateFor = [public] [HANDLER] deploying new smart-contract [HANDLER] contract has been successfully deployed. Result: {contract_address=0xf9425b94e459805da09950f5988071692d925097, transaction_hash=0x31bc179f8cd12c640d1663f3df51ce6da1fbc2875f2b724c3911108fcd19a5d0} [HANDLER] privateFor = [public] [HANDLER] sending new transaction [HANDLER] transaction has been successfully executed. Result: {contract_address=null, transaction_hash=0x33ba66d5deec33f3142bfa190a0d37d0ff07c2e66b06037f5b5ff9578154a3ff} [HANDLER] reading user from smart-contract [HANDLER] user: 'Public Test User' 

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпреЗ рд▓реЙрдЧ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА 3 рдСрдкрд░реЗрд╢рди рд╕рдлрд▓ рд░рд╣реЗ рдереЗред рдкрд╣рд▓реЗ 3 рд▓реЙрдЧ - рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рдХреА рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рдЕрдЧрд▓реЗ 3 рд▓реЙрдЧ - рд▓реЗрди-рджреЗрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рдФрд░ рдЕрдВрддрд┐рдо 2 - рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдПред
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЕрдиреБрдмрдВрдз рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╣рдо contract_address рджреЗрдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд▓реЗрдирджреЗрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ - рдирд╣реАрдВ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рджреВрд╕рд░реА рдмрд╛рд░ рд╣рдо рдЕрдиреБрдмрдВрдз рдХреЛ рддреИрдирд╛рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рдкрд░ рд▓реЗрдирджреЗрди рдХрд░рддреЗ рд╣реИрдВред


рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ Geth рд╣рдореЗрдВ рдХреНрдпрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ , рдЧреНрд░рд╛рд╣рдХ рдХреА Geth рдкреНрд░рдХреНрд░рд┐рдпрд╛ IPC рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:


 geth attach /path/to/ipc 

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


 web3.eth.getTransactionReceipt('0x31bc179f8cd12c640d1663f3df51ce6da1fbc2875f2b724c3911108fcd19a5d0'); 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦрддреЗ рд╣реИрдВ:



рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:


  • "contractAddress" - рдпрджрд┐ "рд╢реВрдиреНрдп" рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рдХреА рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдирджреЗрди рд╣реИ;
  • "рд╕реНрдерд┐рддрд┐" - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ "0x1" рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ - рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд▓реЗрдирджреЗрди рд╕рдлрд▓ рдерд╛ред

рдФрд░ рдЪрд▓рд┐рдП рд▓реЗрди-рджреЗрди рдХреЛ рд╣реА рджреЗрдЦрддреЗ рд╣реИрдВред рдХрдорд╛рдВрдб рдЪрд▓рд╛рдХрд░:


 web3.eth.getTransaction('0x31bc179f8cd12c640d1663f3df51ce6da1fbc2875f2b724c3911108fcd19a5d0'); 

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



рдпрд╣рд╛рдБ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:


  • "рдЗрдирдкреБрдЯ" рдПрдХ рдкреЗрд▓реЛрдб рд▓реЗрдирджреЗрди рд╣реИ;
  • "v" - рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдбрд┐рдЬрд┐рдЯрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдИрд╕реАрдбреАрдПрд╕рдП рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдХреБрдЫ рдФрд░ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ - рдЪрд░ рдХрд╛ рдЕрд░реНрдеред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдФрд░ рдирд┐рдЬреА рд▓реЗрдирджреЗрди рдореЗрдВ рдпрд╣ рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред "Ix1c" ("рджрд╢рдорд▓рд╡ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ 28") рдФрд░ "0x1b" ("рджрд╢рдорд▓рд╡ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ 27") рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВ, рдФрд░ "0x25" ("рджрд╢рдорд▓рд╡ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ 37") рдФрд░ "0x26 (" 38 "рджрд╢рдорд▓рд╡ рдореЗрдВ) рдкреНрд░рдгрд╛рд▓реА) - рдпреЗ рдирд┐рдЬреА рд▓реЗрдирджреЗрди рдХреЛрдб рд╣реИрдВред

рдЖрдк рдпрд╣ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреНрдп рдиреЛрдбреНрд╕ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛ рд╣рдордиреЗ рджреЗрдЦреА рдереА, рдЙрд╕рд╕реЗ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реИред


рдЕрдм рдЖрдк рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рдХреЗ рд▓реЗрдирджреЗрди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ:


 web3.eth.getTransactionReceipt('0x33ba66d5deec33f3142bfa190a0d37d0ff07c2e66b06037f5b5ff9578154a3ff'); 

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



рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:


  • "рдЯреВ" - рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд▓реЗрдирджреЗрди рд╕рд┐рд░реНрдл рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рдХреЗ рд▓рд┐рдП рдЧрдпрд╛ рдерд╛;
  • "рд╕реНрдерд┐рддрд┐" - рдпрд╣ "0x1" рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд▓реЗрдирджреЗрди рд╕рдлрд▓ рдерд╛ред

рд▓реЗрди-рджреЗрди:



рдХреБрдЫ рднреА рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЕрдиреНрдп рдиреЛрдбреНрд╕ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИред


рдирд┐рдЬреА рд▓реЗрди-рджреЗрди


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


 gradle test --tests *.PrivateTransactionsTests 

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


рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЙрдЧ рд▓рд┐рдЦреЗрдЧрд╛:


 [HANDLER] privateFor = [] [HANDLER] deploying new smart-contract [HANDLER] contract has been successfully deployed. Result: {contract_address=0x3e2284d92842f781b83cc7e56fbb074ab15f9a90, transaction_hash=0x8fd619bd9a526f83e29d7b417551e174862f7503ef430eb45793509d05039595} [HANDLER] privateFor = [] [HANDLER] sending new transaction [HANDLER] transaction has been successfully executed. Result: {contract_address=null, transaction_hash=0x72a0458a7b313c8a1c18269ae160e140c6a6e41cb2fd087c64cf665b08a6aefb} [HANDLER] reading user from smart-contract [HANDLER] user: 'Private Test User' 

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдореЗрдВ рдмрджрд▓рд╛рд╡, рдкреНрд░рд╛рдЗрд╡реЗрдЯрдлрд╝реЛрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ - рдЕрдм рдЗрд╕рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рдХрд╛ рдореВрд▓реНрдп рд╣реИред
TransactionReceipt рд▓рд┐рдП TransactionReceipt рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред рдЯреАрдо:


 web3.eth.getTransactionReceipt('0x8fd619bd9a526f83e29d7b417551e174862f7503ef430eb45793509d05039595'); 

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



рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд▓реЗрди-рджреЗрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рд╕реЗ, рдпрд╣ рдХрд╣рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЖрдк рд▓реЗрдирджреЗрди рдкрд░ рдЦрд░реНрдЪ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЧреИрд╕ рдХреА рд░рд╛рд╢рд┐ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗ - GasUsed рдФрд░ рд╕рдВрдЪрдпреА GasUsed рдХрд╛ рдореВрд▓реНрдп "0" рд╣реИред
рдЕрдм рд╣рдо рд▓реЗрди-рджреЗрди рдХреЛ рд╣реА рджреЗрдЦреЗрдВред рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ:


 web3.eth.getTransaction('0x8fd619bd9a526f83e29d7b417551e174862f7503ef430eb45793509d05039595'); 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рдЗрд╕реЗ рджреЗрдЦреЗрдВрдЧреЗ:



рдЗрд╕ рд▓реЗрдирджреЗрди рдореЗрдВ рдХреНрдпрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ:


  1. рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреЗрд▓реЛрдб рд▓реЗрдирджреЗрди рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдореЗрдВ 64 рдмрд╛рдЗрдЯреНрд╕ (128 рд╡рд░реНрдгреЛрдВ) рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░реЗрдЦрд╛ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред рдпрд╣ рд░реЗрдЦрд╛ рдЯреЗрд╕реЗрд░рд╛ рднрдВрдбрд╛рд░ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ, рдЖрдк рдЯреЗрд╕реЗрд░рд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  2. "v" - рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд▓реЗрдирджреЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдб "0x1c" рдпрд╛ "0x1b" рдХреЗ рдмрдЬрд╛рдп, рдирд┐рдЬреА рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ "0x26" рдпрд╛ "0x25" рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

рдЕрдм рдЕрдиреБрдмрдВрдз рдХреА рд╕реНрдерд┐рддрд┐ (рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдЬреНрдЮрд╛рдУрдВ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ) рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП TransactionReceipt рдФрд░ рд▓реЗрдирджреЗрди рдХреЛ рд╕реНрд╡рдпрдВ рджреЗрдЦреЗрдВред рдкрд░рд┐рдгрд╛рдо:




рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╣рдо рдЗрд╕ рдирд┐рдЬреА рд▓реЗрдирджреЗрди рд╕реЗ рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рд╕реАрдЦреЗрдВрдЧреЗред


рдЕрдиреБрдорддрд┐ рдХреЗ рд▓реЗрди-рджреЗрди


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


 gradle test --tests *.PermissionTransactionsTests 

рдЬрд╛рд╡рд╛ рдПрдкреАрдЖрдИ рд▓реЙрдЧ:


 [HANDLER] privateFor = [wQTHrl/eqa7TvOz9XJcazsp4ZuncfxHb8c1J1njIOGA=] [HANDLER] deploying new smart-contract [HANDLER] contract has been successfully deployed. Result: {contract_address=0xf1cc0ba22bd0d18fc9acb22dd57795a3f2fb4ebd, transaction_hash=0x585980bec88aa8a0fe5caffe6d6f24b82d3cd381fcf72fdd8e2102ce67799f01} [HANDLER] privateFor = [wQTHrl/eqa7TvOz9XJcazsp4ZuncfxHb8c1J1njIOGA=] [HANDLER] sending new transaction [HANDLER] transaction has been successfully executed. Result: {contract_address=null, transaction_hash=0x47edc0d00fa9447b2da9f5a78f44602f96145497238cb1ce1d879afb351a3cbe} [HANDLER] reading user from smart-contract [HANDLER] user: 'Permissioned Test User' 

рдирдП рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз, TransactionReceipt рдФрд░ рд╕реНрд╡рдпрдВ рд▓реЗрдирджреЗрди рдХреА рддреИрдирд╛рддреА рдкрд░, Geth рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреНрд░рдорд╢рдГ:




рдФрд░ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рд▓реЗрдирджреЗрди, TransactionReceipt рдФрд░ рд╕реНрд╡рдпрдВ рд▓реЗрдирджреЗрди:




HTTP рдЕрдиреБрд░реЛрдз


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


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

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, "рдПрдВрдбреЛрдкрд┐рдВрдЯ" рдореЗрдВ рдПрдХ рд╣реЛрд╕реНрдЯ рд╣реЛрдЧрд╛ - рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ - рд▓реЗрдХрд┐рди 3 рдХреЛрд░рдо рдиреЛрдб рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреЛрд░реНрдЯ: 22000 (рдЗрд╕ рдиреЛрдб рд╕реЗ рд╕рднреА рд▓реЗрдирджреЗрди рдХрд┐рдП рдЧрдП рдереЗ), 22001 (рдЗрд╕рдХреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдЕрдиреБрдордд рд▓реЗрдирджреЗрди рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЧрдИ рдереА), 22002 (рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП) рдЬрд╛рдирдХрд╛рд░реА)ред


рдЖрдЗрдП рдПрдХ рдирд┐рдЬреА рд▓реЗрдирджреЗрди рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ (рдХреЗрд╡рд▓ 22000 рдкреЛрд░реНрдЯ рдкрд░ рдПрдХ рдиреЛрдб рдХреЛ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред


рд▓реЗрдирджреЗрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдб рдкрд░ CURL рдЕрдиреБрд░реЛрдз:


 curl -X POST \ http://127.0.0.1:8080/user \ -H 'Content-Type: application/json' \ -d '{ "endpoint": "http://127.0.0.1:22000", "contractAddress": "0x3e2284d92842f781b83cc7e56fbb074ab15f9a90" }' 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рд╛:


 {"data":{"user":"Private Test User"}} 

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдиреЛрдб рдореЗрдВ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред


рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ 22001 рдкреЛрд░реНрдЯ рдкрд░ рдиреЛрдб рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИред CURL рдЕрдиреБрд░реЛрдз:


 curl -X POST \ http://127.0.0.1:8080/user \ -H 'Content-Type: application/json' \ -d '{ "endpoint": "http://127.0.0.1:22001", "contractAddress": "0x3e2284d92842f781b83cc7e56fbb074ab15f9a90" }' 

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! :


 {"data":{"status_code":500,"description":"Something went wrong"}} 

, - тАФ !


, 3- . CURL :


 curl -X POST \ http://127.0.0.1:8080/user \ -H 'Content-Type: application/json' \ -d '{ "endpoint": "http://127.0.0.1:22002", "contractAddress": "0x3e2284d92842f781b83cc7e56fbb074ab15f9a90" }' 

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! API :


 {"data":{"status_code":500,"description":"Something went wrong"}} 

, . "permissioned" .


CURL "permissioned" - , 22000:


 curl -X POST \ http://127.0.0.1:8080/user \ -H 'Content-Type: application/json' \ -d '{ "endpoint": "http://127.0.0.1:22000", "contractAddress": "0xf1cc0ba22bd0d18fc9acb22dd57795a3f2fb4ebd" }' 

:


 {"data":{"user":"Permissioned Test User"}} 

, , , .


- , -, . CURL :


 curl -X POST \ http://127.0.0.1:8080/user \ -H 'Content-Type: application/json' \ -d '{ "endpoint": "http://127.0.0.1:22001", "contractAddress": "0xf1cc0ba22bd0d18fc9acb22dd57795a3f2fb4ebd" }' 

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! :


 {"data":{"user":"Permissioned Test User"}} 

, , . CURL :


 curl -X POST \ http://127.0.0.1:8080/user \ -H 'Content-Type: application/json' \ -d '{ "endpoint": "http://127.0.0.1:22002", "contractAddress": "0xf1cc0ba22bd0d18fc9acb22dd57795a3f2fb4ebd" }' 

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! -. .


рдирд┐рд╖реНрдХрд░реНрд╖


, Quorum blockchain Java . , - .


:


  1. Quorum
  2. Quorum
  3. GitHub
  4. Quorum Slack

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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


All Articles