1. 程式人生 > >以太坊開發生態

以太坊開發生態

區塊鏈中級.以太坊開發
From:JamesZou & 傳智播客研究院 & 傳智播客區塊鏈

以太坊開發生態

課程介紹

1.五個模組

在這裡插入圖片描述

  • 什麼是以太坊:以太坊介紹、常見概念、測試 …

  • 如何與以太坊節點網路:錢包、瀏覽器、web3.js …

  • 以太坊開發工具、只能合約測試與部署:solidity、部署測試、mocha、solc、ganache、truffle …

  • 以太坊實戰專案:彩票專案、眾籌專案 …

  • 細節知識點補充:私鏈搭建、mist操作、面試常見問題、以太坊原理 …

2. 課程目標

  • 這是如何構建以太坊應用,開發dapp的課程
  • 不是炒幣的課程
  • 不是底層協議的課程
  • 就業嚮導, 以企業的需求和解決實際問題為主
1.比特幣選擇的是安全和去中心化,犧牲了效率,只有約 7TPS 的吞吐量,難以支撐大規模的商業應用。
2.PPCEOSIOTA等採用POSDPOSDAG共識機制,選擇的是安全和效率,吞吐量可達幾千乃至幾萬TPS,一定程度上犧牲了去中心化。
3.如果選擇去中心化和效率,那麼安全將不能保證,一般不會這麼選擇。

目前的創新公鏈專案一般有兩個思路:
1.是在保證安全的前提下,在去中心化和效率之間尋找平衡,比如側鏈、分片、閃電網路、雷電網路等都是這個思路。
2.
是分層和子鏈技術,底層母鏈採用去中心化的POW共識,上層採用POSDPOS或者DAG這些效率較高的共識,儘量兼顧中心化和效率的優勢。也可以將分層、分片、閃電網路、跨連等多種技術綜合起來,整合創新,當然難度也更大。

一. 區塊鏈

1. 區塊鏈特點

  • 去中心化 ( 所有參與其中的網路節點共同維護,無需中心節點調控 )
  • 不可篡改 ( 整個鏈條按照時間順序和雜湊指標連結起來,環環相扣 )
  • 匿名性 ( 私鑰和地址是使用網路的所有條件,無需身份驗證 )
  • 可溯源 ( 所有寫入區塊的資料需多方驗證,公開透明 )

2. 不可能三角

區塊鏈世界存在“不可能三角”問題,講的是安全、效率、去中心化,三者之間不可共存,只能取其二

在這裡插入圖片描述

3.協議層詳解

在這裡插入圖片描述

3.1 應用層

  • 去中心化應用程式(DApp)、合約呼叫

3.2 合約層

“智慧合約”(smart contract)這個術語至少可以追溯到1995年,是由多產的跨領域法律學者尼克·薩博(Nick Szabo)提出來的。他在發表在自己的網站的幾篇文章中提到了智慧合約的理念。他的定義如下:

“一個智慧合約是一套以數字形式定義的承諾(promises),包括合約參與方可以在上面執行這些承諾的協議。”

  • 本質:數字化合同
  • 特點:程式碼代替人仲裁和執行合同,同時能夠觸發支付
  • 示例:如同程式碼化的合同,去除人的主觀因素,一個合約寫好以後,就無法再被編輯或者修改。因此,你可以保證無論合約的內容是什麼,它都會無條件執行。整個步驟:構建->儲存->執行

在這裡插入圖片描述

3.3 激勵層

  • 發行機制、分配機制,token經濟,通證經濟

3.4 共識層

  • 共識機制

共識機制是指可以使所有節點對某一種狀態達成一致的方式,有共識機制去中心化才有意義,才具備可信度,否則只是資料共享,目前主流的共識機制有:POW、POS、DPOS、PBFT等。

3.4.1 POW
  • POW(ProofOf Work,工作量證明),比特幣在Block的生成過程中使用了POW機制,一個符合要求的Block Hash由N個前導零構成,零的個數取決於網路的難度值。要得到合理的Block Hash需要經過大量嘗試計算,計算時間取決於機器的雜湊運算速度。當某個節點提供出一個合理的Block
    Hash值,說明該節點確實經過了大量的嘗試計算,當然,並不能得出計算次數的絕對值,因為尋找合理hash是一個概率事件。當節點擁有佔全網n%的算力時,該節點即有n/100的概率挖到礦。

在這裡插入圖片描述

  • 特點

    算一道很難的謎題,系統給予挖礦獎勵。

    多勞多得【社會主義】

  • 優點

    所有節點均可參與,記賬權公平的分派到每個節點,去中心化。

    多勞多得,礦工積極性高。

    安全性高,欺詐成本高,如果能夠欺詐成功,那麼做誠實節點收益更大。

  • 缺點

    主流礦池壟斷嚴重,存在51%算力攻擊風險。

    浪費資源嚴重(2018年底消耗全球0.5%電量)。

    持幣人沒有話語權,算力決定一切。

    網路效能低,共識時間長。

  • 專案 :比特幣、以太坊、比原鏈等。

