以太坊账户 相关知识
生活随笔
收集整理的這篇文章主要介紹了
以太坊账户 相关知识
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
比特幣轉賬機制(UTXO)
- 比特幣是基于UTXO的結構存儲有關用戶余額的數據,系統的整個狀態就是一組UTXO集合,每個UTXO都有一個所有者和面值(相當于法幣的面值),每一筆交易都會花費若干個輸入的UTXO,并且根據規則創建若干個新的UTXO
- 每個引用的輸入必須是有效的(尚未花費的UTXO),對于一個交易,必須包含與當前輸入UTXO相匹配的所有者的簽名,并且保證輸入必須大于等于總的輸出值,比特幣系統中用戶的余額是用戶具有私鑰的UTXO的總值
以太坊的轉賬機制(Accounts)
?
- 以太坊的使用機制:存儲系統中所有用戶的列表
- 每一個賬戶都包括了一個余額(balance),和以太坊特殊定義的數據(代碼和內部存儲,這個是指智能合約)
- 以太坊的賬戶類型和銀行使用的是一致的,一筆交易的產生,需要先扣除交易發起方的賬戶余額,如果交易方賬戶余額足夠,則交易生效;然后,交易接收方的賬戶會記入這筆交易。
- 智能合約:如果接收方的賬戶存在相關代碼(智能合約),則代碼會自動運行,并且他的內部存儲也可能被改變,比如代碼還可能設定向其他賬戶發起新的交易信息,這就會造成進一步的借貸資金關系。
比特幣的UTXO的優缺點
以太坊的優缺點
- 節省空間,不將UTXO分開存儲,而是合并到特定的用戶,每個交易只需要一個輸入,一個簽名、并且產生一個輸出
- 更好的替代性,貨幣的本質都是同質化、可以替代的,UTXO設計使得貨幣分為可花費和不可花費兩類,這個很難和現實模型對
- 更加簡單:容易編碼和理解,特別是設計復雜腳本的時候,UTXO在腳本邏輯復雜時候更加令人費解
- 更容易維護持久性節點,只需要沿著特定方向掃描狀態樹,親節點可以很容易的隨時訪問賬戶相關的所有數據。而UTXO的每一個交易都會使得狀態發生改變,這個對于親節點來說長時間運行分布式APP會造成很大的壓力
對比
| ? | BitCoin | Ethereum |
| 設計定位 | 現金系統 | 去中心化應用平臺 |
| 數據組成 | 交易列表(賬本) | 交易和賬戶狀態 |
| 交易對象 | UTXO | Accounts |
| 代碼控制 | 腳本 | 智能合約 |
以太坊的賬戶類型
- 外部用戶/普通賬戶
- 合約賬戶/內部用戶
外部用戶/普通賬戶
合約賬戶/內部用戶
消息
- 合約可以向其他合約發送“消息”
- 消息是不會被序列化的虛擬對象,只存在于以太坊的執行環境(EVM)中
- 可以看作是函數的調用
- 內容:消息的發送方、消息的接收方、金額(VALUE)、數據(DATA,可選)、START GAS 最大支付的GAS
合約
?
- 可以讀/寫自己的內部存儲(32字節key-value的數據庫)
- 可以向其他合約發送消息,依次觸發執行
- 一旦合約運行結束,并且由它發送的消息觸發的所有子執行(sub-exception)結束,EVM就會中止執行,直到下次交易被喚醒
合約的應用
- 維護一個數據存儲(賬本),存放其他合約或者外部的世界有用的內容比如,發售自己的虛擬貨幣
- 通過合約賬戶實現一種具有更加復雜的訪問策略的普通賬戶(EOA),這個被稱為“轉發合同”,只有在滿足某些特定的條件的時候,才會將傳入的消息重新發送到某個所需要的目的地址:例如,一個人有一份轉發合約,該合約會等待直到給定的三個私鑰中的兩個確認之后,再重新發送特定的消息,比如錢包合約
- 管理多個用戶之間的持續合同或者關系。包括金融合同,以及某些特定的托管合同或者某種保險。遺囑,遺產分配。
交易數據結構
(交易是包含以下數據的序列化的二進制消息)
- Nonce 由發起人EOA發出的序列號,用于防止消息重播,相當于統計從一個賬戶中交易記錄的次序,防止了雙重支付。
- Gas price 交易發起人愿意支付的gas單價(wei)
- Start gas 交易發起人愿意支付方最大gas量
- To:以太坊交易的目的地址
- Value:發送到目的地的以太數量
- Data:可變長度的二進制數據負載(payload)
- v,r,s 發起人EOA的ECDSA簽名的三個組成部分
- 交易消息的結構使用遞歸長度前綴(RLP)編碼方案進行序列化,該方案專為以太坊中準確和字節完美的數據序列化而創建。
交易中的nonce
- 黃皮書的定義:一個標量值,等于從這個地址發送的交易數,或者對于關聯code的賬戶來說,就是這個賬戶創建合約的數量
- nonce不會明確存儲為區塊鏈中賬戶狀態的一個部分,相反它是通過計算發送地址已經確認的交易的數量來動態計算的
- nonce值還用于防止錯誤計算賬戶的余額。Nonce強制來自任何地址的交易按照順序處理,沒有間隔,無論節點接收他們的順序如何。
- 使用nonce是為了確保所有的節點計算的是相同的余額和正確的交易,等同于防止了“雙重支付/重放攻擊”,但是因為不像比特幣使用UTXO機制,因此以太坊只有在錯誤計算賬戶的余額時候才會發生“雙重支付/重放攻擊”。
并發和nonce
- 以太坊是一個允許(節點、客戶端,Dapps)并發的系統,但是強制單例狀態。例如,出塊的時候只有一個系統狀態
- 假如我們有多個獨立的錢包客戶端,比如MetaMask和Geth,他們都是使用同一個地址生成交易。如果我們希望同時發起交易,該如何設置交易的nonce呢?
- 方法1,用一臺服務器為各個應用分配nonce,先來先服務,(單點故障),如果先來的一個應用發生故障,那么失敗的交易會使得后續的交易阻塞
- 方法2,生成交易后不分配nonce,也不簽名,而是將其放在一個隊列中等待,另一個節點跟蹤nonce并簽名交易。同樣會出現單點故障,而且跟蹤nonce和簽名的節點是無法實現真正的并發
特殊的交易:創建(部署)合約
-
特殊的交易,具有數據負載但是沒有value,則這筆交易就是為了創建新的合約
-
合約的創建交易被發送到特殊目的的地址,即0x0.這個地址既不代表EOA也不代表合約,也不會花費以太幣或者發布交易,僅僅具有特殊的含義“創建合約”
-
還有一種目的:銷毀以太幣
向EOA或合約傳遞數據
- 當交易包含數據有效負載的時候,一般是發送到合約地址的,但是發送給EOA也是可以的
- 如果發送數據給EOA,數據負載的解釋取決于錢包
- 如果發送給數據給合約地址,EVM會解釋為函數調用,從payload里面解碼出函數的名稱和參數,調用該函數并且傳入參數
- 發送給合約的數據有效負載是32字節的十六進制序列化編碼
- 函數選擇器:函數原型的keccak256哈希的前4個字節,允許EVM明確識別將要調用的函數
- 函數參數:根據EVM定義的各種基本類型的規則進行編碼
交易的Value和data
交易的“有效負載”包含在兩個字段中:value和data。交易可以同時有value和data,僅有value、僅有data、data和value都沒有
交易的接收者(to)
gas計算
總結
以上是生活随笔為你收集整理的以太坊账户 相关知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PADS LAYOUT 设计总结——扇出
- 下一篇: 中科大 计算机网络15 DNS域名解析系