블록 체인과 이더리움

저자:제로, 2016-05-05 17:31:57에서 생성, 2016-05-05 17:32:31에서 업데이트

출처: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% 리저브 증명"은 "제로-지식 증명"과 같은 문제입니다. Bitcion의 소유자가 거래하기 위해 Bitcoin을 거래소에 송금해야하는 시나리오를 고려할 수 있습니다. 이론적으로는 거래소가 모든 사용자의 등록된 계좌 잔액을 사용하도록 할 수 있습니다. 사용자가보고 싶지 않은 것은 거래소가 자백하기를 원합니다. 거래소가 먼저 보유한 Bitcoin 주소를 공개하고 거래자가 실제로 Bitcoin의 잔액을 보유한 것을 확인합니다. 그러나이 금액이 모든 사용자의 합보다 크다는 것을 어떻게 증명할 수 있습니까? 다시 말해, 모든 사용자의 잔액을 공개하지 않고 모든 사용자가 자신의 잔액을 포함 할 수 있는지 어떻게 허용합니까?

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)

지트에서는 파일 (Blob), 인덱스 (Tree) 또는 커밋 (Commit) 가 모두 내용에 의해 결정되는 해쉬를 가지고 있으며, 두 개 객체가 동일한 내용을 가지고 있다면 동일한 해쉬를 가지고 있습니다. 지트에서는 전체 저장소의 역사는 하나의 블록체인이며, 각 커밋은 블록과 같습니다. 커밋에는 이전 커밋의 해쉬와 관련 객체의 해쉬가 포함되어 있으며, 커밋 자체의 해시는 내용과 이러한 메인 정보에 의해 결정됩니다.

Git는 Blockchain을 사용하여 저장소에 대한 고유한 역사를 정의합니다. 오, 만약 Commit가 변경되면 그 다음의 모든 Commit의 Hash가 변경됩니다. 물론 Git는 버전 관리 도구이기 때문에 역사를 변경하는 것을 막지 않습니다.push --force이 글의 주제는 "이번 글의 주제는 다른 글의 주제를 바꾸기 위한 것"입니다.

또 다른 대표적인 블록체인 응용 분야는 비트코인입니다. 비트코인이 블록체인이라는 단어를 널리 퍼뜨렸죠.

blockchain-bitcoin-block-data

이 사진은https://commons.wikimedia.org/wiki/File:Bitcoin_Block_Data.png(CC-BY-SA-3.0)

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

비트코인

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

비트코인의 블록은 "노동량 증명"을 통해 생성된다. "마인"에 참여하는 모든 "마인"은 계산력과 관련된, 무작위적 성격의 배열 계산을 수행해야 하며, 특정 조건을 충족하는 무작위 숫자가 계산될 때까지 블록을 발행할 권리를 얻는다.

설정을 통해, 모든 채굴자는 항상 "장장한 체인"을 신뢰하고, 알려진, 규칙을 충족하는 가장 긴 체인에 기초하여 다음 블록을 계산할 것입니다. 그렇지 않으면 당신의 계산력은 완전히 낭비됩니다.

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

일반적으로 모든 비트코인 노드들은 거래의 합법성을 확인하기 위해 완전한 블록체인 데이터를 저장해야 한다. 거래의 발신자가 거래를 시작하기에 충분한 배당금을 가지고 있는지 확인한다. 그러나 현재 완전한 블록체인은 66G가 있고, 또한 매일 0.1G 정도의 속도로 증가하고 있다. 비트코인의 모든 사용자가 완전한 블록체인을 저장해야 한다는 요구가 너무 까다롭지 않기 때문에 비트코인은 "간단 확인 SPV, 단순화 된 결제 검증"이라는 메커니즘을 가지고 있으며, 소위 "용량 클라이언트"는 완전한 블록체인을 저장하지 않고 하나 또는 몇 개의 완전한 노드에 부착하여 모든 메타정보를 저장하는 것을 선택할 수 있다. Hash Block은 거래의 양을 포함하고 있으며, Hash Block은 작업의 양을 확인하고, 거래의 위치를 확인하는 데 필요한 모든 경우 Hash Block에서 거래의 전체 정보를 저장하는 방법을 얻을 수 있다.

