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

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

рдЬрд╝реЗрдкреЗрд▓рд┐рди рдУрдПрд╕ рдПрдХ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдИрд╡реАрдПрдо рдкрд░ рдЙрдкрдХрд░рдг рдФрд░ рд╕реЗрд╡рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреЛ рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЬрд╝реЗрдкреЗрд▓рд┐рди рдЯреАрдо рдиреЗ рдЪрд╛рд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдШрдЯрдХреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреА, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
- рдЬрд╝реЗрдкреЗрд▓рд┐рди рдУрдПрд╕ рдХрд░реНрдиреЗрд▓ рдПрдХ рдЕрджреНрдпрддрди рдФрд░ рд╕рдореБрджрд╛рдп-рд╕рдВрдЪрд╛рд▓рд┐рдд "рдХреЛрд░" рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╣реИред рдЗрд╕рдореЗрдВ рдмреНрд▓реЙрдХрдЪреЗрди рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рд╕реЗ рдЬреБрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╛рдпрдирд┐рдпрд░ OpenZeppelin рдерд╛, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред
- рдЬрд╝реЗрдкреЗрд▓рд┐рди рдУрдПрд╕ рд╢реЗрдбреНрдпреВрд▓рд░ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рднрд╛рдЧреА рдХреЛ рдЧреИрд╕ рдХреА рд▓рд╛рдЧрдд рдХрд╛ рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░реЗрдЧрд╛ред
- рдЬрд╝реЗрдкреЗрд▓рд┐рди рдУрдПрд╕ рдорд╛рд░реНрдХреЗрдЯрдкреНрд▓реЗрд╕ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмреАрдЪ рдЗрдВрдЯрд░реЗрдХреНрд╢рди рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдШрдЯрдХ рд╣реИ, рдмреНрд▓реЙрдХрдЪреЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░рд╣ рдХрд╛ рдРрдк рд╕реНрдЯреЛрд░ / рдЧреВрдЧрд▓ рдкреНрд▓реЗред рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
- рдЬрд╝реЗрдкреЗрд▓рд┐рди рдУрдПрд╕ рдСрдл-рдЪреЗрди рдЯреВрд▓реНрд╕ - рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдХрд╛рдо рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯред
рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЖрдЬрдорд╛рдиреЗ рдХрд╛ рд╕рдордп!
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╝реЗрдкреЗрд▓рд┐рди рдУрдПрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдкрд╣рд▓рд╛ рдЕрдиреБрдмрдВрдз рд▓рд┐рдЦреЗрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рдм рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдзреЛрдЦрд╛ рджрд┐рдпрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЗрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди рднрдВрдбрд╛рд░рдг рдФрд░ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдЙрдкрдХрд░рдг рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред
рд╕рднреА рдЬрд╝реЗрдкреЗрд▓рд┐рди рдУрдПрд╕ рдкреНрд░рд▓реЗрдЦрди рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЬрд╝реЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
$ npm install --global zos
рдЕрдм рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА рдЬрд░реВрд░рдд рдХреА рд╕рднреА рдЪреАрдЬреЗрдВ рдмрдирд╛рдПрдВ:
$ mkdir zostest && cd zostest $ npm init $ zos init zostest
рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рдИ рдЬрд╛рдПрдВрдЧреА, рдЗрд╕рд▓рд┐рдП рдЕрдм рдЖрдк рдЕрдиреБрдмрдВрдз рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЕрдиреБрдмрдВрдз рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдЗрдП рдПрдХ рдЫреЛрдЯрд╛ "рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рднрдВрдбрд╛рд░" рд▓рд┐рдЦреЗрдВ:
pragma solidity 0.4.24; import "zos-lib/contracts/migrations/Migratable.sol"; contract SimpleStorage is Migratable { uint storedData; function initialize(uint256 _x) isInitializer("SimpleStorage", "0") public { storedData = _x; } function get() public constant returns (uint) { return storedData; } }
рд╣рдо рдЕрдкрдирд╛ рдЕрдиреБрдмрдВрдз рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
$ zos add SimpleStorage

рдкрд░реАрдХреНрд╖рдг рдиреЗрдЯрд╡рд░реНрдХ рдЪрд▓рд╛рдПрдВ (рдПрдХ рдЕрд▓рдЧ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ):
$ npx ganache-cli --port 9545
рдирдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ zos.local.json
рдмрдирд╛рддреЗ рд╕рдордп рд╣рдо рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдзрдХреНрдХрд╛ zos.local.json
:
$ zos push --network local

рдмрд╛рдд рдЫреЛрдЯреА рд╣реИ, рдпрд╣ рд╣рдорд╛рд░реЗ рдЕрджреНрдпрддрди рдЕрдиреБрдмрдВрдз рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╣рдорд╛рд░реЗ "рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА" рдХреЗ рд▓рд┐рдП рддрд░реНрдХ 88 рдХреЗ рд╕рд╛рде initialize()
рдЪрд▓рд╛рдПрдВ:
$ zos create SimpleStorage --init initialize --args 88 --network local

рдЕрдм "рд╕реНрдЯреЛрд░реЗрдЬ" рдореЗрдВ рдЪрд░ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрдВрдХреНрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣:
pragma solidity 0.4.24; import "zos-lib/contracts/migrations/Migratable.sol"; contract SimpleStorage is Migratable { uint storedData; function initialize(uint256 _x) isInitializer("SimpleStorage", "0") public { storedData = _x; } function incrementStorage(uint256 _x) public { storedData += _x; } function get() public constant returns (uint) { return storedData; } }
рдлрд┐рд░ рдЖрдкрдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЕрдиреБрдмрдВрдз рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
$ zos push --network local

$ zos update SimpleStorage --network local

рдЕрдм рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, truffle console
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
$ npx truffle console --network=local truffle(local)> sS = SimpleStorage.at(<proxy-address>)
рдФрд░ <proxy-address>
рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХреЙрд▓рдо рдореЗрдВ zos.local.json
рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА" рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рд╣рдо рдЪрд░ рдХреЛ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ:

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