以太坊學習記錄+geth配置+私有鏈搭建

qwer1030274531發表於2020-08-22

一、以太坊簡介

1、參考資料

  • 《精通以太坊》( Mastering Ethereum )

  • 《以太坊白皮書》(A Next一Generation Smart Contract andDecentralized Application Platform)

  • 《以太坊黃皮書》( 《以太坊:一種安全去中心化的通用交易賬本拜占庭版本》)

  • 以太坊官方文件( Ethereum Homestead Documentation )

  • Solidity官方文件

2、工具

涉及工具

  • MetaMask一瀏覽器外掛錢包
  • Remix一基於瀏覽器的Solidity線上編輯器
  • Geth一以太坊客戶端(go語言)
  • web3.js 一以太坊javascipt API庫
  • Ganache一以太坊客戶端(測試環境私鏈)
  • Truffle一以太坊開發框架

3、以太坊特點

  • 以太坊是“世界計算機”,這代表它是一個開源的、全球分別的計算基礎設施
  • 執行成為智慧合約(smart contract)的程式
  • 使用區塊鏈來同步和儲存系統狀態以及名為以太幣(ether)的加密貨幣,以計量和約束執行資源成本
  • 本質是一個基於交易的狀態機(transaction-based state machine)
  • 以太坊平臺使開發人員能夠構建具有內建經濟功能的強大去中心化的應用程式(DApp);在持續自我正常執行的同時,它還減少或消除了審查,第三方介面和交易對手風險

以太坊是一個平臺,使用者可以自定DApp,而本身具有交易功能

4、以太坊組成

  • P2P網路

    以太坊在以太坊主網路.上執行,該網路可在TCP埠30303.上定址,並執行一個名為DEVp2p的協議。

  • 交易(Transaction)

    以太坊交易是網路訊息,其中包括髮送者(sender),接收者(receiver),值(value)和資料的有效載荷(payload)。

  • 以太坊虛擬機器(EVM)

    以太坊狀態轉換由以太坊虛擬機器(EVM)處理,這是一個執行位元組碼(機器語言指令)的基於堆疊的虛擬機器。

  • 資料庫( Blockchain )

    以太坊的區塊鏈作為資料庫(通常是Google的LevelDB)本地儲存在每個節點上,包含序列化後的交易和系統狀態。

  • 客戶端

    以太坊有幾種可互操作的客戶端軟體實現,其中最突出的是Go一Ethereum ( Geth)和Parity。

5、重要概念

  • 賬戶( Account)

    包含地址,餘額和隨機數,以及可選的儲存和程式碼的物件。
    一普通賬戶(EOA),儲存和程式碼均為空
    合約賬戶(Contract) ,包含儲存和程式碼

  • 地址( Address)

    一般來說,這代表一個EOA或合約,它可以在區塊鏈上接收或傳送交易。更具體地說,它是ECDSA公鑰的keccak雜湊的最右邊的160位。

  • 交易(Transaction)

    一可以傳送以太幣和資訊
    一向合約傳送的交易可以呼叫合約程式碼,並以資訊資料為函式引數
    一向空使用者傳送資訊,可以自動生成以資訊為程式碼塊的合約賬戶

  • gas

    以太坊用於執行智慧合約的虛擬燃料。以太坊虛擬機器使用核算機制來衡量gas的消耗量並限制計算資源的消耗。執行智慧合約需要消耗以太幣

6、乙太網挖礦

  • 區塊獎勵( Block rewards)

    每產生一個新區塊就會有一筆固定的獎勵給礦工,初始是5個以太幣,現在是3個。

  • 叔塊獎勵(Uncle rewards)

    有些區塊被挖得稍晚一些,因此不能作為主區塊鏈的組成部分。比特幣稱這類區塊為“孤塊”,並且完全捨棄它們。但是,以太幣稱它們為“叔塊”(uncles) ,並且在之後的區塊中,可以引用它們。如果叔塊在之後的區塊鏈中作為叔塊被引用,每個叔塊會為挖礦者產出區塊獎勵的7/8。這被稱之為叔塊獎勵。

  • 叔塊引用獎勵(Uncle referencing rewards )

    礦工每引用一個叔塊,可以得到區塊獎勵的1/32作為獎勵(最多引用兩個叔塊)

  • 這樣的一套基於POW的獎勵機制,被稱為以太坊的“幽靈協議”

隨著以太坊發展,以太幣供應量均勻上漲

以太坊收入

  • 普通區塊收入

    一固定獎勵(挖礦獎勵),每個普通區塊都有
    一區塊內包含的所有程式的gas花費的總和
    一如果普通區塊引用了叔塊,每引用一個叔塊可以得到固定獎勵的1/32

  • 叔塊收入

    叔塊收入只有一項,就是叔塊獎勵,計算公式為:
    叔塊獎勵=(叔塊高度+8一引用叔塊的區塊高度)*普通區塊獎勵/ 8

也就是一個區塊引用叔塊,獲得3/32的區塊獎勵,而被應用的叔塊自身獲得3*(7/8)的獎勵

