對於EOS RAM的來講什麼最重要呢?咱們常常在天天的數字貨幣和區塊鏈相關新聞中看到EOS旁邊的RAM
這個詞,可是不管如何咱們應該關注它的價格,爲何要關注它的價格,即便是那些只想深刻了解智能合約開發的人也須要這樣嗎?Eos中基本上有三種類型的資源:帶寬(Network),計算和計算積壓(CPU)和狀態存儲(RAM)。RAM本質上是爲智能合約中調用的每一個交易提供資源的gas,不像磁盤和CPU是經過token值按比例得到的資源,RAM是須要從eosio購買的。RAM的價格由Bancor
算法預先肯定。Bancor算法將動態地促進當前RAM的供應和供應的價格基礎並使其達到市場均衡。所以,全部買賣ram的交易都是與eosio.ram的單方面交易。次級市場也激勵那些沒有使用它的RAM儲備將其出售給須要它們的人。由於Eosio支持免費的用戶理念,因此運行網絡的負擔落在開發人員身上。咱們須要爲智能合約預留足夠的RAM才能在Eos網絡上正常運行。node
在EOS平臺上的整個智能合約開發過程當中,咱們可能會遇到這樣一種狀況:咱們分配的RAM不符合部署合同的要求。在這種狀況下,咱們須要額外購買的帶有EOS令牌的ram才能繼續進行合同部署。整個過程可使用Eos-io提供的CLI工具,即keosd和cleos來完成。在咱們以前的文章中,咱們已經完成了設置本地開發環境以測試智能合約的過程。若是你已經按照文章中的那些步驟進行操做,咱們可使用相同的工具與主網和測試網進行交互,並進行一些配置更改。linux
讓咱們首先將咱們的cleos應用程序指向測試網絡節點而不是本地運行的nodeosd。咱們能夠建立一個額外的別名來註冊這個配置。算法
alias cleos-test='docker exec -i keosd /opt/eosio/bin/cleos -u http://jungle.eos9cat.com:8888 --wallet-url http://localhost:8900'
在上面的命令中,咱們建立了別名cleos-test,以便與eos9cat提供的eos測試網絡節點快速交互。請注意,咱們仍然依賴咱們的本地錢包應用程序來處理咱們的私鑰。 只要咱們在解鎖錢包中導入相應的私鑰便可。docker
提示:若是要持久保存命令,能夠將命令放在~/.bashrc
文件中(若是你在linux上)和~/.bash_profile
(用於mac)。數據庫
有時,當你部署包含更復雜邏輯的應用程序合約時,可能會收到相似於上述屏幕截圖的錯誤消息,暗示智能合約賬戶沒有足夠的RAM來部署合同。在這種狀況下,咱們必須從eosio.ram購買更多的ram。bash
咱們能夠經過發出如下命令來快速檢查咱們的ram分配:網絡
cleos-test get account ${accountname}
memory
部分下的quota
屬性指示賬戶分配的內存量。數據結構
如今咱們知道咱們有權得到多少ram,咱們怎麼可能知道咱們須要多少Ram才能部署咱們的智能合約?因爲Eosio區塊鏈使用Web Assembly
執行用戶生成的應用程序和代碼,所以咱們能夠經過將*.wasm
和*.abi
文件的大小相加來粗略估計執行智能合約所需的千字節數。除了計算粗略估計以外,咱們還必須肯定購買ram所需的Eos代幣數量。工具
Eos區塊鏈平臺依靠Bancor算法經過單邊交易模型促進二級ram市場,咱們能夠經過查詢系統合約公開的ram市場表並執行一些簡單的計算來肯定Eos ram價格。區塊鏈
要得到EOS/KiB,咱們須要將quote.balance
(鏈接器餘額)除以base.balance
ram(token不足支付的部分),最後將該值乘以1024(即quote.balance/base.balance)*1024。在我想要部署的智能合約的示例中,須要大約100KiB,這將花費大約31.70 EOS token。 而後,咱們能夠經過Cleos發出如下命令來繼續實際的交易。
cleos-test system buyram -k ${payer} ${reciever} amount
k標誌將指示金額參數表示要購買的KiB金額,系統合約交易將自動從付款人的帳戶中扣除適當數量的EOS token。 若是沒有kflag,金額將默認爲花費的EOS token數量。 一樣,根據ram價格,將向帳戶中添加適當數量的ram。
若是咱們如今再次部署合約,它應該成功。
對於賬戶當前佔用的不須要的ram,能夠經過Banchor算法肯定的價格經過系統合約交換某些EOS token的資源。出售ram和在eos區塊鏈上購買ram的過程相似。
cleos-test system sellram ${account} bytes
成功的交易看起來與此相似:
因爲其靈活性,RAM能夠說是Eos區塊鏈平臺上最受歡迎的資源。RAM不只能夠用於存儲中間計算狀態,還能夠用做持久存儲。多索引數據庫是Eos中的一種數據結構,它根據範圍的定義方式提供存儲數據的靈活性。多索引數據庫將以表格格式存儲持久數據。實際上,與許多其餘流行的智能合約平臺不一樣,Eos智能合約中的交易不能返回任何值或變量,這意味着RAM捕獲的任何數據都不能經過交易返回給調用者。爲了得到對智能合約中的變量值的訪問,例如某個計算和交易的結果,數據須要經過帶有範圍的多索引數據庫表進行更新,一般以調用者的賬戶名稱或智能合約自己的賬戶名稱的形式存儲數據的關聯連接,而後能夠經過具備相應合同名稱,範圍和表名稱的gettable API
檢索數據。
例如,每一個賬戶已存儲在eosio.token合約中定義的多索引數據庫中的EOS token數,該合約由定義範圍的每一個賬戶的一小塊RAM組成。咱們可使用如下命令直接從db檢索某個賬戶擁有的token數量:
cleos-test get table eosio.token ${account} accounts
上述命令中的表名是accounts,範圍是我的賬戶名。將賬戶餘額信息與實際擁有它們的賬戶分配是合乎邏輯的。另外一方面,若是咱們但願檢索有關EOS token自己的信息,咱們將須要查看具備不一樣表的另外一個範圍,即便信息是在同一智能合約中已經編碼:
cleos-test get table eosio.token EOS stats
肯定範圍和表名稱可能很棘手,特別是對於其餘人生成的合約,一般能夠經過查看合約的abi來快速檢索表名。
範圍更難,但能夠經過查看在代碼中對多索引數據庫的引用查看參數來肯定。
第一個帶下劃線的部分顯示對stats表的引用是使用sym
參數進行的,該參數表示token的SYMBOL;所以,表的範圍是token的SYMBOL。
第e二個帶下劃線的部分描述了在交易期間減去餘額時引用賬戶表的行。這行代碼暗示表賬戶的範圍是賬戶名稱。
因爲智能合約自己與存儲在本地磁盤上的多索引數據庫之間的鏈接僅僅是一個參考連接,所以該功能與使用同一賬戶屢次部署合約時一塊兒授予,以便升級eos生態系統中的智能合約。只要定義多索引數據庫的關鍵功能在新舊智能合約中相同,就能夠在新的智能合約中對數據進行引用。
在某些狀況下,你甚至可能會發現經過部署空合約或大小明顯較小的合同來釋放RAM以進行銷售是有用的,同時仍然將與前合同相關的數據保留在持久存儲上。
安利個私貨,EOS智能合約與DApp開發入門教程:http://t.cn/RealN1W