6
집중하다
792
수행원

블록체인과 이더리움 소개

만든 날짜: 2016-05-05 17:31:57, 업데이트 날짜: 2016-05-05 17:32:31
comments   3
hits   2492

이 글의 출처는 https://jysperm.me/2016/05/blockchain-slides/입니다.

이 글은 지난 3월 말 LeanCloud에서 했던 기술 공유를 바탕으로 작성된 글입니다.

블록 체인은 HashTree의 한 종류라고 할 수 있습니다. 그래서 HashTree와 비슷한 성질을 가지고 있습니다.

blockchain-hash-tree

이 사진은 카오에서 찍은 것입니다.<http://happypeter.github.io/bitcoin_basics/book/017_merkle_tree.html

즉, 나무 구조에서, 각 종단 노드에는 분산 값이 있고, 그렇지 않은 종단 노드의 분산 값은 모든 직접적인 하위 노드의 분산 값에서 나온다. 따라서, 각 노드는 직접적으로 또는 간접적으로 모든 하위 노드의 정보를 포함하고 있다. 따라서, 임의의 한 종단 노드의 분산 값이 변하면, 모든 부모 노드의 분산 값도 변하고, 루트 노드도 변해야 한다.

HashTree에 관한 한 가지 예를 들자면 “100% 예금증명”이라는 Zero-knowledge proofs의 한 종류입니다. Bitcion의 소유자가 거래하기 위해 비트코인을 거래소에 보관해야 하는 시나리오를 생각해 볼 수 있습니다. 이론적으로 거래소는 그 돈을 (모든 사용자들의 예금 계좌 잔액을) 사용하게 됩니다.

blockchain-proof-of-reserves

이 사진은 카오에서 찍은 것입니다.<http://blog.bifubao.com/2014/03/16/proof-of-reserves

우리는 HashTree를 만들 수 있습니다. 모든 최종 노드들이 사용자들을 대표하고, 사용자들의 잔액을 포함합니다.Σ) 와 사용자 아이덴티티의 散列 (예: 우편 주소)h), 그리고 부모 노드는 그 자식 노드의 잔액 총을 포함하고 있다.sum) 와 모든 하위 노드 정보의 해저hash) ᄋ 각 사용자에게는 자신의 종단 노드와 형제 노드, 그리고 모든 아버지 노드와 아버지 노드의 형제 노드를 보여주기만 하면 됩니다. 왜냐하면, 이 사용자는 점차적으로 아버지 노드에 대한 거슬러 올라가는 방식으로 자신의 잔액이 아버지 노드에 포함되고, 결국에는 뿌리 노드에 포함된다는 것을 확인할 수 있기 때문입니다.

이렇게 하면, 각 사용자들에게 보여지는 정보는 그들 자신의 정보와 일부 집약된 정보일 뿐이며, 각 사용자는 다른 사용자를 알 수 없이 자신의 잔액이 루트 노드에 포함된 것을 확인할 수 있다. 위의 그림에는 작은 오류가 있다.h왜?e4df9d12이 노드는 사용자들을 대표하는 최종 노드가 아니라, 통합된 정보 노드 (이 노드는 3333 잔액의 사용자와 0 잔액의 가상의 사용자를 포함할 수 있다) 가 되어야 한다. 이는 사용자의 개인정보를 유출하는 것을 방지하기 위한 것이다.

다음으로 Git에 대해 살펴보겠습니다. Git은 매우 전형적인 블록체인 애플리케이션입니다.

blockchain-git-objects-example

이 사진은 카오에서 찍은 것입니다.http://gitbook.liuhui998.com/1_2.html (GPL v2)

Git에서, 파일 (Blob), 인덱스 (Tree), 또는 컴밋 (Commit) 모두, 그 내용에 의해 결정되는 해쉬가 있습니다. 두 개 개체가 동일한 내용을 가지고 있다면, 동일한 해쉬가 있습니다. Git에서, 전체 저장소의 역사는 블록체인입니다.

Git은 블록체인을 이용해 저장소로 하나의 고유한 히스토리를 설정합니다. 만약 하나의 커밋이 변경되면, 그 이후의 모든 커밋의 해시도 바뀌게 됩니다. 물론, Git은 단지 버전 관리 도구이기 때문에 역사를 수정하는 것을 막지 않습니다.push --force), 하지만 이러한 변경은 모든 공동 작성자에게 감지될 것입니다.

블록체인의 또 다른 고전적인 응용은 바로 비트코인이며, 바로 비트코인이 블록체인이라는 단어를 널리 퍼뜨린 것입니다.

blockchain-bitcoin-block-data