3.4.2 POS
  • POS(ProofOfStake,股權證明),類似於財產儲存在銀行,這種模式會根據你持有數字貨幣的量和時間,分配給你相應的利息。 舉個例子,就是一個根據你持有貨幣的量和時間,給你發利息的一個制度,在股權證明POS模式下,有一個名詞叫幣齡,每個幣每天產生1幣齡,比如你持有100個幣,總共持有了30天,那麼,此時你的幣齡就為3000,這個時候,如果你發現了一個POS區塊,你的幣齡就會被清空為0。你每被清空365幣齡,你將會從區塊中獲得0.05個幣的利息(假定利息可理解為年利率5%),那麼在這個案例中,利息
    = 3000 * 5% / 365 = 0.41個幣,持幣有利息。具體的利息不同幣種不一樣。

在這裡插入圖片描述

  • 特點

    不挖礦,依靠幣齡(幣持有數量 * 持有天數)決定記賬權,利息即為獎勵,記賬後幣齡清零。

    按錢分配,錢生錢【資本主義】。

  • 優點

    在一定程度上縮短了共識達成的時間。

    節約資源。

    防作弊,幣齡越大,獲得記賬權機率越大、避免51%攻擊, 因為攻擊會使自己權益受損。

  • 缺點:數字貨幣過於集中化,富者越來越富有,散戶參與積極性低

  • 專案:ADA 等

3.4.3 DPOS eos
  • DPOS(Delegated Proof Of Stake, 委託權益證明),它的原理是讓每一個持有幣的人進行投票,由此產生n個代表 , 我們可以將其理解為n個超級節點或者礦池,這n個超級節點彼此的權利是完全相等的。從某種角度來看,DPOS有點像是議會制度或人民代表大會制度。如果代表不能履行他們的職責(當輪到他們時,沒能生成區塊),他們會被除名,網路會選出新的超級節點來取代他們。DPOS的出現最主要還是因為礦機的產生,大量的算力在不瞭解也不關心比特幣的人身上,類似演唱會的黃牛,大量囤票而絲毫不關心演唱會的內容。

在這裡插入圖片描述

  • 特點:不挖礦,每年按比例增發代幣,獎勵超級節點
  • 優點:高效、擴充套件性強
  • 缺點:21個節點太少,非去中心化,而是多中心化
  • 專案:EOS

3.5 網路層

  • P2P網路、傳播機制、驗證機制(自組網)

3.6 資料層

  • 包括:區塊鏈資料、鏈式結構、雜湊函式、Merkle樹、非對稱加密、時間戳。

  • 問題:需要突破的就是區塊容量的問題

3.7 常見專案共識機制表

在這裡插入圖片描述

4.補充概念

4.1 分叉

程式碼升級時不同社群意見發生分歧時的結果、重大bug修復是會分叉

  • 軟分叉

    舊節點接受新協議產生的區塊,毫無感知,新老協議共同維護一條鏈

    在這裡插入圖片描述

  • 硬分叉

硬分叉是指區塊格式或交易格式發生改變時,未升級的節點拒絕驗證已經升級的節點生產出的區塊,不過已經升級的節點可以驗證未升級節點生產出的區塊,然後大家各自延續自己認為正確的鏈,所以分成兩條鏈。

舊節點拒絕接收新節點創造的區塊,從此分裂為兩條獨立的鏈

案例:以太坊分叉,分為ETC(以太經典),ETH(以太坊v神)

在這裡插入圖片描述

  • 叔塊

在同一時間出現兩個礦工同時挖出礦的情況,此時出現臨時的分叉,區塊鏈會同時保留兩條鏈,並等待新生成的區塊,新區塊選擇連結的鏈就是最長鏈,即主鏈,那麼另外一個區塊就被稱為叔塊(以太坊,有獎勵)/孤塊(比特幣,無獎勵)

在這裡插入圖片描述

4.2 BIP

BIP(Bitcoin Improvement Proposals),是提出 比特幣的新功能或改進措施的檔案。可由任何人提出,經過稽核後公佈(git可查)。說白了就是 比特幣節點軟體 的各種改進升級意見。

4.2.1 BIP32
提出定義了 HD Wallet (Hierarchical Deterministic wallet),是一個可以從單一個 seed 產生一樹狀結構儲存多組 私鑰和公鑰 的方案。
4.2.2 BIP39
提出定義了助記詞方案,將 seed 用 字詞表示。一般由 12 個字片語成,稱為 mnemonic(助記詞)。
這樣可以方便普通使用者記憶 - 畢竟和錢相關。

在這裡插入圖片描述

4.2.3 BIP44
基於 BIP32 的系統,賦予樹狀結構中的各層特殊的意義。讓同一個 seed 可以支援多幣種、多帳戶等。
格式:m / purpose' / coin_type' / account' / change / address_index
//purporse': 固定值44', 代表是BIP44
//coin_type': 這個代表的是幣種, 可以相容很多種幣, 比如BTC是0', ETH是60'
//btc一般是 m/44'/0'/0'/0
//eth一般是 m/44'/60'/0'/0

