체인의정석

web3.utils.soliditySha3 와 ethers.utils.solidityKeccak256 본문

블록체인/Solidity

web3.utils.soliditySha3 와 ethers.utils.solidityKeccak256

체인의정석 2022. 6. 22. 11:20
728x90
반응형

https://ethereum.stackexchange.com/questions/123232/how-to-use-ethers-keccak256

 

How to use ethers keccak256?

I tried to use ethers' keccak256 function like this: import { keccak256 } from "@ethersproject/keccak256"; const signature = keccak256("balanceOf(address)"); But the script fa...

ethereum.stackexchange.com

솔리디티 자체에 해시가 들어가는 경우

ethers에서는 keccack256
web3에서는 web3.utils.soliditySha3를 사용면 된다.

 

이때 ethers의 경우 타입을 지정해주지 않으면 다른 값이 입력 될 수 있기 때문에

solidityKeccack256에 타입을 지정해 준다.

https://docs.ethers.io/v5/api/utils/hashing/#utils-solidityKeccak256

 

Hashing Algorithms

Documentation for ethers, a complete, tiny and simple Ethereum library.

docs.ethers.io

utils.solidityPack([ "int16", "uint48" ], [ -1, 12 ])
// '0xffff00000000000c'

utils.solidityPack([ "string", "uint8" ], [ "Hello", 3 ])
// '0x48656c6c6f03'

utils.solidityKeccak256([ "int16", "uint48" ], [ -1, 12 ])
// '0x81da7abb5c9c7515f57dab2fc946f01217ab52f3bd8958bc36bd55894451a93c'

utils.soliditySha256([ "int16", "uint48" ], [ -1, 12 ])
// '0xa5580fb602f6e2ba9c588011dc4e6c2335e0f5d970dc45869db8f217efc6911a'

// As a short example of the non-distinguished nature of
// Solidity tight-packing (which is why it is inappropriate
// for many things from a security point of view), consider
// the following examples are all equal, despite representing
// very different values and layouts.

utils.solidityPack([ "string", "string" ], [ "hello", "world01" ])
// '0x68656c6c6f776f726c643031'

utils.solidityPack([ "string", "string" ], [ "helloworld", "01" ])
// '0x68656c6c6f776f726c643031'

utils.solidityPack([ "string", "string", "uint16" ], [ "hell", "oworld", 0x3031 ])
// '0x68656c6c6f776f726c643031'

utils.solidityPack([ "uint96" ], [ "32309054545061485574011236401" ])
// '0x68656c6c6f776f726c643031'

그 결과 오픈씨의 wyvernExchange의 입력값을 암호화 한 부분은 아래와 같이 진행이 되었다.

  const hash = ethers.utils.solidityKeccak256(
    [
      "address",
      "address",
      "address",
      "uint",
      "uint",
      "uint",
      "uint",
      "address",
      "uint8",
      "uint8",
      "uint8",
      "address",
      "uint8",
      "bytes",
      "bytes",
      "address",
      "bytes",
      "address",
      "uint",
      "uint",
      "uint",
      "uint",
      "uint",
    ],
    [
      order.exchange,
      order.maker,
      order.taker,
      BigNumber.from(order.makerRelayerFee).toString(),
      BigNumber.from(order.takerRelayerFee).toString(),
      BigNumber.from(order.takerProtocolFee).toString(),
      BigNumber.from(order.takerProtocolFee).toString(),
      order.feeRecipient,
      order.feeMethod.toString(),
      order.side.toString(),
      order.saleKind.toString(),
      order.target,
      order.howToCall.toString(),
      order.calldata,
      order.replacementPattern,
      order.staticTarget,
      order.staticExtradata,
      order.paymentToken,
      BigNumber.from(order.basePrice).toString(),
      BigNumber.from(order.extra).toString(),
      BigNumber.from(order.listingTime).toString(),
      BigNumber.from(order.expirationTime).toString(),
      order.salt.toString(),
    ]
  );
728x90
반응형
Comments