이 사진은 카오에서 찍은 것입니다.https://commons.wikimedia.org/wiki/File:Bitcoin_Block_Data.png(CC-BY-SA-3.0)

비트코인에서는, 각 블록은 일련의 트랜잭션과 이전 블록의 해쉬를 포함하고, 전체 블록체인은 하나의 분산된 단일 계정을 구성한다. 새로운 블록은 10분마다 생성되고, 블록이 생성되면 영원히 블록체인에 남아 있기 때문에, 블록체인은 트랜잭션이 일어나는 순서를 고정하고, 트랜잭션이 일어나는 전후 순서를 유지하며, 한 계정이 충분한 잔액을 가지고 있는지 여부를 결정한다.

Bitcoin

이 공유의 첫 번째 부분은 간단하게 비트코인을 되돌아보는 것입니다.

비트코인에서 블록은 “작업량 증명”을 통해 생성된다. 즉, “광산”에 참여하는 모든 “광부”가 “광산”에 참여하는 모든 “광부”가 “광산”에 참여하는 모든 “광부”가 “광산”에 참여하는 모든 “광부”가 “광부”에 참여하는 모든 “광부”가 “광부”에 참여하는 모든 “광부”가 “광부”에 참여하는 모든 “광부”가 “광부”에 참여하는 모든 “광부”가 “광부”에 참여하는 모든 “광부”가 “광부”에 참여하는 모든 “광부”가 “광부”에 참여하는 모든 “광부”가 “광부”에 참여하는 모든 “광부”가 “광부”에 참여하는 모든 “광부”가 “광부”에 참여하는 모든 “광부”가 “광부”에 참여하는 모든 “광부”가 “광부”에 참여하는 모든 “광부”가 “광부”에 참여한다.

기본적으로, 각 광부들은 항상 ‘장장한 체인’을 신뢰하고, 알려진 규칙에 부합하는 가장 긴 체인을 기반으로 다음 블록을 계산합니다. 그렇지 않으면, 여러분의 계산력은 낭비됩니다. 왜냐하면 다른 광부들은 항상 가장 긴 체인을 인정하고, 만약 여러분이 가장 긴 체인을 기반으로 작업을 시작하지 않는다면, 그것은 다른 모든 광부들의 계산력에 대항하는 것입니다.

비트코인은 10분마다 새로운 블록을 생성하도록 설계되어 있으며, 이 시간은 지난 몇 블록의 간격을 관찰하여 다음 블록의 생성 조건의 난이도를 조정하여 달성합니다. 지난 몇 블록의 생성 속도가 예상보다 높을 때, 다음 블록의 생성은 더 높은 난이도가 있어야한다고 생각합니다.

일반적으로, 모든 비트코인 노드는 거래가 합법적 인지를 확인하기 위해 전체 블록체인 데이터를 저장해야합니다. 그러나 현재 전체 블록체인은 66G에 이르고 있으며 매일 약 0.1G의 속도로 증가하고 있습니다. 비트코인의 모든 사용자가 전체 블록체인을 저장하도록 요구된다면 너무 까다롭지 않습니다. 따라서 비트코인은 “단순화된 지불 확인 (SPV, Simplified payment verification) “의 메커니즘을 가지고 있습니다.

blockchain-bitcoin-state-machine

이 사진은 카오에서 찍은 것입니다.<https://github.com/ethereum/wiki/wiki/White-Paper

  • 블록체인 기록 상태 변경 기록
  • 트랜잭션 트랜잭션 일회성 상태 변경
  • 블록: 현재 상황에 대한 ‘공감’

실제로 우리는 Bitcoin의 Blockchain을 “상태 기계”로 상상할 수 있습니다. 전체 Blockchain은 상태의 “책서”이며, 모든 거래 기록이 저장되어 있습니다. 이러한 거래 기록에 따라 모든 계좌의 매 순간의 “상태”를 계산할 수 있습니다. 각 트랜잭션은 상태의 변화이며, 각 블록은 Bitcoin 네트워크 전체의 광부들의 현재 상태에 대한 “통일”입니다.

Alt Coin

비트코인의 기초는 다른 많은 암호화폐로 이루어져 있으며, 흔히 ‘알트 코인’이라고 불리기도 한다. 보통 이런 종류의 화폐는 두 가지의 구현이 있다:

첫 번째는 비트코인과 독립된 네트워크를 이용하는 것입니다. 이 장점은 자폐화가 자체적인 프로토콜과 규칙을 매우 유연하게 설계할 수 있다는 점입니다. 하지만 사용자 수가 비트코인과 비슷한 수준에 도달하기는 어렵기 때문에 악의적인 공격에 대한 방어력은 매우 약할 것입니다.