blockchain-bitcoin-state-machine

이 사진은https://github.com/ethereum/wiki/wiki/White-Paper

  • 블록 체인 책자 상태 변경 로그
  • 트랜잭션 트랜잭션 한 번의 상태 변경
  • 블럭 : 현재 상황에 대한 "협감"

사실 우리는 비트코인의 블록체인을 "상황 기계"로 상상할 수 있습니다. 전체 블록체인은 모든 거래 기록이 저장된 상태의 "책기"입니다. 이 거래 기록에 따라 모든 거래 기록의 "상황"을 추론할 수 있습니다. 즉, 비트코인 네트워크의 각 계좌에 얼마나 많은 잔액이 있는지. 각 트랜잭션은 상태의 변화일 뿐이고, 각 블록은 전체 비트코인 네트워크의 채굴자들에 의해 현재 상태에 대한 "협의"입니다. 왜냐하면 비트코인은 10분마다 새로운 블록을 생성하기 때문에, 모든 계좌의 잔액에 대해 10분마다 합의가 이루어지는 것과 같으며, 그 10분 사이에 계좌의 상태는 사실상 "혼돈" 상태입니다.

Alt Coin

비트코인을 기반으로 다른 많은 암호화폐가 생성되기도 하고, 일반적으로 "Alt Coin"라고 불리며, 일반적으로 두 가지 구현 방식이 있습니다.

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

두 번째 방법은 비트코인 네트워크의 "메타 프로토콜"을 이용해서 비트코인의 트랜잭션 위에 커스텀 정보를 첨부하여 자신의 논리를 구현하는 것입니다. 이러한 장점은 공격에 저항하기 위해 비트코인의 컴퓨팅 크기를 활용할 수 있다는 것입니다. 하지만 동시에 비트코인 네트워크에 연결된 모든 채굴자가 티코인의 규칙을 준수하지 않기 때문에 불규칙적인 블록이 블록체인에 진입하는 것을 방지할 수 없으며, 클라이언트에서 불규칙적인 거래를 필터링할 수 있으며, 앞서 언급한 비트코인이 제공하는 간소화된 확인 기능을 활용할 수 없습니다.

이 동전들을 위해, 비트코인은 많은 채굴자 참여를 가진, 대규모 악성 공격에 저항할 수 있는 블록체인을 제공할 수 있으며, 비트코인의 트랜잭션에는 사용자 정의 데이터도 탑재될 수 있으며, 동전의 구현에 약간의 공간을 남겨두고 있다.

그리고 Bitocin은비트코인 스크립트그러나 이것이 비트코인의 핵심 기능이 아니기 때문에 비교적 간단한 연산만 수행할 수 있고, 블록체인에 있는 데이터를 매우 제한적으로 읽을 수 있으며, 순환 메커니즘이 없기 때문에 일반적, 튜링 완전 논리를 작성하는 것은 어렵습니다.

이더리움

blockchain-ethereum

이 사진은https://www.ethereum.org/assets(CC 3.0)

이더리움 (Ethereum) 은 블록체인 기반의 분산 애플리케이션 플랫폼으로, 비트코인의 인프라와 암호학 기반의 블록체인 기술을 하나의 보편적인 플랫폼으로 구축하고, 개발자가 자신의 분산 애플리케이션을 블록체인 위에서 실행할 수 있도록 비트코인 네트워크의 부족한 기능을 보완한다.

