以太坊交易所 以太坊交易所
Ctrl+D 以太坊交易所
ads
首頁 > 火必APP > Info

Starknet改進語法全解讀_NER:STA

Author:

Time:1900/1/1 0:00:00

Cairo 編譯器的第 2 版對 Starknet 語法進行了更改,使代碼更加明確和安全。智能合約公共接口是使用特征定義的,并且對存儲的訪問是通過 ContractState 特征完成的。私有方法必須使用與公共接口不同的實現來定義。事件現在定義為枚舉,其中每個變體都是同名的結構。

就在上周,Cairo 編譯器的新的主要版本 2.0.0-rc0 在 Github 上發布。新的編譯器對 Starknet 插件進行了重大改進,使我們的代碼更安全、更明確、更可重復使用。請注意,Starknet 測試網或主網尚不支持這個新版本的編譯器,因為它仍在集成環境中進行。

本文的目標是向您展示如何將為 Cairo 編譯器版本 1.x 創建的 Starknet 智能合約重寫為與編譯器版本 2.x 兼容的智能合約。我們的起點是上一篇文章中創建的 Ownable 智能合約,它與 Cario 編譯器版本 1.x 兼容。

#[contract]mod Ownable {use starknet::ContractAddress;use starknet::get_caller_address;

#[event]fn OwnershipTransferred(previous_owner: ContractAddress, new_owner: ContractAddress) {}

struct Storage {owner: ContractAddress,}

#[constructor]fn constructor() {let deployer = get_caller_address();owner::write(deployer);}

#[view]fn get_owner() -> ContractAddress {owner::read(。

pSTAKE宣布推出BNB流動性質押功能:8月8日消息,流動性質押協議pSTAKE周一宣布,該平臺將為BNB推出流動性質押功能。用戶可以通過pSTAKE應用程序質押他們的BNB,同時接收質押的BNB或stkBNB。這些stkBNB代幣將直接鑄造為BEP-20代幣。它們將提供與基于BNB鏈的DeFi應用程序的無縫集成,這意味著stkBNB代幣可以用于其他地方以賺取額外的收益。

pSTAKE將允許用戶質押任何非零金額的BNB,并繞過傳統的7天解除綁定期,在任何時候通過將他們的stkBNB交易為另一資產解除綁定。質押在Ankr和Steakbank等其他流動性質押平臺上的BNB,至少需要七天的解除綁定期。

此外,Ankr要求用戶至少質押1.002 BNB才能開始。解除綁定期指的是用戶在出售或轉移加密貨幣之前需要持有加密貨幣的時間。此外,pSTAKE還免除了90天的協議費,用戶可以獲得100%的質押獎勵。(CoinDesk)[2022/8/8 12:10:16]

#[external]fn transfer_ownership(new_owner: ContractAddress) {only_owner();let previous_owner = owner::read();owner::write(new_owner);OwnershipTransferred(previous_owner, new_owner);}

fn only_owner() {let caller = get_caller_address();assert(caller == owner::read(), 'Caller is not the owner');}}

由于 Protostar 尚不支持編譯器 v2,因此本文將依賴支持它的 Scarb 預發行版本(版本 0.5.0-alpha.1)。要安裝該特定版本的 Scarb,您可以使用以下命令。

$ curl --proto '=https' --tlsv1.2 -sSf | bash -s -- -v 0.5.0-alpha.1

區塊鏈游戲初創公司Star Sharks獲Binance Labs戰略投資:11月7日消息,區塊鏈游戲初創公司 Star Sharks 獲 Binance Labs 戰略投資,投資金額未披露。Star Sharks 是一款以海洋世界為背景的 3D NFT 游戲,用戶可以通過持有、繁殖、交易其鯊魚寵物 NFT 來獲取收益。[2021/11/7 6:36:07]

安裝完成后,驗證您是否獲得了正確的版本。

$ scarb --version>>>scarb 0.5.0-alpha.1 (546dad33d 2023-06-19)cairo:2.0.0-rc3()

現在可以創建一個 Scarb 項目。

$ scarb new cairo1_v2$cdcairo1_v2

