본문으로 이동

스마트 계약

스마트 계약의 의미, 블록체인 노드의 실행 방식, 외부 데이터와 업그레이드 권한이 설계에 미치는 영향, 상호작용 전 확인 사항을 설명합니다.

업데이트

교육 목적으로만 제공되며 투자 조언이 아닙니다. 스마트 계약 거래는 되돌릴 수 없는 손실을 초래할 수 있습니다.

직접 답변

스마트 계약은 블록체인이나 유사한 분산 실행 네트워크에 배포된 프로그램입니다. 코드와, 많은 플랫폼에서는 지속 상태를 포함합니다. 거래나 다른 계약이 함수를 호출하면 네트워크 노드가 같은 규칙을 실행하고 검증 및 합의 절차를 통해 그 결과인 상태 변경을 받아들입니다.

‘스마트’는 프로그램이 의도를 이해한다는 뜻이 아니며, ‘계약’이라는 이름만으로 법적으로 강제 가능한 합의가 되는 것도 아닙니다. 이 용어는 실행 환경에서 이용할 수 있는 기능과 데이터 안에서 지정된 조건을 강제하는 코드를 뜻합니다.

스마트 계약은 다음을 수행할 수 있습니다.

  • 프로그래밍된 조건에 따라 디지털 자산을 보유하거나 이전합니다.
  • 애플리케이션 상태를 기록하고 갱신합니다.
  • 다른 계약과 조합하여 거래소, 대출 시스템, 게임, 거버넌스 도구와 기타 온체인 애플리케이션을 만듭니다.

예측 가능성은 구현된 코드와 입력에 한정됩니다. 계약이 작성된 그대로 실행되어도 결함, 악의적인 설계, 탈취된 권한 또는 잘못된 외부 데이터 때문에 원치 않는 결과가 생길 수 있습니다.

작동 방식

일반적인 상호작용은 다음 단계로 진행됩니다.

  1. 개발자가 소스 코드를 작성하고 시험하며, 플랫폼이 요구하면 컴파일한 뒤 결과 프로그램을 거래로 배포합니다.
  2. 배포 과정에서 프로그램에 온체인 식별자나 주소가 부여되고 상태와 관리자 역할이 초기화될 수 있습니다.
  3. 사용자, 애플리케이션 또는 다른 계약이 함수 선택자, 매개변수, 때로는 자산을 포함한 호출을 보냅니다.
  4. 각 검증 노드는 같은 가상 머신 및 프로토콜 규칙에 따라 호출을 실행합니다. 필수 조건이 실패하면 호출이 되돌려질 수 있지만 거래 수수료는 여전히 부과될 수 있습니다.
  5. 호출이 성공하고 네트워크에 포함되면 그 상태 변경과 발생한 이벤트가 블록체인 기록의 일부가 됩니다.

실행의 결정성은 합의된 실행 맥락에서 이용 가능한 정보에만 적용됩니다. 계약은 인터넷에서 날씨, 시장 가격 또는 은행 결제를 스스로 가져올 수 없습니다. 오프체인 사실이 필요한 애플리케이션은 오라클, 서명된 메시지, 브리지 또는 권한 있는 운영자를 사용하므로 계약 코드 바깥의 신뢰 및 실패 가정이 추가됩니다.

배포된 코드가 언제나 시스템 전체인 것은 아닙니다. 일부 계약은 불변이지만 프록시와 거버넌스 패턴은 호출을 새로운 로직으로 보내거나 매개변수를 바꿀 수 있습니다. 사용자는 화면에 보이는 인터페이스뿐 아니라 업그레이드 키, 관리자 권한, 일시 정지 기능, 오라클 설계와 연결 계약도 살펴야 합니다.

상호작용에 서명하기 전에 다음을 확인하십시오.

  • 독립적이고 신뢰할 수 있는 출처에서 확인한 네트워크와 전체 계약 주소
  • 디코딩된 함수, 매개변수, 자산 수량과 수신자
  • 호출로 생성되는 토큰 허용량 또는 운영자 권한
  • 계약의 검증 여부, 업그레이드 가능 여부, 정지 상태 또는 특권 계정의 통제 여부
  • 가능하다면 소액 시험으로 의도한 진입과 출구 경로를 모두 확인했는지 여부

