블록체인을 기반으로 구축하려면 기존 프로그래밍에서 패러다임의 전환이 필요하며 블록체인의 탈중앙화 모델에 대한 철저한 이해가 필요합니다. 스마트 컨트랙트 개발자는 탈중앙화 애플리케이션(DApp)을 개발하기 위해 특정 기능들을 사용할 수 있습니다. 개발자는 첫 번째 시도부터 안전한 디앱(DApp)을 구축해야 합니다. 이 글에서는 일반 애플리케이션 개발과 블록체인 애플리케이션 개발의 차이점을 설명하겠습니다. Aiken으로 작성된 스크립트와 솔리디티로 작성된 SC를 살펴보겠습니다.
블록체인 상에서의 구축은 어떻게 다른가?
일반 프로그래밍 언어와 블록체인 언어의 가장 큰 차이점은 사용 사례와 설계 원칙입니다. 일반적인 프로그래밍 언어는 범용적이며 다양한 애플리케이션을 개발하는 데 사용할 수 있습니다. 반면, 블록체인 언어는 탈중앙화 애플리케이션(DApp)과 스마트 컨트랙트(SC) 개발을 돕기 위해 특정 기능으로 설계되는 경우가 많습니다.
기존 프로그래밍 언어를 사용하는 개발자는 거의 모든 것을 작성할 수 있는 수많은 라이브러리를 마음대로 사용할 수 있습니다. 전 세계 개발자 커뮤니티가 수년에 걸쳐 개발한 이러한 라이브러리는 파일 입출력 처리부터 복잡한 머신러닝 알고리즘까지 다양한 기능을 지원하는 사전 작성된 코드를 제공합니다. 이 방대한 라이브러리 생태계를 통해 개발자는 처음부터 다시 개발할 필요 없이 빠르고 효율적으로 애플리케이션을 구축할 수 있습니다.
그러나 블록체인 개발의 경우 상황은 상당히 다릅니다. 이더리움용 솔리디티나 카르다노용 플루투스 같은 블록체인 프로그래밍 언어는 강력하지만, 사용 가능한 라이브러리의 폭과 깊이가 동일하지 않습니다. 이는 부분적으로는 블록체인 기술이 상대적으로 새롭고 스마트 컨트랙트 작성에 필요한 특정 요구 사항 때문이기도 합니다.
블록체인 프로그래밍 언어는 암호화와 자금 관리에 중점을 두고 설계되었습니다. 또한, 새로운 유형의 토큰을 생성하고 토큰에 대한 제어, 송금 조건 등을 정의할 수도 있습니다.
SC를 작성하는 개발자는 해당 컨트랙트에 인코딩된 로직과 규칙을 제어할 수 있습니다. 그러나 블록체인 네트워크 자체의 특정 측면에 대한 통제권은 없습니다.
예를 들어, 개발자는 트랜잭션이 처리되고 블록체인에 추가되는 속도인 네트워크 처리량을 제어할 수 없습니다. 이는 네트워크의 프로토콜, 노드 수, 사용되는 합의 알고리즘 등 다양한 요인에 의해 결정됩니다.
마찬가지로 개발자는 블록 생성자의 잠재적인 블록 조작을 제어하거나 방지할 수 없습니다. 블록 생성의 무결성은 블록체인의 기본 합의 알고리즘과 네트워크 규칙에 의해 유지됩니다.
개발자는 SC의 동작을 지시할 수 있지만, 그 실행은 블록체인 네트워크에 따라 달라지며 네트워크에 의해 제한될 수 있습니다.
이러한 문제를 분리하는 것은 블록체인 기술의 탈중앙화 특성이란 근본적인 측면입니다. 이는 어느 한 당사자가 블록체인 네트워크의 모든 측면을 완벽하게 통제할 수 없도록 하여 보안과 신뢰성을 향상시킵니다. 이는 블록체인의 바람직한 특징이지만, 일부 개발자는 외부 요인에 의해 다소 제한되거나 의존적이라고 느낄 수 있습니다.
블록체인 개발에서 코드는 탈중앙화된 네트워크에서 실행되며 블록체인 프로토콜의 제약을 준수해야 합니다. 예를 들어, SC의 모든 작업에는 일정량의 '가스’가 필요하며, 개발자는 가능한 한 가스 효율이 높은 컨트랙트를 작성해야 합니다. 이는 종종 스마트 컨트랙트의 코딩 스타일이 더 낮은 수준이고 명시적이라는 것을 의미합니다.
또한, 스마트 컨트랙트는 블록체인에 배포된 후에는 변경할 수 없습니다. 이러한 불변성은 블록체인 기술의 근본적인 특징이지만, 개발자가 처음부터 코드를 올바르게 작성해야 한다는 의미이기도 합니다.
나중에 패치를 적용할 수 없기 때문에 오류나 보안 취약점에 대한 여지가 없습니다. 따라서 스마트 컨트랙트 개발 과정에는 엄격한 테스트와 감사가 수반되는 경우가 많습니다. 이로 인해 디앱 개발 기간이 길어지고 비용이 더 많이 듭니다.
새로운 개발자가 블록체인 프로그래밍의 모든 위험성을 이해하는 것은 어려운 일이지만, 탈중앙화 모델은 또 다른 함정을 초래할 수 있습니다.
일반적인 애플리케이션을 개발할 때는 단일 주체가 데이터와 기능을 제어하는 중앙 집중식 시스템을 만드는 경우가 많습니다. 이는 탈중앙화 모델에서 작동하는 블록체인 애플리케이션과는 완전히 대조적입니다. 이 모델에서는 단일 주체가 전체 네트워크를 제어할 수 없습니다. 대신, 노드들로 구성된 네트워크에 제어권이 분산되어 있습니다.
SC는 블록체인 애플리케이션의 기본 요소입니다. SC는 계약 조건이 직접 코드로 작성된 자체 실행형 계약입니다. 중개자 없이도 미리 정해진 규칙에 따라 자동으로 트랜잭션을 실행합니다. 이러한 자동화는 인적 오류와 사기의 위험을 줄여줍니다.
오류에 대한 여지가 없으므로, SC는 주어진 조건에서 예상되는 일을 정확히 수행해야 합니다. 제3자가 SC의 실행에 영향을 미치거나 중단시킬 수 없어야 합니다. 규정은 곧 법입니다. SC 실행이 실패하고 예기치 않은 오류가 발생한다면 일반적으로 손실된 자금을 복구할 방법이 없습니다.
디앱 개발의 또 다른 특징은 개발자가 이더리움과 같은 한 가지 환경을 잘 알고 있다면, 카르다노에서 개발할 준비가 전혀 되어 있지 않을 수도 있다는 것입니다. SC 플랫폼은 근본적으로 서로 다를 수 있습니다.
개발자가 새로운 플랫폼으로 넘어가는 것은 어렵다.
이러한 차이는 애플리케이션의 디자인, 기능, 보안에 큰 영향을 미칠 수 있으므로 개발자는 SC 플랫폼 간의 중요한 차이점을 알고 있어야 합니다. 예를 들어 상태와 동시성의 차이점을 살펴봅시다.
두 가지 대표적인 SC 플랫폼인 이더리움과 카르다노는 특히 상태 관리와 동시성 측면에서 이러한 차이가 어떻게 나타날 수 있는지에 대한 좋은 예시가 됩니다.
이더리움은 계정 기반 모델로 운영됩니다. 이 모델에서는 전체 네트워크가 글로벌 상태를 공유하며, 이는 블록이 생성될 때마다 업데이트됩니다. 이 글로벌 상태에는 계정 잔고와 스마트 컨트랙트 상태가 포함됩니다.
이더리움의 모델에서는 여러 사용자가 단일 블록 내에서 하나의 스마트 컨트랙트와 상호작용할 수 있습니다. 그러나 이러한 변경 가능한 상태 공유는 특히 동시성과 관련하여 복잡성과 잠재적 취약성을 초래할 수 있습니다. 여기서 동시성이란 여러 트랜잭션이 동시에 실행될 수 있는 기능을 의미합니다. 이를 올바르게 처리하지 않으면 경쟁 조건 및 기타 보안 취약점이 발생할 수 있습니다.
반면, 카르다노는 확장 미사용 트랜잭션 출력(EUTxO) 모델을 사용합니다. 이 모델에서 자금 송수신은 잔고가 아니라 지갑 주소와 연결된 미사용 트랜잭션 금액(UTxO)으로 저장됩니다. 이러한 UTxO는 각각 한 번만 사용할 수 있습니다.
이 모델은 본질적으로 동시성을 처리하는데, 각 트랜잭션 출력은 한 번만 사용할 수 있고, 한 번 사용하면 다른 트랜잭션에서 사용할 수 없기 때문입니다. 그러나 이는 또한 개발자가 스마트 컨트랙트를 설계하고 상태를 처리하는 방식에 대해 다르게 생각해야 한다는 것을 의미합니다.
이러한 차이점을 이해하는 것은 개발자가 스마트 컨트랙트의 버그와 취약성을 피하기 위해 매우 중요합니다. 예를 들어, 이더리움 SC의 일반적인 취약점인 재진입(reentrancy)은 공격자가 첫 번째 함수 호출이 완료되기 전에 반복적으로 함수를 호출할 수 있는 취약점입니다. 카르다노에서는 EUTxO 모델 덕분에 이러한 문제가 덜 발생합니다.
이더리움과 카르다노는 모두 탈중앙화 애플리케이션 개발을 위한 강력한 플랫폼을 제공하지만, 상태와 동시성을 처리하는 각기 고유한 접근 방식을 가지고 있습니다. 개발자는 이러한 차이점과 스마트 컨트랙트 개발에 미치는 영향을 이해해야 이러한 플랫폼에서 안전하고 효율적인 애플리케이션을 효과적으로 구축할 수 있습니다.
솔리디티를 잘 이해하는 개발자는 카르다노로 쉽게 넘어갈 수 없습니다. 새로운 프로그래밍 언어( Plutus, Aiken 등)를 배워야 할 뿐만 아니라 주어진 블록체인의 특정 특성도 이해해야 합니다. 예를 들어 솔라나로 넘어갈 때도 마찬가지입니다.
한 블록체인 플랫폼에서 다른 블록체인 플랫폼으로 전환하는 것은 단순히 새로운 프로그래밍 언어를 배우는 것 이상이 필요합니다. 각 플랫폼에는 고유한 아키텍처, 합의 메커니즘, 거래 모델, 계정 모델, 스마트 컨트랙트 기능이 있습니다.
예를 들어 개발자가 이미 인터넷, 데이터베이스, 클라우드 서비스, 파일 시스템 등의 개념에 대한 경험이 있다면 Java에서 C#으로 전환하는 것이 더 쉬울 수 있습니다.
Aiken
Aiken은 카르다노용 스크립트(스마트 컨트랙트)를 작성하는 데 사용되는 함수형 프로그래밍 언어입니다.
그림에서 매우 간단한 검증자 스크립트를 볼 수 있습니다. 이 스크립트는 송금 조건이 충족되는지 확인합니다.
송금자는 'Hello, World!'라는 문자열과 함께 서명을 제출해야 합니다. 그렇다면 스크립트의 반환 값은 True입니다. 그러면 자금 지출이 허용됩니다.
개발자가 사용할 수 있는 기능을 확인해보세요. 무엇보다도 개발자는 바이트 배열을 사용하여 서로 비교하고, 여러 해시 함수(blake2b_256, sha2_256, sha3_256)를 사용하고, 일정 시간 간격으로 작동하고, 기본 산술 함수를 수행하고, 문자열로 작업하는 등의 기능을 다룰 수 있습니다.
블록체인과 더 밀접한 관련이 있는 기능의 경우 개발자는 주소, 인증서, 트랜잭션으로 작업할 수 있습니다. 또한 ADA 코인과 토큰 등의 가치로 작업할 수도 있습니다.
카르다노용 디앱은 온체인과 오프체인 부분으로 구성되어야 합니다. Aiken은 온체인 부분만을 위한 것입니다. 개발자는 적절한 프로그래밍 언어를 사용하여 오프체인 부분을 구축할 수 있습니다.
카르다노에서 Aiken 또는 Plutus로 작성된 스마트 컨트랙트는 본질적으로 트랜잭션의 유효성 여부를 결정하는 유효성 검사 스크립트이기 때문에 크기가 더 작은 경우가 많습니다. 이들은 각 트랜잭션 출력에 이를 사용하려는 모든 트랜잭션의 유효성을 검사하는 작은 로직(컨트랙트)을 포함하는 UTXO 모델에서 작동합니다.
반면, 솔리디티로 작성된 이더리움의 스마트 컨트랙트는 블록체인에 존재하는 상태 저장 애플리케이션으로, 일반적으로 더 높은 수준의 복잡성을 갖습니다. 스마트 컨트랙트는 계정 기반 모델에서 작동하며, 컨트랙트는 블록체인에 영구적인 상태를 저장하고 이 상태를 변경할 수 있는 기능을 가지고 있습니다.
아래 그림에서 디지털 토큰의 소유권을 관리하고 토큰 소유자 간에 토큰을 전송할 수 있도록 하는 컨트랙트의 예를 볼 수 있습니다.
컨트랙트의 처음 네 줄은 블록체인에 저장된 상태를 나타냅니다.
기존의 객체 지향 프로그래밍 언어로 작성된 소규모 엔터프라이즈 애플리케이션은 수천 줄의 코드를 포함할 수 있지만, 엔터프라이즈 애플리케이션은 수만에서 수십만 줄의 소스 코드를 쉽게 포함할 수 있습니다. 예를 들어, 보잉 787의 항공 전자 장치 및 온라인 지원 시스템에는 650만 줄의 코드가 있습니다.
코드 줄 수 측면에서 보면 디앱은 일반 앱에 비해 작습니다. 간단한 디앱에는 각각 수십 줄에서 수백 줄의 코드로 구성된 몇 개의 스마트 컨트랙트가 사용될 수 있습니다. 탈중앙화 거래소나 대출 플랫폼과 같이 더 복잡한 디앱은 수천 줄의 코드로 구성된 여러 개의 스마트 컨트랙트로 구성될 수 있습니다.
결론
디앱 개발은 매년 점점 더 많은 개발자를 끌어들이는 새로운 수익성 있는 분야입니다. 개발자들은 탈중앙화의 모든 함정과 블록체인 개발의 특수성을 극복해야 함에도 불구하고 점점 더 효율적이고 사용자 친화적인 디앱을 제공할 수 있습니다. 예를 들어, 휴대폰용 게임과 애플리케이션 개발은 경쟁이 치열하고 포화 상태입니다. 블록체인 산업에서는 한 팀이 자리를 잡고 해당 분야에서 지배적인 플레이어가 되는 것이 훨씬 더 쉬울 수 있습니다. 유혹적이죠.
* Source: https://cexplorer.io/article/what-makes-development-on-blockchain-different
* Translation: Ilhun@CryptoVeri enics_sky@naver.com
1 post - 1 participant