您應該得到如下所示的文件夾結構。

$ tree .>>>.├── Scarb.toml└── src└──lib.cairo

為了讓 Scarb 編譯 Starknet 智能合約,需要啟用 Starknet 插件作為依賴項。

// Scarb.toml...[dependencies]starknet="2.0.0-rc3"

設置完成后,我們可以前往 src/lib.cairo 開始編寫智能合約。

在 Cairo 編譯器的版本 2 中,智能合約仍然由帶有 contract 屬性注釋的模塊定義,只是這次該屬性以定義它的插件的名稱命名,在本例中為 starknet。

#[starknet::contract]mod Ownable {}

內部存儲仍然定義為一個必須稱為 Storage 的結構,只是這次必須使用一個存儲屬性來注釋它。

#[starknet::contract]mod Ownable {use super::ContractAddress; #[storage]struct Storage {owner: ContractAddress,}}

WeStarter即將上線Paul Protocol保羅協議兌換:據官方消息,WeStarter已于新加坡時間6月1日20:00上線Paul Protocol保羅協議(代幣PAUL),白名單池總兌換額度共35000000枚PAUL等值7萬USDT,LPT兌換額度共25000000枚PAUL等值5萬USDT,LBP將于同一時間開啟,用戶可通過WeStarter兌換PAUL。

據悉,Paul Protocol保羅協議基于當前的跨鏈網絡設計了基礎架構,該架構基于在高頻自動交易中針對多個交易場景中的單個基準的報價系統引入和修改。質押資產報價和套利驗證用于構建實時報價驗證機制。在極端情況下,可以通過統計假設檢驗更平滑地生成價格曲線。[2021/5/28 22:53:00]

為了定義構造函數,我們使用構造函數屬性來注釋函數,就像在 v1 中所做的那樣,優點是現在函數可以具有任何名稱,不需要像 v1 中那樣被稱為“構造函數”。盡管這不是必需的,但出于習慣,我仍然會將該函數稱為“構造函數”,但您可以以不同的方式調用它。

另一個重要的變化是,現在構造函數會自動傳遞對 ContractState 的引用,該引用充當存儲變量的中介,在本例中為“所有者”。

#[starknet::contract]mod Ownable {use super::ContractAddress; #[storage]struct Storage {owner: ContractAddress,} #[constructor]fn constructor(ref self: ContractState) {let deployer = get_caller_address();self.owner.write(deployer);}}

請注意,寫入和讀取存儲的語法自 v1 以來已發生變化。之前我們執行owner::write(),而現在執行self.owner.write()。這同樣適用于從存儲中讀取。

順便說一下,ContractState 這個類型不需要手動進入作用域,它已包含在前奏中。

Gate.io Startup首發METIS開盤13小時最高漲幅達227.27%:據Gate.io芝麻開門行情顯示,截至今日10:20,Gate.io Startup首發項目METIS開盤13小時最高漲幅227.27%,最高價格18美元,當前價格為10.738美元,認購價格5美元,當前漲幅為95.23%,24H現貨交易量達686.92萬美元。近期行情波動較大,請注意控制風險。[2021/5/14 22:01:27]

與 Cairo 編譯器版本 1 的一個重要區別是,現在我們需要使用帶有 starknet::interface 屬性注釋的特征來明確定義智能合約的公共接口。

#[starknet::interface]trait OwnableTrait { fn transfer_ownership(ref self: T, new_owner: ContractAddress); fn get_owner(self: @T) -> ContractAddress;}

#[starknet::contract]mod Ownable { ...}

如果您還記得 v1 中的原始代碼,我們的智能合約有兩個「公共」方法(get_owner 和 transfer_ownership)和一個「私有」方法(only_owner)。這一特征僅處理公共方法,而不依賴于「外部」或「視圖」屬性來表示哪個方法可以修改合約的狀態,哪個方法不允許。相反,現在通過參數 self 的類型來明確這一點。

如果一個方法需要引用 ContractStorage(一旦實現,通用 T 就是這樣),該方法就能夠修改智能合約的內部狀態。這就是我們過去所說的“外部”方法。另一方面,如果一個方法需要 ContractStorage 的快照,那么它只能讀取它,而不能修改。這就是我們過去所說的“視圖”方法。

