主頁 > 前端設計 > 【區塊鏈學習筆記】以太坊、智能合約

【區塊鏈學習筆記】以太坊、智能合約

2020-09-30 11:28:45 前端設計

目錄

  • 一、以太坊
    • 1. 定義
    • 2. 以太坊與位元幣的關系
    • 3. 以太坊的共識
  • 二、智能合約
    • 1. 智能合約的定義
    • 2. 智能合約的編譯
      • 智能合約原始碼
      • 智能合約編譯工具的安裝
    • 3. 智能合約的測驗
  • 三、以太坊虛擬機EVM
    • 1. 虛擬機的分類
    • 2. 區塊鏈虛擬機
  • 四、以太坊的共識機制與挖礦原理
    • 1. 共識機制
    • 2. 以太坊的挖礦原理

一、以太坊

以太坊是區塊鏈2.0時代的代表,也是全球第一個ICO專案,

1. 定義

以太坊(Ethereum):是一個開源的有智能合約功能的公共區塊鏈平臺,通過其專用加密貨幣以太幣(Ether)提供去中心化的以太虛擬機(Ethereum Virtual Machine)來處理點對點合約,

從上述的定義可以看出以太坊和位元幣相似,都是一個基于區塊鏈技術的分布式計算平臺,不過它更強調自己是一個智能合約系統,其實它的本質和位元幣是一樣的,只不過可以在這個平臺里任意生成多個不同的位元幣系統而已,

以太坊涉及到三個基本概念:

  • 以太幣:簡稱ETH,以太幣是以太坊的內部燃料,為以太坊上各種幣的自動交易提供主動的流動性,同時也適用于智能合約執行的費用支付,它是以太坊內置的資產,
  • 以太坊虛擬機:簡稱EVM,支撐執行任何復雜的代碼和演算法的虛擬機,
  • 智能合約:指的是由計算機程式定義、可自動執行的承諾和協議,簡單來說就是,腳本代碼,

2. 以太坊與位元幣的關系

位元幣存在的不足:

  • 位元幣區塊鏈缺少圖靈完備,圖靈完備是指一切可計算的問題都可以計算,
  • 位元幣區塊鏈的擴展性比較差,不能應用在除了位元幣以外的其它領域,

以太坊的優化:

  1. 建立了一個圖靈完備的底層系統,可以通過簡單的程式來實作各類數字資產的生產,
  2. 一個可編程、圖靈完備的區塊鏈網路,可以實作更多的非資產類的功能型產品,

以太坊技術=區塊鏈技術+智能合約

3. 以太坊的共識

下面三個版本的以太坊的共識機制均采用PoW,目前來看正在往混合共識機制轉換,以太坊的混合共識機制是PoW+POS,從而使礦工與持幣者的利益得到平衡,

二、智能合約

1. 智能合約的定義

智能合約:指的是由計算機程式定義、可自動執行的承諾和協議,

以太坊智能合約:代碼(即合約功能)和資料(即合約狀態)的集合,存在于以太坊區塊鏈的特定地址,合約賬戶能夠在彼此之間傳遞資訊,進行圖靈完備的運算,合約依靠以太坊虛擬機(EVM)以位元組代碼的二進制格式在區塊鏈運行,

以太坊智能合約可以分為5種:

  • 資料庫合約:僅用作資料存盤,允許其他合約寫入、更新和獲取資料,以及檢查呼叫者權限,
  • 管理員合約:在資料庫合約上運行,執行批量讀/寫操作,
  • 合約管理合約(CMC):目的是管理其他合約,主要任務是跟蹤系統的所有合約/組件,處理這些組件之間的通信,并簡化模塊化設計,保持此功能與正常業務邏輯分離,
  • 應用邏輯合約(ALC):包含應用程式特定的代碼,一般來說,如果合約使用控制器和其他合約來執行特定的任務,則它是ALC,
  • 公用合約:執行特定的任務,并且可以被其他合約無限制地呼叫,它可能使用某種演算法散列字串,提供亂數字或其他東西,通常不需要太多存盤空間,而且只有很少或沒有依賴關系,

2. 智能合約的編譯

智能合約原始碼

在這里插入圖片描述
在部署智能合約之前,需要兩件事情:編譯代碼和應用程式的二進制介面,二進制介面是一種參考模板,用于定義如何與合同進行互動,

智能合約編譯工具的安裝

安裝智能合約編譯工具solc,solc是一個Solidiy命令列編譯器,是Solidity編譯方法之一,
在ubuntu系統,在終端輸入命令列就可以成功安裝,

在Ubuntu系統
在終端中執行以下命令: 
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc
which solc

