以太坊的賬戶和交易
5、賬戶
以太坊中有兩種賬戶
1、外部擁有賬戶(EOA),一般指自然人擁有的賬戶。
2、合約賬戶(CA),為智慧合約分配的賬戶。
看一下賬戶的原始碼定義:
- EOA特徵
codeHash為空
storageRoot為空
通過私鑰控制
發起交易(轉移以太幣或觸發合約程式碼) - CA特徵
不能發起交易,可以被觸發執行合約程式碼(通過EOA發起的交易或者從其他CA接收的訊息呼叫啟用)
怎麼判斷一個賬戶是空賬戶?
EMPTY(σ,a)≡ σ[a]c =KEC(()) ∧ σ[a]n =0 ∧ σ[a]b =0
從公式看,一個賬戶的Root為空且nonce為0且餘額為0,則說明這是一個空賬戶。
6、交易
再回顧一個公式
σ′ =Υ(σ,T)
以太坊是一個基於交易的狀態機。
任意兩個賬戶之間的交易都會引起world state的改變。
兩個相鄰區塊之間的狀態差別很小,patricia trie這種資料結構能高效的處理整個系統賬戶變化的部分。
交易基本定義:【從外部擁有賬戶】傳送的加密簽名序列化指令。換句話說交易必須是從EOA發起的才能叫交易,CA之間的通訊叫訊息也有叫內部交易的,現在是有區別,以後這個區別會不會模糊化不知道。
交易型別有兩種:
1、訊息呼叫(Td)
2、合約建立(Ti)
從EOA到EOA的交易僅是轉賬。
EOA到CA可以啟用各種操作。
看交易的原始碼定義:
Tn必須等於發起交易的賬戶的nonce(翻閱前面說法可知,賬戶nonce是該賬戶發起的第幾筆交易的序號,如果是建立合約則代表第幾次建立合約的序號)
Tp是這筆交易消耗的gas單價
Tg是你願意為這筆交易最多可以支付的上限
Tt是接收賬戶的地址,如果為空說明接受賬戶是一個CA,否則是EOA
Tv是到接收者的額度
Td或Ti,如果交易型別是訊息呼叫則Palload寫為Td,表示輸入資料,例如訊息的引數,假設有一個註冊域名的合約服務,則Td就是該服務需要的引數如IP等。如果交易型別是建立合約,則Payload寫為Ti,表示一段程式碼,這段程式碼用於建立合約賬戶,這段初始化程式碼只會被執行一次就丟棄掉,第二次執行的是建立完的合約程式碼體。
交易的公式:
可以看到當接收賬戶不同時,區別僅僅是Td和Ti的區別。
另外,一個區塊裡交易的順序由裝配這個區塊的礦工決定。
7、費用
以太坊網路裡任何計算都要支付gas(燃料),
思考為什麼不直接用eth做費用?
答案是用兩個概念gas和eth區別價值和價格,gas是一種固定衡量的價值,而eth是市場上快速變化的價格,很多EVM(以太坊虛擬機器)的操作指令都需要消耗固定的費用就用gas來計價,gas的最小單位是wei,1eth = 1018wei = 109gwei。所以eth和gas之間是有匯率的。
GasPrice:燃料單價
GasLimit:願意支付的燃料上限
GasLimit × GasPrice = 願意支付的最大費用
10000 × 100gwei = 1015wei = 0.001eth
這圖要說明的是:
一筆交易中,你設定的最大費用如果沒有消耗完,多出的會返回給你。如果最大費用不夠計算的花費,那麼交易會終止、已改變的狀態會回滾、但是錢被消耗不會退回了。這些已消耗的費用都獎勵給礦工了。
計算都是有費用的,初次之外還有一些東西需要繳費:
費用的三種不同構成:
1)計算操作的固定費用
2)交易(合約建立或訊息呼叫)費用
3)儲存(記憶體、儲存賬戶合約資料)費用
著重說一下儲存費用:
儲存收費是因為假如你的合約使得狀態資料庫儲存增大,所有節點都會增加儲存。
以太幣是鼓勵儘量保持少量儲存的。
但是如果有操作是清除一個儲存條目,這個操作的費用不但會被免除,而且由於釋放空間還會獲得退款。
總結
以上就是以太坊裡的一些基礎元素,沒有講到複雜的交易執行、EVM等,後續再寫。
https://segmentfault.com/a/1190000013706670