區塊鏈的相關知識點

1,密碼學原理

密碼學原理

1,collision resistance

哈希函數 ,目前還是很安全的,沒有找到任何不同的內容其哈希是一致的情形。哈希碰撞(這個在數學上面是沒法證明的,都是日常的實踐表明,無法找到對于不同事物的對其進行哈希運算之后,得到的哈希值是一致的。MD5 被人為制造的哈希碰撞攻破,表明其機制的不安全)

2,hiding(輸入空間要足夠大,分布要均勻)

單向的 x -> H(x),輸入到輸出,單向

3,puzzle friendly

事先不知道結果,沒有捷徑,只能不斷的嘗試

簽名

  • 公鑰無需保密,比如雙方溝通,需要使用對方的公鑰加密,然后對方收到加密信息之后使用私鑰解密,就可以看到原始信息。
  • 公鑰相當于銀行賬號,私鑰相當于銀行的密碼。
  • 發起交易,比如我轉給張三10個比特幣,這個需要使用我的私鑰加密,然后將這條消息、秘文、公鑰一起廣播,別人通過我的公鑰解密秘文,如果結果和發布的消息一致,就驗證我的身份。

2,數據結構

  • 數據結構 哈希指針(要求無環
  • 哈希指針不光存儲地址也要存儲哈希值(判定內容是否被篡改)
  • Merkle tree是基于binary tree的改進,使用哈希指針代替了普通的指針

區塊包含

  • Block header : 交易的根哈希值
  • 宏觀信息:比特幣的版本協議、指向區塊鏈的前一個指針、整個Merkle tree的根哈希值、挖礦的難度、隨機數 ?
  • Block body : 交易的列表

節點

  • 全節點:保存全部信息驗證每一個交易
  • 輕節點:無法獨立驗證(大多數)

Merkle prood

  • Merkle proof (從交易體 到根節點的路徑)
  • 全節點 Block header + Block body
  • 輕節點 Block header

輕節點的驗證流程

如果驗證的過程,人為制造對面那個分支的(H()向全節點請求),想制造哈希碰撞,但是根據collision resistance原則,實際上并不可行。

?3,針對電子錢幣的傳統攻擊方式?

1,雙花攻擊

  • 定義:將一份帶有央行密鑰簽名的貨幣復制多份,花費多次。
  • 使用 唯一ID,標識每一份央行密鑰簽名的貨幣,這樣花費的時候就會判定是否花費過。但是,每次花費都需要央行的確認,就相當于中心結構的方式,就不是去中心化的方式了。
  • 比特幣的產生流程 (防止雙花攻擊

A鑄幣交易的哈希 要和 A轉賬的哈希要一致,否則無法證明A的幣的來源的正確性。

分布式共識

分布式哈希表

  • 1,不可能結果 : FLP,即 如果網絡傳輸是異步請求的,網絡傳輸沒有上限,如果系統中一個用戶是faulthy,那么系統也不會達到共識。
  • 異步請求:網絡傳輸時延沒有上限。CAP(Consistency、availability、partition tolerance)三者最多只能滿足兩個

比特幣的共識協議

  • 存在惡意節點,但是大多數節點是好的。既然大多數節點是好的,發布投票,大家檢測其中包含的交易,如果存在非法的交易,投票低點,如果收到的票數達到一半以上,就代表贊成。

問題

  • 不能保證所有節點都投票
  • 效率(網絡延遲)
  • 投票(首先需要確立投票權利)

2,女巫攻擊

  • 定義:創建大量的賬號,投票,控制一半以上的賬戶
  • 比特幣使用 (計算力)進行投票,即使創建一堆賬號,也不能保證計算力的提升

3,分叉攻擊 (交易回滾)

4,比特幣的實現

UTXO(Unspent Transaction output)

  • 為了防止雙重支付問題,檢測double spending。
  • 輸入 等于 輸出,輸入可以來自多個來源,此時需要多個簽名。

問題

M具有記賬權利,發布一筆交易A轉給M10比特幣,但是這個是需要A的簽名,這個是不可以偽造的。即使將其強制寫在區塊鏈上,但是誠實節點不接受這個區塊,會沿著上一個節點繼續挖掘。

雙重支付問題

需要多等幾個區塊,只有包含自身交易的區塊后面的區塊越多,說明篡改的難度越大。一般為6個區塊。

Selfish mining

自己挖完礦之后,得到一個區塊,不是立刻發布,而是繼續接著挖,直到自己的鏈最長,然后同時發出。修改之前的交易。

5,比特幣網絡

Application layer :Bitcoin block chain

Network layer :p2p overlay network 所有節點的身份地位相同,不存在超級節點(super?node/master?node),加入比特幣網絡,需要和種子節點聯系,然后種子節點會告訴你他所知道的網絡中的其他節點。節點之間使用tcp鏈接,可以穿透防火墻,退出的時候,不需要任何的操作,當其余節點接收不到你的消息就會將你刪除列表。

Simple , robust ,but not efficient

比特幣設計的原則是簡單、魯棒而不是高效。使用flooding的方式,當一個節點收到消息之后,會將這條消息轉發給相臨近的鄰居,并且記錄這個消息,下次再收到這個消息的時候就不會再次轉發。這個鄰居的含義不是物理層次的,即中國和中國用戶之間轉賬和中國用戶和美國用戶之間轉賬的花費時間是一致的。

有一個大的集合,存儲所有等待寫入區塊鏈的數據,當一條消息第一次加入集合,需要進行轉發給鄰居節點,第二次就不轉發了,避免無限轉發。如果有兩筆交易,A->B和A->C分別被不同的節點接收,假設這兩筆交易使用的是同一個比特幣,接收第一條消息的節點會拒絕接收第二條消息,同樣,接收第二條消息的節點會拒絕接收第一條消息。如果交易被寫入到區塊鏈中,集合存儲的交易就會被刪除。假設,A->B這條消息被存儲到區塊鏈上之后,那么A->C同樣也會被拒絕。

節點每次都會檢查內部存儲的交易的合法性以及十分處于最長節點。

由于網絡的原因,不是所有的節點都會接收到同一筆交易,以及接收到消息的次序不同,以及有的節點不轉發消息1?M字節,因為比特幣耗帶寬。

6,比特幣挖礦難度

為什么要控制挖礦的難度,使其每10分鐘可以出一個區塊?出塊速度快不好嗎?

  • 出塊時間很短,那么分叉會成為常態,很有可能會形成一堆的分叉,無止盡。
  • 系統的誠實節點越多,系統越來越安全。如果出塊時間縮短,會大幅度降低系統的計算能力,容易被51%估計。惡意節點只需要沿著一條鏈挖礦,很快就會使其成為最長的鏈條。這個時候甚至不需要51%的算力,就可以做惡。

7,全節點和輕節點

合法性檢驗

  • 驗證區塊中的每一筆交易是否合法
  • 發布的區塊是否符合難度要求
  • 區塊是否在最長的鏈上

挖礦歷程

  1. CPU
  2. GPU(通用并行計算)
  3. ASIC芯片(Application?Specific?Integrated?Cirad)專有芯片,只有使用同一個mining?puzzle才可以使用同一個型號的ASIC專屬芯片

相關內容補充

  • 貨幣設計的時候采用 ASIC?resistance,防止ASIC專屬芯片挖礦。
  • 趨勢:礦池(pool?manager全節點驅動很多礦工(miner),礦工只負責哈希運算,剩余功能全部由礦主負責,比如監聽是否有人挖出區塊,以及分配任務)。
  • 參考鏈接:https://www.odaily.com/post/5135179

8,礦工和礦池

如果你運行一個礦池,你將如何給礦工布置任務和發放回報?

礦池就是通過網絡把成千上萬的礦工連接起來聯合挖礦。原理可以簡單理解為:礦池管理員將當前區塊目標 Hash指的計算拆分為更為簡單的目標值給礦工們,比如區塊目標值是需要 Hash 值前面有 70 個 0,礦池管理員會讓礦工們去找滿足 前面有 50 個 0 的 Hash 值;這樣在礦工大量提交的有 50 個 0 開頭的 Hash 指里面,有可能能找到有 70 個 0 開頭的 Hash 值從而贏得該區塊在網絡上的打包權和獎勵。而礦工的工作量統計就可以通過礦工提交的滿足礦池目標 Hash 值的次數來計算。具體回報的發放又可以分為單純按工作量或者根據礦池實際獎勵分紅等方式。

礦池的作用是減小單個礦工的收入不確定性,讓礦工挖礦能成為一個相對波動比較小的固定收入。但礦池管理員同樣會面臨非常有挑戰的問題:如何合理設計礦池獎勵策略、如何面對其他礦池的競爭、如何面對硬件設備的更新換代等。即使這些問題都解決的很好,礦池的獲利還要依賴于對 BTC 價格會上漲的假設;如果投資挖礦還不如直接購買 BTC 來的更具投資屬性,那還有什么人愿意挖礦呢。這就是被稱為 Bitcoin 有可能出現的 “死亡螺旋” 現象:不斷下降的 BTC 價格導致挖礦無利可圖,礦工們因此而退出挖礦,導致全網算力下降,繼而進一步導致價格下跌。

9,匿名性

Privacy:不需要真正的名字,只需要公私鑰

  • 比特幣的匿名性分析輸入地址轉化為 付款地址+找零地址,利用UTXO可以將輸入地址和找零地址關聯起來
  • 虛擬賬戶和現實賬戶相互關聯(資金的轉入/轉出),支持比特幣支付的場所,根據消費記錄,將比特幣賬號和實際的人關聯起來。

提高匿名性

  • Application?layer:將不同的人發起的交易混在一起,(洗錢網站,將錢幣發過去,再將別人的幣發給我們,有可能會跑路)
  • Network?layer:洋蔥路由
  • 區塊鏈的不可篡改性對于匿名性是一個災難,如果一次交易行為的不當,泄漏了身份,但是由于不可篡改性,無法修改區塊。
  • 參考鏈接?https://www.odaily.com/post/5133827

10,零知識證明

定義:是指一方(證明者)向另一方(驗證者)證明一個陳述是正確的,但是不需要向其透露除了該陳述是正確的以外任何信息。

零知識證明是一種基于概率的驗證方式,驗證的內容包括事實類陳述關于個人知識的陳述”。驗證者基于一定的隨機性向證明者提出問題,如果都能給出正確回答,則說明證明者大概率擁有他所聲稱的“知識”。零知識證明系統包括兩部分:宣稱某一命題為真的示證者(prover)確認該命題確實為真的驗證者(verifier)證明是通過這兩部分之間的交互來執行的。在零知識協議的結尾,驗證者只有當命題為真時才會確認。但是,如果示證者宣稱一個錯誤的命題,那么驗證者完全可能發現這個錯誤。

這里我們給出一個有關零知識證明的非常經典的例子,來幫助大家理解:

阿里巴巴被強盜抓住,為了保命,他需要向強盜證明自己擁有打開石門的口令,同時又不能把密碼告訴強盜。他想出一個解決辦法,先讓強盜離開自己一箭之地,距離足夠遠讓強盜無法聽到口令,足夠近讓阿里巴巴無法在強盜的弓箭下逃生。如果強盜舉起左手,阿里巴巴就使用口令將石門打開,如果舉起右手,就將石門關閉。阿里巴巴就在這個距離下向強盜展示了石門的打開和關閉。如果每次都能正確打開和關閉大門,則證實阿里巴巴確實知道石門的密碼。這個整個過程就是零知識證明,即證明者能夠在不向驗證者提供任何有用信息(石門的口令)的情況下,使驗證者相信某個論斷(阿里巴巴知道打開石門的方法)是正確的。

11,相關基礎內容

同態隱藏

盲簽

12,專門為了匿名性設計 零幣/零鈔

比特幣在花費的時候會驗證這個幣的產生流程,而零幣只需要證明這個幣沒有被花過即可。不可以溯源,無法關聯。

13,思考

哈希指針是一種抽象的概念,就其數據結構而言,仍然是哈希,沒有指針。使用的是key和value的形式實現的。使用的是levelDB,使用key?value從level?DB里面關聯每一個區塊。

14,區塊戀 引出 安全性

假設戀人雙方一起購買比特幣,將私鑰256位進行拆分,每人掌握128位,或者合伙人每人掌握一段私鑰地址,但是存在一個問題。單獨的破解整個私鑰需要2的256位數的難度,如果進行截取,只需要破解2的128位,這個破解難度不是對半降低的,因為他們之間的難度是遠遠大于的關系。

因此,使用多重簽名來防范安全。每個私鑰都是單獨產生的,還具有只需要m中的n份就可以。

15,公鏈,聯盟鏈,私鏈的劃分

業界對區塊鏈的劃分一般從兩個角度,一個角度按需要達成的共識范圍,分為公鏈(public),聯盟鏈(consortium),私鏈(private),另外一個角度是從賬本生產者加入的方式,分為無許可鏈(permissionless),許可鏈(permissioned),私鏈(private)。

參考鏈接

  • 無幣區塊鏈代表未來?淺談聯盟鏈以及對 Hyperledger、 Corda、FISCO BCOS 的比較
  • 區塊鏈的技術世界觀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447164.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447164.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447164.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用MAC 編譯合約的時候報錯:

編譯報錯的顯示內容如下: Error: EACCES: permission denied, mkdir /Users/chy/Documents/ipfslearn/ipfs_eth_img/client/src/contracts 最簡單的解決方法 原因分析:執行的權限不夠 解決辦法:升級權限 使用命令 chmod 777 項目的文件夾使…

最新,使用truffle框架之后,安裝ipfs的api包文件的命令變化

原因 項目文件路徑變化了,不是先前直接在項目文件夾里面直接執行安裝ipfs的命令了,需要切換到client文件夾下面執行 路徑不對,會出現錯誤,錯誤提示如下 切換到正確的路徑之后,使用命令 npm install --save ipfs-http-…

通過node 完成簡單的web3 API調用測試

使用命令查看當前web3的版本 npm list web3輸入命令 node,進入終端 引入web3,使用命令 var web3 require(web3) 查看引入web3的版本 web3.version

LInux學習筆記(四)-----實操排雷

參考書籍:linux就該這么學 4 Vim 編輯器與 Shell 命令腳本 4.1 Vim 文本編輯器(在 Vim 中,無法直接從輸入模式切換到末行模式) 4.1.1 配置 Yum 軟件倉庫 注:書中好像有點問題,第一個 . 改成 /(我是Ubuntu發現原來不能用…

Web3.js 學習

web3.js Web3 JavaScript app APIweb3.js是一個JavaScript API庫,一般使得DApp在以太坊上運行web3.js通過RPC調用與本節點通信,用于任何暴露了RPC層的以太坊節點之間通信web3包含了eth對象,即web3.eth(專門和以太坊區塊鏈交互&am…

c語言指針入門

指針的用途非常廣泛,比如如果你想通過函數改變一個變量的值,就得用指針而不能用值傳遞。還有在很多時候變量,特別是對象的數據量實在太大,程序員就會用指針來做形參,只需要傳遞一個地址就行,大大提高了效率…

搭建基于飛槳的OCR工具庫,總模型僅8.6M的超輕量級中文OCR,單模型支持中英文數字組合識別、豎排文本識別、長文本識別的PaddleOCR

介紹 基于飛槳的OCR工具庫,包含總模型僅8.6M的超輕量級中文OCR,單模型支持中英文數字組合識別、豎排文本識別、長文本識別。同時支持多種文本檢測、文本識別的訓練算法。 相關鏈接 PaddleOCR項目地址飛槳開源深度學習平臺效果展示頁面中文OCR在線體驗地…

macos 10.15 django2.2+apache2.4+ladon+wsgi寫webseverice接口

他的文檔不夠完善,使用起來可能有坑,因為不知道如何將ladondjangoapache綁定在一起使用,所以放棄了。 提醒:最好用個虛擬環境,防止庫沖突我使用的是anaconda 安裝apache macos本身自帶apache,其他平臺百度…

使用軟鏈接的方式遷移Docker

確認Docker安裝的位置 使用命令sudo docker info | grep "Docker Root Dir" 查看Docker的安裝位置如果是默認安裝的方式 ,一般會安裝在/var/lib/docker 路徑下面 前置工作 下文以 /store/software/docker 這個路徑作為要遷移的新 Docker 安裝(存儲)目錄…

Qt tableWidget導入\導出Excel表格 自用

首先在.pro文件中添加以下代碼:QTaxcontainer 代碼是轉載的,找不到源博客鏈接 void excel_01::on_pushButton_clicked() {//導出ui->progressBar->setValue(0); //設置進度條的值為0QString fileName QFileDialog::getSaveFileName(this,tr(&q…

基于HubServing的PaddleOCR部署

前提要求 服務器的部署需要鑒于先前安裝配置的docker環境,因此相關步驟查看我之前的博客 參考鏈接 服務部署 先前介紹 參考鏈接 官方推薦本博客采用基于HubServing的部署,這種方式已經集成到PaddleOCR里面,在先前的docker鏡像里面就可以…

我的職業生涯規劃學習日記(軟件工程)整理時間線

學習路線 語言只是工具不過學c一直都做不出來東西是為什么呢,下圖要第六部才做項目 概述 大一上學期:C,C,數據結構,cstl源碼,python爬蟲進入物聯網實驗室python方向,進入算法協會運維部學習算…

PaddleOCR和ChineseOCR的對比

PaddleOCR和ChineseOCR的對比 ChineseOCRPaddleOCR 對比 識別時間 chineseOCR識別的速度相對于PaddleOCR較慢,單純使用CPU對于單張圖片的識別時間可以達到20秒,如果使用GPU識別的時間一般控制在5秒以內(圖片包含的文字比較少的情形&#x…

C++內存管理(1)

根據侯捷老師的視頻:https://www.bilibili.com/video/BV1Kb411B7N8 這篇文章歸納內存管理的面試題和一些知識點梳理 正在更新中 首先為什么想要內存管理 不知道有沒有人好奇delete[]或者delete的時候為什么系統會自動這個變量 占了多少字節。 答案是因為cookies&a…

web3@0.20.1 在依據abi創建智能合約的時候報錯 TypeError: web3.eth.contract is not a function

前面的代碼不變 var web3 new Web3(new Web3.providers.HttpProvider("Http://localhost:8545")); var abi JSON.parse([{"constant":true,"inputs":[{"name":"candidate","type":"bytes32"}],"…

Linux學習筆記(一)------實操排雷

參考兄弟連b站網課 1.1如果沒有ifconfig 使用sudo apt install net-tools 下載;(ifconfig已經被淘汰所以需要另外下載) 1.2如果網卡是ens33; (1). vi /etc/sysconfig/network-scripts/ifcfg-ens33 將里面的…

Dapp簡單的投票小例子

準備工作 相關命令 mkdir simple_voting_dapp //創建文件夾cd simple_voting_dapp //進入文件夾npm init //初始化npm包管理文件,輸入ls 可以看到創建的package.json文件npm intsall web30.20.1 //安裝web3npm install solc0.4.25 //安裝solcnpm install -g ga…

使用mocha進行測試 區塊鏈

mocha安裝 npm install mocha --save-dev mocha簡介 mocha是一個JavaScript的單元測試的框架,既可以運行在瀏覽器環境中,也可以運行在node.js環境中,只需要編寫測試用例,mocha就會將測試自動的運行,并且給出測試的結…

Linux學習筆記(六)

參考書籍:linux就該這么學 6.存儲結構與磁盤劃分 6.1 文件系統與數據資料 6.2 掛載硬件設備 6.2.1 mount 命令用于掛載文件系統 6.2.2 umount 命令用于撤銷已經掛載的設備文件 6.3 添加硬盤 6.3.1 fdisk 命令用于管理磁盤分區 6.3.2 用于查看文件數據占用量的 du 命…

實現Linux系統外部和容器內部的文件傳輸

主機和容器之間進行文件傳輸,需要使用容器的ID即可 獲取方法如下 輸入指令 docker ps -a只需要CONTAINER ID傳輸命令 docker cp 本地文件路徑 容器ID:容器的路徑將文件從容器拷貝到本地的原理是一致的,只需要將對應路徑的位置進行更換即可