이더리움에 대해 자세히 설명하기 전에, 저는 먼저 (내가 생각하는) 탈중앙화 네트워크의 두 가지 기본 요소를 소개합니다. 암호학과 게임. 암호학은 물론, 공钥 암호화, 디지털 서명, 배열 및 추출 알고리즘을 통해 수학적으로 보안을 보장하는 것 이외에 더 많은 것을 말할 필요가 없습니다. 게임이란 탈중앙화 네트워크에 참여 할 수있는 모든 사람이 포함해 악의적으로 네트워크를 공격하려는 사람들이 포함되며, 탈중앙화 네트워크를 설계할 때 모든 참여자의 관점에서 이해 관계를 고려해야하며, 규칙을 준수할 때 이익이 최대화되고 규칙을 위반할 때 손실이 발생하거나 위험을 감수 할 수 있음을 보장해야합니다.

그러나 디지털 세계에서는 데이터의 공개가 비용이 없으며, "이익"과 "손실"이 없습니다. 따라서 "이익"을 정의하기 위해 물리적 세계와 어떤 연결이 만들어져야합니다. 예를 들어, Bitcoin 네트워크에서 공격자가 Blcokchain의 방향을 인공적으로 바꾸기를 원한다면 다른 모든 채굴자보다 더 높은 컴퓨팅 힘을 보유해야합니다.

따라서 탈중앙화된 네트워크에서는 모든 문제가 "기술"에 의해 해결되는 것은 아니며, 기술이 도달할 수 없는 부분에서는 이익, 경제적 인센티브를 통해 해결되어야 한다. 또한 "경제적 인센티브"의 필요성 때문에, 에테리움은 또한 지갑 시스템 (통화 단위 "에테르 (Ether) ") 을 가지고 있으며, 각 사용자는 지갑 주소를 고유의 아이디로 가지고 있으며, 이 점에서는 Bitcion과 비교적 유사하다.

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

  • 블록 체인이 입력과 출력으로 사용할 수 있고 사용할 수 있기 때문에 계산은 반복됩니다. 실제로 계산된 결과는 블록 체인에 저장될 필요가 없으며 언제든지 다시 계산할 수 있습니다.
  • 다른 계약에 있는 함수를 호출할 수 있습니다 (다른 계약의 코드와 데이터는 블록체인에도 존재합니다).
  • 실행 과정에서 새로운 트랜잭션 (자신의 지갑 잔액을 조작하는) 이 생성될 수 있으며, 이 트랜잭션들은 다른 계약들을 실행할 수 있다.

먼저, 이더리움의 공식 클라이언트에는 "다중 지갑"을 만드는 기능이 있습니다.

blockchain-ethereum-multi-sig-wallet

이 기능으로 2명의 다른 사람과 공유하는 지갑 주소를 만들 수 있으며, 각 사람은 하루에 100 에테르까지 사용할 수 있으며, 이 제한을 초과하면 다른 사람의 동의가 필요합니다.

이 기능은 실제로 계약서를 생성하고, 위의 논리는 계약의 코드로 설명됩니다. 이 공유 지갑에서 지출을 원할 때, 이 공유 지갑에 메시지를 보내야 합니다. (거래는 메시지입니다. 거래 금액은 0이 될 수 있으며, 데이터만 가지고 있습니다.) 그리고 공유 지갑의 코드가 실행됩니다. 이 지출 요청이 위의 논리에 부합하는 경우, 실제 지출 거래를 시작합니다. 그렇지 않으면 이 지출 요청은 실제 지출 항목 없이 거부됩니다.

또 다른 예로, "헤지핑 계약"은 비트코인이 디지털 화폐로서의 가치 (그리고 법정 화폐의 환율) 가 불안정하다는 주장이 계속되고 있으며, 종종 하루 사이에 화폐가 두 배 상승하거나 두 배 떨어지는 경우가 발생하지만, 계약을 통해 헤지핑 계약을 구현하면 어느 정도 문제를 해결할 수 있습니다.

