我实现的方法

function ethPacked(params){
  return web3.utils.encodePacked(...params);
}


function msgToHashToSign(params){
    // const message = "0x" + keccak256(str).toString('hex');
    const packed = ethPacked(params);
    const message = "0x" + keccak256(packed).toString('hex');
    const signature = web3.eth.accounts.sign(message, pv);
    return signature;
}

erc 1155 数组等参数实现方法

function encodeSyncFunction(
  Ids,
  Amounts,
) {
  return web3.utils.keccak256(
    web3.eth.abi.encodeParameters(
      [
        "uint256[]",
        "uint256[]"
      ],
      [
        Ids,
        Amounts
      ]
    )
  );
}

const encode = encodeSyncFunction(
    [
      200,
      201
    ],
    [
      "11000000000000000000",
      "2000000000000000000"
    ]
  );

const signature = web3.eth.accounts.sign(encode, pv);
res.send(signature);

合约内验证

生成 相同的数据哈希 return keccak256(abi.encode()); 在传入msg.sender参数
require(verify(相同数据哈希, signature), "SunflowerLand: Unauthorised");