두 번째 방법은 Bitcoin의 네트워크를 사용하여 “메타 프로토콜”을 구현하고, Bitocin의 트랜잭션 위에 사용자 정의 된 정보를 부착하여 자신의 논리를 구현하는 것입니다. 이러한 장점은 Bitcoin의 컴퓨팅 파워를 사용하여 공격을 방어 할 수 있지만, 동시에 Bitcoin 네트워크에 종속되어 있기 때문에 모든 광부가 모조 화폐의 규칙을 준수하지 않기 때문에 규칙을 준수하지 않는 블록을 차단 할 수 없습니다.

이러한 복제 화폐의 경우, 비트코인은 대규모의 악의적 공격에 저항할 수 있는 많은 채굴자 참여의 블록체인을 제공할 수 있으며, 비트코인의 트랜잭션에는 사용자 정의된 데이터가 탑재될 수 있습니다.

Bitocin은 또한 한 가지를 제공합니다.Bitcoin Script더 복잡한 트랜잭션을 구현하기 위해 사용되지만, 이것이 비트코인의 핵심 기능이 아니기 때문에, 비교적 간단한 연산만 할 수 있고, 블록체인 상의 데이터를 매우 제한적으로 읽을 수 있으며, 순환 메커니즘이 없기 때문에 일반적, 튜린 완성된 논리를 작성하는 것은 어렵다.

Ethereum

blockchain-ethereum

이 사진은 카오에서 찍은 것입니다.https://www.ethereum.org/assets (CC 3.0)

이더리움 (Ethereum) 은 블록체인 기반의 탈중앙화 애플리케이션 플랫폼으로, 비트코인의 인프라를 암호화학 기반의 블록체인 기술로 구축하여 하나의 범용 플랫폼으로 만들고, 비트코인 네트워크의 일부 기능들을 보충하여 개발자들이 자신의 탈중앙화 애플리케이션을 블록체인 상에서 실행할 수 있도록 한다.

이더리움에 대해 자세히 설명하기 전에, 먼저 (내가 생각하는) 탈중앙화 네트워크의 두 가지 기초를 소개해 보겠습니다. 암호학과 게임. 암호학은 당연히 공개 키 암호화, 디지털 서명, 해체 및 추상 알고리즘을 통해 수학적으로 보안을 보장하는 것 밖에 없습니다. 게임이란 탈중앙화 네트워크에서, 악의적으로 공격하려는 사람들을 포함하여, 모든 사람이 참여할 수 있습니다. 탈중앙화 네트워크를 설계할 때, 각 참가자의 입장에서 이해관계를 고려하고, 규칙을 준수할 때 이익을 극대화하고, 규칙을 위반할 때 손실을 입거나 위험을 감수해야합니다.

그러나 디지털 세계에서는 데이터를 공개하는 데 비용이 들지 않으며 “이익”과 “손실”이 없기 때문에 “이익”을 정의하기 위해 물리적 세계와 어떤 연결을 구축해야합니다. 예를 들어, Bitocin 네트워크에서 공격자가 Blcokchain의 방향을 인위적으로 바꾸기를 원한다면, 다른 모든 광부보다 더 많은 컴퓨팅 파워를 보유해야합니다.

그래서 탈중앙화 네트워크에서 모든 문제가 “기술”으로 해결되는 것은 아닙니다. 기술이 도달하지 못하는 부분은 이익, 경제적 인센티브를 통해 해결해야합니다. 또한 “경제적 인센티브”의 필요성 때문에, Ethereum은 지갑 시스템 (화폐 단위는 “Ether (에테르) “) 을 가지고 있으며, 각 사용자는 지갑 주소를 유일한 식별자로 가지고 있습니다.

“계약”은 이더리움에서 도입된 가장 중요한 개념이다. 비트코인에서는 모든 주소가 하나의 사용자에 속한다. 우리가 “사용자”라고 말할 때, 실제로는 공개 키와 개인 키의 한 쌍을 말한다. 그러나 이더리움에서는, 키 쌍이 소유하는 주소에 더하여, “코드”가 소유하는 주소가 있다. 즉, Contract.

  • 실제로 계산된 결과는 블록 체인에 저장할 필요가 없으며, 언제든지 재 계산할 수 있기 때문입니다.
  • 다른 Contract의 함수를 호출할 수 있습니다.
  • 실행 과정에서 새로운 거래가 만들어질 수 있습니다. 이것은 자신의 지갑 잔액을 조작하는 것입니다.

먼저, Ethereum의 공식 클라이언트에서 다중 지갑을 만드는 기능이 있는 “다중 지갑”의 예를 들어 보겠습니다.

blockchain-ethereum-multi-sig-wallet