在MAC OSX系統,也是在終端輸入命令列,

在Mac OSX系統中
在終端中執行以下命令:
brew tap ethereum/ethereum
brew install solidity
which solc

在Windows系統中,需要安裝chocolatey,該工具可以在windows上管理軟體,然后執行命令列就可以了,

在Windosw系統中
需要安裝chocolatey (https/chocolsteyorg/),該工具可以在windows上管理軟體,
在終端中執行以下命令:
cinst -pre solC-stable

最后是通過原始碼安裝solc,

在終端中執行以下命令:,
git clone https://github.com/ethereum/cpp-ethereum.git
mkdir cpp-ethereum/build
cd cpp-ethereum/build
cmake -DISONRPC=OFF -DMINER=OFF -DETHKEY=OFF -DSERPENT=OFF-DGUI=OFF -DTESTS=OFF -DJSCONSOLE=OFF
make -j4
make install
which solc

在命令列輸入下面的bin命令進行智能合約代碼solc編譯:

solc --bin HelloWorld.sol

除了位元組碼資料,還需要一個abi介面,通過執行abi命令:

solc --bin HelloWorld.sol

得到abi資訊,在之后的測驗部署中可能會用到,

3. 智能合約的測驗

以下是智能合約示例

pragma solidity ^0.4.20;
contract Simplestorage {
	uint storedData;
	function set(uint x){
		storedData= x;
	}
	function get() constant returns(uint){
		return storedData;
	}
}

三種智能合約測驗的方式:
Remix+MetaMask
wallet +MetaMask
truffle

智能合約測驗工具安裝及使用

  1. Remix+MetaMask
    remix是一個瀏覽器版的solidity開發IDE(集成開發環境),可以使用在線版,也可以安裝到本地,MetaMask是一個瀏覽器插件,作用相當于一個輕型的以太坊錢包,谷歌或者火狐瀏覽器都可以使用,安裝方法是直接在瀏覽器應用商店中搜索MetaMask,或者在MetaMask官網下載安裝,
    以太坊錢包安裝完成之后,首先使用Remix發布智能合約,發布成功之后,右邊就會顯示已經發布成功的智能合約以及合約相關的資訊,包含合約地址以及暴露到外部的介面,
  2. wallet +MetaMask
    如果已經安裝好了MetaMask,那么直接打開以太坊錢包的官網https://wallet.ethereum.org/
  3. truffle(首先需要自行安裝node環境以及cnpm )
    (1)安裝 truffle:
    cnpm i-g truffle
    (2)創建專案工程:
    mkdir truffle && cd truffle
    truffle init
    (3)專案結構:
    contracts目錄下存的是solidity合約代碼,migrations中存的是js腳本,test中存的是測驗用例,
    (4)撰寫代碼、部署、除錯
    contracts中新建Hello.sol檔案;
    注意:
    類名Hello需要跟檔案名Hello.sol保存一致
    Migrations.sol檔案不能洗掉,
    在migrations目錄下添加對應的js腳本2_depoly_hello.js
    代碼添加完后,打開終端,切換到專案所在路徑,執行代碼,

三、以太坊虛擬機EVM

傳統意義上的虛擬機
虛擬機:實際上不是物理計算機,而是一個用來模仿物理計算機的軟體環境,但虛擬機可以像物理計算機一樣運行程式,用于托管虛擬機的物理計算機通常可以支持多臺虛擬機,另外,不僅在系統層上有虛擬機的概念,在程式語言上也有虛擬機的概念,

虛擬機是用來解決什么問題呢?
為了抽象掉硬體底層,從系統層來說,硬體和作業系統都越來越多樣化了,
它可以自動兼容所有硬體,總結一下,虛擬機技術實作基本上都是將硬體層或是系統層進行了一次抽象,以致對應用層屏蔽掉了底層的實作細節,有利于應用的快速實作和部署,

1. 虛擬機的分類

按層次來說可以分為三大類:

  • 高級語言虛擬機:是就一個代碼解釋器,不需要二進制代碼,只需要中間代碼,然后虛擬機處理后,再移交給CPU 和存盤結構,虛擬機模擬的是代碼的執行,
  • 作業系統層的虛擬機:所有作業系統介面呼叫都會被該容器截獲,經過處理后,發送到當前適當的平臺上,
  • 硬體層的虛擬機:是最復雜的工程,是虛擬化技術的一大重點,是對硬體層以及硬體驅動層的模擬,

然而它們的實作越往底層難度就越大,

2. 區塊鏈虛擬機

傳統的精簡指令集計算機:這種計算機CPU只提供了有限的執行指令和存盤器,但是各種型別的應用都能在這臺計算機上運行,