우리는 화폐의 가치를 유지하기를 원하는 사람을 "위험 피자"라고 부르며, 다른 사람이 화폐의 변동의 위험을 감수하고 수익을 창출하기를 원하는 사람을 "위험자"라고 부르고, 그래서 그들은 금액 (예를 들어 1000 CNY) 과 시간 창구를 (예를 들어 한 달) 합의하고 다음과 같은 논리를 실행하는 계약을 만들 수 있습니다.

  • 리스크 피어는 1000 CNY의 에테르를 계약의 지갑 주소로 송금하고, 리스크 피어는 1000 CNY (또는 더 많은) 의 에테르를 계약에 송금합니다.
  • 한 달 후, 위험 회피자는 당시에 CNY 1000의 에테르를 계약서에서 회수할 수 있으며, 에테르와 CNY 사이의 환율에 관계없이 나머지 에테르는 위험 부담자가 회수할 수 있습니다.

에테르의 가치가 상승하면 리스크 수령자는 이익을 얻으며, 에테르의 가치가 감소하면 리스크 수령자는 손실을 입지만, 리스크 회피자는 항상 손해를 입지 않습니다. 물론, 리스크 회피자와 리스크 수령자는 리스크 회피자가 지불해야 할 "보험료"를 미리 합의할 수 있습니다. 또한 리스크 수령자가 1000 CNY보다 몇 배의 보증금을 제공해야하는 것을 합의할 수 있습니다. ("배율이 높을수록 더 큰 위험을 감수 할 수 있습니다").

위의 예제에는 실제로 잘 해결되지 않은 문제도 있습니다. 이더와 법정 화폐 사이의 환율을 어떻게 결정해야하는지, 앞서 언급했듯이, 계약은 블록체인에서의 데이터에만 액세스 할 수 있으며, 법정 화폐는 암호 세계보다는 물리적 세계에서 존재하는 데이터입니다. 우리는 어떤 메커니즘을 통해 이러한 "비 암호 세계로부터의 데이터"를 블록체인에 가져와야 합니다.

우리는 다른 계약을 설계할 수 있습니다. 이럴 때 우리는 이더와 법정 화폐 사이의 환율을 물리적인 세계에서 수집할 수 있는 이 같은 논리를 지정할 수 있습니다.

  • 모든 사람이 계약에 보증금을 지불하고 환율을 제공 할 수 있습니다.
  • 시간 창이 끝나면, 계약은 모든 사람들이 제공하는 환율의 평균을 계산하고 (보증금으로 가중된) 공개합니다.
  • 그리고 수집된 보증금은 (보증금 가중화 기준으로) 평균에 가장 가까운 25%에 분배됩니다.

어떤 참가자라도 다른 사람의 제안을 알지 못하기 때문에 실제 환율을 제출하면 보상을 받을 가능성이 더 높으며, 매우 이상한 환율을 제출하면 보증금을 잃을 가능성이 더 높습니다.

물론 이 규칙에는 몇 가지 틈점이 있습니다. 예를 들어, 만약 사람이 매우 많은 보증금을 가지고 있다면, 그는 평균을 실제 환율보다 높거나 낮게 끌어올릴 수 있고, 동시에 보상을 얻을 수 있으며, 정확한 환율을 제공하는 다른 사람들을 위해 보증금을 잃게 할 수 있습니다. 그러나 실제 세계에서도 마찬가지입니다. 만약 당신이 매우 많은 돈을 가지고 있다면, 당신은 또한 상품의 가격을 높일 수 있습니다. 그러나 실제 세계와 비교했을 때, 전자 화폐의 크기는 매우 작고 많은 돈이 필요하지 않습니다.

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

우리가 앞서 언급한 것처럼 계약은 블록체인의 데이터를 읽을 수 있지만, 블록체인의 데이터는 확실합니다. 만약 우리가 도박과 비슷한 응용 프로그램을 구현하고 싶다면, 무작위 숫자를 어디서 얻을 수 있을까요?

