合约可以在 NEAR 协议中自行删除吗?

Posted

技术标签:

【中文标题】合约可以在 NEAR 协议中自行删除吗?【英文标题】:Can a contract remove itself in NEAR Protocol? 【发布时间】:2020-07-19 01:12:38 【问题描述】:

我想设计升级锁定合约的流程。

(锁定的合约是没有访问密钥允许更改代码的合约;例如,一旦部署代码,完整的访问密钥就会被删除)。

按照设计,没有密钥可以代表账户签署交易以启动锁定账户的账户删除,但我想知道部署在账户上的代码(合约代码)是否仍然可以自行删除( self-destroy) [我认为这是可能的,因为它似乎可以从自己到自己开具收据]。

以下升级策略会起作用吗?

    初始阶段: 创建一个帐户 使用一些可升级帮助程序部署代码 锁定帐户(删除完整的访问密钥) 升级: 创建一个新帐户 将新代码部署到新帐户 锁定新帐户 调用迁移方法,该方法到达旧版本(通过跨合约调用)并请求转移所有权(提供所有数据并自行删除)

似乎需要在可升级性助手中实施某种所有者验证,以确保只有所有者才能将所有权从旧版本转移到新版本,但这是另一个问题;首先,我想知道合约是否可以自我毁灭。

【问题讨论】:

【参考方案1】:

我相信这是可能的。你可以有一个方法使用promise_batch_action_delete_account 删除self,然后向合约添加一个访问密钥,允许它调用该方法。

【讨论】:

【参考方案2】:

使用删除合同或帐户

Promise::new(contract_id).delete_account(beneficiary_id);

参考:https://docs.rs/near-sdk/3.1.0/near_sdk/struct.Promise.html#method.delete_account

源码:https://github.com/near/near-sdk-rs/blob/9d99077c6acfde68c06845f2a1eb2b5ed7983401/near-sdk/src/promise.rs#L309

【讨论】:

以上是关于合约可以在 NEAR 协议中自行删除吗?的主要内容,如果未能解决你的问题,请参考以下文章

NEAR 协议中存储的智能合约 WebAssembly 二进制文件在哪里/如何?

如何让用户在前端部署 NEAR 协议智能合约?

是否可以在 Rust 的 NEAR 智能合约中验证 NIST P-256 曲线?

NEAR 智能合约开发

Near 协议 FunctionCallError(MethodResolveError(MethodNotFound))

在 NEAR 区块链上使用合约名称调用 nft_transfer?