1

最近我创建了一个帐户并部署了一个需要 2 次确认(签名)的多重签名合约,但我只有 1 个完整的访问密钥。我无法对合同做任何事情,包括将确认次数设置为 1...如何使用近壳、近 repl 或近 api-js 添加密钥?

例如

near create_account msig --masterAccount account.testnet --initialBalance 50
near deploy --accountId msig --wasmFile ./contract/res/multisig.wasm
near call msig new '{"num_confirmations":2}' --account_id msig

此时,多重签名已部署并使用 实例化num_confirmations = 2,但只有 1 个密钥。完全访问帐户密钥。

如何添加另一个密钥以便确认多重签名请求?

4

1 回答 1

0

首先,我必须生成一个新密钥以添加到帐户中。我将命名密钥msig.lak1,用于向我的帐户添加新的受限访问密钥 (LAK) msig

near generate-key msig.lak1

复制生成的公钥。

为了参考和签署 txs,就像confirm在 multisig 合同上一样,可以在这里找到 secretKey:code ~/.near-credentials/default/msig.lak1.json

现在我需要将此添加到帐户msig中。

鉴于near shell 不提供向帐户添加新密钥的功能,我将不得不使用near repl。

near repl使用我的多重签名合约账户的 accountId启动msig,只有 1 个完整的访问密钥。

near repl --accountId msig
>

更新:(感谢@vlad-grichina 评论)

await account.addKey("PUBLIC KEY FROM GENERATE KEY", contractName, 'confirm')

因为这是一个单一的动作 tx。

一篇:(如果是捆绑动作)

现在我将创建一个addKey交易并使用该msig帐户对其进行签名。

const contractName = "msig"
const result = account.signAndSendTransaction('msig', [
    nearAPI.transactions.addKey(nearAPI.utils.PublicKey.from("PUBLIC KEY FROM GENERATE KEY"), nearAPI.transactions.functionCallAccessKey(contractName, ['confirm'], null)),
])

我可以使用近壳来验证是否添加了密钥:

near keys msig

现在我可以使用密钥来确认多重签名合约请求:

// in my JS app
await window.keyStore.setKey(
    NETWORK_ID, contractName,
    // from ~/.near-credentials/default/msig.lak1.json
    nearApi.KeyPair.fromString(secretKey)
)
const contract = new nearApi.Contract(window.contractAccount, contractName, {
    changeMethods: ['confirm'],
    sender: contractName
})
...
contract.confirm({ request_id: X }) // confirms request 

我还可以在资源管理器中检查并查看添加访问密钥 tx 是否成功: https ://explorer.testnet.near.org/accounts/msig 从资源管理器添加访问密钥图像

于 2020-06-09T15:31:31.050 回答