예시

디지털 서비스용 에스크로 계약을 생각해 봅시다. 구매자가 1,000 USDC를 예치하면 계약은 구매자, 판매자, 금액과 결제 조건을 기록합니다. 구매자가 제공 완료를 승인하면 계약은 판매자에게 자금을 지급합니다. 조건이 24시간 안에 충족되지 않으면 프로그래밍된 환불 경로가 열립니다.

설계가 해당 사실을 제공하지 않는 한 계약은 서비스가 만족스러웠는지 알지 못합니다. 승인이 구매자의 키에 의존하면 키 탈취로 지급이 승인될 수 있습니다. 오라클이나 관리자가 결과를 정한다면 그 당사자도 신뢰 모델의 일부가 됩니다. 접근 제어나 토큰 처리의 버그도 의도한 에스크로 규칙을 무너뜨릴 수 있습니다. 자동 실행은 일부 수작업을 줄이지만 모든 의존성을 평가할 필요까지 없애지는 않습니다.

위험과 통제

  • 코드 결함: 재진입, 잘못된 회계, 안전하지 않은 외부 호출 또는 경계 사례로 자산이 손실되거나 잠길 수 있습니다. 작고 충분히 시험된 설계를 우선하고 감사 배지만 믿지 말고 배포 코드를 검토하십시오.
  • 권한 및 업그레이드 위험: 관리자가 시스템을 정지하고 로직을 교체하며 수수료를 바꾸거나 자산을 옮길 수 있습니다. 각 역할의 통제자, 타임록이나 다중 서명 사용 여부와 변경 가능 범위를 확인하십시오.
  • 오라클 및 통합 위험: 올바른 코드도 오래되거나 조작되거나 단위가 잘못된 데이터에 따라 움직일 수 있고 토큰, 브리지 또는 다른 계약의 실패가 조합을 통해 퍼질 수 있습니다.
  • 거래 및 승인 위험: 악의적인 인터페이스가 잘못된 주소, 함수, 수신자 또는 무제한 허용량을 제시할 수 있습니다. 요청을 디코딩하고 권한을 필요한 범위로 제한하십시오.
  • 경제 설계 위험: 유효한 거래도 청산, 가격 조작, 인센티브 실패 또는 제한된 유동성의 인출 사태를 일으킬 수 있습니다. 코드의 정확성이 경제적 지급 능력을 뜻하지는 않습니다.
  • 운영 위험: 혼잡, 체인 재구성, 시퀀서 중단 또는 프런트엔드 장애로 계약이 배포된 상태에서도 작업이 지연될 수 있습니다.
  • 비가역성: 퍼블릭 체인 거래에는 일반적으로 지불 취소 수단이 없습니다. 잘못된 함수나 악성 계약으로 자금을 보내면 회수하지 못할 수 있습니다.

감사는 특정 코드 버전과 범위에 대한 증거이지 보증이 아닙니다. 배포된 바이트코드나 검증된 소스가 검토 버전과 일치하는지, 이후 업그레이드, 의존성 또는 설정 변경이 감사 범위 밖인지 확인하십시오.

흔한 오해

  • “코드는 거래 없이 자동 실행된다.” 상태를 바꾸는 대부분의 함수는 거래나 다른 온체인 호출이 필요하며 시간 기반 작업에는 외부 실행자가 필요할 수 있습니다.
  • “코드는 바뀔 수 없다.” 불변 계약은 자체 배포 바이트코드를 다시 쓸 수 없지만 프록시, 거버넌스와 마이그레이션 설계는 사용자가 도달하는 로직을 바꿀 수 있습니다.
  • “공개된 코드는 안전하다.” 공개는 검토에 도움을 주지만 정확성, 정직한 관리 또는 건전한 경제성을 입증하지 않습니다.
  • “감사가 안전을 보장한다.” 검토에는 시점과 범위의 한계가 있고 결함을 놓치거나 운영 및 경제 위험을 제외할 수 있습니다.
  • “거래 성공은 의도한 작업의 완료를 뜻한다.” 성공은 호출된 코드가 되돌려지지 않았다는 뜻일 뿐이며 대상, 디코딩된 이벤트, 자산 이동과 최종 권한을 확인해야 합니다.

관련 주제

출처

탐색

위키 검색...