所有 NEAR 区块链交易都需要接收方账户吗?
do all NEAR blockchain transactions require a receiver account?
阅读一些 documentation here 并看到交易定义的一部分是执行所有操作 "on top of the receiver's account" 并且接收方帐户是 "the account towards which the transaction will be routed."
同样在 nearlib SDK 中,the transactions interface 包含一个名为 signTransaction 的方法,该方法需要 receiverId
作为参数
async function signTransaction(receiverId: string, nonce: number, actions: Action[], blockHash: Uint8Array, signer: Signer, accountId?: string, networkId?: string): Promise<[Uint8Array, SignedTransaction]> {
但是查看 nearcore 支持的交易列表,我想知道为什么其中一些交易需要接收方。
why would any transactions require a "receiver" except for maybe Transfer
, AddKey
, DeleteKey
, and DeleteAccount
?
amd 我认为 "receiver" 的想法过于字面意思,如 "they receive the outcome or impact of the transaction"?相反,这不是正确的思考方式?
或者在某些情况下 receiverId 是可选的,但接口只需要一个值来避免验证问题?
我认为这是 full list of supported transactions
pub enum Action {
CreateAccount(CreateAccountAction),
DeployContract(DeployContractAction),
FunctionCall(FunctionCallAction),
Transfer(TransferAction),
Stake(StakeAction),
AddKey(AddKeyAction),
DeleteKey(DeleteKeyAction),
DeleteAccount(DeleteAccountAction),
}
从概念上讲,每个交易总是有一个发送方和一个接收方,即使有时他们可能是相同的。因为我们总是将交易转换为发送给接收方的收据,所以它们在概念上是否相同并不重要,即使在实现中可能存在差异。
不幸的是,我们没有一个好名字来表示我们所说的 "receiver"。在我们的代码中的某些地方,我们也称它为 "actor",因为它实际上指的是 执行操作的帐户 而不是 执行操作的帐户发出要执行的操作 (a.k.a "sender").
DeployContract
、Stake
、AddKey
、DeleteKey
需要receiver==sender
,也就是说只有一个账号本身可以add/delete键,自己抵押和部署合约,没有其他账户可以为它做。
DeleteAccount
是一样的,它需要 receiver==sender
,但有一个例外:如果帐户由于存储租金即将 运行 失衡并且低于某个系统定义的阈值任何其他帐户都可以删除它并索取剩余余额。
CreateAccount
、FunctionCall
和 Transfer
不需要 receiver==sender
。在 CreateAccount
的情况下 receiver
在执行时不应该存在并且实际上会被创建。
阅读一些 documentation here 并看到交易定义的一部分是执行所有操作 "on top of the receiver's account" 并且接收方帐户是 "the account towards which the transaction will be routed."
同样在 nearlib SDK 中,the transactions interface 包含一个名为 signTransaction 的方法,该方法需要 receiverId
作为参数
async function signTransaction(receiverId: string, nonce: number, actions: Action[], blockHash: Uint8Array, signer: Signer, accountId?: string, networkId?: string): Promise<[Uint8Array, SignedTransaction]> {
但是查看 nearcore 支持的交易列表,我想知道为什么其中一些交易需要接收方。
why would any transactions require a "receiver" except for maybe
Transfer
,AddKey
,DeleteKey
, andDeleteAccount
?
amd 我认为 "receiver" 的想法过于字面意思,如 "they receive the outcome or impact of the transaction"?相反,这不是正确的思考方式?
或者在某些情况下 receiverId 是可选的,但接口只需要一个值来避免验证问题?
我认为这是 full list of supported transactions
pub enum Action {
CreateAccount(CreateAccountAction),
DeployContract(DeployContractAction),
FunctionCall(FunctionCallAction),
Transfer(TransferAction),
Stake(StakeAction),
AddKey(AddKeyAction),
DeleteKey(DeleteKeyAction),
DeleteAccount(DeleteAccountAction),
}
从概念上讲,每个交易总是有一个发送方和一个接收方,即使有时他们可能是相同的。因为我们总是将交易转换为发送给接收方的收据,所以它们在概念上是否相同并不重要,即使在实现中可能存在差异。
不幸的是,我们没有一个好名字来表示我们所说的 "receiver"。在我们的代码中的某些地方,我们也称它为 "actor",因为它实际上指的是 执行操作的帐户 而不是 执行操作的帐户发出要执行的操作 (a.k.a "sender").
DeployContract
、Stake
、AddKey
、DeleteKey
需要receiver==sender
,也就是说只有一个账号本身可以add/delete键,自己抵押和部署合约,没有其他账户可以为它做。
DeleteAccount
是一样的,它需要 receiver==sender
,但有一个例外:如果帐户由于存储租金即将 运行 失衡并且低于某个系统定义的阈值任何其他帐户都可以删除它并索取剩余余额。
CreateAccount
、FunctionCall
和 Transfer
不需要 receiver==sender
。在 CreateAccount
的情况下 receiver
在执行时不应该存在并且实际上会被创建。