EOS開發中記憶體RAM如何買賣
對於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網路上正常執行。
購買RAM
在EOS平臺上的整個智慧合約開發過程中,我們可能會遇到這樣一種情況:我們分配的RAM不符合部署合同的要求。在這種情況下,我們需要額外購買的帶有EOS令牌的ram才能繼續進行合同部署。整個過程可以使用Eos-io提供的CLI工具,即keosd和cleos來完成。在我們之前的文章中,我們已經完成了設定本地開發環境以測試智慧合約的過程。如果你已經按照文章中的那些步驟進行操作,我們可以使用相同的工具與主網和測試網進行互動,並進行一些配置更改。
讓我們首先將我們的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測試網路節點快速互動。請注意,我們仍然依賴我們的本地錢包應用程式來處理我們的私鑰。 只要我們在解鎖錢包中匯入相應的私鑰即可。
提示:如果要持久儲存命令,可以將命令放在~/.bashrc
檔案中(如果你在linux上)和~/.bash_profile
(用於mac)。
有時,當你部署包含更復雜邏輯的應用程式合約時,可能會收到類似於上述螢幕截圖的錯誤訊息,暗示智慧合約帳戶沒有足夠的RAM來部署合同。在這種情況下,我們必須從eosio.ram購買更多的ram。
我們可以通過發出以下命令來快速檢查我們的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
對於帳戶當前佔用的不需要的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以進行銷售是有用的,同時仍然將與前合同相關的資料保留在持久儲存上。