EOS原始碼分析(3)案例分析

尹成發表於2018-05-13
EOS 專案在建構了一套去中心化的可信網路的同時,提供的最重要的功能就是智慧化合約,智慧合約能夠使用一種透明的方式來轉移和交換資金或財產,而不需要通過中間人,接下來我們就一起通過一個案例分析下如何在EOS上建立智慧合約。

## 執行EOS節點
智慧合約是在EOS節點中執行的,因此要首先把EOS節點執行起來,在這裡,我們執行一個本地節點,命令如下:

```
cd path-to-eos/build/programs/eosiod/
./eosd
```

## 建立預設錢包
- 建立錢包
由於智慧合約是與賬號相關聯的,因此在建立智慧合約前,我們首先要建立賬號,而賬號的Key需要通過錢包來建立和儲存,因此需要先建立錢包,如下:

    ```
    cd path-to-eos/build/programs/eosioc/
    ./eosioc wallet create # Outputs a password that you need to save to be able to lock/unlock the wallet
    ```
上面的命令會建立一個名稱為default 的預設錢包,在建立錢包時,你也可以指定名稱。錢包對應的密碼需要儲存,後續操作錢包狀態的時候需要使用。

- 匯入測試賬號的Private key
錢包建立好之後,還不能直接建立賬號,每個賬號的建立需要一個Creator賬號,在這裡,我們使用`genesis.json`中的 `inita`賬號作為Creator賬號。作為Creator的賬號,必須要把它的`Private key`匯入到錢包中,否則在建立其他賬號時,會提示許可權不夠,命令如下:

    ```
    ./eosioc wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
    ```


## 建立賬號
### 建立賬號所需的key
每個賬號的建立都需要`owner_key``active_key` 兩個key,我們通過以下命令建立key:

    ```
    cd path-to-eos/build/programs/eosioc/
    ./eosioc create key # owner_key
    ./eosioc create key # active_key
    ```
    
    以上命令會分別輸出兩組 `private key` 和 `public key`,如下:
    
    ```
    Private key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Public key: EOSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    ```
    **千萬儲存好以上的key,後續需要使用**。

### 建立賬號
建立賬號的所有準備都已經齊備,現在可以開始建立賬號了,賬號建立的命令如下:

    ```
    ./eosioc create account inita currency PUBLIC_KEY_1 PUBLIC_KEY_2
    ```
在以上命令中,建立的當前賬號名稱為`currency`,建立當前賬號的`Creator` 賬號指定為 `inita`, 最後的兩個`public key` 分別對應`currency`賬號的 `owner_key``active_key`。當賬號建立成功後,你將得到一個附帶 `transaction ID``JSON`反饋。

如果你之前沒有匯入過`inita`賬號的`private key`,則會出現如下錯誤提示:
/Screen Shot 2018-02-21 at 10.36.38 PM.png
    
這主要是因為以上這條命令必須要有`inita``active`許可權才能執行,如果沒有匯入私鑰,則許可權不夠,從而會給出以上錯誤提示。
    
你也可以通過查詢此賬戶的資訊來確認賬號是否建立成功:
    
```
./eosioc get account currency
```
以上命令將會返回如下結果:

```
{
"account_name": "currency",
"eos_balance": "0.0000 EOS",
"staked_balance": "0.0001 EOS",
"unstaking_balance": "0.0000 EOS",
"last_unstaking_time": "2035-10-29T06:32:22",
...
```

`currency`賬號已經建立成功,但你目前還不能使用此賬號進行智慧合約等操作,因為系統中目前只有此賬號的`public key`,而進行交易和智慧合約等操作需要用到此賬號的`active`許可權,因此,我們需要把此賬號對應的`active private key`匯入到系統中,如下:

```
./eosioc wallet import XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```
請使用你之前建立的`active private key` 替代以上命令中的 `xxx` 字串。

## 部署智慧合約
### 準備工作
在上傳以前,首先確認`currency`賬號下是沒有智慧合約的

```
./eosioc get code currency
code hash: 0000000000000000000000000000000000000000000000000000000000000000
```
### 部署智慧合約
上傳智慧合約到currency 賬號,此處的智慧合約是EOS系統自帶的測試合約

```
./eosioc set contract currency ../../contracts/currency/currency.wast ../../contracts/currency/currency.abi
```
當你得到一個帶有`transaction_id`欄位的JSON反饋後,說明智慧合約已經上傳成功。你還可以通過以下命令來驗證合約是否上傳成功。

```
./eosioc get code currency
```
以上命令應該會返回這樣的結果:

```
code hash: 9b9db1a7940503a88535517049e64467a6e8f4e9e03af15e9968ec89dd794975
```

### 發行貨幣
在使用`currency`智慧合約以前,你首先要發行貨幣,以下命令將向`currency`中發行10,000,000 的貨幣

```
./eosioc push action currency issue '{"to":"currency","quantity":"1000.0000 CUR"}' --permission currency@active
```
通過以下命令可以驗證 currency 賬號中目前確實已經有 10,000,000 的餘額了

```
./eosioc get table currency currency account
{
"rows": [{
"currency": 1381319428,
"balance": 10000000
}
],
"more": false
}
```

### 轉賬
任何賬號都可以在任何時間向任何智慧合約傳送訊息,但如果許可權不夠的話,智慧合約會拒絕訊息的執行。更加準確的來說,訊息並不一定是從某個賬號發出來的,只要這條訊息所關聯的賬號和許可權等級是滿足的,這條訊息就能被執行。以下命令展示瞭如何向`currency`賬號傳送`transfer`訊息,在這條命令中,需要從`currency`賬號轉賬到其他賬號,因此,需要`currency`賬號許可權才能完成此操作,具體命令如下:

```
./eosioc push action currency transfer '{"from":"currency","to":"inita","quantity":"20.0000 CUR","memo":"my first transfer"}' --permission currency@active
```

上面這條命令中,出現了三次`currency`, 第一次出現表示的是智慧合約`currency`,第二次出現表示的轉賬賬號`currency`,第三次出現則表示`currency`賬號的許可權; 如果我們換一個其他轉出賬號,則比較通用的命令格式應該如下:
```
./eosioc push action currency transfer '{"from":"${usera}","to":"${userb}","quantity":"20.0000 CUR","memo":""}' --permission ${usera}@active
```
以上命令是從usera 向userb轉賬,因此許可權上面需要使用usera 的許可權。此命令中`currency`只出現了一次,在這裡表示智慧合約的名稱。






網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052  備註:CSDN

尹成學院微信:備註:CSDN




網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052  備註:CSDN

尹成學院微信:備註:CSDN

相關文章