---
# System prepended metadata

title: Smart Contract with Solidity

---

# 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://)

