A vintage camera on its back on a black surface
Photo by Mitchell Hollander / Unsplash

Background

俗話說的好 畢圈一日 人間一年..... 開始學 Smart Contract吧, 紀錄點基本觀念資訊.

Blockchain Basics

Transactions

區塊鍊可以把它想成是一個大家都可以擁有的數據庫. 所以大家都可以讀取這個數據庫中的資料. 所以當你想改變這個數據庫裡面的資料時, 你必續獲得其他人的認可才行. 所以我們把更改數據庫的動作稱之為 Transaction. 所以一筆 Transaction 時. 要嘛整個 Transaction 的內容都被完成. 要嘛就是都沒有執行.

接著. Transaction 彼此之間是不會影響彼此的. 然後在區塊鍊上的每筆 Transaction 後面都會加上 Digital Signature 藉此來保護整個 Transaction.

Blocks

在比特幣的論文中有提到 double-spend attack 這個模式: 可以想一下如果有兩筆 transactions 存在必且都想同時把同一個帳戶歸零時會發生什麼事呢?

每筆 transaction 最終都必續被歸類在某個 block 中. 歸類到block中後, 這個block將會被傳播到其他區塊鏈上的節點. 所以整個 transaction 是會有一個時間序列在排序的. 當兩筆交易互相矛盾時. 第二筆交易將會失敗. 而且失敗的交易將不會進入 block 中.

The Ethereum Virtual Machine

Overview

The Ethereum Virtual Machine or EVM 是以太坊中智能合約的運行時環境。它不僅是sandboxed,而且實際上是完全隔離的,這意味著在EVM內部運行的代碼無法訪問網絡,文件系統或其他進程。智能合約甚至可以限制其他智能合約的使用。

Accounts

在以太坊中有兩種帳戶共享相同的地址空間(address space):由公鑰 - 私鑰對(即人)控制的外部帳戶和跟帳戶一起存儲的合同帳戶(contract accounts), 那這個合同帳戶(contract accounts)是由代碼所控制的。

外部帳戶的地址是根據公鑰確定的,而合同的地址是在創建合同時確定的(它來自創建者地址和從該地址發送的交易數量,即所謂的"隨機數")。

無論帳戶是否存儲代碼,EVM都會平等對待這兩種類型。

Transactions

Transaction(交易)是從一個帳戶發送到另一個帳戶的消息(可能是相同的或特殊的零帳戶)。它可以包括二進制數據(payload)和 ether。

如果目標帳戶包含代碼,則執行該代碼並將 payload 作為輸入數據。 如果目標帳戶是零帳戶(地址為0的帳戶),則Transaction會創建新合同。

這種合同創建Transaction的payload被認為是EVM的bytecode並被執行。此執行的輸出將永久存儲為合同代碼。這意味著,為了創建合同,您不會發送合同的實際代碼,而是實際上在執行時返回該代碼的代碼。

Gas

在創建時,每筆交易都收取一定數量的gas,其目的是限制執行交易所需的工作量並支付執行費用。 當EVM執行交易時,根據特定規則逐漸耗盡gas。

gas的價格是交易創建者設定的價值,他必須從發送賬戶預先支付 gas_price * gas。 如果在執行後留下一些 gas,它將以相同的方式退還。

如果gas在任何點用完(即它是負的),則觸發gas不足的異常,這將恢復至這筆交易發生前的狀態。

Storage, Memory and the Stack

每個帳戶都有一個持久的內存區域,稱為 Storage。 Storage 是一種 key-value的型態 (maps 256-bit words to 256-bit words)。 不可能從合同中的存儲項目, 即使是讀取也是成本蠻高的更何況去修改合同中的存儲項目。

第二個內存區域稱為 Memory, Memory是線性的,可以是一種 byte level的形式, 但讀取限制為256位寬,而寫操作可以是8位或256位寬。當訪問(讀取或寫入)先前未觸及的memory word(即,word的任何偏移)時,存儲器由字(256位)擴展。在擴張時,必須支付gas費用。隨著memory的增大,memory成本越高(it scales quadratically)。

EVM不是register機器而是stack機器,因此所有計算都在稱為stack的區域上執行。它的最大大小為1024個元素,包含256位的字。Stack運作方式先進後出, 當然可以將堆棧元素移動到 Storage 或 Memory,但是如果不首先移除Stack的頂部,就不可能只訪問Stack中更深的任意元素。

Reference