흐름에 구축 | FCL 배우기 - 15. 공개 키를 추가하고 취소하는 방법

머리말



많은 트랜잭션으로 서명해야 할 때 발생할 수 있는 문제 중 하나는 단일 블록에서 계정별로 단일 트랜잭션보다 더 많은 트랜잭션에 서명할 수 없다는 것입니다. 이것은 Proposer 역할이 nounce 를 제공하는 데 사용되기 때문에 발생하며, 트랜잭션이 봉인된 후에만 계정 키에서 업데이트됩니다.

해결책 - 더 많은 키를 추가해야 합니다 🔑✨!

개요



이 문서의 코드를 살펴보면 다음을 알 수 있습니다.
  • Flow View Source를 사용하여 계정에서 공개 키를 검색하는 방법
  • 설정된 중량
  • 으로 새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" , ellipticsha3 패키지를 종속 항목으로 추가합니다.

    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, but revoked - 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
  • 좋은 웹페이지 즐겨찾기