###### tags: `blockcchain` # HW1 ## [ 1 ] . 請描述何謂 Transaction (交易)? 執行流程是什麼?什麼是交易確認次數? 交易是由外部擁有帳戶 (EOA) 發起的簽名訊息,由以太坊網路發送,並紀錄以太坊區塊鏈上。看待交易的另一種方式是,它是唯一能觸發狀態改或是或促使合約在 EVM 中執行的東西。以太坊是一個全域單例 (global singleton) 的狀態機(state machine),交易是唯一能夠轉動這狀態機去改變狀態的方法。合約無法自行運行。以太坊不會在後臺運行,且所有的狀態改變與執行皆始於交易。 一個交易中有以下字段: **nonce**:該字段表示的是交易發送者的交易序列號,它是賬號的一個交易計數器,這個字段能夠防止重放攻擊(replay attack)。 **gasPrice**:gas的價格,用於計算交易費用 **gasLimit**:執行這筆交易所花費的gas的上限 **to**:交易接收者的地址或者合約的地址 **value**:要發送的以太幣數量,以wei為單位 **v, s, r**:簽名相關的參數,通過這三個參數可以得到發送者的公鑰和地址 如果該交易是一個創建合約的交易,還可能包括以下字段: **init**:用於初始化交易的EVM(以太坊虛擬機)操作碼 **data**:傳送數據 #### 交易執行流程 1. **構建原生交易對象** : 如下![](https://i.imgur.com/A7wE51K.png) 2. **對交易簽名** : 以太坊網絡需要知道交易發起人確實擁有該賬戶,以確保其他人不會假冒執行此交易。向網絡證明這一點的方法是使用與該賬戶相對應的私鑰簽署交易,這是一個證明你是你的過程。 3. **本地驗證交易** : 交已簽名的交易提給本地以太坊節點。然後,本地節點將驗證已簽名的交易並確保它是真正由當前帳戶地址簽名的。 4. **交易廣播** : 簽名交易由發起人的校驗節點(比如geth)廣播給其他節點,一旦交易廣播到網絡,本地節點也會輸出可以用來跟踪交易狀態的交易ID。 5. **礦工節點接受交易** : 礦工們是把你的交易打包在區塊裡的人。在開始評估(gas價格是否合理)之前,礦工會維護一個交易池,一筆筆的交易被添加到交易池。 6. **礦工節點發現有效區塊並向全網廣播** : 一旦礦工選擇要打包交易,交易將被驗證並包含在待定塊中,並且工作量就證明開始了。礦工節點之一最終找到一個有效的塊,並將該塊添加到區塊鏈中。就像本地節點廣播的原始交易會由其他節點接收到一樣,礦工節點也將此有效塊廣播到其他節點中 7. **本地節點同步新區塊** : 本地節點將收到此新塊並將其同步到區塊鏈的本地副本。在接收到新塊時,本地節點執行塊中的所有交易 #### 交易確認次數 以太坊和比特幣一樣,都有最長鏈的概念,所以有區塊確認數的概念。每當一筆交易剛被寫入區塊的時候,這筆交易的區塊確認數便是1,在此區塊之後每新增一個區塊,這比交易的區塊確認數便加1。 區塊確認數越大,這筆交易便越難被篡改,eth每筆交易的區塊確認數大於等於6的時候,則表明這筆交易是不可逆的 參考資料 https://blog.csdn.net/qq_42815754/article/details/90170007 ## [ 2 ] . 挖礦原理為何?礦工如何收集待挖的交易資料?(以 POW 回答) 比特幣區塊鏈是個記錄交易的帳本,可以想像這個帳本的一頁就是一個區塊,而把每頁接在一起,就成了區塊鏈。而這個帳本因為一直有新的交易產生需要被記錄,所以不斷的更新,每十分鐘比特幣區塊鏈就會生成一個新的區塊,這個區塊記錄了過去十分鐘的交易。區塊鏈帳本則是存放於每個參與挖礦的節點中,因此我們稱之為**分佈式帳本**,而挖礦就是這記帳的工作。 礦工需將要打包的交易數據與 nonce 的隨機數組合,以**sha-256算法**碰撞哈希值,若是該計算出的結果可以符合的要求,那麼該區塊就被認為是有效的,並被加入到區塊鏈中。礦工不會無緣無故費力解題,因此記錄帳本的獎勵就是**獲得隨著區塊生成的比特幣**。 #### 礦工怎麼收集交易資料? 就是礦工在待打包池中選擇一些交易來進行打包,等待池子中的交易可以從etherscan網站中查詢,數據是完全公開、透明的。 參考資料 https://ethbook.abyteahead.com/ch3/dig.html ## [ 3 ] . Transaction Hash 如何產生? 先將交易內容進行 **SHA 加密**產生一組 hash 值,再將產生後的 hash 值進行加密一次,進而產生 Transaction Hash,每則 Transaction Hash 都有自己獨特性與不可取代性,只要交易內容有更動,其Hash 值就不同 參考資料 ## [ 4 ] . 區塊的 Nonce 與 Ethereum 交易的 Nonce 分別是什麼意思?各解決什麼問題? ### 1. **區塊中的 Nonce** : 用來挖礦,隨機猜測nonce,直到算出符合條件的hash值,其他節點可以根據nonce驗證 * nonce 是「使用過一次的數字」(英文的首字母縮寫詞)。 它指的是礦工在將其集成到區塊鏈之前為了解決該塊而必須找到的數字。 * 由於發現了這個數字,礦工在任務中消耗的時間和其他資源將獲得加密貨幣作為獎勵。 * 找到 nonce 是一個非常困難的皮重,需要一定的資源,這被認為是一種消除效率低下礦工的方法。 * 如果你想在挖礦中獲利,則需要強大的計算能力才能找到隨機數。 ### 2. **Ethereum 交易的 Nonce** : 這個值用於計算一個以太坊地址中發出的交易數量。一個以太坊地址裡的所有轉賬會按照你發起轉賬的時間,給每一筆交易排序,從 0 開始計數。地址每發送一筆交易,交易的隨機數 nonce 就會增加 1,而轉入這個地址的交易則不會改變 nonce 值。 此有三條規定: 1. 礦工需要按照 nonce 值從小到大去打包轉賬,所以在 nonce 為 0 的交易未被礦工打包前,nonce 為 1,2,3···的交易無論礦工費給的多高,都必須一直排隊等著 2. nonce 是連續的,不能跳過。當 nonce 為 1 的交易沒有發起時,nonce 不能從 0 直接跳到 2,即 nonce 為 2 的交易只能發生在 nonce 為 1 的交易後面。 3. 如果有兩筆交易 nonce 相同,其中一筆交易成功後,另外一筆交易就會顯示被替代,轉賬失敗。 所以他有以下幾個作用:**確認交易順序, 防止雙花, 撤銷pending中的交易,確定生成的合約地址** ## [ 5 ] . 加密錢包的地址、公鑰、私鑰關係為何?錢包如何透過公私鑰進行加解密? **私鑰:** 私鑰是一段由電腦隨機產生的65位元亂數,包含了大約五十個數字和大小寫字母, 沒有固定的邏輯和規則。私鑰與公鑰是成對產生的,世界上只會有一組,不會重複,在加密貨幣的世界裡,公鑰會散布在網路上,但私鑰只能本人持有,因此私鑰就代表資產的所有權,誰擁有私鑰誰就擁有該錢包地址中的使用權。 **公鑰:** 比特幣的公鑰是透過稱為「橢圓曲線加密」的演算法,對「私鑰」進行加密後所產生的一組亂數。「橢圓曲線密碼學」的算法為不可逆,也就是說,即使公鑰暴露,也不會影響私鑰的安全性,因為沒辦法藉由公鑰推算出私鑰。 **錢包地址:** 是根據「公鑰」經過兩次雜湊函數(SHA256)轉換為「公鑰哈希」,這個過程同樣是不可逆的,之後再將「公鑰哈希」經過編碼推算得到地址。地址的功能是接收比特幣,某個地址收到比特幣後,只有擁有該地址對應私鑰的人才能使用它 **關係圖:** ![](https://i.imgur.com/YOVBmFE.png) #### 錢包如何透過公私鑰進行加解密 只要把文件內容及私鑰一起送入 SHA256 函數,就能產生一組 256 位元(256 個 0 和 1)的數字,而這串數字就是所謂的數位簽章。這串數字將會和訊息內容一起被廣播到其他的節點,當其他人收到這組數字時,就能用公鑰驗證這個簽章的正確性。對於數位簽章,則是能透過公鑰與驗證函數來確認這串數字是否為本人所發送的。如果校驗正確,那麼這筆交易就成功地從「轉出錢包」轉移transfer到「轉入錢包」了 ## [ 6 ] . 擴容想要解決什麼問題?ETH 2.0 轉成 POS,與 POW 有哪些差異?效果為何? 以太坊會從PoW機制轉為PoS機制,有幾個原因: 1. **POS 是一個更分散、更安全的網路**: 挖礦的成本很高,很少有參與者能獨立驗證,大多數人都會參與礦池,由礦池提取出大部分區塊,這會導致高度集中的少數人控制著網路。在 POS 機制底下,以太坊將需要至少16384個驗證者,更能實現去中心化,網路安全性更佳。POS 不像 POW 那樣,需要購買專屬的礦機來運行,耗費大量的能源。相反,POS 使用一般的電腦便就能運行節點,自行擔任著交易確認和傳播的角色,資訊能夠減少能源的消耗,有效避免算力資源的浪費。 2. **透過分片實現可拓展性**:意思是將大的數據庫切分成很多小的、可處理的部分,以利提高性能並縮短處理時間,分片的實際作法是分解區塊鏈網路裡的所有待處理任務,將全網的節點進行分組,而原先單一節點處理全網的所有任務,就變成了多組節點同時並行處理,可大幅分擔以太坊的負載,減少網路擁堵、大幅增加交易輸送量 3. **POS 的效率更高,比POW好能更少**:在PoS機制下,不需要在工作證明的計算上使用大量的能源,因此估計以太坊轉向PoS將導致用於保護網路的能源減少99.95%。