Smart Contract/Smart Contracts

스마트 컨트랙트 업그레이드

dev_swan 2023. 11. 2. 19:00

✏️ 스마트 컨트랙트 업그레이드

스마트 컨트랙트 업그레이드란 스마트 컨트랙트의 비즈니스 로직을 변경하면서 스마트 컨트랙트의 상태를 유지하는 것을 말합니다. 블록체인에서 한 번 배포된 스마트 컨트랙트는 수정할 수 없다는 원칙이 있습니다. 그러나 실제로는 이러한 제한을 극복하기 위해 다양한 전략과 패턴이 개발되었습니다.

스마트 컨트랙트 업그레이드 - https://medium.com/rayonprotocol

1️⃣ 컨트랙트 마이그레이션

컨트랙트 마이그레이션은 기존 스마트 컨트랙트의 새 인스턴스를 배포하고, 스토리지와 잔액을 새로운 컨트랙트로 이전하는 과정입니다. 새롭게 배포된 컨트랙트는 초기 상태가 비어있어, 이전 컨트랙트에서 데이터를 복구하여 새로운 구현에 쓸 수 있습니다.

 

이후에는 이전 컨트랙트와 상호작용 했던 모든 컨트랙트를 새 주소로 업데이트해야 합니다. 이 방법은 상대적으로 간단하나, 사용자의 스토리지와 잔액을 새로운 컨트랙트로 수동으로 마이그레이션 하는 것은 시간이 오래 걸리고 가스 비용이 높을 수 있습니다.

더보기

💡 마이그레이션 (Migration)

마이그레이션이란 한 환경에서 다른 환경으로 데이터나 소프트웨어를 이동시키는 과정을 의미합니다.

 

2️⃣ 데이터 분리

스마트 컨트랙트를 업그레이드하는 또 다른 방법은 비즈니스 로직과 데이터 스토리지를 별도의 컨트랙트로 분리하는 것입니다. 이 방법은 사용자가 로직 컨트랙트와 상호작용하고, 데이터는 스토리지 컨트랙트에 저장하는 방식입니다.

 

로직 컨트랙트는 사용자가 애플리케이션과 상호작용할 때 실행되는 코드를 포함하며, 스토리지 컨트랙트의 주소를 보유하고 데이터를 가져오고 설정하기 위해 이와 상호작용 합니다.

 

3️⃣ 프록시 패턴

프록시 패턴은 비즈니스 로직과 데이터를 별도의 컨트랙트로 유지하기 위해 데이터 분리를 사용합니다. 하지만 프록시 패턴에서는 스토리지 컨트랙트가 코드 실행 중에 로직 컨트랙트를 호출합니다.

 

프록시 패턴은 인기 있는 방법이지만, 잘못 사용하면 중요한 결함 또는 함수 선택기 충돌을 일으킬 수 있습니다.

더보기

💡 함수 선택기

함수 선택기는 Ethereum 스마트 컨트랙트에서 사용되는 용어로, 컨트랙트 내의 특정 함수를 식별하는 데 사용됩니다.

 

함수 선택기는 함수의 시그니처를 취한 해시의 처음 4바이트로 이루어져 있습니다. 함수의 시그니처는 함수 이름과 괄호 안의 매개변수 타입으로 구성됩니다. 예를 들어, 함수 foo(uint256, address)의 시그니처는 foo(uint256,address)이 됩니다. 이 시그니처를 keccak256 알고리즘으로 해싱하고 그 결과의 앞 4바이트를 가져오면 함수 선택기를 얻을 수 있습니다.

더보기

💡 keccak256

keccak256은 해시 함수로, 어떤 길이의 입력도 받아들이고, 항상 동일한 길이의 해시 출력을 생성합니다. 이 출력은 예측 불가능하고 유일합니다. 즉, 같은 입력에 대해 항상 같은 출력을 생성하지만, 미세하게 다른 입력에 대해서는 완전히 다른 출력이 나타납니다.

 

4️⃣ 전략 패턴

전략 패턴은 특정 기능을 구현하기 위해 다른 프로그램과 인터페이스하는 소프트웨어 프로그램을 만드는 것을 권장합니다. 이는 스마트 컨트랙트가 다른 컨트랙트에서 함수를 호출하는 방식으로 작동합니다. 따라서 다이아몬드 패턴과 컨트랙트 로직을 변경할 수 있도록 설계된 패턴이라는 점은 비슷하지만 사용하는 방식과 적용 범위에서 차이가 있습니다.

 

전략 패턴은 주로 메인 컨트랙트가 비즈니스 로직을 가지고 있으며, 특정 기능을 실행하기 위해 다른 컨트랙트를 호출하는 방식을 사용합니다. 이는 특정 부분의 로직만 변경하는 소규모 업그레이드에 적합하며, 주요 로직의 변경 없이 특정 기능만을 개선하거나 수정할 수 있게 합니다.

 

5️⃣ 다이아몬드 패턴

다이아몬드 패턴은 프록시 패턴의 개선 버전으로 볼 수 있습니다. 다이아몬드 패턴은 프록시 컨트랙트가 여러 로직 컨트랙트에 함수 호출을 위임할 수 있다는 점에서 프록시 패턴과 다릅니다.

 