이 기능을 통해 2명의 다른 사람들과 공유되는 지갑 주소를 만들 수 있으며, 각 사람은 하루 최대 100개의 이더를 사용할 수 있으며, 이 제한을 초과하면 다른 사람의 동의를 받아야 합니다.

이 기능은 실제로 Contract를 생성하며, 위의 논리는 Contract의 코드에서 설명된다. 이 공유 지갑에서 지불금을 지불하고자 할 때, 당신은 이 공유 지갑에 메시지를 보내야 한다 ((거래는 메시지이며, 거래 금액은 0이 될 수 있으며, 데이터만 수반된다). 그 다음 공유 지갑의 코드가 실행되며, 이 지불 요청이 위의 논리에 부합하면 실제 지출 거래가 시작되며, 그렇지 않으면 지출 요청이 거부된다 ((실제로 지불금이 없다).

또 다른 예는 “보장 계약”입니다. 비트코인은 디지털 화폐로서의 가치 (그리고 법정 화폐의 환율) 가 불안정하기 때문에 하루에 두 배로 증가하거나 두 배로 감소하는 경우가 종종 발생하지만, Contracts를 통해 보장을 실현하면이 문제가 어느 정도 해결됩니다.

우리는 화폐가치를 변동시키지 않으려고 하는 사람을 ‘위험 피하는 사람’이라고 부르고, 화폐가치의 변동에 대한 위험을 감수하고 수익을 내려고 하는 다른 사람을 ‘위험 취하는 사람’이라고 부르고, 그들은 금액 (예를 들어 1000 CNY) 과 시간 창 (예를 들어 한 달) 을 계약하고, 다음 논리를 수행하는 계약을 만들 수 있습니다.

  • 리스크 회피자는 Contract의 지갑 주소로 1000 CNY의 이더를 보내며, 리스크 취수자는 또한 1000 CNY (또는 그 이상의) 의 이더를 Contract에 보내서 계약을 맺는다.
  • 한 달 후, 리스크 회피자는 그 당시 가치인 1000 CNY의 이더를 계약에서 회수할 수 있으며, 이더와 CNY 사이의 환율이 무엇이든, 나머지 이더는 리스크 취수자가 회수한다.

이더의 가치가 상승하면 리스크 취득자는 이익을 얻으며, 이더의 가치가 감소하면 리스크 취득자는 손실을 입지만, 리스크 회피자는 항상 손실을 입지 않습니다. 물론, 리스크 회피자와 리스크 취득자는 리스크 회피자가 지불해야 할 ‘보험료’를 사전에 협의 할 수 있으며, 리스크 취득자는 1000 CNY의 수 배 이상의 보장을 제공해야한다고 협의 할 수 있습니다.

위의 예제에는 에테르와 가상화폐 사이의 환율을 어떻게 결정하는지에 대한 문제가 있습니다. 앞서 언급했듯이, 계약은 블록 체인에 대한 데이터에만 액세스 할 수 있으며, 가상화폐는 가상화폐가 아닌 실제 세계에 존재하는 데이터입니다.

우리는 다른 계약서를 설계할 수 있습니다. 이 계약서는 이럴 수 있습니다. 이 계약서는 이더와 가상화폐의 환율을 실제 세계에서 매 시간 창 (예: 한 시간) 에 매기기 위해 다음과 같은 논리를 지정할 수 있습니다.

  • 모든 사람들은 Contract에 보증금을 지불하고 환율을 제공 할 수 있습니다.
  • 시간 창이 끝나면, 계약은 모든 소유자가 제공한 환율의 평균값을 계산하고 발표합니다.
  • 그리고 수집된 보증금을 분배합니다. (보증금 가중치에 따라) 평균에 가장 가까운 25%의 사람들에게.

어떤 참가자라도, 다른 참가자의 제안을 모르기 때문에, 진실한 환율을 제출하면 보상을 받을 가능성이 더 높고, 매우 기괴한 환율을 제출하면 보증금을 잃을 가능성이 더 높습니다.

물론 이 규칙에는 몇 가지 허점이 있습니다. 예를 들어, 만약 한 사람이 많은 보증금을 가지고 있다면, 그는 평균값을 실제 환율보다 높거나 낮은 가격으로 끌어올릴 수 있고 동시에 보상을 받을 수 있으며, 정확한 환율을 제공한 다른 사람들이 보증금을 잃게 할 수 있습니다. 그러나 실제로는 현실 세계에서도 마찬가지입니다. 만약 당신이 많은 돈을 가지고 있다면 상품의 가격을 올릴 수 있습니다. 그러나 현실 세계와 비교하면 전자 화폐의 부피는 매우 작아서 많은 돈이 필요하지 않습니다. 그러나 실제로는 이렇게 악의적으로 환율을 높이거나 압박하는 것은 매우 위험합니다. 왜냐하면 당신은 자신이 지불한 보증금이 충분하다고 확신하지 못하기 때문에 실패하면 모든 보증금이 손실됩니다.

또 다른 단점은 ‘모든 사람이 계약에 보증금을 지불하고 환율을 제공할 수 있다’라는 단계입니다. 거래가 만들어지고 모든 거래는 블록체인에 기록됩니다. 그래서 당신이 제출한 환율은 실제로 다른 사람들에게 볼 수 있고 악의적인 공격자에게 더 많은 기회를 제공합니다.

앞서 Contract가 블록체인에 있는 데이터를 읽을 수 있다고 언급했었는데, 블록체인에서의 데이터는 확실합니다. 만약 우리가 도박과 같은 애플리케이션을 구현하고자 한다면, 어디서 무작위 숫자를 얻을 수 있을까요?

생각해 볼 수 있는 하나의 무작위 숫자의 근원은 다음 블록의 해시이다. 대부분의 경우, 이 정도의 무작위성은 충분하다. 하지만 실제로는 광부가 이 무작위 숫자를 어느 정도 조작할 수 있다. 한 광부가 어떤 도박에 참여하고 도박의 수익이 한 블록의 수익보다 더 크다고 가정하면, 그 광부가 자신을 잃게 할 블록을 파내면, 그 광부는 분명히 이 새로운 블록을 공개하지 않기로 선택할 것이다.

따라서 우리는 교환비율을 모집하는 것과 비슷한 메커니즘을 도입하여 임의의 숫자를 모집하고, 각 시간창의 끝에서 이 숫자를 사용하여 임의의 숫자를 계산하고, … 하지만 교환비율을 모집하는 것과 마찬가지로, 참여자들은 거래를 만들어서 교환비율을 제출하기 때문에, 한 시간창 사이에, 각자가 제출한 임의의 숫자는 다른 사람들에게 모두 볼 수 있습니다.

그래서 우리는 씨앗을 수집하는 창을 두 부분으로 나누고, 아무도 예측하지 못하고 개입할 수 없는 무작위적인 숫자를 얻었습니다.

  • 1단계: 모든 사람이 계약에 보증금을 지불하고 “수입된 씨앗의 산산값”을 제공할 수 있습니다.
  • 2단계: 1단계 참가자가 Contract에게 재배되지 않은 씨앗을 제공합니다.
  • 2단계 종료: 계약은 모든 합법적 인 씨앗을 사사하여 무작위 숫자를 생성하고 공개합니다. 2단계에서 올바른 씨앗을 제공하는 사람의 보증금을 반환합니다.

첫 번째 단계에서는 다른 사람들이 제출한 씨앗의 산산값만 알고 실제 씨앗을 알지 못하기 때문에 결과를 조작하기 위해 씨앗을 정교하게 구성 할 수 없습니다. 두 번째 단계에서는 모든 사람들이 첫 번째 단계의 씨앗을 확인하고 새로운 씨앗을 제출 할 수 없으며 다른 사람들이 씨앗을 제출하는 것을 막을 수 없습니다.

앞서 우리는 Bitcoin Script가 순환, 회귀, 점프 등의 능력을 제공하지 않는다는 것을 언급했다. 아마도 Bitcoin은 Bitcoin Script의 실행 시간을 통제하기 위한 것이었기 때문일 것이다. 왜냐하면 튜링의 “정지론”에 따르면, 튜링이 완성한 프로그래밍 언어로 작성된 프로그램은 항상 정적 분석의 관점에서만 제한된 단계 후에 종료될지 판단할 수 없기 때문에, 따라서 의존하는 악의적인 공격자는 죽은 순환을 일으키는 트랜잭션을 구성하여 채굴자의 정상적인 작업을 방해할 수 있다.

이더리움은 다시 “경제적 인센티브”를 통해 이 문제를 우회합니다. 계약은 opcode (운영 코드) 의 형태로 EVM (Ethereum Virtual Machine) 라는 가상 머신에서 실행됩니다. EVM는 자체 “회계”를 가진 가상 머신이며, EVM의 표준에서는 운영에 필요한 메모리 및 CPU 시간에 따라 각 opcode가 소비되는 가스를 정의합니다. 이것은 에테르가 구입한 컴퓨팅 자원입니다.

그리고 우리는 “협의력 간격”에 대해 다시 이야기합니다. 앞서 언급한 바와 같이, 비트코인은 10분마다 새로운 블록을 생성합니다. 즉, 전체 네트워크는 10분마다 하나의 “협의력”을 이룬다는 것입니다.

분명히 더 짧은 합의 시간은 사용자에게는 더 나은 경험을 제공 할 수 있습니다. 왜 비트코인은 블록 시간을 단축하지 않는가? 이것은 더 빠른 합의 간격이 “중앙화 된 광장”의 장점을 어느 정도 증가시킬 수 있기 때문입니다.

한 채굴자 A가 새로운 블록을 채굴할 때, 그는 이 블록을 전파하고, 다른 사람들은 이 소식을 받으면 즉시 이 새로운 블록을 기반으로 작업을 시작한다. 다른 사람들은 “A가 새로운 블록을 채굴했다”와 “A가 전파한 소식을 받았다” 사이의 시간 사이의 계산이 사실상 낭비되는 반면, 중앙 채굴 연못의 다른 채굴자들은 이 문제를 겪지 않는다. 왜냐하면 그들은 더 빨리 새로 생성된 블록에 대한 정보를 얻고, 즉시 새로운 블록을 기반으로 작업을 시작한다.

blockchain-ethereum-without-uncles

이 방송의 시간은 10분이라는 것은 그다지 중요하지 않지만, 합의 간격을 줄인다면, 중앙화폐의 장점은 점점 더 분명해 질 것입니다. 하지만 이더리움은 “Uncle Block”이라는 개념을 도입하여 합의 간격을 15초로 줄여서 이 문제를 해결했습니다.

비트코인의 블록체인에서는 하나의 블록에는 하나의 아버지 블록과 하나의 자 블록이 있을 수 있다. 하지만 이더리움에서는 새로 생성되는 블록에는 하나의 아버지 블록과 몇몇의 아저 블록이 있을 수 있다. 위의 예로 돌아가면, 만약 A에서 새로운 블록이 채굴되었지만 다른 사람들은 아직 방송시간에 수신되지 않았다면, 만약 누군가가 새로운 블록을 채굴했지만 방송이 늦어서 모두가 받아들이지 않았다면, 이 블록은 다음 블록의 “아저 블록”이 될 가능성이 있다. 이 블록이 나타내는 작업량은 다음 블록의 일부로 간주된다 (즉, 그 사람이 다음 블록을 채굴하는 데의 난이도가 낮아진다).

blockchain-ethereum-uncles

이 사진은 카오에서 찍은 것입니다.<https://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time

아직 해결되지 않은 문제

이 부분에서 저는 여러분께 Ethereum이 아직 해결하지 못한 몇 가지 문제들을 소개하고자 합니다.

우선, Ethereum은 현재 Bitcoin과 마찬가지로 POW (노동량 증명) 을 통해 합의에 도달합니다. 특정 작업량을 완료한 노드만이 블록 생성 작업에 참여할 수 있습니다. 작업량 증명의 문제는 네트워크의 보안을 보장하기 위해 많은 계산력을 낭비한다는 것입니다.

이더 자체는 가치가 있기 때문에, 왜 그 자체로 경제적인 인센티브를 제공하지 않는가? POS는 우리가 가진 이더로 보증하는 것입니다. 즉, 블록 생성에 참여하려는 모든 노드 (통상적 의미의 채굴) 는 시스템에 보증금을 지불해야 합니다.

이 모형은 POW와 매우 유사합니다. POW에서 광부들은 자신의 계산력을 사용하여 “배팅”하고, 만약 하나의 체인이 길어지면, 이 체인에 전환하여 계속 채굴하는 것이 필요합니다. 왜냐하면 더 많은 사람들이 참여하는 체인이 올바른 체인이 될 가능성이 높기 때문에, 결국 모두가 합의에 도달합니다.

POS는 전체 네트워크의 트너보스를 증가시킬 것이다. 이제 더 이상 많은 무용지물이 있는 계산을 통해 합의에 도달할 필요가 없을 것이며, 각 노드의 계산량은 계약의 코드를 실행하고 데이터 검증을 수행하는 계산량에 가깝게 될 것이다.

물론 POS가 아직 채택되지 않은 이유는 아직 해결되지 않은 문제들이 있기 때문입니다. 그 중 하나는 POW와 같은 51% 공격 문제입니다. POW에서 전체 네트워크의 51%의 컴퓨팅은 컴퓨팅 장치가 제공되기 때문에 물리적으로 제한되어 있습니다. 반면 POS에서 전체 네트워크의 51%의 이더는 충분한 돈이있는 한 비교적 쉽게 얻을 수 있습니다.

또 다른 주제는 “분산”입니다. 비트코인이나 이더리움 모두 동일한 블록체인에서 모든 거래를 확인하고 있습니다. 이는 분산 네트워크의 컴퓨팅 능력을 극도로 제한합니다. 각 노드는 모든 거래를 수신하고 저장하고 검증해야 합니다.

따라서 이더리움은 앞으로 네트워크 전체를 여러 부분으로 나누고, 각각 독립적으로 거래를 검증하는 ‘파리칭’을 도입하기를 희망한다. 하지만, 파리칭은 지표의 구조를 통해 다른 파리칭의 데이터를 참조하고, 비동기 호출을 통해 다른 파리칭에 영향을 미치기 때문에, 전체 네트워크는 사용자 입장에서는 여전히 하나의 구조로 보이지만, 전체 네트워크의 처리 능력은 매우 강력하게 확장될 것이다. 현재 파리칭 관련 구현은 비교적 초기 개발 단계에 있으며, 내가 찾은 정보는 제한되어 있어서 너무 많이 소개하지 않는다.

Contract

이 부분에서는 실제 작동하는 Contract의 코드를 보여드리겠습니다. Contract는 다양한 언어에서 작성될 수 있고, 결국에는 EVM에서 실행되는 opcode로 컴파일될 것입니다.

contract Test {
  uint storedData; // State variable

  struct Voter { // Struct
    uint weight;
    bool voted;
    address delegate;
    uint vote;
  }

  event HighestBidIncreased(address bidder, uint amount); // Event

  function func() { // Function
    if (msg.sender.balance < 10 finney) {
        msg.sender.send(10 finney);
    }

    sha256("...");

    address nameServer = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2;
    nameServer.delegatecall("isAvailable", "MyName");
    nameServer.call("register", "MyName");
  }
}

Solidity에서 상태 변수를 선언할 수 있는 몇 가지 핵심 문법들을 보여드리겠습니다.uint storedData;이러한 변수의 값은 블록체인 상에 영원히 저장됩니다.struct복잡한 데이터 구조를 선언할 수 있고, 트랜잭션을 받으면 실행되는 함수를 정의할 수 있으며, 트랜잭션의 발신자는 어떤 함수를 실행할지를 선택할 수 있다. 따라서, 하나의 계약은 함수 안에 논리적인 판단, 순환, 수정을 할 수 있는 몇 가지 함수를 제공할 수 있다.

언어에는 일반적인 암호 알고리즘과 같은 몇 가지 편리한 기능이 내장되어 있습니다.sha256단위 전환10 finneyᄋᄋᄋᄋ) ᄋᄋ) ᄋ) ᄋ) ᄋ)0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2(웃음)msg내장된 범용 변수입니다. 이 변수에서 거래와 관련된 정보를 읽을 수 있습니다. 예를 들어, 발기자, 금액 등과 같은 정보입니다.delegatecall다른 Contract의 코드를 현재 컨텍스트에서 실행하는 것과 같습니다. 마치 라이브러리 함수를 도입하는 것과 같습니다.call새로운 거래를 시작해서 다른 계약의 논리를 실행하는 것입니다.

