EIP712에 대하여

김대익·2022년 2월 9일
4

EIP712 signTypedData는 기존의 경우 사용자가 서명할 때 hash값을 보고 서명하기 때문에
일반 사용자들은 이 서명이 내가 서명하려는 값이 맞는지 확인하기 힘들었기 때문에
사용자에게 hash값이 아닌 서명을 하는 내용을 보여주어 이상한 내용에 서명하게하는 사기를 방지하기위해 만들어졌다.

이러한 signTypedData함수는 현재 4버전까지 나와있으며 버전에 따라 이런 차이점이 있다.

// signTypedData_v4 example
window.ethereum.enable().then(accounts => {
  const from = accounts[0];
  const typedData = {
    domain: {
      chainId: 1,
      name: "ckb.pw",
      verifyingContract: "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC",
      version: "1"
    },
    message: {
      // CKBTransaction에 타입 기입
      hash:
        "0x304daae8b785d35000cf209e65105a38339f539df7171fdbbec36a79abc2edf5",
      fee: "0.00000509CKB",
      "input-sum": "99899.99999491CKB",
      to: [
      	// Output에 타입 기입
        {
          address: "ckt1qny...ufs62l5",
          amount: "100.00000000CKB"
        },
        {
          address: "ckt1qny...ufs62l5",
          amount: "99799.99998982CKB"
        }
      ]
    },
    // domain에 있던 타입
    primaryType: "CKBTransaction",
    types: {
      EIP712Domain: [
        {
          name: "name",
          type: "string"
        },
        {
          name: "version",
          type: "string"
        },
        {
          name: "chainId",
          type: "uint256"
        },
        {
          name: "verifyingContract",
          type: "address"
        }
      ],
      // message에 있던 타입
      CKBTransaction: [
        {
          name: "hash",
          type: "bytes32"
        },
        {
          name: "fee",
          type: "string"
        },
        {
          name: "input-sum",
          type: "string"
        },
        {
          name: "to",
          type: "Output[]"
        }
      ],
      // to에 있던 타입
      Output: [
        {
          name: "address",
          type: "string"
        },
        {
          name: "amount",
          type: "string"
        }
      ]
    }
  };

  ethereum.sendAsync(
    {
      // 메타마스크에서 이 메서드를 제공한다.
      method: "eth_signTypedData_v4",
      params: [from, JSON.stringify(typedData)],
      from
    },
    (err, r) => {
      console.log(err, r);
      alert(err ? err.message : r.result);
    }
  );
});

예제 함수의 실행 모습이다. 서명을 하기 전에 내용들을 보여주고 서명을 누르게되면

해시화된 값을 리턴한다.

이 값은 타원곡선암호화 r, s, v값을 concate 값으로 0~64, 64~128, 128~130으로 다시 나누어
ercrecover함수에 인수로 사용하여 서명한 사람의 공개키를 얻을 수 있다.

클레이튼에서 사용해보려했지만 이 함수를 지원하지 않는다고한다.

참조
https://coinyuppie.com/an-example-to-explain-eip-712/
(SignTypedData_v3를 설명한 글)

1개의 댓글

comment-user-thumbnail
2023년 3월 24일

도움 많이되었습니다. 감사합니다.

답글 달기