0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Keys

Last updated at Posted at 2024-10-24

Accountにはそれぞれkeyが関連付けられています。アカウントにキーが追加されると、そのキーを使用してトランザクションに署名できるようになります。署名されたトランザクションはアカウントにアクセスでき、そのアカウント上で書き込み操作を実行できます。

アカウントは、keysフィールドを通じてキーを公開します。このフィールドの型はAccount.Keysです。

Account.Keys

access(all)
struct Keys {

    /// The total number of unrevoked keys in this account.
    access(all)
    let count: UInt64

    /// Returns the key at the given index, if it exists, or nil otherwise.
    ///
    /// Revoked keys are always returned, but they have `isRevoked` field set to true.
    access(all)
    view fun get(keyIndex: Int): AccountKey?

    /// Iterate over all unrevoked keys in this account,
    /// passing each key in turn to the provided function.
    ///
    /// Iteration is stopped early if the function returns `false`.
    ///
    /// The order of iteration is undefined.
    access(all)
    fun forEach(_ function: fun(AccountKey): Bool)

    /// Adds a new key with the given hashing algorithm and a weight.
    ///
    /// Returns the added key.
    access(Keys | AddKey)
    fun add(
        publicKey: PublicKey,
        hashAlgorithm: HashAlgorithm,
        weight: UFix64
    ): AccountKey

    /// Marks the key at the given index revoked, but does not delete it.
    ///
    /// Returns the revoked key if it exists, or nil otherwise.
    access(Keys | RevokeKey)
    fun revoke(keyIndex: Int): AccountKey?
}

entitlement Keys

entitlement AddKey
entitlement RevokeKey

Account key

アカウントキーの構造は次のようになります。

access(all)
struct AccountKey {

	const accountKeyHashAlgorithmFieldDocString = ``
	const accountKeyWeightFieldDocString = ``
	const accountKeyIsRevokedFieldDocString = ``

	/// The index of the account key.
    access(all)
    let keyIndex: Int

    /// The public key of the account key.
    let publicKey: PublicKey

    /// The hash algorithm used by the public key.
    let hashAlgorithm: HashAlgorithm

    /// The weight assigned to the account key,
    /// with a maximum of 1000.0
    let weight: UFix64

    /// The flag indicating whether the key is revoked.
    let isRevoked: Bool
}

有効なアカウントキーのpublicKeyフィールドは、ECDSA_P256またはECDSA_secp256k1署名アルゴリズムのPublicKeyです。Cadenceがサポートするその他の署名アルゴリズムの公開鍵は、有効なアカウント公開鍵ではありません。

公開鍵の作成および有効性に関する詳細は、public keysセクションを参照してください。

有効なアカウント鍵のhashAlgorithmフィールドは、SHA2_256またはSHA3_256のいずれかです。

Cadenceがサポートするその他のすべてのハッシュアルゴリズムは、アカウント鍵でのハッシュ処理には有効ではありません。

ハッシュアルゴリズムの詳細については、hash algorithmsセクションを参照してください。

Getting an account key

keys.get および keys.forEach 関数を使用すると、アカウントのキーを取得できます。

get関数を使用すると、特定のインデックスに一致するキーを取得できます。この関数は、キーが存在する場合はそのキーを返し、存在しない場合はnilを返します。

access(all)
view fun get(keyIndex: Int): AccountKey?

forEach 関数を使用すると、アカウントのすべてのキーを繰り返し取得し何らかの処理をすることができます。

access(all)
fun forEach(_ function: fun(AccountKey): Bool)

Accountの各keyについて、forEach関数は指定されたコールバック関数を呼び出し、そのキーを渡します。コールバック関数がtrueを返すと繰り返し処理が継続され、falseを返すと繰り返し処理が停止します。

⚠ WARNING
keys.get および keys.forEach 関数には、無効化されたキーが含まれます。無効化されたキーは、isRevokedフィールドがtrueに設定されています。

access(all)
fun main() {
    let account = getAccount(0x42)

    // Get the third key from the account.
    let thirdKey = account.keys.get(keyIndex: 2)
    // ...

    // Iterate over all keys of the account.
    account.keys.forEach(fun (key: AccountKey): Bool {
        // ...
        return true
    })
}

Adding an account key

keys.add関数は、Accountにアクセスするためのkeyを作成します。

access(Keys | AddKey)
fun add(
    publicKey: PublicKey,
    hashAlgorithm: HashAlgorithm,
    weight: UFix64
): AccountKey

add関数を呼び出すには、粗粒度のKeys権限(auth(Keys) &Account)または、細粒度のAddKey権限(auth(AddKey) &Account)で認証された参照経由でアカウントにアクセスする必要があります。

例えば、トランザクションに署名した既存のアカウントに公開鍵を追加するには、以下のようにします。

transaction(publicKey: [UInt8]) {
    prepare(signer: auth(AddKey) &Account) {
        let key = PublicKey(
            publicKey: publicKey,
            signatureAlgorithm: SignatureAlgorithm.ECDSA_P256
        )

        signer.keys.add(
            publicKey: key,
            hashAlgorithm: HashAlgorithm.SHA3_256,
            weight: 10.0
        )
    }
}

アカウントを作成する、より複雑なトランザクションでは、トランザクションの署名者がアカウント作成の費用を支払い、1つのkeyにアカウントへのアクセス権限を与えます。以下のような形になります。

transaction(publicKey: [UInt8]) {
    prepare(signer: auth(BorrowValue) &Account) {
        let key = PublicKey(
            publicKey: publicKey,
            signatureAlgorithm: SignatureAlgorithm.ECDSA_P256
        )

        let account = Account(payer: signer)

        account.keys.add(
            publicKey: key,
            hashAlgorithm: HashAlgorithm.SHA3_256,
            weight: 10.0
        )
    }
}

Revoking an account key

revoke関数は、Accountへのアクセス権をキーから取り消します。この関数は、指定されたインデックスのキーを取り消した(revoked)とマークするだけで、決して削除はしません。

access(Keys | RevokeKey)
fun revoke(keyIndex: Int): AccountKey?

revoke関数を呼び出すには、粗粒度のKeys権限(auth(Keys) &Account)または、細粒度のRevokeKey権限(auth(RevokeKey) &Account)で認証された参照によるアカウントへのアクセスが必要です。

例えば、トランザクションに署名したアカウントの3番目のキーを取り消すには:

transaction {
    prepare(signer: auth(RevokeKey) &Account) {
        let revokedKey = signer.keys.revoke(keyIndex: 2)
        // ...
    }
}

翻訳元->https://cadence-lang.org/docs/language/accounts/keys

Flow BlockchainのCadence version1.0ドキュメント (Keys)

Previous << Capabilities

Next >> Contracts

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?