在這裡插入圖片描述

4.3 ERC

4.3.1 ERC-20

以太坊 Token作為代幣的標準,每個代幣都一樣,就像人民幣。

  • ERC20 是各個代幣的標準介面。這個標準提供了代幣的基本功能,以及允許代幣被批准,這樣它們就可以由另一個鏈第三方使用。(這個標準相當於定義了一個介面,當你的智慧合約實現了這個介面以後,錢包軟體就能通過呼叫這些介面,監聽事件等操作你的代幣。)
  • ERC-20標準規定了每個代幣的基本功能,非常適合第三方使用,在開發人員的程式設計下,5分鐘 就可以發行一個ERC-20代幣。因為它可以快速發幣,而且使用又方便,因此空投幣和空氣幣基本上就是用ERC-20標準開發的。

在這裡插入圖片描述

  • 體驗 ERC20 標準【參考
contract ERC20 {
    //代幣的名字,例如"Gavin token"
    function name() constant public returns (string name);
    //代幣的簡稱,例如:GAVC 也是我們一般在代幣交易所看到的名字
    function symbol() public constant returns (string symbol);
    //代幣的最小分割量 token使用的小數點後幾位。比如如果設定為3,就是支援0.001表示
    function decimals() public constant returns (uint8 decimals);
    //token的總量
    function totalSupply() public  constant returns (uint totalSupply);
    //餘額 返回某個地址(賬戶)的賬戶餘額
    function balanceOf(address _owner) public constant returns (uint balance);
    //轉賬 交易代幣 從訊息傳送者賬戶中往_to賬戶轉數量為_value的token
    從代幣合約的呼叫者地址上轉移 _value的數量token到的地址 _to,並且必須觸發Transfer事件*/
    function transfer(address _to, uint _value) public returns (bool success);
    /**【替某人個別人轉賬】
    從賬戶_from中往賬戶_to轉數量為_value的token,與approve方法配合使用
    從地址 _from傳送數量為 _value的token到地址 _to,必須觸發Transfer事件。
    transferFrom方法用於允許合約代理某人轉移token。條件是from賬戶必須經過了approve。這個後面會舉例說明*/
    function transferFrom(address _from, address _to, uint _value) public returns (bool success);
    //允許量值 限定_spender能從合約呼叫賬戶中轉出數量為_value的token
    function approve(address _spender, uint _value) public returns (bool success);
    //限額 獲取賬戶_spender可以從賬戶_owner中轉出token的數量
    function allowance(address _owner, address _spender) public constant returns (uint remaining);
    //發生轉賬時必須要觸發的事件,一般位於 transfer 和 transferFrom 函式中
    event Transfer(address indexed _from, address indexed _to, uint _value);
    //當函式approve(address _spender, uint256 _value)成功執行時必須觸發的事件
    event Approval(address indexed _owner, address indexed _spender, uint _value);
}
4.3.2 ERC223
  • ERC223 是 ERC20 的一個升級版本。ERC223 標準提供了更安全的方法用於完成交易。
4.3.2 ERC721

Token作為數字資產的標識,每個標識都可以代表不一樣,就像每隻貓都不同。

在這裡插入圖片描述

https://www.cryptokitties.co/

  • ERC721的NFT(Non-Fungible Tokens - 不可替代的Token) 讓每個Token都獨一無二,從而讓數字資產變得更有收藏價值,尤其是在加密貨幣收藏和網路遊戲領域擁有巨大的潛力。在CryptoKitties中一隻貓能值1000個ETH, 在大型多人網路遊戲中,一把劍可能也值2000個ETH,而在ERC721中它僅僅只是一個智慧合約中的一個Token。
  • ERC20是標準Token介面,ERC20的Token可以無限細分為10^18份,而ERC721的Token最小的單位為1,無法再分割。
  • 體驗 ERC721 標準【參考
contract ERC721 {
   // ERC20 compatible functions
   function name() constant returns (string name);
   function symbol() constant returns (string symbol);
   function totalSupply() constant returns (uint256 totalSupply);
   function balanceOf(address _owner) constant returns (uint balance);
   // Functions that define ownership
   function ownerOf(uint256 _tokenId) constant returns (address owner);
   function approve(address _to, uint256 _tokenId);
   function takeOwnership(uint256 _tokenId);
   function transfer(address _to, uint256 _tokenId);
   function tokenOfOwnerByIndex(address _owner, uint256 _index) constant returns (uint tokenId);
   // Token metadata
   function tokenMetadata(uint256 _tokenId) constant returns (string infoUrl);
   // Events
   event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
   event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
}
4.3.3 ERC1155

Token作為合約的標識,每個合約都像是ERC1155合約類的物件一樣。【參考

  • ERC1155 是遊戲開發服務提供商Enjin釋出的一個全新的代幣標準,旨在幫助遊戲開發者節省資金,促進原子交換,即“無需中間人即可實現代幣之間的兌換”,以此來提升代幣之間的交易效率。

