OpenZeppelinTransparentProxy
κ° μ§μλλ κ²μ νμΈνμ΅λλ€. κ°κΉμ΄ μ₯λμ UUPS νλ‘μ μ§μμ μΆκ°ν κ³νμ΄ μμ΅λκΉ?
κΈ°λ³Έμ μΌλ‘ μ§μν κ³νμ΄μ§λ§ νμ¬λ‘μλ hardhat-deployμ ν¨κ» μ¬μ©ν μ μμ΅λλ€. νλ‘μ jistλ νΈνμ±μ μ μ§νκΈ° μν΄ μμ±μμ λλ―Έ/λ―Έμ¬μ© μμ μ μΈμκ° μμ΄μΌ ν©λλ€.
νλ‘μ jistλ νΈνμ±μ μ μ§νκΈ° μν΄ μμ±μμ λλ―Έ/λ―Έμ¬μ© μμ μ μΈμκ° μμ΄μΌ ν©λλ€.
UUPSλ₯Ό μ¬μ©νλ κ²μ΄ λ μ΄μ λμμ΄ λμ§ μμ΅λκΉ? UUPSλ₯Ό μ¬μ©νλ μ΄μ λ νλ‘μκ° νΈμΆνλ κ΄λ¦¬μμΈμ§ νμΈν νμκ° μκΈ° λλ¬Έμ νΈλμμ νΈμΆμ κ°μ€λ₯Ό μ μ½νκΈ° μν κ²μ λλ€.
λ΄κ° λμΉ κ²μΌ μλ μμ΅λλ€. μμ¬ μ½λλ‘ uups νλ‘μ(μ¬μ©νμ§ μλ μΈμ ν¬ν¨)μ ν¨κ» hardhat-deployλ₯Ό μ¬μ©νλ λ°©λ²μ μμΈν μ€λͺ ν μ μμ΅λκΉ?
κ°μ¬ ν΄μ
κ·Έκ²μ κ°μ€μ μν₯μ λ―ΈμΉμ§ μμΌλ©° hardhat-deployκ° μ½λ λ³κ²½ μμ΄ λ°°ν¬ν μ μλλ‘ λλ―Έ μΈμμΌ λΏμ
λλ€. μμ±μλ ν΄λΉ μΈμλ‘ μ무κ²λ ν νμκ° μμ΅λλ€.
λΉ λ₯Έ μμΌ λ΄μ λ³κ²½ μμ΄ μλνλλ‘ λ³κ²½ν μ μλμ§ νμΈνλ €κ³ ν©λλ€. νλ‘μμ λν μμ±μ μΈμλ₯Ό μ§μ νκ±°λ λ¨μν UUPS νλ‘μμμ μ§μ ν μ μλ μμ λ³κ²½μ΄μ΄μΌ ν©λλ€.
κ°μ¬ν©λλ€ @wighawag , λ§μΉ¨λ΄ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
κ΄μ¬ μλ μ¬λλ€μ μν΄ μ΄ κ³μ½μ λ§λ€μμ΅λλ€.
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
// Kept for backwards compatibility with older versions of Hardhat and Truffle plugins.
contract UUPSProxy is ERC1967Proxy {
constructor(
address _logic,
address, // This is completely unused by the uups proxy, required to remain compatible with hardhat deploy: https://github.com/wighawag/hardhat-deploy/issues/146
bytes memory _data
) payable ERC1967Proxy(_logic, _data) {}
}
κ·Έλ° λ€μ λ΄ λ°°ν¬λ λ€μκ³Ό κ°μ΅λλ€( proxyContract: "UUPSProxy"
κ° μ€μν λΆλΆμ).
await deploy(CONTRACT, {
from: deployer,
proxy: {
proxyContract: "UUPSProxy",
// ... your other config, initializers etc
},
log: true,
});
@JasoonS UUPSProxy
κ³μ½ μ½λμ λͺ©μ μ λͺ
νν ν΄μ£Όμ€ μ μμ΅λκΉ? hardhat-deployκ° μ€μ νλ‘μ μμ±μμ μΈν°νμ΄μ€λ₯Ό μ μ μλλ‘ λλ―Έ κ³μ½μ
λκΉ? μλλ©΄ μ€μ λ‘ λ°°ν¬λλ νλ‘μ κ³μ½κ³Ό μ΄λ»κ² λ κ΄λ ¨μ΄ μμ΅λκΉ?
admin
μ μν μ μ νν 무μμ΄λ©° deployer
(=upgrade admin) λλ νλλ₯Ό μλ΅ν΄λ μ€λ₯κ° λ°μν©λλ€.
proxy: {
proxyContract: "UUPSProxy",
execute: {
methodName: "initialize",
args: [admin],
},
},
@marceljay λ°μν μ€λ₯λ₯Ό (νμ) λΆμ¬λ£μΌμΈμ :-)
μλ νμΈμ @aspiers , μ λ hardhat-deployλ₯Ό κΉμ΄ νκ³ λ€μ§ μμμΌλ―λ‘ @wighawagλ₯Ό μμ νμμμ€. κ·Έλ¬λ λ΄κ° μ΄ν΄ν λ°μ λ°λ₯΄λ©΄ ν¬λͺ ν νλ‘μλ₯Ό λ°°ν¬νλ λ°©λ²μ μκ³ μμ΅λλ€. ν¬λͺ νλ‘μλ ν΄λΉ νλ‘μλ₯Ό κ΄λ¦¬νλ κ΄λ¦¬μμ ν¨κ» λ°°ν¬λ©λλ€. UUPS κ³μ½μλ μ κ·Έλ μ΄λλ₯Ό κ΄λ¦¬νλ μΈλΆ κ³μ½(νλ‘μ κ΄λ¦¬μ)μ΄ μμΌλ©° ꡬν μ체μ μμΌλ―λ‘ νλ‘μ μμ±μλ‘ μ λ¬λμ§ μμ΅λλ€.
λ°λΌμ hardhat-deployλ‘ μ΄ μμ μ μννλ €λ©΄ ν¬λͺ νλ‘μμ λμΌν μμ±μλ₯Ό μ¬μ©νμ¬ λ°°ν¬νμ§λ§ admin νλλ₯Ό 무μνκ³ λμΌν ν¨κ³Όλ₯Ό μ»μ΅λλ€.
λλ₯Ό μν΄ μΌνλ κ² κ°μ΅λλ€ @marceljay
λ©΄μ± μ‘°ν λ΄ μ½λ μ‘°κ°μ΄ κ°μ¬λμ§ μμ΅λλ€ :sweat_smile: - μλͺ» ꡬμ±λ νλ‘μμ λν΄ μ± μμ μ§μ§ μμ΅λλ€ :laughing:
@marceljay μ, λ€, κ·νμ λ¬Έμ λ₯Ό μΆμΈ‘ν μ μμ΅λλ€. μλ λ΅λ³μ μμ νμ΅λλ€.
λ€μ μ½λλ ꡬνμμ μνν μμ μ λλ€. κ·Έλμ 1κ°μ μΈμ(κ΄λ¦¬μ)λ₯Ό μ·¨νλ initializeλΌλ ꡬν(νλ‘μκ° μλ)μ λν ν¨μκ° μμ΅λλ€.
execute: {
methodName: "initialize",
args: [admin],
},
@marceljay μ, λ€, κ·νμ λ¬Έμ λ₯Ό μΆμΈ‘ν μ μμ΅λλ€. μλ λ΅λ³μ μμ νμ΅λλ€.
λ€μ μ½λλ ꡬνμμ μνν μμ μ λλ€. κ·Έλμ 1κ°μ μΈμ(κ΄λ¦¬μ)λ₯Ό μ·¨νλ initializeλΌλ ꡬν(νλ‘μκ° μλ)μ λν ν¨μκ° μμ΅λλ€.
execute: { methodName: "initialize", args: [admin], },
μ, μ΄μ μλ²½νκ² μ΄ν΄λμμ΅λλ€. λ΅λ³μ μμ ν κ²μ 보μμ΅λλ€. :)
ERC1967Proxy
κ³μ½μ΄ OZ μ
κ·Έλ μ΄λ νλ¬κ·ΈμΈμμ μ¬μ©νλ κ²κ³Ό λμΌνμ§ μκ³ κ³μλκΉ?
@JasoonS λ§μ μ€λͺ κ°μ¬ν©λλ€λ§ μμ§ μμ ν μ΄ν΄κ° λμ§ μμ΅λλ€. μμμ λ€μκ³Ό κ°μ΄ μμνλ κ³μ½μ κ²μνμ΅λλ€.
contract UUPSProxy is ERC1967Proxy {
μμ κ²μν μν await deploy
μ½λμ μν΄ μ€μ λ‘ λ°°ν¬ λ©λκΉ, μλλ©΄ hardhat-deployκ° μ€μ νλ‘μ μμ±μμ μΈν°νμ΄μ€λ₯Ό μλλ‘ νλ λλ―Έ κ³μ½μ
λκΉ, μλλ©΄ λ€λ₯Έ κ²μ
λκΉ? λΉμ μ μΌλ€:
ν¬λͺ νλ‘μμ λμΌν μμ±μλ₯Ό μ¬μ©νμ¬ λ°°ν¬ν©λλ€.
κ·Έλ¬λ μ€μ λ‘ λ°°ν¬νλ κ²½μ° ν΄λΉ κ³μ½μ΄ ERC1967Proxy
μλ UUPSUpgradeable
ERC1967Proxy
μμ μμλλ―λ‘ μ€μ UUPS κΈ°λ₯μ μ΄λμμ μ¬κΉμ?
μμ κ²μν λ°°ν¬ μ½λλ₯Ό κΈ°λ€λ¦¬λ μνμ μν΄ μ€μ λ‘ λ°°ν¬λ©λκΉ?
μ, μ€μ λ‘ λ°°ν¬ν©λλ€.
ν΄λΉ κ³μ½μ UUPSUpgradeableμ΄ μλ ERC1967Proxyμμ μμλκΈ° λλ¬Έμ λλ€.
ERC1967Proxy(UUPSμ openzeppelinμ ν¬λͺ
νλ‘μ λͺ¨λ erc1967, https://docs.openzeppelin.com/contracts/4.x/api/proxy#transparent-vs-uups μ¬μ©)λ₯Ό μ¬μ©ν΄μΌ ν©λλ€. UUPSUpgradeable
κ³μ½μ ꡬν κ³μ½μμ μ¬μ©λ©λλ€(νλ‘μμ μΌλΆκ° μλ).
κ·Έλ λ€λ©΄ μ€μ UUPS κΈ°λ₯μ μ΄λμμ μ€λ κ²μΌκΉμ?
μ€κ³μ ꡬν κ³μ½μ UUPS κΈ°λ₯μ 보μ ν©λλ€(μ΄λ λ‘μ§μ΄ νλ‘μ μ체μ μκΈ° λλ¬Έμ κ°μ€ ν¨μ¨μ μ΄κΈ° λλ¬Έμ μ’μ§λ§ μ€μλ‘ νΈνλμ§ μλ κ³μ½μΌλ‘ μ κ·Έλ μ΄λνκ³ μ κ·Έλ μ΄λ κ°λ₯μ±μ κΉ¨λ¨λ¦΄ μ μκΈ° λλ¬Έμ λμ©λλ€. ).
λν, λλ νμ€ν νλ‘μ μ λ¬Έκ°κ° μλλλ€. μ΄κ²μ μ μμ μ μ°κ΅¬μμ λμ¨ κ²μ λλ€.
@JasoonSκ° 2021λ 9μ 1μΌ μ€ν 9μ 18λΆ μ λκΈμ μμ±νμ΅λλ€.
ν΄λΉ κ³μ½μ UUPSUpgradeableμ΄ μλ ERC1967Proxyμμ μμλκΈ° λλ¬Έμ λλ€.
ERC1967Proxy (λͺ¨λ UUPS λ° openzeppelin μ¬μ© erc1967μμ ν¬λͺ νλ‘μλ₯Ό μ¬μ©νλλ‘λμ΄ docs.openzeppelin.com/contracts/4.x/api/proxy#transparent-vs-uupsμ ).
μ€λ₯Έμͺ½. κ·Έλ¦¬κ³ ERC-1967μ ꡬν μ£Όμ, λΉμ½ μ£Όμ λ° κ΄λ¦¬μ μ£Όμμ μ μ₯ μμΉλ₯Ό ββμ§μ νλ κ² μΈμλ λ§μ κΈ°λ₯μ νμ§ μμ΅λλ€. BTW μ¬λ―Έμλ μ¬μ€: ERC-1967μ μ€μνλ©΄μ OZ UUPS ꡬνμ μ€μ λ‘ κ΅¬ν μ£Όμμ λν΄ μ½κ° λ€λ₯Έ μ μ₯ μμΉλ₯Ό ββμ§μ νλ EIP1822λ₯Ό μλ°ν©λλ€.
UUPSUpgradeable
κ³μ½μ ꡬν κ³μ½μμ μ¬μ©λ©λλ€(νλ‘μμ μΌλΆκ° μλ).
λ¬Όλ‘ μ΄μ£ ! λ΄κ° μ΄λ¦¬μκ² μ¬κΈ°μμ λμΉ κ²μ λ³Ό μ μλλ‘ λμμ£Όμ μ κ°μ¬ν©λλ€.
κ·Έλ λ€λ©΄ μ€μ UUPS κΈ°λ₯μ μ΄λμμ μ€λ κ²μΌκΉμ?
μ€κ³μ ꡬν κ³μ½μ UUPS κΈ°λ₯μ 보μ ν©λλ€(μ΄λ λ‘μ§μ΄ νλ‘μ μ체μ μκΈ° λλ¬Έμ κ°μ€ ν¨μ¨μ μ΄κΈ° λλ¬Έμ μ’μ§λ§ μ€μλ‘ νΈνλμ§ μλ κ³μ½μΌλ‘ μ κ·Έλ μ΄λνκ³ μ κ·Έλ μ΄λ κ°λ₯μ±μ κΉ¨λ¨λ¦΄ μ μκΈ° λλ¬Έμ λμ©λλ€. ).
μ, ꡬνμ UUPSUpgradeable
μμ μμν΄μΌ ν©λλ€.
μ΄ ν° λμμ λ€μ νλ² κ°μ¬λ립λλ€!
κ°μ₯ μ μ©ν λκΈ
κΈ°λ³Έμ μΌλ‘ μ§μν κ³νμ΄μ§λ§ νμ¬λ‘μλ hardhat-deployμ ν¨κ» μ¬μ©ν μ μμ΅λλ€. νλ‘μ jistλ νΈνμ±μ μ μ§νκΈ° μν΄ μμ±μμ λλ―Έ/λ―Έμ¬μ© μμ μ μΈμκ° μμ΄μΌ ν©λλ€.