1. 基礎(chǔ)知識(shí)
1.1 以太坊要素
以太坊作為一個(gè)區(qū)塊鏈項(xiàng)目,有區(qū)塊鏈的三個(gè)基本要素,也有特殊的兩個(gè)要素。
基本要素:
- 一條區(qū)塊鏈,完整記錄著所有交易。
- 由數(shù)個(gè)節(jié)點(diǎn)組成的網(wǎng)絡(luò)。
- 一個(gè)大家公認(rèn)的共識(shí)算法。
特殊要素:
- 每個(gè)節(jié)點(diǎn)都具備智能合約的環(huán)境
- 隨每次交易不斷變化的世界狀態(tài),世界狀態(tài)指每個(gè)人賬戶的集合
1.2 以太幣記錄在哪
以太幣儲(chǔ)存在世界紀(jì)錄中。世界紀(jì)錄指的是每個(gè)人賬戶的集合,它是一份伴隨交易而不斷變化的數(shù)據(jù),記載了所有以太坊賬戶的信息。
在每個(gè)以太坊節(jié)點(diǎn)都有一份相同的數(shù)據(jù)。
1.3 區(qū)塊是什么
區(qū)塊是有多個(gè)合法簽名的交易的有序集合;
區(qū)塊的組成:
- 前一區(qū)塊的哈希值
- 當(dāng)前區(qū)塊的哈希值
- 一個(gè)計(jì)算工作量的參數(shù)
- 一個(gè)時(shí)間戳
- 該區(qū)塊包含的交易列表的哈希值。
1.4 區(qū)塊鏈?zhǔn)鞘裁?/h3>
區(qū)塊鏈?zhǔn)怯袇^(qū)塊串聯(lián)成的,一個(gè)區(qū)塊內(nèi)包含著數(shù)筆交易。
區(qū)塊鏈的第一個(gè)區(qū)塊,被稱為創(chuàng)世區(qū)塊。
區(qū)塊時(shí)由多個(gè)合法簽名的交易的有序集合,由共識(shí)算法挑選出來的合法區(qū)塊逐一疊加起來的區(qū)塊鏈就是一個(gè)巨大的賬本,最早的創(chuàng)世區(qū)塊交易記錄被壓在了最下方。
所以要推翻在下方的某一區(qū)塊記錄,就要重新計(jì)算該區(qū)塊后的所有區(qū)塊。導(dǎo)致了攻擊者攻擊成本的增加。
1.5 區(qū)塊鏈網(wǎng)絡(luò)
區(qū)塊鏈網(wǎng)絡(luò)是由全世界的計(jì)算機(jī)組成網(wǎng)絡(luò)并協(xié)同運(yùn)行對(duì)外提供服務(wù),每個(gè)計(jì)算機(jī)節(jié)點(diǎn)都處于平等地位。沒有中央服務(wù)器提供集中化的服務(wù)。
網(wǎng)絡(luò)中的節(jié)點(diǎn)分化:
- 交易發(fā)送和校驗(yàn)節(jié)點(diǎn):不保留完整區(qū)塊鏈數(shù)據(jù),例如手機(jī)錢包。
- 同步和校驗(yàn)節(jié)點(diǎn):常年在線,參與日常區(qū)塊的同步與校驗(yàn)工作。例如運(yùn)行在服務(wù)器上的節(jié)點(diǎn)。
- 礦工節(jié)點(diǎn):運(yùn)行在高性能專用硬件上進(jìn)行挖礦(出塊記賬)。
雖然節(jié)點(diǎn)側(cè)重不同,但在共識(shí)算法和通信協(xié)議層面都遵循統(tǒng)一的標(biāo)準(zhǔn),可以視為邏輯上平等的計(jì)算機(jī)節(jié)點(diǎn)。
節(jié)點(diǎn)信息同步
以太坊間節(jié)點(diǎn)信息傳遞是將大塊數(shù)據(jù)分割成小塊,用點(diǎn)對(duì)點(diǎn)(P2P)傳輸、擴(kuò)散的。
在整個(gè)自治網(wǎng)絡(luò)中,沒有中央服務(wù)器,節(jié)點(diǎn)可以 隨時(shí)* 選擇自愿加入或者離開節(jié)點(diǎn)網(wǎng)絡(luò)。
2. 賬戶
2.1 賬戶的分類
以太坊賬戶分成兩類:
- 外部賬戶:外部賬戶由一把私鑰和對(duì)應(yīng)的公開地址組成,私鑰在用戶自己手上。既可發(fā)送/接受以太幣,也可以發(fā)起部署智能合約的行為
- 智能合約:沒有私鑰,它的行為由合約自身的代碼邏輯來控制。
2.2 賬戶的數(shù)據(jù)結(jié)構(gòu)
每一個(gè)賬戶在數(shù)據(jù)結(jié)構(gòu)上具有兩個(gè)元素:一個(gè)公開地址,一個(gè)與該地址關(guān)聯(lián)的狀態(tài),如下圖所示。
2.2.1 狀態(tài)
一個(gè)賬戶在初次接收或者發(fā)出交易后,都會(huì)形成初始狀態(tài),每次對(duì)該賬戶的修改都會(huì)不斷修改該狀態(tài)。以太坊公鏈時(shí)刻維護(hù)著每一個(gè)賬戶的狀態(tài)。
2.2.1.1 狀態(tài)的四個(gè)要素
- nonce:已執(zhí)行交易總數(shù),用來標(biāo)識(shí)該賬戶發(fā)出的交易數(shù)量。
- balance:持幣數(shù)量,記錄用戶的以太余額。
- storage hash:存儲(chǔ)區(qū)的哈希值,指向智能合約賬戶的存儲(chǔ)數(shù)據(jù)區(qū)。
- code hash:代碼區(qū)的哈希值,指向智能合約賬戶存儲(chǔ)的智能合約代碼。
外部賬戶有nonce
、balance
。
合約賬戶有nonce
、balance
、storage hash
、code hash
、存儲(chǔ)數(shù)據(jù)區(qū)
以及代碼區(qū)
。
如下圖,圖來源于鏈接: link
已執(zhí)行總數(shù)
該值會(huì)隨著交易不斷增加。保障用戶發(fā)出的交易是按照順序被收納入最終的區(qū)塊鏈。
已執(zhí)行總數(shù)和用戶賬戶地址可以聯(lián)合計(jì)算合約地址,合約地址可以在用戶創(chuàng)建智能合約時(shí)使用。
持幣數(shù)量
持幣數(shù)量包含該賬戶可花費(fèi)的以太幣數(shù)量。外部賬戶和智能合約都可以持有。
存儲(chǔ)區(qū)的哈希值
智能合約獨(dú)有屬性。外部賬戶不包含該值。
存儲(chǔ)區(qū)存儲(chǔ)了智能合約在運(yùn)行中產(chǎn)生的數(shù)據(jù)。相當(dāng)于智能合約的’小硬盤’
存儲(chǔ)區(qū)的內(nèi)容通過散列函數(shù)校驗(yàn)出校驗(yàn)哈希值。該值即為存儲(chǔ)區(qū)的哈希值。
代碼區(qū)的哈希值
智能合約獨(dú)有,外部賬戶不包含該值。代碼區(qū)即為智能合約代碼本身。
在合約的生命周期內(nèi)是只讀狀態(tài)。
2.3 賬戶的生成
外部賬戶僅由私鑰與公開地址組成。公開地址由私鑰生成。
2.3.1 私鑰的生成
私鑰是一個(gè)32bytes(256bits)的隨機(jī)數(shù)。用戶需要一個(gè)可靠的的隨機(jī)源產(chǎn)生隨機(jī)數(shù)。私鑰地址空間有 2 256 2^{256} 2256。
2.3.2 公共地址的生成
- 選定的橢圓曲線算法(ECDSA-secp256k1)算法,帶入
私鑰
作為參數(shù)進(jìn)行運(yùn)算,得出的結(jié)果為公鑰
。 - 將
公鑰
放入哈希算法生成哈希值,截取哈希值末40位16進(jìn)制字符得到地址(160bits或者20bytes)。
2.4 賬戶私鑰的保存
在以太坊的世界里,采用 keystore 格式加密存儲(chǔ)是一種更加通用的方式,keystore
格式可以被多數(shù)錢包APP及客戶端所導(dǎo)入、導(dǎo)出。
2.4.1 私鑰加密保存
keystore生成過程,歷經(jīng)4個(gè)步驟:
- 通過 KDF 的算法的變種算法 Scrypt 算法,將我們選中的密碼:123456,變換為一個(gè) AES-128-CTR 對(duì)稱加密算法所能采用的加密密匙 S 。
- 使用該密匙 S 通過 AES-128-CTR 對(duì)稱加密算法加密明文的以太坊私鑰。
- 將 2 步驟生成的結(jié)果保存為密文 cyphertext 。
- 為了防止可能的篡改或數(shù)據(jù)變更,將 cyphertext 與 S 聯(lián)合起來作為輸入,使用 SHA3 哈希算法對(duì)該值進(jìn)行帶入求值,得到一個(gè)完整性校驗(yàn)簽名。
2.4.2 私鑰解密校驗(yàn)
keystore解密的過程與生成過程相反:
用戶輸入準(zhǔn)確的密碼 123456 后,通過 KDF 的 Scrypt 算法先計(jì)算出解密密匙 S’ 。
如果密碼正確,S = S’ ,否則提示用戶密碼輸入錯(cuò)誤。
最終通過 S’,經(jīng)由 AES-128-CTR 對(duì)稱加密算法反向計(jì)算出私鑰。文章來源:http://www.zghlxwxcb.cn/news/detail-802361.html
3. 學(xué)習(xí)鏈接
鏈接:link文章來源地址http://www.zghlxwxcb.cn/news/detail-802361.html
到了這里,關(guān)于以太坊--2.賬戶是什么---以太坊的指南針學(xué)習(xí)記錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!