現在,我們可以使用關鍵字 impl 為剛剛定義的特征創建一個實現。請記住,Cairo 與 Rust 的不同之處在于,實現是具備名稱的。

Gate.io Startup 上線項目DDOS回報率近12倍:據Gate.io芝麻開門行情顯示,Gate.io Startup 首發項目Disbalancer (DDOS)已于昨日23:30附近正式開盤交易,上線11小時內最高漲幅達2445.44%,最高價格6.3636美元,為Startup認購價格0.5美元的近12倍,當前價格為2.3646美元,當前漲幅為845.84%,開盤11小時現貨交易量達235.50萬美元。近期行情波動較大,請注意控制風險。[2021/4/16 20:26:10]

#[starknet::contract]mod Ownable { ... #[external(v0)] impl OwnableImpl of super::OwnableTrait { fn transfer_ownership(ref self: ContractState, new_owner: ContractAddress) { let prev_owner = self.owner.read(); self.owner.write(new_owner); }

fn get_owner(self: @ContractState) -> ContractAddress { self.owner.read() } }}

我們在定義智能合約的模塊內為我們的特征創建了一個實現,將類型 ContractState 作為通用類型 T 傳遞,這樣就可以像構造函數那樣訪問存儲。

我們的實現用屬性 external(v0) 進行注釋。屬性中的版本 0 意味著選擇器僅從方法名稱派生,就像過去的情況一樣。缺點是,如果您為您的智能合約定義了另一個不同特征的實現,并且兩個特征碰巧對它其中一個方法使用相同的名稱,則編譯器會因為選擇器的重復而拋出錯誤。

該屬性的未來版本可能會添加一種新的方法來計算選擇器,以防止沖突,但目前還不能使用。目前,我們只能使用外部屬性的版本 0。

我們還需要為智能合約定義另一種方法,only_owner。此方法檢查調用它的人是否應該是智能合約的所有者。

因為這是一個不允許從外部調用的私有方法,所以不能將其定義為 OwnableTrait(智能合約的公共接口)的一部分。相反,我們將使用 generate_trait 屬性創建自動生成特征的新實現。

...#[starknet::contract]mod Ownable { ... #[generate_trait] impl PrivateMethods of PrivateMethodsTrait { fn only_owner(self: @ContractState) { let caller = get_caller_address(); assert(caller == self.owner.read(), 'Caller is not the owner'); } }}

現在可以通過在需要的地方調用 self.only_owner() 來使用 only_owner 方法。

#[starknet::contract]mod Ownable { ... #[external(v0)] impl OwnableImpl of super::OwnableTrait { fn transfer_ownership(ref self: ContractState, new_owner: ContractAddress) { self.only_owner(); ... } ... }

#[generate_trait] impl PrivateMethods of PrivateMethodsTrait { fn only_owner(self: @ContractState) { ... } }}

在 Cairo v1 中,事件只是一個沒有主體的函數,并用事件(event)屬性進行注釋,而在 v2 版本中,事件是一個用相同屬性注釋的枚舉(enum),但現在使用派生(derive) 實現了一些附加特征。

...#[starknet::contract]mod Ownable { ... #[event] #[derive(Drop, starknet::Event)] enum Event { OwnershipTransferred: OwnershipTransferred, }

#[derive(Drop, starknet::Event)] struct OwnershipTransferred { #[key] prev_owner: ContractAddress, #[key] new_owner: ContractAddress, }}

事件枚舉的每個變體都必須是同名的結構體。在該結構中,使用可選的 key 屬性定義想要發出的所有值,來通知系統我們希望 Starknet 索引哪些值,以便索引器更快地搜索和檢索。在本例中,我們希望對兩個值(prev_owner 和 new_owner)建立索引。

ContractState 特征定義了一個發出方法,可以用來發出事件。

...#[starknet::contract]mod Ownable { ... #[external(v0)] impl OwnableImpl of super::OwnableTrait { fn transfer_ownership(ref self: ContractState, new_owner: ContractAddress) { ... self.emit(Event::OwnershipTransferred(OwnershipTransferred { prev_owner: prev_owner, new_owner: new_owner, })); } ... } ...}