생각될 수 있는 무작위 숫자의 원천은 다음 블록의 해시이며, 대부분의 경우 이러한 무작위성은 충분하다. 그러나 실제로 채굴자는 어느 정도 무작위 숫자를 조작할 수 있다. 한 채굴자가 어떤 도박에 참여하고 도박의 수익이 한 블록의 수익보다 더 크다고 가정하면, 이 채굴자가 채굴하는 한 블록은 자신이 도박을 잃게 할 것이라고 생각하면, 분명히 이 채굴자는 새로운 블록을 공개하지 않기로 선택하게 될 것입니다. 이것은 개별 채굴자의 계산력이 강한 경우에 더욱 분명합니다.

따라서 우리는 추출 환율과 유사한 메커니즘을 도입하여 무작위 수의 씨앗을 추출하고, 그 다음 각 시간 창문의 끝에서 무작위 수를 계산하기 위해 그 씨앗을 사용해야 합니다. 그러나 무작위 환율과 마찬가지로, 참가자가 거래를 만들어서 제출 환율을 구현하기 때문에, 시간 창간 사이에 모든 사람이 제출한 무작위 숫자가 다른 사람들에게 보이므로, 이미 도박에 참여한 사람이 무작위 수의 씨앗을 신중하게 선택하여 다른 사람들이 제출한 씨앗을 더하여 생성된 무작위 수의 씨앗이 그의 기대에 정확히 부합하도록 할 수 있습니다.

그래서 우리는 씨앗을 채취하는 창을 두 부분으로 나누고 아무도 예측하고 개입할 수 없는 무작위 숫자를 얻어야 합니다.

  • 1단계: 모든 사람이 계약에 보증금을 납부하고 "주식별로 선택된 씨앗의 배당값"을 제공할 수 있다.
  • 2단계: 1단계 참가자가 계약에 배분되지 않은 씨앗을 제공합니다.
  • 2단계 종료: 계약은 모든 합법적인 씨앗을 배열하고 무작위 집합을 생성하고 발표합니다; 역전 2단계에서는 올바른 씨앗을 제공하는 사람에게 보증금을 지급합니다.

첫 번째 단계에서는 다른 사람들이 제출한 씨앗의 배분 값을 알고 실제 씨앗을 알지 못하기 때문에 결과를 개입하기 위해 씨앗을 세밀하게 구성 할 수 없습니다. 두 번째 단계에서는 모든 사람들이 첫 번째 단계에 제출된 씨앗을 확인하고 새로운 씨앗을 제출하지 않고 다른 사람들이 씨앗을 제출하는 것을 막을 수 없습니다.

앞서 언급한 바와 같이 비트코인 스크립트는 루킹, 회귀, 점프 등의 능력을 제공하지 않으며, 아마도 비트코인은 비트코인 스크립트의 실행 시간을 통제하기 위한 이유일 수도 있다. 왜냐하면 튜링의 "정지 정리에" 따르면, 튜링이 완성한 프로그래밍 언어로 작성된 프로그램은 항상 정적 분석의 관점에서만 끝나는지 아닌지를 판단할 수 없기 때문에, 악의적인 공격자가 튜링의 완전한 프로그래밍 언어로 작성된 프로그램이 제한된 단계 후에 끝나는지 판단할 수 없기 때문에, 악의적인 공격자가 튜링의 정상적인 작업에 방해하기 위해 죽음의 루크를 일으키는 트랜잭션을 구성할 수 있다.

이더리움은 또다시 이 문제를 "경제적 인센티브"로 우회하고, 계약은 opcode (운영 코드) 의 형태로 EVM (Ethereum Virtual Machine) 라는 가상 머신에서 실행되며, EVM의 표준에서 작업에 필요한 메모리와 CPU 시간에 따라 각 opcode가 소비하는 가스, 즉 에더가 구매하는 컴퓨팅 자원을 정의하는 자율 "비용"이있는 가상 머신이다. 앞서 언급한 것처럼 거래의 목표는 계약이 될 때 계약의 코드가 실행되며, 거래의 발시자는 계약 실행 과정에서 소비되는 가스에 대해 지불해야하며, "중간에 사용량이 부족하면 계약이 종료 될 최대 금액"을 선언합니다.

