네모랩 편집하기

이동: 둘러보기, 검색

경고: 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. 로그인하거나 계정을 생성하면 편집자가 아이디(ID)으로 기록되고, 다른 장점도 있습니다.

편집을 되돌릴 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 저장해주세요.
최신판 당신의 편집
39번째 줄: 39번째 줄:
 
====프록시 계약====
 
====프록시 계약====
 
[[파일:프록시 계약.jpg|썸네일|600픽셀|프록시 계약]]
 
[[파일:프록시 계약.jpg|썸네일|600픽셀|프록시 계약]]
현재 [[블록체인]] 상에서 동작하는 스마트 계약은 한 번 배포되면 변경을 할 수 없기 때문에 태생적으로 업데이트가 불가능하다. 기존의 서비스들은 이런 문제점을 해결하기 위해 아예 새로운 버전의 스마트 컨트랙트를 배포한 후 기존 서비스 데이터를 복사하여 사용하거나 데이터를 저장하는 컨트랙트만 분리 설계한 후 따로 존재하는 기능 구현부의 [[스마트 컨트랙트]]만 새로 만들어 배포해왔다. 그러나 서비스 사용 데이터의 복사는 그 자체로 복잡하고 세심한 관리가 필요하며, 만일 복사 중 문제가 발생한다면 막대한 손실이 발생한다. 이로 인해 데이터 저장과 구현의 분리 패턴이 생겨났지만 이 역시 고객에게 변경된 주소를 알려 줘야하며, 여기서 오는 혼란으로 문제가 발생할 여지는 여전히 존재한다.
+
현재 블록체인 상에서 동작하는 스마트 계약은 한 번 배포되면 변경을 할 수 없기 때문에 태생적으로 업데이트가 불가능하다. 기존의 서비스들은 이런 문제점을 해결하기 위해 아예 새로운 버전의 스마트 컨트랙트를 배포한 후 기존 서비스 데이터를 복사하여 사용하거나 데이터를 저장하는 컨트랙트만 분리 설계한 후 따로 존재하는 기능 구현부의 스마트 컨트랙트만 새로 만들어 배포해왔다. 그러나 서비스 사용 데이터의 복사는 그 자체로 복잡하고 세심한 관리가 필요하며, 만일 복사 중 문제가 발생한다면 막대한 손실이 발생한다. 이로 인해 데이터 저장과 구현의 분리 패턴이 생겨났지만 이 역시 고객에게 변경된 주소를 알려 줘야하며, 여기서 오는 혼란으로 문제가 발생할 여지는 여전히 존재한다.
  
네모닥은 이 문제를 프록시 컨트랙트 구조를 사용함으로 해결했다. 프록시 컨트랙트를 사용하기 위해 솔리디티에서 지원하는 fallback 함수와 delegatecall을 이용했다. delegatecall은 함수를 호출하는 주체(sender)가 호출 시, 컨트랙트의 정보들을(context) 유지한 채 다른 컨트랙트의 함수를 호출하는 방법이다. 즉, 사용자 계정이 호출하는 형태가 아닌 컨트랙트에 의해서 호출하도록 도와주는 기능이다. 사용자는 프록시 계약의 주소인 0x123으로 A에 구현된 함수를 호출한다. 여기서 fallback 함수는 컨트랙트에 하나만 존재할 수 있는 이름 없는 함수로 호출하는 함수와 일치하는 함수가 해당 컨트랙트에 존재하지 않을 경우 실행된다. 이 fallback 함수에 사용자 함수 호출을 delegatecall로 그대로 전달하는 코드를 작성하면 다른 컨트랙트의 함수를 호출하여 자기 컨트랙트에 저장을 할 수가 있게 된다. 일반적으로 다른 외부 컨트랙트의 함수 호출시에는 해당 컨트랙트의 변수들을 이용하는 것으로 정보들이 바뀌기 때문에 송금등의 함수를 호출할 경우 서비스하는 컨트랙트의 정보가 바뀌지 않고 호출한 컨트랙트의 정보만 바뀌는 등의 문제가 있다. 그러나 delegatecall을 사용하면 호출시 컨트랙트의 정보들이 바뀌지 않아 타 컨트랙트의 실행 결과로 프록시의 저장소가 바뀌는 결과를 얻을 수 있다. 이와 같이 프록시 계약 구조를 가질 경우 실제 기능이 구현된 ERC-20 토큰이나 이더리움와 네모코인 간 환전 거래 컨트랙트 등의 컨트랙트들을 수정하더라도 프록시 계약에서 기능을 호출할 구현부 컨트랙트 주소만 바꾸어 주면 되기 때문에 데이터의 손상 및 고객 입장에서 주소가 바뀌는 문제가 해결된다.<ref name="네모랩 백서"></ref>
+
네모닥은 이 문제를 프록시 컨트랙트 구조를 사용함으로 해결했다. 프록시 컨트랙트를 사용하기 위해 솔리디티에서 지원하는 fallback 함수와 delegatecall을 이용했다. delegatecall은 함수를 호출하는 주체(sender)가 호출 시, 컨트랙트의 정보들을(context) 유지한 채 다른 컨트랙트의 함수를 호출하는 방법이다. 즉, 사용자 계정이 호출하는 형태가 아닌 컨트랙트에 의해서 호출하도록 도와주는 기능이다. 사용자는 프록시 계약의 주소인 0x123으로 A에 구현된 함수를 호출한다. 여기서 fallback 함수는 컨트랙트에 하나만 존재할 수 있는 이름 없는 함수로 호출하는 함수와 일치하는 함수가 해당 컨트랙트에 존재하지 않을 경우 실행된다. 이 fallback 함수에 사용자 함수 호출을 delegatecall로 그대로 전달하는 코드를 작성하면 다른 컨트랙트의 함수를 호출하여 자기 컨트랙트에 저장을 할 수가 있게 된다. 일반적으로 다른 외부 컨트랙트의 함수 호출시에는 해당 컨트랙트의 변수들을 이용하는 것으로 내용이 바뀌기 때문에 송금등의 함수를 호출할 경우 서비스하는 컨트랙트의 정보가 바뀌지 않고 호출한 컨트랙트의 정보만 바뀌는 등의 문제가 있다. 그러나 delegatecall을 사용하면 호출시 컨트랙트의 정보들이 바뀌지 않아 타 컨트랙트의 실행 결과로 프록시의 저장소가 바뀌는 결과를 얻을 수 있다. 이와 같이 프록시 계약 구조를 가질 경우 실제 기능이 구현된 ERC-20 토큰이나 이더리움와 네모코인 간 환전 거래 컨트랙트 등의 컨트랙트들을 수정하더라도 프록시 계약에서 기능을 호출할 구현부 컨트랙트 주소만 바꾸어 주면 되기 때문에 데이터의 손상 및 고객 입장에서 주소가 바뀌는 문제가 해결된다.<ref name="네모랩 백서"></ref>
  
 
====스마트 계약====
 
====스마트 계약====

해시넷에서의 모든 기여는 다른 기여자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요. 만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 사항은 해시넷:저작권 문서를 보세요). 저작권이 있는 내용을 허가 없이 저장하지 마세요!

취소 | 편집 도움말 (새 창에서 열림)