Hardhat-deploy: OpenZeppelin UUPS ν”„λ‘μ‹œ 지원

에 λ§Œλ“  2021λ…„ 06μ›” 28일  Β·  13μ½”λ©˜νŠΈ  Β·  좜처: wighawag/hardhat-deploy

OpenZeppelinTransparentProxy κ°€ μ§€μ›λ˜λŠ” 것을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. κ°€κΉŒμš΄ μž₯λž˜μ— UUPS ν”„λ‘μ‹œ 지원을 μΆ”κ°€ν•  κ³„νšμ΄ μžˆμŠ΅λ‹ˆκΉŒ?

enhancement

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

기본적으둜 지원할 κ³„νšμ΄μ§€λ§Œ ν˜„μž¬λ‘œμ„œλŠ” hardhat-deploy와 ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘μ‹œ jistλŠ” ν˜Έν™˜μ„±μ„ μœ μ§€ν•˜κΈ° μœ„ν•΄ μƒμ„±μžμ— 더미/λ―Έμ‚¬μš© μ†Œμœ μž μΈμˆ˜κ°€ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

λͺ¨λ“  13 λŒ“κΈ€

기본적으둜 지원할 κ³„νšμ΄μ§€λ§Œ ν˜„μž¬λ‘œμ„œλŠ” 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 μ—μ„œ 상속해야 ν•©λ‹ˆλ‹€.

이 큰 도움에 λ‹€μ‹œ ν•œλ²ˆ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