News & Events
블록체인이 존재하며 암호화폐가 금융계를 휩쓸고 있고 세계는 이더리움과 비트코인을 그 어느 때보다도 포용하고 있다는 사실은 부인할 수 없다. 그 어느 때보다 많은 기사들이 뉴스 네트워크에 의해 발행되어 이러한 아이디어들이 보다 주류화된 원천이 되고 있다. 대형 은행들이 수십억 달러의 투자처를 통해 암호화폐 자산으로의 전환을 주도하고 있다.
우리가 처한 이 새로운 세계에 대해 더 알아보자!
이더리움 Vs 비트코인
2015년 출시된 이더리움은 시가총액 2위(해당 포스팅 기준 256B)로 비트코인(644B)에 뒤졌다. 하지만 이더리움을 비트코인에 이렇게 비교하는 것은 공정하지 않다. 비트코인은 2009년 처음 출시된 암호화폐로 중앙조직 없이도 온라인으로 안전하게 거래할 수 있는 디지털 화폐이다.
이 포스팅에서 비트코인에 대한 설명은 생략할 것이다. 더 많은 정보를 원한다면, 여기 좋은 설명이 있다. 이더리움은 비트코인과 달리 디지털 화폐가 아니라 스마트 컨트랙트를 위한 플랫폼이다. ETH는 이더리움과 연관된 코인으로 비트코인처럼 거래될 수 있지만 더 많은 것을 위해 사용될 수 있다!
스마트 컨트랙트는 분산된 네트워크가 중앙 권한 없이 코드를 안전하게 실행할 수 있도록 하는 방법이다. 이 개념은 현재 금융 부문에 국한되지 않고 많은 산업에 혁명을 일으키고 있다.
비트코인의 재산 저장소와 이더리움의 스마트 컨트랙트를 통한 업무 수행 능력을 비교할 수 있는 또 다른 방법은 다음과 같다.
비트코인이 ‘디지털 골드’라면 이더리움은 ‘디지털 오일’로 볼 수 있다.
스마트 컨트랙트
이더리움에서 스마트 컨트랙트는 코드 블록으로, 내부 상태, 사용자, 심지어 자신의 토큰까지 포함할 수 있다. 이들은 블록체인 네트워크에 배치되고 분산 방식으로 네트워크에 의해 완벽하게 관리된다.
간단히 말해 스마트 컨트랙트는 분산형 싱글톤(초단순화이지만 좋은 시작)이다. 아래 예를 살펴보자.
pragma solidity ^0.8.0;
contract Parrot {
string speech;
constructor() public {
speech = “Polly want a cracker”;
}
function teach(string newSpeech) public returns(bool success) {
speech = newSpeech;
return true;
}
function speak() public view returns(string itSays) {
return speech;
}
}
이는 이더리움 네트워크에 구축될 수 있는 기본 스마트 컨트랙트의 예이다. 구축되면 계약서에 참조할 수 있는 자체 이더리움 주소가 부여된다.
이것은 꽤 간단한 예이며 위의 기능을은 코딩하는 데 익숙한 사람들에게는 그리 어려운 일이 아니지만, 이것은 스마트 컨트랙트이기 때문에 몇 가지 주요 차이점이 있다.
내부 상태
이 예에서는 문자열의 내부 상태를 유지하는 패럿이라는 컨트랙트를 선언한다. 스마트 컨트랙트는 전체 블록체인 네트워크에서 검증되므로 이 컨트랙트는 여러 개의 복사본을 네트워크의 모든 노드에 분산시켜 각각 내부 상태를 계산하고 기록한다. 네트워크의 각 노드는 계약이 보는 모든 트랜잭션을 효과적으로 실행하고 보안을 위해 네트워크의 다른 모든 노드에 대해 유효성을 검사한다. 동일한 데이터의 복사본이 많다.
트랜잭션 및 비용
전통적인 언어의 코드와 위의 코드를 분리하기 시작하는 것은 거래의 형태로 나타난다. teach 기능은 계약 내부 상태 및 네트워크 전반을 수정하여 데이터를 블록체인에 기록하고 트랜잭션을 기록한다. 이 트랜잭션은 특정 업데이트에서 변경된 블록 체인에 대한 기록이며, 이 경우 계약의 내부 상태가 어떻게 업데이트되었는지 표시된다.
function teach(string newSpeech) public returns(bool success) {
speech = newSpeech;
return true;
}
중요한 것은 거래가 자유롭지 않다는 것이다. 거래는 “gas”라는 이름으로 작동된다. 네트워크의 마이너들은 블록을 생성하기 위해 해시를 풀고, 블록을 검증한 후 네트워크에 추가한다. 이 과정에 대한 보상으로, 그들은 ‘gas’라고 불리는 각 거래에 대해 소량의 토큰을 받는다. 거래를 처리하고 검증하기 위한 팁이라고 생각하면 된다. 이 가격은 고정되어 있지 않고 시장에 따라 변동한다. 마이너들은 검증하고자 하는 트랜잭션을 자유롭게 선택할 수 있다. 만약 신속하게 완료하거나 아예 완료하려면 gas를 절약해야 한다.
다음과 같은 게이온 사이트에서 가격을 추적할 수 있다.
위 함수에 대한 요청은 다음과 같다: source
params: [{
// From what Ethereum address (your personal wallet)
“from”: “0xb60e8dd61c5d32be8058bb8eb970870f07233155”,
// To what Ethereum address (the address of the contract)
“to”: “0xd46e8dd67c5d32be8058bb8eb970870f07244567”,
// The gas (or tip) to the miner that processed this request
“gas”: “0x76c0”,
// Encoded data representing the function name and parameters to call
“data”: “0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f”
}]
계약 데이터 Viewing
이러한 내부 상태는 언제든지 말하기 기능으로 읽을 수 있다. 이 함수는 키워드 view 를 가지고 있다. 즉, 데이터만 반환하고 내부 상태는 편집하지 않으므로 호출할 트랜잭션이 필요하지 않다. 네트워크상의 노드에 이 데이터를 요청하기만 하면 네트워크 전반의 작업 없이도 데이터를 제공할 수 있다. 이는 이 값을 얻기 위해 gas가 필요하지 않다는 것을 의미한다!
function speak() public view returns(string itSays) {
return speech;
}
다양한 트랜잭션의 사례
위의 계약과 같은 계약은 특별히 유용하지는 않지만 분산형 애플리케이션을 실행하는 데 블록체인을 사용하는 방법을 보여준다. 보다 정교한 계약은 사용자 지갑을 추적하고, 토큰을 직접 생성하며, 완전한 분산 시스템을 만들기 위해 다른 계약을 호출할 수 있다.
기차표 보험에 대한 보험계약의 더 실제적인 예를 상상해보자. 내부 상태가 단순한 문자열이 아니라 견고하게 구조를 만들 수 있다.
struct Customer {
bool hasPolicy;
uint256 lastPayment;
}
그러면 모든 이더리움 지갑에 맵을 설정할 수 있는 솔리드 기능을 사용할 수 있다. 이 기능은 블록 체인의 모든 이더리움 지갑에 키가 있는 해시맵과 같다.
mapping(address => Customer) public insured;
사실상 위에서 정의한 바와 같이 키들은 가능한 모든 이더리움 지갑이고 값이 고객 객체인 해시 테이블을 설정하는 것이다. 처음에는 비어 있다. 존재하지 않는 지정된 키를 요청하면 0 값이 반환된다(hasPolicy는 0 또는 false). 계약이 실행되어 트랜잭션이 기록되면 이 테이블에 추가된 새 데이터가 저장되며, 조회 시 새 데이터를 찾을 수 있다.
그런 다음 스마트 계약에 따라 보험에 가입할 수 있다.
function signUp() payable public {
Customer storage customer = insured[msg.sender];
// Accept initial payment into the contract
require(msg.value == 0.01);
customer.lastPayment = now;
customer.hasPolicy = true;
}
function payPremium(address addr) public payable {
InsuranceTaker storage customer = insuranceTakers[insuranceTaker];
// Verify they paid and have a policy
require(msg.value == 0.01);
require(customer.hasPolicy);
customer.lastPayment = now;
}
가입은 계약을 계속하기 전에 require 키워드를 사용하여 지정된 값이 참인지 확인한다. 유효성 검사에 실패하면 계약이 실행되지 않는다. signUp 기능으로의 호출로 사용자가 0.01 ETH를 실제로 계약에 전송했다고 가정해 보자. 이 경우, 계약서는 ETH(계약서 자체도 지갑임)를 유지하고 발송인이 현재 보험에 가입되어 있고 방금 지불되었음을 등록한다.
다시 결제하기 위해 사용자는 payPremium에 다시 전화를 걸어 동일한 프로세스를 수행할 수 있다. 이번에는 lastPayment이 현재 시간으로 업데이트되어 보험 기간이 연장된다.
그런 다음, 우리는 주어진 계정이 보험에 가입되어 있는지 확인하기 위해 계약에 대한 공개 기록을 확인하여 거기에 기재된 그들의 보험을 확인할 수 있다.
function isInsured(address addr) public pure returns (bool insured) {
Customer storage customer = insured[addr];
return customer.hasPolicy && customer.lastPayment + paymentPeriod >= now;
}
pure view
이 기능은 gas가 필요하지 않으므로 view 와 매우 유사한 pure으로 나열된다. View는 단순히 내부 상태를 반환하며, pure는 해당 상태에 대해 계산을 수행할 수 있지만 해당 상태를 편집하지는 않는다. 여기에서는 마지막 지불이 일정 기간 내에 이루어졌는지 확인하고, 만약 그렇다면 그들은 보험에 가입되어 있는 것이다.
마지막으로, 보험금을 청구하는 것은 보험을 찾아보고 필요한 사람에게 자금을 배분하는 것이다.
function claim() public {
Customer storage customer = insured[addr];
require(isInsured(msg.sender));
msg.sender.transfer(10.0);
}
전체적으로 보험에 대한 위의 접근법의 문제는 매우 크지만, 이러한 보험은 스마트 계약의 한도 내에서 안전하게 추가할 수 있다. 이 포스팅의 목표는 보험에 대한 새로운 접근 방식을 제시하는 것이 아니라, 블록체인의 토큰과 자산을 분산 관리하는 것이 얼마나 간단한지를 설명하는 것이었다. 이 계약들이 어떻게 검증에 필요한 어떠한 중앙 권한도 없이 금융 거래의 보안과 공공 시스템 설정에 사용될 수 있는지 명확하기를 바란다.
번역 – 핀인사이트 인턴연구원 강지윤(shety0427@gmail.com)
원문 보러가기>