您好,登錄后才能下訂單哦!
這篇文章主要講解了“Solidity背景資料分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Solidity背景資料分析”吧!
本質上,以太坊是一個去中心化的虛擬機,在運行的過程中,可以按照一定順序執行合約。合約由一組供用戶調用的函數構成,比如說,一個標準的 ERC 20 合約應當實現以下六個函數。
當一個用戶想將自己的 ERC 20 token 轉給其他地址的時候,可以發起一筆交易來調用 transfer
函數,讓以太坊執行合約中 transfer
函數對應的代碼,從而完成轉賬。
在以太坊中,用戶可以通過發起交易實現 3 個功能:
創建新的智能合約
執行合約中的函數
轉賬 ether
交易由礦工打包進區塊,所有區塊構成了一個鏈。這樣所有的交易就有了一個執行的順序,基于這個順序,也可以定出每個時刻的合約狀態和交易余額。
在以太坊中,合約以字節碼的形式發布到區塊鏈上,并在 EVM (Ethereum Virutal Machine) 中執行。在用戶開發的時候,不需要直接編寫字節碼。以太坊社區提供了一套叫做 Solidity 的語言。一個由 Solidity 開發合約的代碼如下圖所示。
在合約的前兩行,定義了一個變量和一個字典映射。在每次合約被執行的時候,這兩個變量都可能被修改。當下一次合約被執行的時候,如果讀取了這兩個變量,得到的將是修改后的內容。
合約的第一個函數 AWallet
與合約名相同,是這個合約的構造函數。當這個合約在區塊鏈上被創造的時候,構造函數被執行,一般用于初始化合約中的一些變量。
在 Solidity 代碼中,可以通過 msg.sender
和 msg.value
兩個變量獲取:1. 觸發本次合約執行的交易是誰發的,2. 觸發本次合約執行的交易向合約里轉入了多少 ether。基于這兩個變量,可以實現合約操作的權限管理,也可以實現將一些數字資產由用戶私鑰控制轉為合約執行控制。
Solidity 允許異常的存在,例如函數 pay
的第一行,如果調用這個函數的地址與創建合約的地址不一致,則意味著調用合約的人沒有動用合約里資產的權限,那么就通過 throw
觸發了一個異常。當異常被觸發時,沒有任何捕獲(catch)的方式,直接停止合約的執行,回滾狀態,并扣除全部的交易費用。
對于類型為 address
的變量 r
, r.send(amount)
表示由合約向地址 v
發送數額為 amount
的 wei. (10^18 wei = 1 ether )
最后一個沒有函數名的函數 function () 稱為回退(fallback)函數,是智能合約中一個特殊的函數。因為 EVM 的字節碼中并沒有對函數的支持,所以,Solidity 在將代碼編譯成字節碼后,字節碼的第一部分便是函數匹配。用戶通過指定要調用函數的函數名和參數類型的哈希值的前四個字節來告訴 EVM 執行哪個函數。例如 byte4(sha3("pay(uint,address)"))
,這四個字節被稱為函數簽名。如果用戶調用時使用的函數簽名匹配到了一個函數,則執行這個函數。如果沒有匹配到任何函數,回退函數將作為 default 選項被執行。
在以太坊中,每次合約函數的調用需要被所有的礦工執行。交易中的交易費可以激勵礦工們做這件事情,同時保護以太坊合約執行上免受 DoS 攻擊(攻擊者提交大量計算機很大的合約)。
執行交易費由燃料用量(gas used)和燃料費(gas price)決定。燃料用量由合約執行過程中執行了的操作計算,EVM 虛擬機的每一個字節碼指令都標注了燃料用量。燃料費是用戶的出價,更高的燃料費意味著交易可以更早被加入區塊。燃料用量乘燃料費就是合約執行的交易費。
同時,每筆交易要指定燃料用量上限(gas limit)。燃料用量上限乘以燃料費是預付款。交易發起時要保證賬戶余額中有足夠的錢支付預付款。當燃料用到上限時,如果還沒有執行結束,將判斷為執行失敗,回滾所有操作,并沒收預付款。如果合約執行成功,預付款中未使用的部分會被退回。
感謝各位的閱讀,以上就是“Solidity背景資料分析”的內容了,經過本文的學習后,相信大家對Solidity背景資料分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。