通過這個最終功能,我們已經完成了 Ownable 智能合約從 v1 到 v2 的遷移。完整代碼如下所示。

#[starknet::contract]mod Ownable { use super::ContractAddress; use starknet::get_caller_address;

#[storage] struct Storage { owner: ContractAddress, }

#[constructor] fn constructor(ref self: ContractState) { let deployer = get_caller_address(); self.owner.write(deployer); }

#[external(v0)] impl OwnableImpl of super::OwnableTrait { fn transfer_ownership(ref self: ContractState, new_owner: ContractAddress) { self.only_owner(); let prev_owner = self.owner.read(); self.owner.write(new_owner); self.emit(Event::OwnershipTransferred(OwnershipTransferred { prev_owner: prev_owner, new_owner: new_owner, })); }

您也可以在 Github 上找到這段代碼。

Cairo 編譯器第 2 版為 Starknet 帶來了新的語法,使智能合約代碼看起來與 Cairo 本身更加一致,并且在擴展上更類似于 Rust。即使犧牲了更多繁瑣的代碼,安全方面的優勢也值得權衡。

在本文中,我們沒有觸及關于新語法的所有內容,特別是如何與其他智能合約交互,但您可以閱讀編譯器的變更日志、閱讀論壇上的這篇文章或觀看 StarkWare 的 YouTube 頻道上的視頻來了解更多信息。

這個新版本的編譯器將在幾周內提供給 Starknet 的測試網,在幾周后提供給主網,所以暫時不要嘗試部署此代碼,它還不能運行。

Cairo 一直在變得更好。

資源

合約語法——遷移指南

Cairo 1:合約語法在不斷發展

StarkNet 中文

個人專欄

閱讀更多

金色財經

金色薦讀

Block unicorn

金色財經 善歐巴

區塊鏈騎士

Foresight News

深潮TechFlow

Tags:OWNNERTRASTATOWNoneroot幣騙局TRACASTAKE

火必APP
坎昆升級:繼上海之后的又一個里程碑_以太坊:ROL

坎昆升級簡介 Cancun-Deneb(Dencun,以下簡稱為坎昆升級)是以太坊區塊鏈下一個重要的升級,將提高以太坊網絡的可擴展性、安全性和可用性.

1900/1/1 0:00:00
規范交易后 虛擬幣還能在USA野蠻生長嗎?_NCE:BAMBINO價格

上周,SEC正式公布對Binance和Coinbase的起訴書,有人終于盼到監管部門正式介入種種灰色地帶,有人認為相關交易平臺能提供更好的投資者保護.

1900/1/1 0:00:00
從 Blur 的空投策略看代幣如何驅動增長_BLUR:blur幣是山寨幣嗎

文章速覽 1/ Intro2/ 分階段的獎勵模型3/ Token 設計角度的亮點    3.

1900/1/1 0:00:00
FERC上線暴漲數百倍 公平發售概念代幣都有哪些?_RC20:Kols Offering Token

$FERC代幣6月1日免費鑄造,很快引起社區關注,價格最高時市值達到1500萬美元。假如將鑄造gas費視為成本、每張(1000個幣)5U的話,FERC相當于上漲了300倍.

1900/1/1 0:00:00
手機+AI大模型 除了噱頭還剩什么?_區塊鏈:Struggle Doge

AI大模型,2023年最具話題性的人工智能應用。智能手機,全球普及度最高的智能終端。一個代表未來的人工智能浪潮,一個是過去20年最成功的科技產品,在漢語中,它們都有一個相同的詞:智能.

1900/1/1 0:00:00
Solana 開發者 Ferrante:與其消滅競爭對手 我們應該讓加密貨幣蛋糕變得更大_Solana:SOLX幣

來源:Blockworks;編譯:比推BitpushNews TracySolana的核心網絡已經實現了“許多令人難以置信的改進”,這將使其實現“重生”,Armani Ferrante表示.

1900/1/1 0:00:00
ads