子账户访问密钥和存储抵押

问题描述

假设存在于帐户 factory.near 上的合同有一个 create 方法,可以创建子帐户并将合同部署到它,如下所示..

    const promise = ContractPromiseBatch.create(subaccount)
      .create_account()
      .deploy_contract(Uint8Array.wrap(changetype<ArrayBuffer>(CODE)))
      .add_full_access_key(base58.decode(Context.senderPublicKey))
      .function_call(
        "init",new PlaceInitArgs(Context.sender),Context.attachedDeposit,XCC_GAS
      )
  1. 持有工厂合约的父账户是否自动拥有子账户的完全访问权限或函数调用访问权限?
  2. 因为同一个 WASM 文件被部署到子账户上,所以所有子账户都具有相同的合约哈希吗?
  3. 如果附加的押金不足以抵押存储会发生什么?帐户会在没有部署合同的情况下创建还是都会失败?
  4. 如果子账户被删除,作为存储质押的 NEAR 代币是否也会在删除函数调用中返回给指定的受益人?

解决方法

持有工厂合约的父账户是否自动拥有子账户的完全访问权限或函数调用访问权限?

否,帐户之间的访问控制不起作用。说某些帐户对其他某些帐户具有完全访问权限是无效的。当且仅当您拥有该帐户的完整访问密钥(私钥)时,您才能完全访问该帐户。

由于同一个 WASM 文件被部署到子账户上,所有子账户是否都具有相同的合约哈希?

是的,如果它们是这样创建的。

如果附加的押金不足以抵押存储会发生什么?帐户会在没有部署合同的情况下创建还是都会失败?

操作在一个收据中进行批处理。收据的执行是原子的——要么成功,要么回滚中间的整个状态。在这种情况下,如果附加存款不足,帐户创建将失败。

如果子账户被删除,作为存储质押的 NEAR 代币是否也会在删除函数调用中归还给指定的受益人?

是的