그리고 우리는 "협의 간격"에 대해 다시 논의합니다. 앞서 언급한 Bitcoin은 10 분마다 새로운 블록이 발생하고, 즉 전체 네트워크는 10 분마다 "협의"에 도달합니다. 따라서 일반적인 Bitcoin 거래는 확인되기 위해 10 분 정도 기다립니다. 계산 능력이 높지 않은 초기에는 1 시간 동안 기다려야 할 수도 있습니다. (block 6 개) 거래가 신뢰할 수 있다고 생각되기 전에.

명백히 짧은 합의 시간이 사용자에 대한 더 나은 경험을 제공 할 수 있습니다. 왜 비트코인은 블록 출력 시간을 줄이지 않는가? 이것은 더 빠른 합의 간격이 어느 정도 "중앙화된 광산"의 장점을 증가시킬 것이기 때문입니다. "광산"이라고 불리는 것은 비트코인 채굴자가 함께 채굴하는 것을 의미합니다. 채굴자는 광산의 지시를 무조건적으로 따르고, 결국은 광산과 수익 분배를 합의합니다.

한 광부 A가 새로운 블록을 파는 동안, 그는 그 블록을 전파하고, 다른 사람들은 이 메시지를 받은 즉시 새로운 블록에 기초하여 작업을 시작합니다. 다른 사람들은 "A가 새로운 블록을 파는 것"과 "A가 전파하는 소식을 받은 것" 사이의 시간을 계산하는 것이 사실상 낭비되고, 중앙 광산 풀의 다른 광부들은 이 문제를 겪지 않습니다. 그들은 새로운 생성된 블록에 대한 정보를 더 빨리 얻을 수 있기 때문에 새로운 블록에 기초하여 즉시 작업을 시작할 수 있습니다.

blockchain-ethereum-without-uncles

이 방송 시간은 10초 정도 걸릴 수도 있고, 10분 정도라면 그다지 중요하지 않지만, 합의 간격을 줄이면 중앙화된 채굴 풀의 장점이 점점 더 분명해진다. 하지만 이더리움은 "Uncle Block"라는 개념을 도입함으로써 이 문제를 해결하고, 합의 간격을 15초로 줄여 비트코인에 비해 결제 확인 속도가 크게 향상되었다.

비트코인 블록체인에서는 하나의 블록은 하나의 모 블록과 하나의 자 블록을 가질 수 있다. 그러나 이더리움에서는 새로 생성된 블록은 하나의 모 블록과 여러 개의 자 블록을 가질 수 있다. 위의 예로 돌아가서, A에서 새로운 블록을 채굴하고 다른 사람들이 아직 전파를 받지 않은 시간 동안 누군가가 새로운 블록을 채굴할 경우, 그러나 방송이 늦어지면서 모든 사람들이 받아들여지지 않았기 때문에, 이 블록은 다음 블록의 "아모 블록"이 될 가능성이 있다. 이 블록이 대표하는 작업량의 증명은 다음 블록의 일부로 간주될 것이다. (즉, 이 사람이 다음 블록을 채굴하는 어려움이 낮아지고), 자 블록은 단지 작업량의 증명만을 제공하며, 그 안에 포함된 거래는 무효이다. 이것은 방송을 더 늦게 받은 클라이언트가 낮은 블록 출동의 경우, 즉, 직접적으로 자 블록의 작업량의 증명의 25%를 제공함으로써, 이 블록의 작업량의 25%를 제공함으로써, 최대 5세대까지의 자 블록을 인정할 수 있다.

blockchain-ethereum-uncles

이 사진은https://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time

해결되지 않은 문제

이 부분에서는 이더리움이 해결하지 못한 몇 가지 문제를 소개합니다.