不管是ERC20系【可替代性通證】還是ERC721系【不可替代性通證】的token都具備的一個問題,對於一個專案中如果有幾萬種完全不同性質的東西,比如: 錢是錢、積分是積分、收藏品是收藏品那麼我們需要部署幾萬種token的合約【不管是ERC20的還是ERC721的】那麼問題來了,首先這幾萬種合約裡面必然有大量的重複程式碼,但是礦工們依然會把這幾萬種合約都上鍊,【注意我說的是在一個專案裡面,比如: 遊戲專案】,所以給每一個不同的物品設立一個獨立的合約,這產生的巨大成本和之後帶來的管理費用,都將是幾乎讓人無法承受的,那麼ERC1155就是為了解決這種問題而生的,現在『物品』(可能包含ERC20的token或ERC721的token或兩者都有)可以被單一的一個合約(打包處理)來定義了。合約裡包含區別token們所需的最小量的資料。好比,後來出現的視訊壓縮技術,後一幀只記錄了與前一幀的不同之處,所以極大的壓縮了整個視訊的體積(老闆說你確定你舉得這個栗子真的能更好更簡單的說明這個問題??)合約的狀態包含了每個token ID的配置資訊和管理收集的所有行為。ERC-1155的靈活性更強,它使得開發者可以自行選擇是批量生成某一種特定的token,還是構建不可被複制的惟一元資料;說白點就是說ERC1155可以把一種token換成為另外一種token,最大進步就是可以融合不同token(可能是『可替換』的代幣與『不可替換』的代幣的混合體)進行『打包處理』

  • 特點:

    • 模組化即插即用合同 – 如上所述,ERC-20和ERC-721需要為每個部署單獨的合同,這會導致大量重複程式碼,從而“堵塞”以太坊區塊鏈。ERC-1155建議跨Token的“通用”程式碼儲存在中央智慧合約中,並給出唯一識別符號。然後,此唯一識別符號可以被需要中央智慧合約程式碼的其他智慧合約引用。這基本上提供了智慧合約“重複使用”的功能,無需複製,從而節省儲存空間,處理能力和電力消耗。
    • 捆綁Token的原子交換 – 原子交換是“一種智慧合約技術,可以在不使用中介的情況下為另一種加密貨幣進行交換,起到交易所的作用”。使用當前標準,如果Alice想要將A和B與Bob交換C和B,則需要至少四個單獨的步驟(圖A)。ERC-1155為了解決這種低效率將多個Token分組在一起,而不管有許多Token需要被交換,只需將其捆綁一起經過兩個步驟即可。
    • 多個複雜操作合多為一 – ERC-1155允許在單個合約中執行多個複雜操作,這將使交易“更輕”且更方便。
    • 可交換的獨特性 – 前文討論過ERC-20是同質代幣協議以及ERC-721是非同質代幣協議。“ 使用ERC-1155,開發人員現在可以增加選擇的許可權,因為每個Token可以大規模生產或單獨建立,並且包含唯一的元資料(獨特性)或完全可替代”
  • 體驗 ERC721 標準【參考

/**
針對 可替代token的
https://github.com/ethereum/EIPs/issues/1155
 */
contract ERC1155 {
    // Events
    event Approval(address indexed _owner, address indexed _spender, uint256 indexed _itemId, uint256 _value);
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _itemId, uint256 _value);
 
    // Required Functions
 
    /**
    【兩個方法一個處理單個的一個批量處理】 【請參照 ERC20的transfer函式】
    將每個itemId[]的數量轉移到指定的地址。
    每個引數陣列應該是相同的長度,每個索引都是相關的。
    必須觸發 Transfer事件
    itemId 可以看做是某個特定的tokenId
     */
    function transfer(address _to, uint256 _itemId, uint256 _value) external;
    function batchTransfer(address _to, uint256[] _itemIds, uint256[] _values) external;
 
    /**
    【兩個方法一個處理單個的一個批量處理】 【請參照 ERC20的transferFrom函式】
    將每一個itemId[]的數量從一個或多個地址轉移到指定地址。
    每個引數陣列應該是相同的長度,每個索引都是相關的
    必須觸發 Transfer事件
    itemId 可以看做是某個特定的tokenId
     */
    function transferFrom(address _from, address _to, uint256 _itemId, uint256 _value) external;
    function batchTransferFrom(address _from, address _to, uint256[] _itemIds, uint256[] _values) external;
    
    /**
    【兩個方法一個處理單個的一個批量處理】 【請參照 ERC20的approve函式】
    批准一個帳戶可以替代表另一個帳戶(使用轉賬)轉移最大數量的多個itemId數目
    必須觸發 Approval事件
     */
    function approve(address _spender, uint256 _itemId, uint256 _value) external;
    function batchApprove(address _spender, uint256[] _itemIds,  uint256[] _values) external;
    
    /**
    增加一個或多個itemId的餘量,而不需要重置為0 【及變更approve函式指定的允許轉移量?】
    必須觸發 Approval事件
     */
    function increaseApproval(address _spender, uint256 _itemId,  uint256 _addedValue) external;
    function batchIncreaseApproval(address _spender, uint256[] _itemIds,  uint256[] _addedValues) external;
    
    /**
    減少一個或多個itemId的餘量,而不需要重置為0
    必須觸發 Approval事件
     */
    function decreaseApproval(address _spender, uint256 _itemId,  uint256 _subtractedValue) external;
    function batchDecreaseApproval(address _spender, uint256[] _itemIds,  uint256[] _subtractedValues) external;
 
    // Required View Functions
    function totalSupply(uint256 _itemId) external view returns (uint256);
    /**
    根據對應的tokenId檢視餘額
     */
    function balanceOf(uint256 _itemId, address _owner) external view returns (uint256);
    /**
    根據對應的tokenId及擁有者及代替擁有者花錢者(注意 錢還是話擁有者的,只是擁有者給予某些權力給 第三者可以挪用她的部分資金) 具體參照ERC20 自明
     */
    function allowance(uint256 _itemId, address _owner, address _spender) external view returns (uint256);
 
    // Optional View Functions
    function name(uint256 _itemId) external view returns (string);
    function symbol(uint256 _itemId) external view returns (string);
    function decimals(uint256 _itemId) external view returns (uint8);
}
 
