흐름에 구축 | FCL 배우기 - 15. 공개 키를 추가하고 취소하는 방법
머리말
많은 트랜잭션으로 서명해야 할 때 발생할 수 있는 문제 중 하나는 단일 블록에서 계정별로 단일 트랜잭션보다 더 많은 트랜잭션에 서명할 수 없다는 것입니다. 이것은
Proposer
역할이 nounce
를 제공하는 데 사용되기 때문에 발생하며, 트랜잭션이 봉인된 후에만 계정 키에서 업데이트됩니다.해결책 - 더 많은 키를 추가해야 합니다 🔑✨!
개요
이 문서의 코드를 살펴보면 다음을 알 수 있습니다.
PublicKey
를 추가하는 방법지갑 제한
Blocto
또는 Lilico
는 0이 아닌 다른 인덱스의 키를 사용할 수 없도록 하지만 경우에 따라 일부 작업을 자동화하기 위해 프로그래밍 방식으로 사용할 수 있는 공개 키를 추가하는 것이 여전히 유용합니다. 전체 무게가 있는 키를 사용하면 계정 저장소에 액세스하고 이를 조작할 수 있습니다.조사
계속하기 전에 Flow View Source - 0x5593df7d286bcdb8에서 현재 계정을 확인하겠습니다.
😅 Considering how many times Codesandbox has been run, you probably will see multiple keys here, when you read it.
weight
가 1000(전체 가중치)인 키가 하나 이상 표시되어야 합니다.1단계 - 설치
💡You can go and fork your work from previous article as it will be mostly the same :)
"@onflow/fcl"
, elliptic
및 sha3
패키지를 종속 항목으로 추가합니다.2단계 - 서명자 만들기
이전 기사에서
signer.js
파일의 내용을 복사/붙여넣기하거나 instructions을 따라 새 기사를 만들 수 있습니다.3단계 - FCL 구성
이 예에서는 지갑을 사용하지 않을 것입니다 - 이것을 숙제로 생각하세요 😉 - 따라서 구성에는 액세스 노드 URL만 필요합니다.
config({ "accessNode.api": "https://rest-testnet.onflow.org" });
4단계 - addPublicKey 구현
addPublicKey
라는 새 함수를 만들어 보겠습니다.PublicKey
수락, weight
인수로 프로세스는 이전 기사에서 트랜잭션을 요리하는 방법과 유사합니다.
const addPublicKey = async (publicKey) => {
const cadence = `
transaction(publicKey: String, weight: UFix64) {
prepare(signer: AuthAccount) {
let bytes = publicKey.decodeHex()
let key = PublicKey(
publicKey: bytes,
signatureAlgorithm: SignatureAlgorithm.ECDSA_P256
)
var clampledWeight = weight
// weight should be in range 0 to 1000
if(clampledWeight > 1000.0){
clampledWeight = 1000.0
}
signer.keys.add(
publicKey: key,
hashAlgorithm: HashAlgorithm.SHA3_256,
weight: clampledWeight
)
}
}
`;
// List of arguments
const weight = (0).toFixed(1) // zero weight keys are perfectly fine for Proposer role
const args = (arg, t) => [
arg(publicKey, t.String),
arg(weight, t.UFix64)
];
// Roles
const proposer = signer;
const payer = signer;
const authorizations = [signer];
// Execution limit
const limit = 1000
// "mutate" method will return us transaction id
const txId = await mutate({
proposer, payer, authorizations,
cadence, args, limit
});
// Then we subscribe to status updates and return, when it's sealed
return tx(txId).onceSealed();
};
5단계 - revokePublicKey 구현
우리가 준비하고 싶은 또 다른 함수는
revokePublicKey
입니다. 트랜잭션을 준비하고 제출하면 계정의 키가 취소됩니다.const revokePublicKey = async (keyIndex) => {
const cadence = `
transaction(keyIndex: Int){
prepare(signer: AuthAccount){
signer.keys.revoke(keyIndex:keyIndex)
}
}
`;
const args = (arg, t) => [arg(keyIndex.toString(), t.Int)];
const proposer = signer;
const payer = signer;
const authorizations = [signer];
const limit = 1000;
// "mutate" method will return us transaction id
const txId = await mutate({
cadence, args, limit,
proposer, payer, authorizations
});
// Then we subscribe to status updates and return, when it's sealed
return tx(txId).onceSealed();
};
드디어 -
파일 끝에 IIFE를 추가하고 방금 정의한 메서드로 채우겠습니다.
(async () => {
console.clear();
// PublicKey doesn't need to be unique, so we are gonna use exactly the same one
// that already exist on account. This way we can control it with the same private key.
const key =
"790a6849decbc179e9904f7f601fbd629f1687f371484998ceb8c587303e05ae4f859c7aa91f8493642de1039039d2da9650b4b7d9d44d2486e7a2adabf602bc";
// Uncomment this block to add public key
/*
const txDetails = await addPublicKey(key);
console.log({ txDetails });
*/
// Uncomment this block to revoke key
/*
const txDetails = await revokePublicKey(2);
console.log({ txDetails });
*/
})();
문제가 해결되면 콘솔에 다음과 같은 출력이 표시되어 트랜잭션이 성공적으로 계정을 업데이트했음을 보여줍니다.
txDetails: {
blockId: "b9ddfac94c968864ca369ec890e8025c0144375f334bd0e2ddea1965b175fc82",
status: 4,
statusString: "SEALED",
statusCode: 0,
errorMessage: "",
events: Array(4),
0: Object {
type: "flow.AccountKeyAdded"
transactionId: "fa2640f428a3317b656196ef7f069a744b2455569e492f8112d37abca31e273d"
transactionIndex: 0
eventIndex: 0
data: Object
},
1: Object,
2: Object,
3: Object,
}
Flow View Source를 확인하면 이제 사용할 수 있는 여러 키가 표시됩니다.
revokePublicKey
사용 블록의 주석을 해제하고 실행을 기다리면 키가 해지된 것으로 표시된 것을 확인할 수 있습니다.💡 Please note, that keys are not
removed
, butrevoked
- you won’t be able to use this key index on this account anymore 🤷♂️
이 기사가 도움이 되었기를 바랍니다. 그리고 당신이 우리와 함께 그것을 겪었다면 - 당신은 더 강해졌습니다! 💪
다음 시간까지 👋
자원
전체 소스 코드 - https://codesandbox.io/s/dev-to-15-add-public-key-cvfho2
Cadence 문서 - 키 추가 - https://docs.onflow.org/cadence/language/accounts/#add-account-keys
Cadence 문서 - 키 취소 - https://docs.onflow.org/cadence/language/accounts/#revoke-account-keys
유용할 수 있는 기타 리소스:
Flow Docs 사이트 - https://docs.onflow.org/ - Flow 블록체인 및 상호 작용 방법에 대한 자세한 정보
Flow Portal - https://flow.com/ - Flow 진입점
FCL JS - https://github.com/onflow/fcl-js - 소스 코드 및 FCL JS 라이브러리에 기여하는 기능
케이던스 - https://docs.onflow.org/cadence/ - 케이던스 소개
Codesandbox - https://codesandbox.io - 빠른 프로토타이핑을 지원하는 놀라운 브라우저 내 IDE
Reference
이 문제에 관하여(흐름에 구축 | FCL 배우기 - 15. 공개 키를 추가하고 취소하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/onflow/build-on-flow-learn-fcl-15-how-to-add-and-revoke-public-keys-4k8c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)