그렇다면, Contract는 어떻게 블록체인에서 데이터를 읽고 쓸 수 있을까요? 이 복잡한 작업은 ‘상태 변수’로 추상화되어 있습니다. storedData는 상태 변수입니다. 사실, Contract의 실행 과정에서 상태 변수에 대한 변경은 블록체인에 저장되지 않습니다. 왜냐하면 Contract의 실행은 결정적인 계산이기 때문입니다.

다음으로, 실제로 사용할 수 있는 Contract 을 보여드리겠습니다. 이 코인은 이더리움 (Ethereum) 네트워크에 기반을 두고 있습니다.

contract Coin {
    // The keyword "public" makes those variables
    // readable from outside.
    address public minter;
    mapping (address => uint) public balances;

    // Events allow light clients to react on
    // changes efficiently.
    event Sent(address from, address to, uint amount);

    // This is the constructor whose code is
    // run only when the contract is created.
    function Coin() {
        minter = msg.sender;
    }
    function mint(address receiver, uint amount) {
        if (msg.sender != minter) return;
        balances[receiver] += amount;
    }
    function send(address receiver, uint amount) {
        if (balances[msg.sender] < amount) return;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        Sent(msg.sender, receiver, amount);
    }
}

이 코드는http://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html#subcurrency-example (MIT)