/**
針對不可替代token的拓展 
 */
contract ERC1155NonFungible {
    // Optional Functions for Non-Fungible Items
    /**
    For NFTs, this returns the owner of a specific _itemId.
    在【 Non-Fungible Items】,返回當前tokenId 所屬者 【參照ERC721】
     */
    function ownerOf(uint256 _itemId) external view returns (address);
    /**
    返回當前tokenId的描述的URL 【參照ERC721】
     */
    function itemURI(uint256 _itemId) external view returns (string);
    /**
    列舉可用的Non-Fungible Items
     */
    function itemByIndex(uint256 _itemId, uint128 _index) external view returns (uint256);
    /**
    列舉分配給所有者的Non-Fungible Items
     */
    function itemOfOwnerByIndex(uint256 _itemId, address _owner, uint128 _index) external view returns (uint256);
}

二.什麼是以太坊

0. 區塊鏈的智慧合約時代

比特幣 的區塊鏈概念:在全球範圍多個計算機上驗證,儲存,複製交易資料(術語叫“分散式賬本”)
以太坊 在這個概念上更進一步,使在全球範圍的多個計算機上執行程式碼成為現實

在這裡插入圖片描述

  • 自從基於區塊鏈技術的 比特幣 被世人所知後,越來越多的人意識到區塊鏈技術的好處,並想到很多可以用區塊鏈技術解決的行業或業務問題。但為每個業務都開發一個全新的區塊鏈軟體,成本會非常高(開發、維護、社群建設等),有沒有一種區塊鏈軟體能讓大家不操心p2p、資料一致性、安全、漏洞等一大堆問題,只需要專注業務的功能實現呢?

  • 嘭!以太坊應運而生,它區別於比特幣最大的特點:智慧合約,就解決了上面的問題。本質上,你在同一個區塊鏈軟體上可以開發其它的區塊鏈軟體。說得再大一點:以太坊的目的是讓擁有以太幣的人能使用通過數千節點提供動力的分散式世界計算機。

1. 基本資訊

以太坊(Ethereum):是一個開源的有 智慧合約 功能的 公共區塊鏈平臺,通過加密貨幣以太幣(Ether)提供去中心化的虛擬機器(“以太虛擬機器” Ethereum Virtual Machine)來執行智慧合約程式碼。 gas - eth

  • 願景:建立一個無法停止,抗遮蔽(審查)和自我維持的去中心化世界計算機。
作者 V神 (Vitalik Buterin - 俄羅斯人,1994.1.31)
以太坊系統 下一代加密貨幣與去中心化應用平臺
釋出時間 2013.12
以太幣(Eth) 以太坊系統獎勵並流通的電子貨幣(積分、通證)
官網 www.ethereum.org
交易瀏覽器 www.etherscan.io
黃皮書 www.github.com/ethereum/yellowpaper
  • 簡而言之:比特幣系統是一套 分散式的賬本,而以太坊則更進一步,可以看作是一臺 分散式的計算機

  • 以太坊用來分散式儲存資料並且計算。這些小型的電腦執行程式叫做智慧合約,合約由參與者在他們自己的機器上通過一種稱為 “以太坊虛擬機器(EVM)”的作業系統執行。

在這裡插入圖片描述

以太坊 是一個可以執行智慧合約程式的去中心化平臺,那些應用程式,不存在停機、審查、欺詐或第三方干擾的可能性。

2.以太坊歷史

2.2 以太坊發展史

  • 以太坊5年簡史——梳理與展望

  • 開發計劃 分成四個階段,即:

    1. Frontier(前沿)- 20150730

      目標:將挖礦和交易所交易執行起來

    2. Homestead(家園)- 20160314

      目標:提供了圖形介面的錢包,易用性得到改善,普通使用者也可以方便地體驗和使用以太坊

    3. Metropolis(大都會)- 20171016

      包含拜占庭(Byzantium)和君士坦丁堡(Constantinople)兩個硬分叉,後者預計在2018年進行

    4. Serenity(寧靜)- 2018年底(已延期至2019)
      前三個階段以太坊共識演算法採用工作量證明機制(POW),在第四階段計劃切換至權益證明機制(POS)

  • V神:因遊戲不公而想改變世界,創業5年躍生幣圈大佬

