1. 程式人生 > >區塊鏈程式設計開發初學者入門指南

區塊鏈程式設計開發初學者入門指南

我有很多問題需要了解區塊鏈Blockchain的工作原理。重要的是“我如何在其上構建應用程式dapp?”。花了幾個星期的時間挖掘,閱讀和試驗才最終了解。我找不到簡短而全面的指南。現在,我有一些不錯的理解,我想寫一個可以幫助別人的。這是一個快速指南,我只保留了重要的部分,以減少學習曲線。

目錄

  • 區塊鏈的目的
  • 區塊鏈是如何發明的
  • 以太坊和智慧合約簡介
  • 在以太坊上編寫智慧合約

區塊鏈的目的

Roopa住在Delhi的一個偏遠地區。印度政府每個月都會分配她少量的食物資源。因為她屬於BPL(貧困線以下)類別。政府通過中介來分配這些食物資源。只有三分之一的食物資源可供人們使用,如Roopa,其餘的則被中介出售以獲取利潤。

Sara寫小說,她在亞馬遜上發表。她很沮喪,因為亞馬遜將50%的銷售額作為佣金。這是不公平的,因為她一個人投入了寫作和營銷的努力。

問題是中介渴望權力和金錢。他們的座右銘已成為“不惜任何代價獲利”,為了支援生產者和賦予窮人權力,我們需要中介採取道德行為。這幾乎是不可能實現的,但是如果我們可以用自治系統取代中介呢?

由於計算機沒有偏見,因此既不需要金錢也不需要權力。這可能是Satoshi Namakato在2008年使用區塊鏈技術發明比特幣時的想法。

Blockchain是如何發明的?

隨著時間的推移,貨幣逐漸發展,每次發展都降低了生產成本,使交易更加便利。金幣的生產成本很高。紙幣的發明解決了這個問題。但是,在計算機和網際網路的發明之後,人們找到了一種更方便,更快捷的交易方式。

為了安全地保持我們一生的收入並促進數字交易,我們需要一箇中介(銀行)。這使銀行變得強大,他們可以對我們的提款/交易徵收高額費用,出售我們的私人資訊等。

銀行對金錢的渴望導致了2008年的金融危機。銀行未能尊重客戶的隱私。他們薄弱的安全系統引發了數字欺詐。

貨幣的下一次演變必須解決以下問題。

  • 它不應儲存在中央實體。
  • 它需要高度安全。
  • 它應該確保隱私。

由於法定貨幣由政府控制,Satoshi別無選擇,只能發明一種新貨幣(比特幣)。他藉助點對點網路和密碼學解決了這些問題。

去中心化分享權力

Torrent使用點對點技術來共享檔案。torrent應用程式不會從中央伺服器或單臺計算機下載檔案,而是連線到其網路中的人員,找出誰擁有該檔案並從其計算機下載。

你可以從世界各地的不同計算機上獲取檔案。如果網路中的某個人離開,你的下載不會受到影響,因為還有其他人可以共享該檔案。

Satoshi採用這種技術,因為它以去中心化分散的方式儲存錢。任何單一實體都無法控制它。

加密

在密碼學中,人們可以對訊息進行數字簽名。為了做到這一點,我們需要三個東西:公鑰,私鑰和訊息。

公鑰和私鑰是一組數學連線的長字元。公鑰就像你的使用者名稱一樣公開,私鑰就像你的密碼一樣是祕密。

訊息是你要授權的資訊,例如:“我授權你向John支付100美元”。

如果你使用公鑰,私鑰和訊息輸入演算法。加密演算法將產生簽名。這是該訊息內容唯一的另一組字元。

Public Key 
-----BEGIN EC PUBLIC KEY----- 
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE50uE+YSxqDgMkFByhpcgTVqXCqHOh68Ljt1z0jklDff/WV7xo+U6o3REBtK/C0/LM+Ef3FB3wR9aXMGNMLb9EA== 
-----END EC PUBLIC KEY-----