첫째, 에테리움의 현재 합의 방식은 여전히 비트코인과 마찬가지로 POW (작업량 증명) 으로 보장되며, 특정 작업량을 완료한 노드만이 블록 생성 작업에 참여할 수 있습니다. 작업량 증명의 문제는 네트워크의 보안을 보장하기 위해 많은 컴퓨팅 힘을 낭비한다는 것입니다. 이것은 또한 앞서 언급한 "경제적 인센티브"에 기반하지만 실제로 개선 될 수 있습니다. Ehtereum는 POS (소유권 증명) 을 대신하는 것이 더 나은 방법이라고 생각합니다.

이더는 그 자체로 가치가 있기 때문에, 왜 그 자체로 경제적인 인센티브를 사용하지 않는가? POS는 사람들이 가진 이더를 가지고 보증하는 것을 의미합니다. 블록 생성 (전통적 의미에서 채굴) 에 참여하려는 모든 노드 (통신자라고 불립니다) 는 시스템에 보증금을 지불해야하며 모든 노드들이 보증금이 "냉동"되었다고 생각하는 프로토콜을 의미합니다.

이 모델은 실제로 POW와 매우 유사합니다. POW에서는 채굴자가 자신의 계산력을 사용하여 "배팅"하고, 더 긴 연쇄가 있으면 연쇄로 전환하여 채굴을 계속해야합니다. 왜냐하면 참여자가 더 많은 연쇄가 올바른 연쇄가 될 가능성이 더 높기 때문에 결국 합의가 이루어집니다.

POS는 네트워크 전체의 처리량을 증가시킬 수 있을 것이다. 이제 더 이상 수많은 무의미한 계산을 통해 공감대를 형성할 필요가 없을 것이며, 각 노트의 처리량은 계약에서 코드를 실행하고 데이터를 검증하는 계산량에 가깝게 될 것이다.

물론 POS는 아직 채택되지 않은 이유는 아직 해결되지 않은 문제들이 있기 때문이며, 그 중 하나는 POW와 같은 51% 공격 문제이며, POW에서 전체 네트워크의 51%의 컴퓨팅 전력이 물리적으로 제한되어 있습니다. 왜냐하면 컴퓨팅 전력이 컴퓨팅 장비를 제공해야하기 때문입니다. 반면 POS에서 전체 네트워크의 51%의 에테르를 수집하는 것은 비교적 쉽습니다. 충분한 돈이있는 한.

또 다른 주제는 "파편화"입니다. 비트코인과 이더리움은 현재 같은 블록체인에서 모든 트랜잭션을 확인하고 있습니다. 이것은 분산 네트워크의 계산 능력을 크게 제한합니다.

따라서 이더리움은 미래의 "파일링" 메커니즘을 도입하여 전체 네트워크를 여러 부분으로 분리하여 상호간에 독립적으로 거래를 확인하는 것을 희망한다. 그러나 파일링은 포인터의 구조를 통해 다른 파일링의 데이터를 참조하고, 비동기 호출 방식으로 다른 파일링에 영향을 미치므로 전체 네트워크는 사용자 입장에서는 여전히 하나의 것, 그러나 전체 네트워크의 처리 능력은 매우 강력한 확장성을 가질 것입니다. 현재 제한된 파일링 관련 구현은 비교적 초기 개발 단계이며, 나는 발견한 정보가 너무 많지 않기 때문에 설명하지 않습니다.

계약

이 부분에서는 실제로 작동할 수 있는 계약의 코드를 보여드리겠습니다. 계약은 많은 다른 패러다임 언어로 작성될 수 있고 결국 EVM에서 실행되는 opcode로 컴파일됩니다. 오늘 우리는 현재 가장 잘 유지되고 있는 EVM 언어 중 하나인 Solidity라는 종류의 자바스크립트를 예로 삼았습니다.

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 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()이 변수는 첫 번째 거래를 생성하는 계약의 발시자의 값을 부여하고 지갑 주소를 숫자로 매핑하는 표를 선언합니다.balances이 지표는 지표의 주소를 보유한 모든 사람의 잔액을 나타냅니다.

