EOS原始碼分析(3)案例分析
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
相關文章
- EOS原始碼分析(2)EOS執行原始碼
- EOS原始碼分析(6)Token原始碼
- EOS原始碼分析(1)安裝原始碼
- EOS原始碼分析(4)錢包原始碼
- EOS原始碼分析(5)賬號原始碼
- EOS原始碼分析(7)目錄結構原始碼
- 集合原始碼分析[3]-ArrayList 原始碼分析原始碼
- 深度 Mybatis 3 原始碼分析(一)SqlSessionFactoryBuilder原始碼分析MyBatis原始碼SQLSessionUI
- Retrofit原始碼分析三 原始碼分析原始碼
- Thinkphp3原始碼分析(2)PHP原始碼
- 【JDK】JDK原始碼分析-AbstractQueuedSynchronizer(3)JDK原始碼
- AFL二三事 -- 原始碼分析 3原始碼
- Fabric 1.0原始碼分析(3)Chaincode(鏈碼)原始碼AI
- 集合原始碼分析[2]-AbstractList 原始碼分析原始碼
- Guava 原始碼分析之 EventBus 原始碼分析Guava原始碼
- 【JDK原始碼分析系列】ArrayBlockingQueue原始碼分析JDK原始碼BloC
- 集合原始碼分析[1]-Collection 原始碼分析原始碼
- Android 原始碼分析之 AsyncTask 原始碼分析Android原始碼
- kube-scheduler原始碼分析(3)-搶佔排程分析原始碼
- Vue3原始碼分析之compositionApiVue原始碼API
- 以太坊原始碼分析(36)ethdb原始碼分析原始碼
- 以太坊原始碼分析(38)event原始碼分析原始碼
- 以太坊原始碼分析(41)hashimoto原始碼分析原始碼
- 以太坊原始碼分析(43)node原始碼分析原始碼
- 以太坊原始碼分析(51)rpc原始碼分析原始碼RPC
- 以太坊原始碼分析(52)trie原始碼分析原始碼
- redis個人原始碼分析筆記3---redis的事件驅動原始碼分析Redis原始碼筆記事件
- Tomcat詳解系列(3) - 原始碼分析準備和分析入口Tomcat原始碼
- k8s client-go原始碼分析 informer原始碼分析(6)-Indexer原始碼分析K8SclientGo原始碼ORMIndex
- k8s client-go原始碼分析 informer原始碼分析(4)-DeltaFIFO原始碼分析K8SclientGo原始碼ORM
- EventEmitter3原始碼分析與學習MIT原始碼
- Giraph原始碼分析(六)——Edge 分析原始碼
- Netty原始碼分析-- FastThreadLocal分析(十)Netty原始碼ASTthread
- 以太坊原始碼分析(35)eth-fetcher原始碼分析原始碼
- 以太坊原始碼分析(20)core-bloombits原始碼分析原始碼OOM
- 以太坊原始碼分析(24)core-state原始碼分析原始碼
- 以太坊原始碼分析(29)core-vm原始碼分析原始碼
- 以太坊原始碼分析(34)eth-downloader原始碼分析原始碼