如何在NEAR智能合约中设置仅初始化一次的静态Owner字段?
NEAR托管合约Owner相关问题解答
self.owner_id是否会被客户端重复初始化?
不会。NEAR合约的状态是持久化存储在区块链上的,整个合约对应一个全局唯一的实例,所有客户端交互的都是同一个合约实例。self.owner_id作为合约结构体的字段,一旦在部署初始化时被赋值,就会被保存在链上的合约状态中,后续客户端调用合约方法时,只会读取或使用这个已存在的值,不会重复初始化。
如何实现全局唯一、仅初始化一次的Owner字段?
在NEAR Rust合约中,直接通过合约结构体的持久化字段即可实现类似Rust静态变量的效果,步骤如下:
- 在合约结构体中定义
owner_id字段,类型为AccountId,并确保结构体被#[near_bindgen]宏修饰,字段能被序列化存储:use near_sdk::{near_bindgen, AccountId}; use near_sdk::serde::{Serialize, Deserialize}; #[near_bindgen] #[derive(Default, Serialize, Deserialize)] #[serde(crate = "near_sdk::serde")] pub struct EscrowContract { owner_id: AccountId, } - 实现合约的
new初始化方法,仅在部署合约时调用一次,将owner_id设置为部署者的账户ID,并且不提供任何修改owner_id的公开方法:#[near_bindgen] impl EscrowContract { #[init] pub fn new() -> Self { Self { owner_id: env::signer_account_id(), } } }
这样owner_id就会在部署时被唯一初始化,之后无法修改,所有合约方法都能访问这个全局唯一的Owner值。
env::signer_account_id()能否正确获取合约部署者地址?
可以。部署NEAR合约的过程本质是发起一个调用合约new方法的交易,这个交易的签名者就是合约的部署者。在#[init]修饰的new方法中调用env::signer_account_id(),返回的就是部署者的账户ID,完全可靠。
内容的提问来源于stack exchange,提问作者Marco C. Stewart
相关产品推荐
相关产品推荐

