# 示例三：數字貨幣發行與管理

## 簡介

該智能合約實現一個簡單的商業應用案例，即數字貨幣的發行與轉賬。在這之中一共分為三種角色：中央銀行，商業銀行，企業。其中中央銀行可以發行一定數量的貨幣，企業之間可以進行相互的轉賬。主要實現如下的功能：

* 初始化中央銀行及其發行的貨幣數量
* 新增商業銀行，同時央行並向其發行一定數量的貨幣
* 新增企業
* 商業銀行向企業轉給一定數量的數字貨幣
* 企業之間進行相互的轉賬
* 查詢企業、銀行、交易信息

## 主要函數

* `init`：初始化中央銀行，併發行一定數量的貨幣；
* `invoke`：調用合約內部的函數；
* `query`：查詢相關的信息；
* `createBank`：新增商業銀行，同時央行向其發行一定數量的貨幣；
* `createCompany`：新增企業；
* `issueCoin`：央行再次發行一定數量的貨幣（歸於交易）；
* `issueCoinToBank`：央行向商業銀行轉一定數量的數字貨幣（歸於交易）；
* `issueCoinToCp`：商業銀行向企業轉一定數量的數字貨幣（歸於交易行為）；
* `transfer`：企業之間進行相互轉賬（歸於交易行為）；
* `getCompanys`：獲取所有的公司信息，如果企業個數大於10，先訪問前10個；
* `getBanks`：獲取所有的商業銀行信息，如果商業銀行個數大於10，先訪問前 10 個
* `getTransactions`：獲取所有的交易記錄 如果交易個數大於10，先訪問前 10 個；
* `getCompanyById`：獲取某家公司信息；
* `getBankById`：獲取某家銀行信息；
* `getTransactionBy`：獲取某筆交易記錄；
* `writeCenterBank`：修改央行信息；
* `writeBank`：修改商業銀行信息；
* `writeCompany`：修改企業信息；
* `writeTransaction`：寫入交易信息。

## 數據結構設計

* centerBank 中央銀行
  * Name：名稱
  * TotalNumber：發行貨幣總數額
  * RestNumber：賬戶餘額
  * ID：ID固定為 0
* bank  商業銀行
  * Name：名稱
  * TotalNumber：收到貨幣總數額
  * RestNumber：賬戶餘額
  * ID：銀行 ID
* company 企業
  * Name：名稱
  * Number：賬戶餘額
  * ID：企業 ID
* transaction 交易內容
  * FromType：發送方角色 //centerBank:0,Bank:1,Company:2
  * FromID：發送方 ID
  * ToType：接收方角色 //Bank:1,Company:2
  * ToID：接收方 ID
  * Time：交易時間
  * Number：交易數額
  * ID：交易 ID

## 接口設計

### `init`

request 參數:

```
args[0] 銀行名稱
args[1] 初始化發佈金額
```

response 參數:

```javascript
{"Name":"XXX","TotalNumber":"0","RestNumber":"0","ID":"XX"}
```

### `createBank`

request 參數:

```
args[0] 銀行名稱
```

response 參數:

```javascript
{"Name":"XXX","TotalNumber":"0","RestNumber":"0","ID":"XX"}
```

### `createCompany`

request 參數:

```
args[0] 公司名稱
```

response 參數:

```javascript
{"Name":"XXX","Number":"0","ID":"XX"}
```

### `issueCoin`

request 參數:

```
args[0] 再次發行貨幣數額
```

response 參數:

```javascript
{"FromType":"0","FromID":"0","ToType":"0","ToID":"0","Time":"XX","Number":"XX","ID":"XX"}
```

### `issueCoinToBank`

request 參數:

```
args[0] 商業銀行ID
args[1] 轉賬數額
```

response 參數:

```javascript
{"FromType":"0","FromID":"0","ToType":"1","ToID":"XX","Time":"XX","Number":"XX","ID":"XX"}
```

### `issueCoinToCp`

request 參數:

```
args[0] 商業銀行ID
args[1] 企業ID
args[2] 轉賬數額
```

response 參數:

```javascript
{"FromType":"1","FromID":"XX","ToType":"2","ToID":"XX","Time":"XX","Number":"XX","ID":"XX"}
```

### `transfer`

request 參數:

```
args[0] 轉賬用戶ID
args[1] 被轉賬用戶ID
args[2] 轉賬餘額
```

response 參數:

```javascript
{"FromType":"2","FromID":"XX","ToType":"2","ToID":"XX","Time":"XX","Number":"XX","ID":"XX"}
```

### `getBanks`

response 參數

```javascript
[{"Name":"XXX","Number":"XX","ID":"XX"},{"Name":"XXX","Number":"XX","ID":"XX"},...]
```

### `getCompanys`

response 參數

```javascript
[{"Name":"XXX","TotalNumber":"XX","RestNumber":"XX","ID":"XX"},{"Name":"XXX","TotalNumber":"XX","RestNumber":"XX","ID":"XX"},...]
```

### `getTransactions`

response 參數

```javascript
[{"FromType":"XX","FromID":"XX","ToType":"XX","ToID":"XX","Time":"XX","Number":"XX","ID":"XX"},{"FromType":"XX","FromID":"XX","ToType":"XX","ToID":"XX","Time":"XX","Number":"XX","ID":"XX"},...]
```

### `getCenterBank`

response 參數

```javascript
[{"Name":"XX","TotalNumber":"XX","RestNumber":"XX","ID":"XX"}]
```

### `getBankById`

request 參數

```
args[0] 商業銀行ID
```

response 參數

```javascript
[{"Name":"XX","TotalNumber":"XX","RestNumber":"XX","ID":"XX"}]
```

### `getCompanyById`

request 參數

```
args[0] 企業ID
```

response 參數

```javascript
[{"Name":"XXX","Number":"XX","ID":"XX"}]
```

### `getTransactionById`

request 參數

```
args[0] 交易ID
```

response 參數

```javascript
{"FromType":"XX","FromID":"XX","ToType":"XX","ToID":"XX","Time":"XX","Number":"XX","ID":"XX"}
```

### `writeCenterBank`

request 參數

```
CenterBank
```

response 參數

```
err  nil 為成功
```

### `writeBank`

request 參數

```
Bank
```

response 參數

```
err  nil 為成功
```

### `writeCompany`

request 參數

```
Company
```

response 參數

```
err  nil 為成功
```

### `writeTransaction`

request 參數

```
Transaction
```

response 參數

\`\`\` err nil 為成功 ···

### 其它

查詢時為了兼顧讀速率，將一些信息備份存放在非區塊鏈數據庫上也是一個較好的選擇。
