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(。
Equilibrium:6月17日Starknet Pathfinder節點停止同步,隔日已完成修復:6月27日消息,去中心化網絡基礎設施Equilibrium發文稱,2023年6月17日(星期六)發生了一起事件,導致Starknet Pathfinder節點在主網上停止同步,導致整個生態系統中斷。修復程序于第二天早上8:30(UTC時間)發布。
根本原因是由于類散列不匹配,Pathfinder無法在主網上同步區塊84,448。罪魁禍首是JSON的字符串編碼。失敗的類包含非ASCII字符,導致最終編碼字節不同,因此產生不同的散列。[2023/6/27 22:03:53]
#[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
安裝完成后,驗證您是否獲得了正確的版本。
$ scarb --version>>>scarb 0.5.0-alpha.1 (546dad33d 2023-06-19)cairo:2.0.0-rc3()
V神:新書《Proof of Stake》已經出版:9月28日消息,以太坊創始人Vitalik Buterin發推表示,其新書《Proof of Stake》已經出版,“這本書匯集了我在過去10年中創作的各種著作,感謝所有幫助實現這一目標的人!”
此前報道,Vitalik Buterin于8月31日表示,其近十年文集《Proof of Stake》數字版和實物版將出版。讀者現可在Gitcoin為其捐贈并獲得數字副本和紀念NFT,全部收益將用于公益事業。[2022/9/28 22:35:47]
現在可以創建一個 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,}}
ZK Rollup擴容方案StarkNet Alpha上線以太坊主網:11月29日消息,StarkWare推出的以太坊Rollup擴容方案StarkNet Alpha今日上線以太坊主網。StarkNet是一個無需許可的以太坊L2網絡去中心化Rollup擴容方案。StarkNet允許任何dApp實現其計算規模,而不會影響可組合性和安全性,它依賴于安全和具可擴展性的加密證明系統——STARK。StarkNet建立在Cairo編程語言之上,Cairo和STARK均由 StarkWare內部開發,并為生產級應用程序提供支持。除其他功能外,StarkNet Alpha支持通用計算智能合約,支持與其他StarkNet合約以及通過 L1<>L2 消息與L1合約的可組合性。StarkNet Alpha在Rollup模式下運行,所有狀態差異數據都在鏈上發送。
StarkNet Alpha上線以太坊主網意味著開發者可以在StarkNet上部署他們的合約,用戶可以向這些合約發送交易,每個StarkNet區塊都在鏈上被證明和驗證,應用程序獲得無限擴展并保持L1安全性。這是一個Alpha版本,該網絡仍在開發中。團隊不斷添加功能、修復錯誤并對其進行改進。在接下來的幾周和幾個月內,團隊將在以下功能上升級Alpha:合約升級機制;收費機制;添加系統調用(get_block_number、get_block_timestamp 等)。[2021/11/30 12:39:57]
為了定義構造函數,我們使用構造函數屬性來注釋函數,就像在 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);}}
BitMax明日將啟動xDai (STAKE) 競拍:據官方消息,北京時間4月28日 (明日)21:00 - 23:00,BitMax用戶將獲得STAKE競拍權。按競價由高到低排名,前400名用戶將以第400名用戶給出的競拍價為最終價獲得拍賣品1000 STAKE(無鎖定期)。本次競拍起拍價格為400 USDT,上限為550 USDT。
BitMax (BTMX.com) 交易所將于北京時間4月29日 22:00開啟獨家上線xDai Chain (STAKE),并開放STAKE/USDT交易對。
更多活動和交易詳情登錄BitMax平臺官網查看。[2020/4/27]
請注意,寫入和讀取存儲的語法自 v1 以來已發生變化。之前我們執行owner::write(),而現在執行self.owner.write()。這同樣適用于從存儲中讀取。
順便說一下,ContractState 這個類型不需要手動進入作用域,它已包含在前奏中。
與 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 的類型來明確這一點。
星鏈StarChain測試主網上線并公開測試錢包web版:星鏈StarChain測試主網已于4月8日上線,并公開了測試錢包web版。在后續測試中會空投測試Token并開放產品APP-星主頁的權益兌換。據了解,星鏈采用先進的dBFT共識機制模塊,吞吐量預期可達10000TPS。作為一條技術公有鏈,全新星鏈生態將實現明星/IP一鍵發行Token、通過特有的3次賦值可實現所有明星/IP在星鏈上發行的Token價值最大化。[2018/4/9]
如果一個方法需要引用 ContractStorage(一旦實現,通用 T 就是這樣),該方法就能夠修改智能合約的內部狀態。這就是我們過去所說的“外部”方法。另一方面,如果一個方法需要 ContractStorage 的快照,那么它只能讀取它,而不能修改。這就是我們過去所說的“視圖”方法。
現在,我們可以使用關鍵字 impl 為剛剛定義的特征創建一個實現。請記住,Cairo 與 Rust 的不同之處在于,實現是具備名稱的。
#[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:OWNNERTRASTACLOWN價格Green Life EnergySTRAY價格pSTAKE Finance
作者:Miles Deutscher 編譯:PANews北京時間 6 月 5 日晚.
1900/1/1 0:00:00作者:IGNAS;編譯:深潮 TechFlow在韓國,幾乎沒有人不知道比特幣。2017 年,這個擁有 5000 多萬人口的國家完成了所有比特幣交易的 20%,并且成為以太坊的最大市場.
1900/1/1 0:00:00作者:Messari,翻譯:金色財經xiaozouDePIN是使用代幣激勵現實世界基礎設施建設的去中心化網絡.
1900/1/1 0:00:00作者:Louround_,來源:Twitter@Louround;編譯:Yvonne,MarsBit為什么我相信在下一輪牛市中,比特幣將達到10萬至20萬美元.
1900/1/1 0:00:00成長性對于投資回報至關重要,然而在 web 3 ,能夠成功拓展新業務的項目少之又少,老項目新業務多半競爭不過該業務競爭的新項目.
1900/1/1 0:00:00通貨膨脹的危害: 物價上漲:通貨膨脹會導致物價上漲,這會增加生活成本,降低人們的購買力。經濟不穩定:通貨膨脹會導致經濟不穩定,增加投資風險,可能導致企業盈利下降.
1900/1/1 0:00:00