中心化 vs 去中心化
- 中心化 資料僅由單方提供
ex: 影片網站(中心) 提供影片,經過瀏覽頁面,讀取資源然後觀看。 - 去中心化 - 非單一網路提供資料
ex : A 與 B 電腦(去中心)有某個影片檔案,分享於P2P網路,讀取下載其資源然後觀看。
區塊鏈 Blockchain
一台公共的數據庫 (DB),由多台電腦更新與共享。
- 區塊 - 數據 (Data) 和 狀態 (Status) 依序批量儲存,需將區塊完成才算成功。
- 鏈 - 每個區塊連接一起且不能串改其加密資料,需所有網路共識
以太坊 Ethereum
在以太坊網中,有個被認定的機器稱 EVM ,每位與以太坊網交握的人都會保存此EVM的狀態,任何人都可與 EVM 發出請求。
此 請求 與 Log 與 EVM當時狀態 皆存放於區塊鏈中,狀態也會存在Node中。
加密機制確保請求 被驗證且有效添加在區塊鏈上,且不能串改。(只有自己,任何人都不能從自己的帳戶發送數位資產)
- 以太幣 Ether - 任何使用請求時,必須提供之賞金
- 以太虛擬機 EVM - 以太坊認定之虛擬機器,任何執行代碼會改變EVM狀態
- 節點 Nodes - 存EVM的實體機器
- 帳戶 Accounts - 以太幣之帳戶
- 交易 Transactions - 請求功能
- 區塊 Blocks - 交易量巨大,通常是分批提交,通常包含數十至百筆交易
- 智能合約 Smart contracts - 又稱 Dapps 或 去中心化應用 ,其實就是一段程式碼。
DAPP
去中心化應用,也是APP,但是結合了智能合約。
一個Dapp的後端Code在 P2P網路上運行
- 去中心化 - 無人控管
- 確定性 - 任何環境都能運行相同功能
- 圖靈完備性 - 只要有必要的資源,dapp就可以執行任何操作
- 隔離性 - 被需在 EVM之虛擬環境中運行
DAPP 好處
- 零關機 - 將其dapp核心合約部署至 Blockchain 上,整個網路都能為希望互動的客戶提供服務。
- 隱私 - 0真實身份部署 或 與其他dapp交互
- 抵制省查 - 無法拒絕任何 Transaction
- 數據完整性 - 採用加密機緣,且存放於 Blockchain 的數據是不可串改與無爭議,且無法偽造
- 無需信任關西的計算/可驗證行為 - 智能合約可以被分析,並保證以可預測的方式執行,而無需信任中央權威機構。
DAPP 壞處
- 維護 - 難以維護,一但部署開發者就很難對其更新
- 性能開銷 - 為了追求以太坊的安全完整透明可靠的水平,遠超出目前標準運算超多
- 網路阻塞 - 目前,網路每秒只能處理約10筆交易,如果交易風送的速度遠超過這個速度,未確認的交易池會迅速膨脹。
- 用戶體驗 - 設計用戶有好的體驗很難,普通終端用戶會認為以真正安全設置與區塊鏈互動所需的工具棧太難了。
Zombie Game
網址 - 這是一款入門以太坊的教學遊戲,手把手建立區塊鏈DApp。
Solidity
以太坊所撰寫智能合約的語言
這是第 1-13 章 Solidity 入門的 智能合約 Dapp ,這個將會是得部署在以太坊的Dapp
pragma solidity ^0.4.19; // Solidity 版本
contract ZombieFactory {
event NewZombie(uint zombieId, string name, uint dna);
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
Zombie[] public zombies;
function _createZombie(string _name, uint _dna) private {
uint id = zombies.push(Zombie(_name, _dna)) - 1;
NewZombie(id, _name, _dna);
}
function _generateRandomDna(string _str) private view returns (uint) {
uint rand = uint(keccak256(_str));
return rand % dnaModulus;
}
function createRandomZombie(string _name) public {
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}
}
web3.js
使用前端頁面(瀏覽器)操作Javascript,與以太坊連結後,操作Dapp的一項工具。
這是第 1-14 章 web3.js 簡單介紹如何透過 web3.js 操作 Dapp
var abi = /* abi是由编译器生成的 */
var ZombieFactoryContract = web3.eth.contract(abi)
var contractAddress = // 發布Dapp於以太坊的位置
var ZombieFactory = ZombieFactoryContract.at(contractAddress)
$("#ourButton").click(function(e) {
var name = $("#nameInput").val()
// 調用合約 public `createRandomZombie` Function:
ZombieFactory.createRandomZombie(name)
})
// 監聽 `NewZombie` 事件, 更新UI
var event = ZombieFactory.NewZombie(function(error, result) {
if (error) return
generateZombie(result.zombieId, result.name, result.dna)
})
// 獲取 Zombie 的 dna, 更新圖像
function generateZombie(id, name, dna) {
let dnaStr = String(dna)
while (dnaStr.length < 16)
dnaStr = "0" + dnaStr
let zombieDetails = {
headChoice: dnaStr.substring(0, 2) % 7 + 1,
eyeChoice: dnaStr.substring(2, 4) % 11 + 1,
shirtChoice: dnaStr.substring(4, 6) % 6 + 1,
skinColorChoice: parseInt(dnaStr.substring(6, 8) / 100 * 360),
eyeColorChoice: parseInt(dnaStr.substring(8, 10) / 100 * 360),
clothesColorChoice: parseInt(dnaStr.substring(10, 12) / 100 * 360),
zombieName: name,
zombieDescription: "A Level 1 CryptoZombie",
}
return zombieDetails
}
真心推薦直接玩一次讓你對撰寫及部署Dapp非常離理解與上手!
結語
以太坊算是繼比特幣後最大宗的一項區塊鏈專案,在交易所中可以看到琳瑯滿目的幣別,但我打算從以太坊開始了解滲透這個區塊鏈開發的相關工程, Solidity為以太坊智能合約撰寫的語言,接下來會紀錄這怎麼撰寫,和如何部署。