# Smart Contract with Solidity 其他相關連結 https://gist.github.com/Ankarrr/561fb3e49bd22847780fb93f0e382f59 https://chihaolu.gitbook.io/all-in-one-solidity/ https://chihaolu.gitbook.io/kryptocamp-office-hour/season-2-2022-2-4/outline https://www.youtube.com/playlist?list=PLvQHfrvdK_Mop3DFTX8jW0AWT1bqZBXbJ 以下為AC推薦 https://github.com/OffcierCia/DeFi-Developer-Road-Map https://github.com/ethereumbook/ethereumbook https://devansh.xyz/blockchain-security/2021/09/17/genesis-0x01.html https://www.notonlyowner.com/learn/intro-security-hacking-smart-contracts-ethereum https://cmichel.io/how-to-become-a-smart-contract-auditor/ ### Reference https://ithelp.ithome.com.tw/users/20092025/ironman/1759 ## 1. 合約的概念 ### 傳統合約需要具備哪些基本條件: * 甲、乙方資訊 * 合約條款:記載著大家必須遵守的商業邏輯 * 合約效期 * 不可變動性:約合簽訂後,雙方各執一份,若未來有任何修改需求,要重新定義一份新的合約,並將舊的合約作廢。 ### 傳統合約流程自動化,需要做哪些事? * 我們需要一個平台,甲乙雙方都需要有帳號,帳號要具有可辨識性,並確保帳號的安全性,不容易被盜用,這樣大家才會認可這個合約的有效性。 * 我們需要寫一些程式邏輯,來處理合約內容的商業邏輯。 * 程式邏輯就如同,合約內容簽訂後,沒有人可以再**任意再修改**。 * 有一些公司會用支票支付,所以我們也必須要有**類似銀行的服務**,確保支票可以兌現。 ### 智能合約和一般程式的差異 #### 1. **整合金流容易** 每個智能合約發布後都內建一個合約帳戶,程式透過以太坊內建機制,很容易可以做到收款、付款等操作。 #### 2. **寫入資料需要成本** 在智能合約裡需要儲存資料,需要透過礦工將資料寫入至區塊鏈上,區塊鏈的資料是以點對點的方式,儲存在世界各地以太坊的節點,所以成本非常的昂貴,所以就定義了 Gas 機制,讓使用資源的人付費。 * gas 是程式執行的成本,付給礦工努力工作的報酬。會有一篇獨立的篇幅,做更詳細的解釋。 #### 3. **部署之後不能修改** 一般程式上線之後,還是可以持續進行多次改版,但智能合約部署之後,程式邏輯就會固定,屏除了人為操縱的因素,所以與智能合約整合開發出的應用程式,又稱為去中心化應用程式 (DApp)。 #### 4. **不需要有固定主機** 當我們需要發布程式時,普遍認知我們會將程式執行在一台永不關機的主機。但智能合約運作原理是透過以太坊網路上眾多的節點,幫我們執行程式,而不是只靠一台主機。 ## 2. 交易的概念 在區塊鏈的世界需要保存任何資料時,需要產生一筆交易 (transaction),裡面包含了當下的狀態及資訊,等一段時間後,才由礦工批次處理,寫入一個區塊中。所以區塊裡面可以記錄多筆交易紀錄。 將所有交易攤開一起看,就像是一個大型的賬本。如下圖所示,From 是指支出方和 To 則是指收款方,Value 則是指金額。 * 須補範例截圖 由於區塊鏈是以去中心化為基礎,所以每個區塊鏈中的節點,都保存相同的副本,所以又稱為分散式賬本 (Distributed ledger)。 * 分散式帳本 [https://zh.wikipedia.org/wiki/%E5%88%86%E6%95%A3%E5%BC%8F%E8%B3%AC%E6%9C%AC](https://) ### 常見交易類型 #### 1. 一般轉帳交易 一般轉帳交易是最常見的交易類型,例如從 A 帳戶轉錢至 B 帳戶 #### 2. 發佈智能合約的交易 當要發布智能合約時,會將程式進行編碼寫入至交易的 inputData 值中。 #### 3. 呼叫智能合約的函示,所產生的交易。 你甚至可以看到它所呼叫的函示 (function) 名稱 ## 3. 區塊的概念(Block) 區塊鏈顧名思義,就是由區塊 (block) 與鏈 (chain) 組成,在區塊鏈網路中有多個區塊。除了創始區塊的 Parent Hash 值是零,其他區塊的 Parent Hash 值對應到前一個區塊的 BlockHash 值,如此一來,像一條鍊子把所有區塊串在一起。 個人認為重點在各個區塊間用hash做連結與驗證(在Block information 可看到當下的hash和 parent hash) 如果某個區塊要修改資料必須要整條鍊都要改, 這樣便可確保區塊鍊不可串改的特性 有關hash補充資料可參考: [https://blockbar.io/blockchain/hash%E6%98%AF%E4%BB%80%E9%BA%BC-what-is-hash/](https://)