區塊鏈swap合約跟單系統開發技術方案丨合約跟單/帶單技術系統開發方案

a1271916008發表於2023-04-25

交易

交易可以包含二進位制數 據負載(Payload)和以太幣(Ether)。
如果目標賬戶包含程式碼,該程式碼會執行, Payload 就是輸入資料。
如果目標賬戶是零賬戶(賬戶地址是 0),交易將建立一個新合約,新合約地址將由建立者的地址和該地址發出過的交易數量 (Nonce)計算得到。 這筆交易(建立合約交易)的 Payload 被當作 EVM 宇節碼執行,輸出作為合約程式碼被儲存。這意味著為了建立一個合約,不需要向合約傳送真正的合約程式碼, 而是傳送能夠返回真正程式碼的程式碼。
一個合約也可以透過一個特殊的指令來建立其他合約(不是簡單地向零地 址發起呼叫 )。建立合約的呼叫跟普通的訊息呼叫的區別在於, Payload 資料執 行的結果被儲存為合約程式碼,呼叫者(建立者)在枝上可以得到新合約的地址。

訊息呼叫

合約可以透過訊息呼叫的方式來呼叫其他合約 , 或者傳送以太幣到非合約賬戶。訊息呼叫和交易非常類似,它們都有一個源、 一個目標、資料負載、以太幣、 gas (費用)和返回資料。 事實上每筆交易都可以被認為是一個頂層的消 息呼叫,這個訊息呼叫會依次產生更多的訊息呼叫。
一個合約可以決定剩餘 gas 的分配。 比如在內部訊息呼叫時使用多少 gas, 或者期望保留多少 gas。 如果在內部訊息呼叫時發生了費用不足(out-of-gas) 異常(或者其他異常),合約將會得到通知(異常會“冒泡”到合約的呼叫核)。
當合約呼叫時,被呼叫的合約會擁有嶄新的記憶體, 以及能夠訪 問呼叫的 Payload (由被稱為“calldata" 的獨立區域所提供的資料)。 當呼叫執行結束後, 返回資料將被儲存在呼叫者預先分配好的一塊記憶體中 。
呼叫層數被限制為 1024, 因此對於更加複雜的操作,我們應該使用迴圈而 不是遞迴。

費用( gas)

gas 的目的是限制執行交易所需的工作量,同時為執行支付費用 。 當 EVM 執行交易時, gas 將按照特定規則(這個規則在以太坊黃皮書中有詳細說明〉被逐漸消耗。

思考費用的作用

施加費用可以防止使用者超負荷使用網路。 以太坊是一個圖靈完備的系統, 它允許有迴圈,並使以太坊受到停機問題的影響,這個問題讓你無法確定程式 是否無限制地執行。如果沒有費用的話, 惡意的執行者透過執行一個包含無限 迴圈的交易就可以很容易地讓網路癱瘓。 因此,費用保護網路不受蓄意攻擊。
gas price (gas 價格,以太幣計)是由交易建立者設定的, 傳送者賬戶需要 預付的交易費用(可以理解為給礦工的預算) =gas price × gas limit。 如果交易完成還有剩餘 gas,這些 gas 將被返還給傳送者賬戶 。
無論執行到什麼位置,一旦 gas 被耗盡(比如降為負值),就會觸發一個費用不足異常,當前呼叫幀所做的所有狀態修改都將被還原。 前面介紹過交易(事務〉是一個原子操作,要麼所有操作全部成功,要麼操作失敗所有的執行都將被還原,不能出現中間狀態。
另外, gas 不僅僅是用來支付計算的費用,也是用來支付儲存的費用 。

以太坊網路

主網(Mainnet)

以太坊網路實時資料如區塊、散表難度、 gas 價格和 gas 花費等,可以在   上查詢到。部署在主網上的智慧合約,任何應用都可以 呼叫,相關交易資訊可以在   上查詢到。

測試網路(Testnet)

在主網上任何合約的執行都會消耗真實的以太幣,不適合進行開發、除錯和測試。因此以太坊專門提供了測試網路,在測試網路中可以很容易獲得免費的以太幣 。測試網路同樣是一個全球網路。 目前以太坊公開的測試網路有:
Ropsten、Rinkeby、Kovan
目前開發人員最常用的測試網路是 Ropsten 和Rinkeby, 使用測試網路依然有一個缺點,即需要花較長時間初始化節點。 在實際使用中,測試網路更適合擔當如灰度釋出之類的角色。

私有網路、開發者模式

我們可以自己建立私有鏈進行開發,透過上面提到的 Geth 就可以很容易建立一個屬於自己的測試網路,在自己的測試網路中,想挖多少以太幣就挖多少,也省去了同步網路的耗時。 或者直接使用 Geth 提供的開發者模式。相比私有鏈,在開發者網路(模式)下,會自動分配一個有大量餘額的開發者賬戶給我們使用 。

模擬環境網路

還有一種建立測試網路的方法是使用 Ganache。 Ganache 在本地使用記憶體模 擬的一個以太坊環境,對於開發除錯來說更方便、快捷。而且 Ganache 可以在 啟動時幫我們建立 10 個存有資金的測試賬戶 。 在進行合約開發時,可 以在 Ganache 中測試透過後 , 再部署到 Geth 節點中。

儲存、記憶體和能

每個賬戶都有一塊持久化儲存區域,被稱為儲存(storage)。key 和 value 的長度均為 256 位。在合約中不能遍歷賬戶的儲存。儲存的讀寫操作開銷較大,修改操作開銷更大。一個合約只能對它自己的儲存 進行讀寫。

開銷指的是消耗gas 的量。

第一個儲存區被稱為 記憶體( memory)。可以以宇節為粒度定址。第二個儲存區被稱為 (stack) ,

委託呼叫和庫

存在一種特殊型別的訊息呼叫,被稱為 委託呼叫( delegatecall)。 它跟上面講到的訊息呼叫幾乎完全一樣,不同的是它將目標地址的程式碼載入到發起呼叫的合約上下文中來執行,並且  msg.sender 和  msg.value 不變。 例如: A 呼叫 B, B 委託呼叫 C,此時 msg.sender 為 A。 而如果是普通呼叫,則 msg.sender 為 B。
這意味著一個合約在執行時可以從另外一個地址動態載入程式碼。 儲存當前 地址和餘額都指向發起呼叫的合約,只有程式碼是從被呼叫地址獲取的。這使得 Solidity 可以實現庫能力。

日誌

以太坊允許日誌跟蹤各種交易和資訊,日誌是用一種特殊的可索引的資料結構來儲存的。 Solidity 用日誌特性來實現事件。建立合約之後就無法訪問日誌資料了,但是可以從區塊鏈外高效地訪問這些日誌資料。
由於部分日誌資料被儲存在布隆過濾器中,因此可以高效並安全地搜尋日誌。所以那些沒有下載整個區塊鏈的網路節點(輕客戶端)也可以找到這些日誌。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69983064/viewspace-2948671/,如需轉載,請註明出處,否則將追究法律責任。

相關文章