솔리디티란?
솔리디티(Solidity)는 객체 지향의 고급 프로그래밍 언어로, 다양한 블록체인 플랫폼에서 스마트 컨트랙트를 생성하고 구현하는 데 사용된다. 이러한 플랫폼에는 주로 이더리움이 포함되지만, 솔리디티는 폴카닷(Polkadot)과 같은 다른 플랫폼에서도 사용된다.
솔리디티 작동 방식
솔리디티의 구문은 C++, 파이썬, 자바스크립트와 같은 영향력 있는 언어에서 영감을 얻었다. 그렇기 때문에 이러한 언어에 익숙한 개발자에게는 친숙하게 느껴질 것이다.
솔리디티의 핵심 애플리케이션인 스마트 계약은 계약 조건이 코드에 직접 기재된 자체 실행형 계약이다.
이를 통해 중앙 기관, 법률 시스템 또는 외부 집행 메커니즘 없이도 신뢰할 수 있는 거래와 계약을 수행할 수 있다.
솔리디티는 이러한 계약에 생명력을 불어넣어, 복잡한 멤버 변수, 상속 체계, 타입 세이프 기능과 같은 강력한 기능을 제공함으로써 복잡하고 안전한 블록체인 애플리케이션을 제작할 수 있게 한다.
이러한 솔리디티 프로그램은 이더리움 가상 머신(EVM) 또는 EVM 호환 가상 머신에서 실행되며, 블록체인 기술의 힘을 활용하여 탈중앙화 애플리케이션(dApp)의 개발과 운영에서 중요한 역할을 한다.
솔리디티는 어떻게 만들어졌나?
2014년 8월, 이더리움의 공동 창립자인 개빈 우드(Gavin Wood)가 처음 솔리디티를 제안했다.
수석 개발자 크리스티안 라이트위스너(Christian Reitwiessner)의 지도 아래 알렉스 베레그자시(Alex Beregszaszi)를 비롯한 전 이더리움 핵심 기여자들로 구성된 팀이 솔리디티를 개발했다.
솔리디티는 이더리움 블록체인과 가장 잘 연계되어 있지만, 다른 EVM 호환 가상 머신과도 원활하게 작동한다.
솔리디티의 출현 시기는 이더리움의 기업용 블록체인, 하이퍼레저 패브릭(Hyperledger Fabric), 프라이빗 블록체인의 인기가 급증하는 시기와 맞물려 있었다.
솔리디티의 응용 분야는 매우 광범위하다. 예를 들어, SWIFT는 하이퍼레저 패브릭에서 실행되는 개념 증명에서 솔리디티의 기능을 활용했다.
솔리디티의 장단점
솔리디티의 장점
- 강력한 기능: 블록체인 애플리케이션을 만드는 데 솔리디티가 채택된 것은 솔리디티의 강력한 기능 덕분이다.
- 스마트 계약 개발: 솔리디티를 사용하면 스마트 계약을 개발할 수 있다. 스마트 계약은 안전하고 신뢰할 수 있으며, 운영 효율성을 높이고 비용을 절감할 수 있으며, 제3자에 대한 의존도를 최소화할 수 있다.
- 익숙한 언어: 솔리디티의 구문은 C++, 파이썬, 자바스크립트에서 영감을 받았기 때문에 이러한 언어에 익숙한 개발자에게 친숙하다. 변수, 함수, 연산, 기타 익숙한 프로그래밍 개념이 솔리디티에서 많이 활용된다.
- 풍부한 문서 및 사용 사례: 이더리움 및 EVM 체인에 대한 풍부한 오픈소스 문서와 사용 사례는 애플리케이션을 구축하는 복잡한 작업을 덜 어렵게 만든다.
- 혁신적 기능: 유동성 파밍이나 대출과 같은 혁신적인 기능이 필요한 시나리오에서도 유니스왑과 같은 인기 탈중앙화 거래소의 소스 코드를 간단히 포크할 수 있다.
솔리디티의 단점
다른 언어와 마찬가지로 솔리디티에도 단점이 있다.
- 스마트 계약의 불변성:솔리디티에서 스마트 계약의 불변성은 많은 경우 유익하지만, 문제가 될 소지도 있다. 한 번 배포된 계약은 변경하거나 개선할 수 없으므로 동적인 환경에서는 문제가 될 수 있다.
- 정보 수집 및 업데이트의 한계: 솔리디티는 다른 블록체인 기반 시스템과 마찬가지로 시스템에서 정보를 자율적으로 수집하고 업데이트할 수 없다. 이는 통화쌍(외환)과 같이 변동성이 큰 데이터를 처리할 때 중요한 문제가 된다.
- 라이브러리 및 리소스의 상대적 부족: C나 Java와 같은 성숙한 언어에 비해 솔리디티는 아직 초기 단계에 머물러 있다. 인기가 높아지고 있음에도 불구하고 라이브러리와 리소스가 상대적으로 부족하기 때문에 초보자에게는 솔리디티를 배우는 것이 쉽지 않을 수 있다.
솔리디티의 예
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;
contract Coin {
// “public” 키워드는 변수가
// 다른 컨트랙트에서 접근할 수 있게 한다.
address public minter;
mapping(address => uint) public balances;
// 이벤트는 클라이언트가 반응하도록 한다.
// 특정한 컨트랙트 변경에
event Sent(address from, address to, uint amount);
// 생성자 코드는 컨트랙트가
// 생성될 때만 실행된다.
constructor() {
minter = msg.sender;
}
// 새로 생성된 코인의 양을 주소로 전송한다.
// 컨트랙트 생성자만 호출할 수 있다.
function mint(address receiver, uint amount) public {
require(msg.sender == minter);
balances[receiver] += amount;
}
// 에러는 다음과 같은 정보를 제공한다.
// 연산이 실패한 이유. 에러는 반환된다.
// 함수 호출자에게
error InsufficientBalance(uint requested, uint available);
// 기존 코인의 양을
// 모든 호출자로부터 주소로
function send(address receiver, uint amount) public {
if (amount > balances[msg.sender])
revert InsufficientBalance({
requested: amount,
available: balances[msg.sender]
});
balances[msg.sender] -= amount;
balances[receiver] += amount;
emit Sent(msg.sender, receiver, amount);
}
}
결론
새롭게 떠오른 프로그래밍 언어인 솔리디티는 수많은 도전 과제에도 불구하고, 프로그래밍 환경에서 중요한 위치를 차지하고 있다. 이더리움의 스마트 계약 강화라는 중요한 역할 때문이다.
다른 도구와 마찬가지로 솔리디티의 효과는 사용 방법에 따라 달라진다. 개발자가 솔리디티의 잠재력을 제대로 발휘하기 위해서는 강점과 한계를 모두 인식하고 있어야 한다.
향후 금융 생태계에서 스마트 계약의 역할이 커짐에 따라 솔리디티의 역할도 커질 것으로 전망된다.