三.以太坊開發生態

0.以太坊網路

在這裡插入圖片描述

0.1 以太坊主網路

  • 花費真實的以太幣

在這裡插入圖片描述

0.2 以太坊測試網路

在這裡插入圖片描述

網路名 介紹 共識機制
Morden(退役) 2016年11月時,難度炸彈(太難)嚴重影響出塊速度,退役 PoW
Ropsten 解決Morden難度炸彈問題而重新啟動的一條區塊鏈 PoW
Kovan 解決測試網路中PoW共識機制的問題 PoA
Rinkeby(推薦) 以太坊團隊提供了Rinkeby的PoA共識機制說明文件 PoA
Ropsten
是以太坊官方提供的測試網路,是為了解決Morden難度炸彈問題而重新啟動的一條區塊鏈,目前仍在執行,共識機制為PoW。測試網路上的以太幣並無實際價值,因此Ropsten的挖礦難度很低,目前在755M左右,僅僅只有主網路的0.07%。這樣低的難度一方面使一臺普通膝上型電腦的CPU也可以挖出區塊,獲得測試網路上的以太幣,方便開發人員測試軟體,但是卻不能阻止攻擊。

PoW共識機制要求有足夠強大的算力保證沒有人可以隨意生成區塊,這種共識機制只有在具有實際價值的主網路中才會有效。測試網路上的以太幣沒有價值,也就不會有強大的算力投入來維護測試網路的安全,這就導致了測試網路的挖礦難度很低,即使幾塊普通的顯示卡,也足以進行一次51%攻擊,或者用垃圾交易阻塞區塊鏈,攻擊的成本及其低廉。

20172月,Ropsten便遭到了一次利用測試網路的低難度進行的攻擊,攻擊者傳送了千萬級的垃圾交易,並逐漸把區塊Gas上限從正常的4,700,000提高到了90,000,000,000,在一段時間內,影響了測試網路的執行。攻擊者發動這些攻擊,並不能獲得利益,僅僅是為了測試、炫耀、或者單純覺得好玩兒。

0.3 本地私有測試網路

  • 使用geth在本地自行搭建(後面介紹)

在這裡插入圖片描述

1.錢包和地址

1.0 MetaMask 錢包

在這裡插入圖片描述

1.1 錢包的分類

  • 區塊鏈錢包並不"裝錢",而是裝金鑰(私鑰和公鑰)的工具,有了金鑰就可以擁有相應地址上的數字貨幣的支配權。參考:【數字貨幣錢包分類】【錢包分類2

在這裡插入圖片描述

冷錢包  
冷即離線、斷網,也就是說私鑰儲存的位置不能被網路所訪問。例如紙錢包、腦錢包、硬體錢包等等。
例:下載比太錢包到手機客戶端後,關閉網路,生成比特幣錢包地址,備份密語。另外一個手機聯網,安裝比太錢包後,新增離線手機中的比特幣地址作為監控地址。在聯網手機中生成未簽名的交易資料後, 使用離線手機掃描聯網手機中的未簽名交易二維碼進行簽名,然後再使用聯網手機掃描離線手機上的簽名後的二維碼,再進行交易資料廣播。

熱錢包
熱即聯網,也就是私鑰儲存在能被網路訪問的位置。 例如存放在交易所的、線上錢包網站、手機App錢包都屬於熱錢包。通常而言,冷錢包更加安全,熱錢包使用更加方便。

on-chain
給一個錢包地址傳送數字貨幣, 這筆交易在全網廣播、被確認、被打包進區塊。這是發生在鏈上的,被稱為on-chain交易。on-chain錢包需要自己保管私鑰。

off-chain
相對於on-chain交易是off-chain交易。通常,通過交易所進行的交易是off-chain的,本人並沒有私鑰。私鑰在交易所,由交易所託管。所以交易所的錢包也是中心化的錢包。

全節點錢包
除了儲存私鑰外,全節點錢包還有儲存了所有區塊的資料,最為著名的是bitcoin-core。

輕錢包
它不必儲存所有區塊的資料,只儲存跟自己相關的資料。基本可以實現去中心化。

1.2 錢包地址和祕鑰