Private Key 
-----BEGIN EC PRIVATE KEY----- 
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgwqIsXl9FqsgrzMdxaxI6flBwWIev0Z7i+WF4j8BGnrKhRANCAATnS4T5hLGoOAyQUHKGlyBNWpcKoc6HrwuO3XPSOSUN9/9ZXvGj5TqjdEQG0r8LT8sz4R/cUHfBH1pcwY0wtv0Q 
-----END EC PRIVATE KEY-----

Message
Hello World

Signature
B0A9A4F641D3A2E3A65576B7311DCD62ABE78BBF4D3F5FE856598508E24FCB2E6F0277C2F8D57E9E2E108B7C493986E783F5316B8046597019951669B4EE6922

要驗證訊息,必須輸入公鑰,訊息和簽名。加密演算法可以驗證訊息是否由公鑰的所有者簽名。

破解加密演算法需要1000年的時間。由於我們的計算限制,這不能更快地完成。未來的量子計算機可能會挑戰這一點。但是,可以升級比特幣系統以確保安全性。

Satoshi在他的系統中加入了密碼術,以幫助人們從他們的錢包中授權比特幣交易。

隱私

你通過生成錢包(公鑰/私鑰)註冊到比特幣。系統不會收集電子郵件ID,全名等資訊。因此,除非你公佈你的公鑰,否則你將是匿名的。

把它放在一起Satoshi使用加密技術和點對點網路構建了一個共享分類賬。當有人向某人傳送比特幣時,會以加密方式簽署一條訊息並將其廣播給網路中的所有人。他們更新了他們的分類賬,因此網路中的每個人都知道誰擁有什麼。

Blockchain

每隔十分鐘,交易就會組合成一個塊並連結回以前的塊。這個過程產生一個連續的區塊鏈。挖掘是確認塊的過程,這涉及網路中的計算機來解決數學問題。第一個解決問題的計算機/礦工獲得了憑空製造的比特幣獎勵。

區塊確認並新增到網路後,將在整個網路中進行復制。區塊鏈是在製作自主比特幣系統的過程中發明的,該系統在沒有人為干預的情況下確認了交易。如果你正在尋找區塊鏈的簡化說明,這裡有一個故事

以太坊和智慧合約簡介

早些時候我們談到用自治系統取代中介。這可以通過程式設計來完成。比特幣的系統很難讓人們對自治系統進行編碼。

因此,Vitalik Buterin建立了一種名為以太坊的新加密貨幣。它不僅是一個去中心化的加密貨幣,而且是一個可以以智慧合約的形式託管程式碼的計算機網路。

在智慧合約中,我們可以編制條件。如果你想建立一個去中心化的書店。你編寫說明以幫助作者新增新書,在客戶進行交易後將下載連結傳送到電子書等。

智慧合約不僅儲存條件,還儲存資料。去中心化的書店的智慧合約本身儲存書籍列表,購買等。

但是,我們應該承認智慧合約的侷限性。有些系統需要人工支援,計算機無法處理。在現實世界中實施智慧合約並不容易。一旦釋出的智慧合約不能改變,愚蠢的錯誤可能代價高昂。

在以太坊上編寫智慧合約

我們將建立一個簡單的智慧合約,儲存和檢索學生的成績。我們將以合理的方式編寫合約。這是github repo

pragma solidity ^0.4.18;
contract Grades{
}

第一行告訴編譯器我們正在使用哪種版本的solidity。然後我們定義合約等級。

我們需要在合約中儲存兩項內容,學生姓名和成績。因此,我們將建立一個數組來儲存學生姓名和一個關聯陣列來儲存他們的成績。

pragma solidity ^0.4.18;
contract Grades{
mapping (bytes32 => string) public grades;
bytes32[] public studentList;
}

現在,我們將建立一種方式來發送合約,即學生姓名列表。我們將在建構函式中執行此操作。