7、etherscan.io網站資訊

  • 每一塊都有gas limit,達到limit上限就不能進行
  • Block Reward,靜態區塊獎勵+交易費
  • Uncles Reward,很多情況下即使引用叔塊,獎勵為0,因為叔塊的層數可能相隔很久
  • 如果是親叔叔,也就是父塊的父塊相同,則能判定是親叔叔

8、幽靈協議

  • 臨時分叉機率高
  • 同時挖礦會造成浪費,作廢區塊浪費的是驗證資訊,有算力優勢造成的後果是一家獨大
  • 比特幣不存在同時造成的無用功,因為花的時間相對長
  • Greedy Heaviest Observed Subtree,GHOST協議:考慮整個樹結構,最重的一條是主鏈
  • 幽靈協議
    • 計算工作量證明時,不僅包括當前區塊的祖區塊,父區塊,還要包括祖先塊的作廢的後代區塊(“叔塊”),將他們進行綜合考慮。
    • 目前的協議要求下探到第七層(最早的簡版設計是五層),也就是說,廢區塊只能以叔區塊的身份被其父母的第二代至第七代後輩區塊引用,而不能是更遠關係的後輩區塊。
    • 以太坊付給以“叔區塊”身份為新塊確認作出貢獻的廢區塊7/8的獎勵,把它們納入計算的“侄子區塊”將獲得區塊獎勵的1/32,不過,交易費用不會獎勵給叔區塊。

9、以太坊和圖靈完備

為了防止無限迴圈的出現,採納gas消耗機制

同時,以太坊可以構建去中心化應用

  • DApp至少由以下組成:
    • 區塊鏈上的智慧合約
    • Web前端使用者介面
  • 一些名詞解釋
    • EIP:Ethereum Improvement Proposals,以太坊改進建議
    • ERC: Ethereum Request for Comments的縮寫,以太坊徵求意見。一些EIP被標記為ERC,表示試圖定義以太坊使用的特定標準的提議
    • EOA: External Owned Account,外部賬戶。由以太坊網路的人類使用者
    • Ethash:以太坊1.0的工作量證明演算法
    • HD錢包: 使用分層確定性( HD protocol)金鑰建立和轉賬協議(BIP32)的錢包。
    • Keccak256:以太坊中使用的密碼雜湊函式。Keccak256被標準化為SHA-3
    • Nonce:在密碼學中,術語nonce用於指代只能使用一次的值。以太坊使用兩種型別的隨機數,賬戶隨機數和POW隨機數

二、初識以太坊

  • 以太幣單位:wei,1ether = 10^18wei

  • 其他單位

    值(wei) 指數 通用名稱 SI名稱
    1 1 wei wei
    1,000 10^3 babbage Kilowei or femtoether
    1,000,000 10^6 lovelace megawei or picoether
    1,000,000,000 10^9 shannon gigawei or nanoether
    1,000,000,000,000 10^12 szabo microether or micri
    1,000,000,000,000,000 10^15 finney milliether or milli
    1,000,000,000,000,000,000 10^18 ether ether
    1,000,000,000,000,000,000,000 10^21 grand kiloether
    1,000,000,000,000,000,000,000,000 10^24
    megaether
  • 私鑰、公鑰和地址

    • 私鑰(Private Key)

      以太坊私鑰事實上只是一個256位的隨機數,用於傳送以太的交易中建立簽名來證明自己對資金的所有權。

    • 公鑰( Public Key)

      公鑰是由私鑰透過橢圓曲線加密secp256k1演算法單向生成的512位(64位元組)數。

    • 地址( Address )

      地址是由公鑰的Keccak一256 單向雜湊,取最後20個位元組(160位)派生出來的識別符號。

  • 私鑰丟失會導致賬戶丟失,keystore檔案是儲存的私鑰,要設定強密碼

  • 助記詞可以匯出私鑰

  • 一些以太坊環境

    • Main Network (NetworkID: 1 )

      主要的、公共的、以太坊區塊鏈。真正的ETH,真正的價值,真正的結果

    • Ropsten Test NetWork(Network ID:3)

      以太坊公共測試區塊鏈和網路,使用工作量證明共識(挖礦)。該網路上的ETH沒有任何價值。

    • Kovan Test Network ( NetworkID: 42)

      以太坊公共測試區塊鏈和網路,使用“Aura”協議進行權威證明POA共識(聯合簽名)。該網路上的ETH沒有任何價值。此測試網路僅由Parity支援。

    • Rinkeby Test Network ( Network ID: 4)

      以太坊公共測試區塊鏈和網路,使用“Clique"協議進行權威證明POA共識(聯合簽名)。該網路上的ETH沒有任何價值。

    • Localhost 8545

      連線到與瀏覽器在同一臺計算機上執行的節點。該節點可以是任何公共區塊鏈(main或testnet)的一部分,也可以是私有testnet。

    • Custom RPC

      允許將Metamask連線到任意相容geth的RPC介面的節點。該節點可以是任何公共或私人區塊鏈的一部分。

  • gas price不能為0

  • 無函式名為回退函式,也就是上面程式碼不執行就執行回退函式