코인 (Coin) 이라는 계약은 두 개의 상태 변수를 선언합니다.minter이 토큰을 저장하기 위한 제작자는 () 함수를 구성하고 있습니다.function Coin()) 에서 Contract를 만들기 위해 사용된 첫 번째 트랜잭션의 발기자 부여를 이 변수에 부여하고, 또한 지갑 주소를 디지털의 지도 테이블에 선언합니다.balances, 이 코인을 보유한 모든 주소의 잔액을 나타냅니다.

mint이 함수는 거래의 발기자가 해당 토큰의 창시자인지 여부를 먼저 판단하고, 만약 그렇다면 함수 파라미트에 따라 특정 수의 토큰을 지정된 주소에 추가한다.send이 함수는 모든 사람이 호출할 수 있으며, 트랜잭션 발신자의 주소에서 일정량의 잔액을 빼내어 (만약 충분한 잔액이 있다면), 목표 주소에 더하여, 하나의 송금 기능에 해당한다.

우리는 또한 “미국”이라는 이름을 발표했습니다.Sent이벤트, 사건은 실제로 어떤 실제적인 역할도 하지 않습니다, 단지 디비팅 할 때 중요한 사건을 인쇄하는 것을 편리하게 합니다. 미래에는 경량 클라이언트의 구현을 편리하게 할 것입니다.