이 패턴은 컨트랙트의 일부만 업그레이드할 수 있게 해주며, 함수를 여러 로직 컨트랙트에 나누어 이 문제를 쉽게 해결할 수 있게 합니다. 또한 프록시 패턴은 일체형 접근 제어 방식을 채택하지만, 다이아몬드 패턴은 모듈식 권한 접근 방식을 가능하게 합니다.


 스마트 컨트랙트 업그레이드 장단점

👍 장점

 

1️⃣ 취약점 수정 용이

스마트 컨트랙트 배포 후에 발견된 취약점을 수정하는 것을 용이하게 합니다. 이것은 버그 수정과 보안 강화에 빠른 반응을 가능하게 하며, 사용자들의 자산을 보호하는데 중요합니다.

 

2️⃣ 새로운 기능 추가

개발자들은 로직 업그레이드를 통해 분산형 애플리케이션에 새로운 기능을 추가할 수 있습니다. 이것은 시장의 변화나 사용자의 요구에 따라 서비스를 지속적으로 향상시킬 수 있는 유연성을 제공합니다.

 

3️⃣ 사용자 안전성 향상

스마트 컨트랙트 업그레이드는 버그를 빠르게 수정할 수 있어 최종 사용자의 안전성을 향상시킵니다. 신속한 버그 수정은 시스템의 신뢰성을 높이고 사용자의 신뢰를 얻는데 중요합니다.

 

4️⃣ 기능 실험과 dapp개선

스마트 컨트랙트 업그레이드는 개발자에게 다양한 기능을 실험하고 시간이 지남에 따라 dapp을 향상시키는 더 많은 여지를 줍니다. 이는 제품의 지속적인 개선과 최적화를 가능하게 합니다.

 

👎 단점

 

1️⃣ 코드 불변성 원칙에 대한 부정

스마트 컨트랙트를 업그레이드하는 것은 코드의 불변성 원칙에 대한 부정을 의미합니다. 이는 분산화와 보안에 영향을 미치며, 프로젝트의 신뢰성을 저해할 수 있습니다.

 

2️⃣ 개발자에 대한 과도한 신뢰

사용자들은 개발자가 임의로 스마트 컨트랙트를 수정하지 않을 것이라는 점을 신뢰해야 합니다. 이는 무분별한 수정이 이루어질 경우 사용자의 자산이 위험에 노출될 수 있음을 의미합니다.

 

3️⃣ 복잡성 증가와 결함 가능성 상승

스마트 컨트랙트에 업그레이드 기능을 프로그래밍하는 것은 복잡성을 더하며 중요한 결함의 가능성을 증가시킵니다. 이는 잘못 구현된 경우 새로운 보안 취약점을 만들 수 있음을 의미합니다.

 

4️⃣ 조속한 프로젝트 시작 유도

스마트 컨트랙트를 업그레이드하는 기회는 개발자들이 개발 단계에서 철저한 조사를 하지 않고 프로젝트를 더 빠르게 시작하도록 유도할 수 있습니다. 이는 초기 단계에서의 부실한 개발로 인해 나중에 문제가 발생할 가능성을 증가시킵니다.

 

5️⃣ 무단 업그레이드 용이

스마트 컨트랙트에서 불안전한 접근 제어 또는 중앙 집중화는 악의적인 행위자가 무단 업그레이드를 수행하는 것을 용이하게 할 수 있습니다. 이는 스마트 컨트랙트의 보안과 사용자의 자산을 위협할 수 있습니다.


❗️스마트 컨트랙트 업그레이드 고려사항

프록시 패턴, 전략 패턴, 데이터 분리를 사용하는 경우, 무단 스마트 컨트랙트 업그레이드를 방지하기 위해 안전한 접근 제어/ 권한 부여 메커니즘을 사용해야 합니다.

 

스마트 컨트랙트의 업그레이드는 복잡한 과정으로, 새로운 취약점이 발생하지 않도록 세심한 주의가 필요합니다.

 

업그레이드를 구현하는 프로세스를 분산시켜 신뢰 가정을 줄여야 합니다. 다중 서명 지갑, DAO 멤버가 업그레이드를 승인하는 투표 요구 등의 방법을 사용하여 한 사람이나 그룹만이 임의로 스마트 컨트랙트를 업그레이드할 수 없도록 방지합니다.

 

컨트랙트 마이그레이션 중에 이전 스마트 컨트랙트에서 새 스마트 컨트랙트로 상태를 복사하는 것은 추가적인 트랜잭션이 필요로 하며, 이는 더 많은 가스 비용을 발생시킬 수 있습니다.

 

사용자를 보호하기 위해 타임락을 구현하는 것을 고려해야 합니다. 업그레이드와 같은 중요한 변경사항이 발생할 때, 변경이 즉각적으로 발생하는 대신, 타임락이 설정된 일정 시간 동안 지연됩니다. 이 기간 동안 사용자들은 변경사항을 검토하고 자신의 행동을 조정할 수 있습니다.