EOS記憶體即RAM如何買賣

2021-09-13 10:08:24 字數 3920 閱讀 1194

對於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網路上正常執行。

在eos平台上的整個智慧型合約開發過程中,我們可能會遇到這樣一種情況:我們分配的ram不符合部署合同的要求。在這種情況下,我們需要額外購買的帶有eos令牌的ram才能繼續進行合同部署。整個過程可以使用eos-io提供的cli工具,即keosd和cleos來完成。在我們之前的文章中,我們已經完成了設定本地開發環境以測試智慧型合約的過程。如果你已經按照文章中的那些步驟進行操作,我們可以使用相同的工具與主網和測試網進行互動,並進行一些配置更改。

讓我們首先將我們的cleos應用程式指向測試網路節點而不是本地執行的nodeosd。我們可以建立乙個額外的別名來註冊這個配置。

alias cleos-test='docker exec -i keosd /opt/eosio/bin/cleos -u  --wallet-url http://localhost:8900'
在上面的命令中,我們建立了別名cleos-test,以便與eos9cat提供的eos測試網路節點快速互動。請注意,我們仍然依賴我們的本地錢包應用程式來處理我們的私鑰。 只要我們在解鎖錢包中匯入相應的私鑰即可。

有時,當你部署包含更複雜邏輯的應用程式合約時,可能會收到類似於上述螢幕截圖的錯誤訊息,暗示智慧型合約帳戶沒有足夠的ram來部署合同。在這種情況下,我們必須從eosio.ram購買更多的ram。

我們可以通過發出以下命令來快速檢查我們的ram分配:

memory部分下的quota屬性指示帳戶分配的記憶體量。

現在我們知道我們有權獲得多少ram,我們怎麼可能知道我們需要多少ram才能部署我們的智慧型合約?由於eosio區塊鏈使用web assembly執行使用者生成的應用程式和**,因此我們可以通過將*.wasm*.abi檔案的大小相加來粗略估計執行智慧型合約所需的千位元組數。除了計算粗略估計之外,我們還必須確定購買ram所需的eos代幣數量。

eos區塊鏈平台依靠bancor演算法通過單邊交易模型促進二級ram市場,我們可以通過查詢系統合約公開的ram市場表並執行一些簡單的計算來確定eos ram**。

要獲得eos/kib,我們需要將quote.balance(聯結器餘額)除以base.balanceram(token不足支付的部分),最後將該值乘以1024(即quote.balance/base.balance)*1024。在我想要部署的智慧型合約的示例中,需要大約100kib,這將花費大約31.70 eos token。 然後,我們可以通過cleos發出以下命令來繼續實際的交易。

cleos-test system buyram -k $ $ amount
k標誌將指示金額引數表示要購買的kib金額,系統合約交易將自動從付款人的賬戶中扣除適當數量的eos token。 如果沒有kflag,金額將預設為花費的eos token數量。 同樣,根據ram**,將向賬戶中新增適當數量的ram。

如果我們現在再次部署合約,它應該成功。

對於帳戶當前占用的不需要的ram,可以通過banchor演算法確定的**通過系統合約交換某些eos token的資源。**ram和在eos區塊鏈上購買ram的過程類似。

cleos-test system sellram $ bytes
成功的交易看起來與此類似:

由於其靈活性,ram可以說是eos區塊鏈平台上最受歡迎的資源。ram不僅可以用於儲存中間計算狀態,還可以用作持久儲存。多索引資料庫是eos中的一種資料結構,它根據範圍的定義方式提供儲存資料的靈活性。多索引資料庫將以**格式儲存持久資料。實際上,與許多其他流行的智慧型合約平台不同,eos智慧型合約中的交易不能返回任何值或變數,這意味著ram捕獲的任何資料都不能通過交易返回給呼叫者。為了獲得對智慧型合約中的變數值的訪問,例如某個計算和交易的結果,資料需要通過帶有範圍的多索引資料庫表進行更新,通常以呼叫者的帳戶名稱或智慧型合約本身的帳戶名稱的形式儲存資料的關聯鏈結,然後可以通過具有相應合同名稱,範圍和表名稱的gettable api檢索資料。

例如,每個帳戶已儲存在eosio.token合約中定義的多索引資料庫中的eos token數,該合約由定義範圍的每個帳戶的一小塊ram組成。我們可以使用以下命令直接從db檢索某個帳戶擁有的token數量:

上述命令中的表名是accounts,範圍是個人帳戶名。將帳戶餘額資訊與實際擁有它們的帳戶分配是合乎邏輯的。另一方面,如果我們希望檢索有關eos token本身的資訊,我們將需要檢視具有不同表的另乙個範圍,即使資訊是在同一智慧型合約中已經編碼:

cleos-test get table eosio.token eos stats
確定範圍和表名稱可能很棘手,特別是對於其他人生成的合約,通常可以通過檢視合約的abi來快速檢索表名。

範圍更難,但可以通過檢視在**中對多索引資料庫的引用檢視引數來確定。

第乙個帶下劃線的部分顯示對stats表的引用是使用sym引數進行的,該引數表示token的symbol;因此,表的範圍是token的symbol。

由於智慧型合約本身與儲存在本地磁碟上的多索引資料庫之間的連線僅僅是乙個參考鏈結,因此該功能與使用同一帳戶多次部署合約時一起授予,以便公升級eos生態系統中的智慧型合約。只要定義多索引資料庫的關鍵功能在新舊智慧型合約中相同,就可以在新的智慧型合約中對資料進行引用。

在某些情況下,你甚至可能會發現通過部署空合約或大小明顯較小的合同來釋放ram以進行銷售是有用的,同時仍然將與前合同相關的資料保留在持久儲存上。

eos教程

這裡是原文

效能優化 記憶體優化建議(RAM)

原因 service的執行需要浪費記憶體,而且系統傾向保留這個service從而保留serivce的程序。解決方法 最後使用intentservice代替普通的service,當service不使用了就殺死。情景 當載入乙個bitmap的時候,將bitmap的大小設定為當前螢幕畫素的大小就可以了。原...

所謂心如磐石,初見面即見分曉?

彪悍的人生,的確不是一天兩天能夠完成修煉的,一般來說,老妖怪之所以稱之為老妖怪,是因為修煉了多年,其妖孽指數已經遠超出其他同行。今天早上,很無辜的被黑了一把,不知道為啥子,某些人定的會議居然是早上九點,很不幸的是,成都的班車基本都晚點,這玩意最終結果成了我們的藉口。很不出意外的是,大部分的人都遲到了...

STM8L的RAM與記憶體模型

stm8l的ram與記憶體模型 一 ram空間 在記憶體對映圖上可以看到stm8l的ram劃分為2部分,如下 2k的ram空間包含513個位元組的stack,經過深入研究發現,其實ram被劃分為 short range long range stack這3個部分。如下 可以在stvd中通過proje...