Previous << Capabilities
Next >> Contracts
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)
// ...
}
}
翻訳元