mint이 함수는 트랜잭션의 발신자가 해당 토큰의 창업자인지 여부를 결정하고, 만약 그렇다면 함수의 파라미터에 따라 특정 수의 토큰을 지정된 주소로 더합니다.send이 함수는 모든 사람이 호출할 수 있으며, 거래의 발시자 주소로부터 일정 금액의 잔액을 (충분한 잔액이 있는 경우) 더하여 목표 주소로 환전하는 기능에 해당한다.

우리는 또한Sent이 사건은 실제로 어떤 실제적인 역할도 하지 않고, 단지 디뷰팅을 할 때 중요한 사건을 인쇄하는 것이 용이하며, 미래에도 경량 클라이언트의 구현을 용이하게 할 것이다.

blockchain-ethereum-mix

이더리움은 이 코드를 디버깅하기 위해 믹스 (Mix) 라는 IDE를 제공하며, 믹스의 오른쪽에는 블록과 계정을 만들어서 계약을 테스트할 수 있고 실행 과정에서 각 상태 변수의 값의 변화를 볼 수 있다. 언급할 만한 점은 계약이 출시되면 수정될 수 없다는 점이며, 그 이후의 실행은 다른 사람의 거래에 전적으로 의존한다는 점입니다. 매일 버그를 작성하는 프로그래머에게 이것은 매우 짜증스러울 수 있지만 계약의 의미는 원래 "계약"입니다.

이 계약이 작성되면 이 Ethereum 지갑을 통해 웹에 게시할 수 있습니다.

blockchain-ethereum-create-contract

이 컨트랙트가 공개된 후에도 이 컨트랙트를 주시할 수 있습니다.

blockchain-ethereum-wallet-contract

왼쪽에는 두 개의 상태 변수의 값이 있습니다.minter이 문서는 제 자신의 주소입니다.balances이것은 지도 표이기 때문에 주소를 입력하여 그 잔액을 문의할 수 있습니다. 오른쪽에는 이 계약에 새로운 거래를 시작할 수 있습니다.send또는mint함수, 당신은 계약에 전달되는 것을 입력할 수 있습니다. 여기 우리가 거래를 보내는 목적은 메시지를 전달하는 것이 아니라 에테르를 전송하기 때문에 거래 금액을 설정할 필요가 없습니다.

다음으로 흥미로운 계약에 대해 소개해 드리겠습니다. 이 계약은 "포인츠 사기"라는 효과를 구현합니다. 이 계약에 1 에테르를 지불하여 게임에 참여할 수 있습니다.

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

이 코드는 간단합니다. 이 계약은participants모든 참가자의 지갑 주소를 순서대로 저장하는 집합, 또는payoutIdx이전 참가자 중 얼마나 많은 사람들이 3 에테르를 돌려받았는지 기록하기 위해 사용되었습니다.enter이 계약의 주요 기능을 구현하기 위해 먼저 몇 가지 매개 변수를 확인하고 참가자 각자가 1 에테르를 지불하고 새로운 참가자를 넣는 것을 보장합니다.participants집합의 끝에서, 마지막으로, 만약 현재 참가자의 전수수가 3의 倍数이라면, 3 에테르를payoutIdx이 모든 것은payoutIdx다음 참가자를 가리키고 있습니다.

참고 링크

해시트리:

비트코인:

정지 문제:

이더리움:

이더리움 네트워크:

이더리움 다음:

계약:

계약 IDE:


더 많은

작은 꿈이 모든 것을 이해하는데, 이해하는데, 이해하는데, 이해하는데 너무 부족합니다.

수안그런데, 그 사람들은 BTC와 ETH를 연구하러 갔습니다.

모박스이해가 안되네요