三、智慧合約入門

透過科學上網工具登入remix工具可以進行合約的編寫和部署

在這裡插入圖片描述

在這裡插入圖片描述

四、搭建以太坊

測試geth

geth --datadir ./data1

搭建私鏈步驟

  1. 在geth/bin路徑下建立genesis.json,我的路徑是 /usr/local/Cellar/ethereum/1.9.18/bin

  2. 然後在json檔案中新增如下資訊

    {
    	"config": {
    		"chainId": 15
    	},
    	"difficulty": "2000",
    	"gasLimit": "2100000",
    	"alloc": {
    		"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
    		"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
    	}}1234567891011
  3. 然後在bin目錄下新建一個dir,名為chain

  4. 執行命令

    geth --datadir "/usr/local/Cellar/ethereum/1.9.18/bin/chain" init genesis.json1
  5. 執行成功

在這裡插入圖片描述

在這裡插入圖片描述

  1. geth --datadir . --networkid 15執行自己的私鏈

五、geth控制檯操作

  • 如果需要js需要互動,則使用
geth --datadir . --networkid 15 console 2>output.logtail -f output.log
//動態列印log1234
  • 出現js互動,後面的2>output.log 是將INFO資訊列印到外部日誌檔案中,不會顯示到控制檯影響命令輸出

在這裡插入圖片描述

  • 一些命令
eth.getBalance("0x58A8404CA64a9314e17Cf5F6B90F354b08d2a735")//獲取賬戶餘額
web3.fromWei(eth.getBalance("0x58A8404CA64a9314e17Cf5F6B90F354b08d2a735"),'ether')//檢視多少wei
eth.blockNumber
//檢視區塊數
personal.newAccount()//建立新賬戶
//輸入密碼後輸出`Your new key was generated            address=0x05E07008dbba53Dd9201f63FafC0d0C2efeC13Ed`12345678910
  • 轉賬之前必須先解
> personal.unlockAccount(eth.accounts[0])Unlock account 0x05e07008dbba53dd9201f63fafc0d0c2efec13ed
Passphrase: 
true1234
  • 轉賬
eth.sendTransaction([from: "0x58A8404CA64a9314e17Cf5F6B90F354b08d2a735", to:eth.accounts[0], values:100000})//這裡報錯因為from要從自己的accounts中取值
//應該如下>eth.sendTransaction({from:eth.accounts[0],to:"0x58A8404CA64a9314e17Cf5F6B90F354b08d2a735",value:web3.toWei(10,'ether')})"0x8f8a1b7a761db527a0d076121281a63a3fe86eeb6a6d3a86fed89b459f32a7c6"12345
  • 挖礦
miner.start(1)//程式會一直挖塊,在控制檯輸出
//想要停止挖塊
miner.stop()1234
  • 轉化
web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')1
  • 常用演算法

    personal.newAccount():建立賬戶;
    personal.unlockAccount():解鎖賬戶;
    eth.accounts:列出系統中的賬戶;
    eth.getBalance():檢視賬戶餘額,返回值的單位是Wei;eth.blockNumber:列出當前區塊高度;
    eth.getTransaction0:獲取交易資訊;
    eth.getBlock():獲取區塊資訊;
    miner.start():開始挖礦;
    miner.stop():停止挖礦;
    web3.fromWei(): Wei換算成以太幣;
    web3.toWei():以太幣換算成Wei;

  • 如果想直接使用dev環境,可以執行以下命令

geth --datadir . -dev console 2>output.log1
  • 獲取交易資訊
eth.getTransaction("0x1ed46e2c4c3c6f4dd5c691e60f7ef7e3a6e0064aeea88d9f34899f906bfdd6ed")1
{
  blockHash: "0xef95f308638afcc7be090fe1cb8410c68c62f546219d32c8db6d3707fcf78bc0",
  blockNumber: 1,
  from: "0x8ab2a77dcd76c69aa97a2516a0379a962c56cb32",
  gas: 21000,
  gasPrice: 1,
  hash: "0x1ed46e2c4c3c6f4dd5c691e60f7ef7e3a6e0064aeea88d9f34899f906bfdd6ed",
  input: "0x",
  nonce: 0,
  r: "0x9067606bee846798ba97180b336867293812c3849853d9688985f83d17fc0345",
  s: "0x69e7a2281e685a04d752015323c832dd4ea8fc94378db879a4b341a95f05fa73",
  to: "0x227a1e3efe2dd8e6fe4a633288b823f4f8179e21",
  transactionIndex: 0,
  v: "0xa96",
  value: 10000000000000000000}12345678910111213141516
  • 透過curl請求實現
//curl請求命令,與js互動的結果相同curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"web_clientVersion","params":[],"id":1}' 

六、以太坊賬戶

以太坊狀態機:儲存所有賬戶的基本資訊

比特幣UTXO可以提供更高程度的隱私

以太坊賬戶模式可以節省大量空間、更加簡單,具有更好的替代性


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2713830/,如需轉載,請註明出處,否則將追究法律責任。

相關文章