blockchain-ethereum-mix

이더리움은 Mix라는 IDE를 제공하여 이 코드를 디비전합니다. Mix의 오른쪽에 당신은 당신의 Contract를 테스트하기 위해 몇 개의 블록과 계정을 가상화할 수 있고, 실행 과정에서 각 상태 변수의 값이 어떻게 변하는지 볼 수 있습니다. Contract는 일단 공개되면 수정할 수 없으며, 그 이후의 운영은 다른 사람의 거래에 전적으로 의존합니다. 매일 버그를 작성하는 프로그래머에게 이것은 매우 짜증나는 일이지만, Contract의 어원은 “계약”입니다.

이 계약은 에테리움 지갑을 통해 인터넷에 공개될 수 있습니다.

blockchain-ethereum-create-contract

이 계약에 대한 자세한 내용은 다음 페이지에서 확인할 수 있습니다.

blockchain-ethereum-wallet-contract

왼쪽에는 두 개의 상태 변수의 값이 있습니다.minter“이것이 제 주소입니다.balances매핑 테이블이기 때문에, 당신은 그 잔액을 확인하기 위해 주소를 입력할 수 있습니다. 오른쪽에는 이 계약에 대한 새로운 거래를 시작할 수 있습니다.send아니면…mint함수, 당신은 Contract에 전달되는 변수를 채울 수 있습니다. 여기서 우리는 거래의 목적은 Ether를 전달하는 것이 아니라 메시지를 전달하기 때문에 거래 금액을 설정할 필요가 없습니다.