使用者平時一般使用 地址(賬號) 和 私鑰(密碼),不需要知道或使用公鑰

  • **私鑰:**私鑰可以計算出公鑰,公鑰 可以經過一系列數字簽名生成錢包地址。所以, 私鑰的持有者才是數字貨幣的持有者。

    私鑰通過隨機數來生成,如連續拋 256 次硬幣,根據每次硬幣的正反面可以得到的一個私鑰。 下面是使用 keyconv 命令列工具隨機生成的一個比特幣公私鑰和地址:

    Address: 1NpSVmyeJvFg3YNxp1QeCj51XsyceSZXT
    Privkey: 5J4jzNpmZTaA2hpsTqAzAf1fVRALr7Es4ciSjtjvGTR7i94Qrm2

  • 公鑰:它是密碼學上的概念,它由私鑰推算出來。公開金鑰的演算法屬於不對稱加密演算法,該演算法擁有兩個金鑰:公鑰和私鑰。

  • **錢包地址:**由於公鑰字元數太長,為了方便使用,使用一些列演算法將它轉成字元數很短的 地址

在這裡插入圖片描述

1.3 私鑰公鑰地址的關係

一個比特幣錢包中包含一系列的金鑰對,每個金鑰對包括一個私鑰和一個公鑰。私鑰(k)是一個數字,通常是隨機選出的。有了私鑰,我們就可以使用橢圓曲線演算法這個單向加密函式產生一個公鑰(K)。有了公鑰(K),我們就可以使用一個單向加密雜湊函式生成比特幣地址(A

在這裡插入圖片描述

1.4 比特幣公鑰生成地址流程

在這裡插入圖片描述

2.remix開發工具

  • Remix是一個基於solidity語言的線上智慧合約開發IDE,它提供從編譯,除錯到部署的全流程工具,功能非常強大。

3.Solidity語言

目前嘗試Solidity程式設計的最好的方式是使用 Remix (需要時間載入,請耐心等待)

在這裡插入圖片描述

  • Solidity是一門面向合約的、為實現智慧合約而建立的高階程式語言。這門語言受C++,Python和Javascript語言的影響,設計的目的是能在以太坊虛擬機器(EVM)上執行。
  • Solidity是靜態型別語言,支援繼承、庫和複雜的使用者定義型別等特性。
pragma solidity ^0.4.25;

contract HelloWorld{
    uint public balance;
    //public int aaa(){return 1;}
    function update(uint amount) public view returns (address,int){
        balance += amount;
        return (msg.sender, balance);
    }
}

4.Web3

  • 為了讓你的Dapp執行上以太坊,一種選擇是使用web3.js library提供的web3物件。底層實現上,它通過RPC 呼叫與節點通訊。web3.js可以與任何暴露了RPC介面的以太坊節點連線。

在這裡插入圖片描述

npm install --save web3 // 安裝 web3
npm install --save ganache-cli // 安裝 本地測試節點
  • 建立web3例項,需要設定要連線的節點(此例用的本地測試節點)
const Web3 = require('web3');
const ganache = require('ganache-cli');

if (typeof web3 !== 'undefined') {
 
            
           

相關推薦

開發生態

區塊鏈中級.以太坊開發 From:JamesZou & 傳智播客研究院 & 傳智播客區塊鏈 以太坊開發生態 課程介紹 1.五個模組 什麼是以太坊:以太坊介紹、常見概念、測試 … 如何與以太坊節點網路:錢包、瀏覽器、web

區塊鏈開發開發的技術資料資源匯總

以太坊 以太坊開發 ethereum truffle solidity 以太坊入門 區塊鏈入門 區塊鏈 區塊鏈開發 blockchain 一個適合區塊鏈新手的以太坊DApp開發教程: http://xc.hubwiz.com/course/5a952991adb

開發DApp實戰教程——用區塊鏈、星際文件系統(IPFS)、Node.js和MongoDB來構建電商平臺

IPFS 區塊鏈電商 區塊鏈開發 以太坊開發 以太坊dapp 以太坊教程 智能合約 以太坊 星際文件系統 區塊鏈 第一節 簡介 歡迎和我們一起來用以太坊開發構建一個去中心化電商DApp!我們將用區塊鏈、星際文件系統(IPFS)、Node.js和Mong

是什麽 - 開發入門指南

以太坊 以太坊 入門 很多同學已經躍躍欲試投入到區塊鏈開發隊伍當中來,可是又感覺無從下手,本文將基於以太坊平臺,以通俗的方式介紹以太坊開發中涉及的各晦澀的概念,輕松帶大家入門。寫在前面閱讀本文前,你應該大概了解區塊鏈是什麽,如果你還不了解,歡迎訂閱專欄:區塊鏈技術指引你從頭開始學區塊鏈技術。以太坊

開發環境搭建

適合 extra limit class ref acc difficult 發現 就是 Geth安裝 全稱 Go Ethereum, 官網地址:https://github.com/ethereum/go-ethereum/wiki/geth 安裝指令: brew tap

開發入門

智能合約 合約 以太坊 以太坊開發 ethereum truffle solidity 區塊鏈 區塊鏈開發 blockchain 以太坊開發入門 目標讀者: 專業的程序員;

EthBox開發套件,一鍵安裝開發環境

百度雲 技術 aid 驗證 cli nac 下載到本地 ejs 11.2 EthBox是匯智網為了方便以太坊開發學習者快速安裝本地開發環境而 制作的開發套件,可以一鍵安裝以下必備開發工具: nodejs:8.11.2 git:2.17.1.2 geth:1.8.10 ga

python開發dapp的實戰教程

智能合約 合約 EOS 區塊鏈 Dapp blockchain 以太坊作為最流行區塊鏈平臺,最大的特點是運行各種智能合約。我們已經出過node.js、java、php的以太坊開發實戰教程,這一次是python。Python官方提供了一系列的Python包用於支持在Pyth

開發實戰:私有鏈搭建操作指南

雖然以太坊是一個公有鏈系統,但是我們可以通過設定一些引數來執行自己的私有鏈節點,在自己的私有鏈上進行開發和測試不需要同步公有鏈資料,也不需要花錢來買以太幣,節省儲存空間和成本,而且很靈活很方便。本文介紹使用geth客戶端搭建私有鏈的操作步驟,同時會解釋在這個過程中用到的各個命令及選項的含

分享實錄|開發需知

1 以太坊開發與傳統應用開發的差異 相比起傳統應用而言,以太坊開發引入了新的基礎設施,由此必不可少的帶來了部署和運維的複雜度,比如作為系統設計者,我們需要做出選擇: 自建節點,還是信任第三方節點? 公有鏈、聯盟鏈、私有鏈? 由於加入了新的設計

這30個開發示例,讓你成為80萬都挖不走的區塊鏈人才!

2018年已過了大半,幣圈跌跌蕩蕩,而鏈圈的人在等待鳳凰涅槃,熊市專心做技術,牛市才能一展身手、衝破雲霄! 本文主要告訴你,如何成為一名優秀的以太坊開發者! 如果你是以太坊開發者中的“老司機”,請直接看最後一部分:30個為你量身定做的挑戰示例! 如果你是以太坊

開發教程(二) 利用truffle發布寵物商店 DAPP 到 測試環境Ropsten

ini 寵物 func on() append localhost -c success compile 1.環境安裝 1) node安裝 設置鏡像地址: curl --silent --location https://rpm.nodesource.com/s

開發】發幣指南--進階篇

參考:https://www.ethereum.org/token pragma solidity ^0.4.16; interface tokenRecipient { function receiveApproval(address _from, uint256 _value,

開發自己的ERC-20加密貨幣及如何ICO

今天我將向你展示如何在以太坊區塊鏈上開發你自己的加密貨幣並將其出售!我將向你展示如何使用以太坊智慧合約逐步建立自己的ERC-20代幣和眾籌銷售,如何測試智慧合約,如何將智慧合約部署到以太坊區塊鏈,以及如何構建ICO網站部署到網路上。我還將解釋ERC-20代幣是什麼,以太坊代幣如何工作,初始代

20181117--區塊鏈2.0開發

以太坊(Ethereum)是一個建立在區塊鏈技術之上, 去中心化應用平臺。它允許任何人在平臺中建立和使用通過區塊鏈技術執行的去中心化應用。 智慧合約 智慧合約可以理解為在區塊鏈上可以自動執行的(由訊息驅動的)、以程式碼形式編寫的合同(特殊的交易)。 智慧合約非常適合對信任、安全和永續性要求較

java程式設計師使用web3j進行開發詳解

如何使用web3j為Java應用或Android App增加以太坊區塊鏈支援,教程內容即涉及以太坊中的核心概念,例如賬戶管理包括賬戶的建立、錢包建立、交易轉賬,交易與狀態、智慧合約開發與互動、過濾器和事件等,同時也詳細說明如何使用web3j提供的API開發介面與以太坊進行互動,是java工程師學習以

開發】如何開發一個編譯智能合約並且發布的平臺(二)

vid new 有一個 tran slim ole https parse 交易 接上一章的內容,這篇介紹 deploy相關和結果演示。 deploy一個合約的過程中,需要計算發布的消耗和nonce值。 當進行每筆交易時,發送人設定Gas Limit 和Gas Pric

開發】利用Oraclize開發一個投注合約(一):原理介紹

智慧合約的作用很多,但是很多資料還是要基於網際網路,那麼如何在合約中獲取網際網路中的資料?Oraclize就是為了這個目的而誕生的。 本篇介紹如何利用Oraclize開發一個投注智慧合約,開始coding之前,這一節講述一下理論。 工作原理: 智慧合約通過對Oraclize釋出一個合約之間的呼叫請求來獲

開發】利用Oraclize開發一個投註合約(一):原理介紹

tween 協議 簡單方法 type callback 使用 抓取 獲取 num 智能合約的作用很多,但是很多數據還是要基於互聯網,那麽如何在合約中獲取互聯網中的數據?Oraclize就是為了這個目的而誕生的。 本篇介紹如何利用Oraclize開發一個投註智能合約,開始co

瞭解新的開發語言Vyper

Vyper是一種全新的以太坊開發語言,主要用於商用區塊鏈,對區塊鏈開發者來說可以提高安全性。 Vyper是一種通用的實驗性程式語言,可編譯為EVM(以太坊虛擬機器)位元組碼,Solidity也是如此。但是,Vyper旨在大規模簡化流程,以便建立更易於理解的智慧合約,這些合約對所有相關方更