原理:因為系統存在一個“虛擬機”將高層語言的實作都轉換成了CPU的相關執行指令,高層語言提供語法,人們使用高級語言開發相關應用,

由低到高的層次結構分別為:硬體指令,虛擬機,高級語言和應用層,

如果要在區塊鏈里支持各種應用,也需要有這樣的層次結構,因此需要區塊鏈提供一套指令,并且區塊鏈里的虛擬機可以對這些指令作相關的解釋,另外,高級語言的實作需要有一個編譯器將實作編譯成虛擬機支持的指令,這樣,區塊鏈就完美支持了語言和業務的分離,從而可以在區塊鏈里開發各種業務應用,

虛擬機架構的組成部分:

  • 指令∶區塊鏈系統底層支持的原子操作指令
  • 虛擬機∶對原子操作指令的解釋
  • 編譯器:將高級語言轉換為虛擬機支持的指令
  • 高級語言:用于實作在區塊鏈里運行業務應用

還有兩個重要的組成部分∶

  • 區塊鏈系統提供的原始API,用于在撰寫智能合約需要時,獲取系統相關資料或是狀態;
  • ABI,一個智能合約發布后,其他的應用需要知道這個合約提供了什么功能介面以及資料結構,

當所有的部分都就緒后,我們就可以用高級語言和API撰寫符合業務邏輯的智能合約,然后用相關編譯器將智能合約編譯成 byte codes,并且也會生成相關的ABI描述,經過嚴格測驗后,就可以將智能合約的byte codes和ABI以交易的形式發布到區塊鏈中,

礦工會驗證你交易的合法性,如果入塊成功,將會回傳智能合約地址,用戶會呼叫這個合約地址來獲取 ABI,再根據 ABI 里對功能介面的描述來發起—筆對功能介面呼叫的交易,從而實作相關功能或是獲取相關結果,礦工同樣也會對這筆交易進行合法性驗證及入塊處理,

將經過嚴格測驗的智能合約代碼發布到區塊鏈上可以理解為一個特殊的交易——包括了可執行代碼的交易,然后會被礦工記錄在某個塊中,當需要呼叫這個智能合約時,只需向這個智能合約的地址發送一個交易即可,因為每個節點都需要安裝以太坊客戶端,而每個客戶端都自帶了一個EVM(以太坊虛擬機),通過交易觸發智能合約后,智能合約的代碼就能在EVM上被執行,

這種方式相當于把程式部署到了很多的電腦上,隨時都可以通過交易來觸發這些智能合約的執行,從而也完成了去中心化程式的部署和呼叫,
DAPP就是基于以太坊運行的去中心化應用,這種應用涉及到傳統行業的方方面面,

四、以太坊的共識機制與挖礦原理

1. 共識機制

以太坊為什么需要共識機制呢?
分布式系統中多個主機通過異步通信的方式組成網路集群,在這樣的一個異步系統中需要主機之間進行狀態復制,以保證每個主機達成一致的狀態共識,在運行的程序中,可能出現主機故障導致無法通信,也有可能主機性能下降、網路擁塞這些都可能導致錯誤資訊在系統內傳播,因此需要在不可靠的異步網路中定義容錯協議以保證各主機達成安全可靠的狀態共識,

以太坊共識機制的版本
在這里插入圖片描述
如果單純根據代幣余額來決定記賬者,必然使富有者勝出,導致記賬權的中心化,降低共識的公正性,因此,如何解決記賬權中心化問題?不同的PoS機制在權益證明的基礎上,采用了不同的方式來增加記賬權的隨機性,來辟負中心化,
在這里插入圖片描述

2. 以太坊的挖礦原理

挖礦流程
共識機制:PoW(作業量證明)
演算法:Ethash (Dagger-Hashimoto演算法的改良版本)

對于每個塊,首先計算一個種子,該種子僅和當前塊的資訊有關,然后根據種子生成一個32M的隨機資料集,根據隨機資料集生成一個1G大小的DAG(有向無環圖),
在這里插入圖片描述
挖礦的程序就是從DAG中隨機選擇元素(類似于位元幣挖礦中查找合適Nonce),再進行哈希運算,可以從Cache快速計算DAG指定位置的元素,進而哈希驗證,

挖礦步驟

  • 生成一個錢包
  • 有一臺電腦,把電腦調成挖礦的最高效狀態
  • 下載個挖礦軟體開始挖礦,挖到礦后,挖到的幣會發到錢包里面,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/141885.html

標籤:其他

上一篇:lotus 區塊高度 匯出快照

下一篇:使用vscode除錯npm scripts

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more