이제 재미있는 Contract에 대해 말씀드리겠습니다. 이 Contract은 ‘폰체 사기’를 가능하게 합니다. 이 Contract에게 1 이더를 지불해서 이 게임에 참여하게 됩니다. 그리고 3명이 추가되면, 3명의 Ether를 지불하게 됩니다.

contract Pyramid {
    struct Participant {
        address etherAddress;
    }

    Participant[] public participants;

    uint public payoutIdx = 0;

    // events make it easier to interface with the contract
    event NewParticipant(uint indexed idx);

    // fallback function - simple transactions trigger this
    function() {
        enter();
    }

    function enter() {
        if (msg.value < 1 ether) {
            msg.sender.send(msg.value);
            return;
        }

        if (msg.value > 1 ether) {
            msg.sender.send(msg.value - 1 ether);
        }

        uint idx = participants.length;
        participants.length += 1;
        participants[idx].etherAddress = msg.sender;

        NewParticipant(idx);

        // for every three new participants we can
        // pay out to an earlier participant
        if (idx != 0 && idx % 3 == 0) {
            // payout is triple, minus 10 % fee
            uint amount = 3 ether;
            participants[payoutIdx].etherAddress.send(amount);
            payoutIdx += 1;
        }
    }

    function getNumberOfParticipants() constant returns (uint n) {
        return participants.length;
    }
}

코드가 단순화되었습니다.<https://ethereumpyramid.com/contract.html

코드는 간단합니다. 이 Contract는participants모든 참가자의 지갑 주소를 순서대로 저장하는 배열을 사용하거나payoutIdx3 Ether의 환불을 받은 참가자 수를 기록하기 위해 사용된다.enter이 계약의 주요 기능은, 각 참가자가 1 Ether를 지불하고 새로운 참가자를 추가하는 것을 보장하는 몇 가지 변수 검사를 수행하는 것입니다.participants3 에테르를 3 에테르에 보내서 3 에테르를 3 에테르에 보내서 3 에테르를 3 에테르에 보내서payoutIdx그리고 그 결과로,payoutIdx다음 참가자를 가리키십시오.

참고 링크

HashTree:

Bitcoin:

Halting Problem:

Ethereum:

Ethereum Network:

Next of Ethereum:

Contract:

Contract IDE: