Cadence 소개

Brian
9 min readMar 7, 2021

--

우리는 일반적으로 유저 어카운트에 저장되어 있는 프로그램을 스마트 컨트랙트라 합니다. 스마트 컨트랙트는 신뢰할 수 있는 제 3자의 필요 없이 계약의 성과를 확인하고 실행하는 프로그램입니다. 블록체인에 기반하여 돌아가는 프로그램들은 중앙 권위에 의존하지 않고 중요한 목적을 담고 있기 때문에 일반적으로 스마트 컨트랙트라고 합니다.

새로운 프로그래밍 언어

Cadence는 새로운 특징들을 스마트 컨트랙트 프로그래밍에 소개해 개발자들이 자신들의 코드가 안전하고 보안이 철저하며 명확하고 접근 가능하도록 도와주는resource-oriented 프로그래밍 언어입니다. 살펴보자면

  • Type safety and a strong static type system
  • Resource-oriented 프로그래밍은 자원들이 동시간에 한 곳에서만 존재 할 수 있고 복사 될 수 없으며 실수로 없어지거나 지워지지 않는다는 보장을 함으로써 보안성 높은 디지털 소유권을 위한 모델을 만들기 위해 linear 타입을 object capabilities와 짝을 맞추는 새로운 패러다임입니다.
  • 기능과 거래를 위한 내재된 전제 조건과 사후 조건
  • 소유주와 유효한 문서를 가진 사람만이 물체에 접근할 수 있도록 제한하는 access controls을 강요함으로써 capability-based security를 활용합니다.

Swift 와 Rust는 Cadence의 구문에 영감을 주었습니다. Cadence의 자원 유형의 이용은 Libra 팀에 의해 개발되고 있는 프로그래밍 언어인 Move의 자원 유형 이용과 잘 맞아 떨어집니다.

Cadence’s Programming Language Pillars

하이 레벨 언어인 Cadence는 다음과 같은 조건을 요구합니다.

  • 안정성과 보안성: 안정성은 그 어떤 스마트 컨트랙트의 겉으로도 잘 드러나지 않는 신뢰도입니다. 또한 보안성은 네트워크와 스마트 컨트랙트를 향한 공격에 대한 예방책입니다. 이렇게 안정성과 보안성은 블록체인이 변경 될 수 없는 성질을 가졌고 또한 high-value 자산을 다루기 때문에 스마트 컨트랙트에서 굉장히 중요합니다. 수정과 리뷰가 스마트 컨트랙트의 발전에 있어서 중대한 부분을 차지할 것이지만 Cadence는 안정성과 보안성의 최고 단계를 유지하면서도 이런 작업의 효율성을 최대로 끌어올립니다. 이것은 strong static type system, design by contract, 그리고 linear type에서 영감을 얻은 초기의 소유권에 의해 이루어집니다.
  • 선명도: 코드는 읽기 쉽고 최대한 모호하지 않아야 합니다. 또한 툴링으로 인해 안전과 보안을 담보하기 위해 조회와 검증이 가능해야 합니다. 이 담보는 코드를 명료하게 만들고 개발자가 의도를 직접 표현할 수 있게 함으로써 이루어집니다. 검사와 리뷰가 적은 비용으로 효율적이게 하는 디자인과 더불어 읽기 쉽게 하여 그 의도를 노골적으로 드러냅니다.
  • 접근성: 코드를 작성하고 프로그램을 만드는 것은 최대한 접근이 가능해야 합니다. Swift와 Rust같은 언어의 특징을 Cadence에 포함하는 것은 개발자들로 하여금 Cadence의 문법과 그 의미에 있어 더욱 친숙하게 느끼게끔 할 것입니다. 현실적인 툴링, 문서, 그리고 예제들은 개발자들로 하여금 빠르고 효율적인 프로그램을 만들게 할 것 입니다.
  • 개발자로서의 경험: 개발자들은 초기 애플리케이션 논리부터 일련의 버그 수정까지의 전과정에 걸쳐 지원 받아야 합니다.
  • 자원을 통한 소유권 직감: 자원은 데이터 구조와 유사한 복합적인 데이터 유형으로 직접적인 자산의 소유권을 나타냅니다. Cadence의 강인하고 정적인 시스템은 자원이 같은 시간에 한 곳에서만 머물게 하고 코딩의 실수로 인해 복사되거나 사라질 수 없게 합니다. 보통의 스마트 컨트랙트 언어들은 소유권을 기록하기 위해 스마트 컨트랙트에 저장되어 있는 fungible 토큰같은 자산이 중심 원장에 들어갈 수 있는 권한을 부여하는 ledger 스타일의 접근 방식을 사용합니다. Cadence의 자원은 자원을 계정의 저장공간에 저장하여 자산의 소유권과 소유하는 계정을 직접적으로 묶습니다. 결과적으로 소유권은 스마트 컨트랙트의 저장소에 한데 모여있지 않게 됩니다. 각각의 계정은 자신의 자산을 소유하고 그리고 그 자산들은 중앙 스마트 컨트랙트의 승인 없이 계정 간 이동이 자유롭습니다.

기존의 언어를 이용한 문제해결

기존의 언어들은 스마트 컨트랙트의 개발을 개척했지만 차세대 애플리케이션의 장기적인 실행 가능성에 영향을 미치는 요소들이 결핍되어 있습니다.

안전성

안전성은 스마트 컨트랙트가 의도한대로 작동하는 신뢰도입니다. 이것은 스마트 컨트랙트가 한번 배포되면 다시는 바꿀 수 없기 때문에 개발자들은 배포전에 어떠한 실수던 바로잡아야 한다는 특성에 큰 영향을 받습니다. 예를 들어 2016년에 DAO 코드에서 못보고 넘어간 실수가 스마트 컨트랙트로부터 많은 양의 돈을 잃게 하여 결과적으로 이더리움이 이더리움과 이더리움 클래식으로 갈라지게 하는 원인이 되었습니다.

버그 수정은 스마트 컨트랙트가 복잡함과 보안 문제를 유발하는 기능을 지원하도록 디자인된 경우에만 가능합니다. 시간이 오래걸리는 검사와 리뷰의 과정은 버그로부터 안전한 스마트 컨트랙트가 보장됩니다. 하지만 이미 스마트 컨트랙트의 핵심 논리가 제대로 작동하게 하는데 시간이 좀 걸리는데 검사와 리뷰는 여기에 더하여 상당한 시간을 소모하게 합니다.

발견하지 못하고 넘어간 실수는 치명적인 결과를 불러 일으킵니다. 기존의 언어들이 관련 불변량을 확인하지 않거나 표현하는데 있어서 더 어렵기 때문에 화폐의 가치 또는 자산을 잃거나 복제하는 것이 쉽습니다. 예를 들어 거래된 양을 나타내는 일반적인 숫자가 실수로(혹은 의도적으로) 배가 되거나 무시될 수 있습니다.

어떤 언어들은 개발자들이 자주 잊어버리는 행동을 나타내기도 합니다. 예를 들어 고정 범위 유형은 잠재적 오버플로우나 언더플로우에 대한 고려 없이 통화의 가치를 나타냅니다.Solidity에서 오버플로우는 값이 반올림 되게 합니다. Solidity는 또한 거래가 변수를 초기화하지 않고 선언할 수 있게 해줍니다. 개발자가 초기 내용 설정을 추가하는 것을 까먹고 코드 내부 어딘가에서 변수를 읽고자 한다면 문제가 발생할 것입니다.

Cadence는 안전하고 강하고 고정된 유형의 시스템을 가지고 있어 컴파일 와중에 일어나는 오류 또는 원하지 않은 프로그램의 동작을 방지합니다. 유형은 정적으로 확인되고 은연중에 변환되지 않습니다. Cadence는 또한 산술적인 언더플로우와 오버플로우를 방지하여 프로그램의 안전성을 향상 시키고 선례가 없는 경우를 명확하게 하기 위해 옵션을 도입하며 항상 변수의 초기화를 요구합니다. 이것은 스마트 컨트랙트의 동작이 분명하고 상황에 따라 달라지지 않는다는 것을 보장하는데 있어 도움을 줍니다.

보안

보안성은 안전성과 함께 인가되지 않은 접근을 막고 검증된 액션만 프로토콜에서 수행될 수 있도록 하여 스마트 컨트랙트의 성공적인 실행을 보장합니다. 어떠한 언어들에서는 기능이 기본적으로 공개되기 때문에 약점이 생겨 악의적인 의도를 가진 유저들이 공격할 수 있게 하는 상황을 발생 시킵니다. Cadence는 capability-base 보안을 활용하여 type 시스템이 사용자와 유저가 권한을 가지고 있는 규칙을 기반으로 접근 제어를 가능하게 합니다.

보안은 다른 스마트 컨트랙트들과 상호작용 할 때 고려해야 하는 사항입니다. 그 어떤 외부 호출도 악의적인 코드가 실행 될 수 있는 가능성이 있습니다. 예를 들어 solidity에서 호출된 함수 서명이 기존의 가능한 것들과 매치되지 않는다면 solidity의 fallback 함수를 야기합니다. 그리고 이러한 함수들은 악의적인 방법들로 사용될 수 있죠. 다중 상속, 과적, 그리고 발송과 같은 언어의 특징들은 어느 코드가 발동 되었는지 더욱 알기 어렵게 합니다.

Cadence에서는 프로그램의 안전과 보안이 Design By Contract와 Ownership Primitives에 의해 보장됩니다. Design by contract는 개발자들로 하여금 함수에 쓰이는 전제 조건과 사후 조건을 명시하고 declarative manner로 접속하게 하여 호출한 사람들이 호출한 코드를 믿을 수 있도록 합니다. 초기의 소유권은 linear type에 영감을 받아 계정과 관련된 일에선 더욱 안전합니다. 중요한 자산이 실수로 또는 악의적으로 없어지거나 복제되지 않도록 보장합니다.

선명도와 접근성

함축성, 상황 의존도, 그리고 표현력은 개발자들이 마주치는 언어 기반 문제들입니다. 이것들은 언어와 그 언어를 이용한 프로그램의 선명도와 접근성에 영향을 미칩니다. 예를 들어 solidity에서 storage는 개발자의 의도를 애매하게 하는 low-level key-value의 수준에서 실행되어야 합니다. 또 다른 예로는 구문 혼동이 있습니다. with “=+” being legal syntax leading to an assignment instead of a probably-intended increment. Solidity는 의도치 않은 결과를 유발하는 일반적이지 않은 행동과 관련된 특징들도 가지고 있습니다. 다중 상속화는 프로그램에서 예기치 않은 결과로 이어질 수 있고 코드를 검사하고 테스트 해보는 것으로는 이 문제를 발견할 수 없습니다.

이더리움 블록체인의 코드의 불변성은 ad-hoc 수정을 허용하는 확장과 메커니즘의 필요성을 고려해야 한다는 것을 보여줍니다. 비트의 발자취는 이더리움의 현재 업그레이드 전략과 이슈들을 자세히 설명하고 있습니다. 업그레이드 가능성에 대한 접근을 ‘data separation’을 이용하는 개발자들은 데이터 구조의 복잡성과 관련한 문제에 직면하게 되고 ‘delegatecall-based proxies’를 이용하는 개발자들에겐 메모리 레이아웃의 일관성에 관련한 문제가 제기될 것입니다. 어느 쪽이던 간에 이 문제들은 접근성과 전체적인 확장 가능성을 타협하게 할 것입니다.

Cadence는 확장, 코드 재사용, 그리고 계약 간 상호 운용성을 허용하는 인터페이스를 이용함으로써 선명도와 프로그램 확장성을 증진 시킵니다. Cadence 모듈은 코드가 변경 불가능해지기 전에 프로젝트가 반복 테스트 할 수 있게 내재적으로 장착된 설정 가능하고 투명한 업그레이드 가능성 또한 가지고 있습니다.

Cadence는 argument 함수의 의미를 설명할 수 있게 argument 레이블의 이용을 허락합니다. 또한 Cadence는 통화와 관련된 작업을 할 때 도움이 되는 fixed-point arithmetic과 같은 유용한 데이터 구조와 데이터 타입의 풍부한 표준 라이브러리를 제공합니다.

--

--