pragma solidity ^0.4.18;
contract Grades{
mapping (bytes32 => string) public grades;
bytes32[] public studentList;
function Grades(bytes32[] studentNames) public {
studentList = studentNames;
}
}

在Solidity中,我們只調用一次建構函式。我們將學生名稱作為引數傳遞,該引數將儲存在我們之前宣告的studentList陣列中。

現在,我們需要編寫一個函式來為學生分配他們的成績。我們還需要另一個功能來檢查學生是否有效。

pragma solidity ^0.4.18;
contract Grades{
mapping (bytes32 => string) public grades;
bytes32[] public studentList;
function Grades(bytes32[] studentNames) public {
studentList = studentNames;
}
function giveGradeToStudent(bytes32 student, string grade) public {
require(validStudent(student));
grades[student] = grade;
}
function validStudent(bytes32 student) view public returns (bool) {
for(uint i = 0; i < studentList.length; i++) {
if (studentList[i] == student) {
return true;
}
}
return false;
}
}

giveGradeToStudent函式有兩個引數,學生姓名和成績。require函式檢查validStudent函式是返回true還是false。如果返回false,則取消執行。

最後,我們需要編寫一個函式來獲取學生的成績。getGradeForStudent函式將學生姓名作為引數,從關聯陣列中返回相應的成績。

pragma solidity ^0.4.18;
contract Grades{
mapping (bytes32 => string) public grades;
bytes32[] public studentList;
function Grades(bytes32[] studentNames) public {
studentList = studentNames;
}
function giveGradeToStudent(bytes32 student, string grade) public {
require(validStudent(student));
grades[student] = grade;
}
function validStudent(bytes32 student) view public returns (bool) {
for(uint i = 0; i < studentList.length; i++) {
if (studentList[i] == student) {
return true;
}
}
return false;
}
function getGradeForStudent(bytes32 student) view public returns (string) {
require(validStudent(student));
return grades[student];
}
}

為了本教程的目的,你可以將其部署在個人區塊鏈上。你可以用Ganache建立。以下是安裝和執行ganache的命令。

npm install ganache-cli [email protected] solc
node_modules/.bin/ganache-cli

保持ganache執行,在新終端上我們將部署我們的智慧合約。請將智慧合約儲存為Grades.sol

讓我們編譯程式碼。

node
code = fs.readFileSync('Grades.sol').toString()
solc = require('solc')
compiledCode = solc.compile(code)

現在讓我們部署智慧合約。在區塊鏈上部署合約會花費你的gas,這是為了獎勵那些向你租用計算能力的人。所以我們必須指定你願意分配的gas量。你可以使用gas計算器估算。但是,你現在無需付費,因為你正在使用個人區塊鏈進行部署,這是你正在使用的資源。在公共以太坊區塊鏈上部署合約時,你必須付費。

Web3 = require('web3')
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
abiDefinition = JSON.parse(compiledCode.contracts[':Grades'].interface)
GradesContract = web3.eth.contract(abiDefinition)
byteCode = compiledCode.contracts[':Grades'].bytecode
deployedContract = GradesContract.new(['John','James'],{data: byteCode, from: web3.eth.accounts[0], gas: 4700000})

現在讓我們呼叫我們的函式給我們的學生John提供成績A +。稍後,我們將使用getGradeForStudent函式檢查它是否已更新。

deployedContract.giveGradeToStudent('John', 'A+', {from: web3.eth.accounts[0]})
deployedContract.getGradeForStudent.call('John')
'A+'

恭喜,你已經部署了智慧合約。

======================================================================

如果你希望更進一步,分享一些以太坊、EOS、比特幣等區塊鏈相關的互動式線上程式設計實戰教程:

  • java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
  • python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
  • php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
  • 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
  • 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
  • EOS教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
  • java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
  • php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
  • tendermint區塊鏈開發詳解,本課程適合希望使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI介面、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操程式碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。

匯智網原創翻譯,轉載請標明出處。這裡是原文區塊鏈程式設計初學者入門指南