BSC合约buyTokenByTokenWithPermission的bytes_signature生成方法问询
生成合约所需
_signature参数的实现方法 核心原理
你传入的_signature是给_verifyWhitelist方法做白名单校验用的,本质是项目方专属签名私钥对你调用参数中_candidate、_maxAmount、_minAmount三个字段的ECDSA数字签名,只有用对应私钥生成的签名才能通过合约校验。
从你给出的链上调用参数可以看到,签名是标准的65字节以太坊签名,结构为:32字节r + 32字节s + 1字节v,对应你贴的参数中[8]是r、[9]是s、[10]最后1位是v值(0x1c对应十进制28)。
Python实现步骤
首先安装依赖:
pip install web3 eth-account
代码示例:
from web3 import Web3 from eth_account import Account from eth_account.messages import encode_defunct # 1. 填入你调用合约时的三个参数,必须和传入buyTokenByTokenWithPermission的参数完全一致 candidate = "0x2cff6fb5a463735d65c29d933ce7f1c45350cb33" # 对应调用参数里的_candidate max_amount = 107945000000000000000 # 对应调用参数里的_maxAmount,十六进制转十进制 min_amount = 0 # 对应调用参数里的_minAmount,十六进制转十进制 # 2. 按照合约_verifyWhitelist里的规则拼接原始消息 # 注意:如果合约用了EIP-712,这里要换成对应EIP-712的编码逻辑,以下是最常见的EIP-191个人签名规则示例 message = Web3.solidity_keccak( ["address", "uint256", "uint256"], [candidate, max_amount, min_amount] ) # 添加以太坊标准个人签名前缀 encoded_message = encode_defunct(hexstr=message.hex()) # 3. 用项目方的白名单签名私钥完成签名 sign_private_key = "你的项目方专属签名私钥" signature_obj = Account.sign_message(encoded_message, sign_private_key) # 4. 拼接得到最终要传入的bytes参数 signature_bytes = signature_obj.r.to_bytes(32, 'big') + signature_obj.s.to_bytes(32, 'big') + signature_obj.v.to_bytes(1, 'big')
注意事项
- 必须持有项目方用于白名单签名的私钥才能生成合法签名,无对应私钥生成的签名都会被合约拦截,报错
POOL:INVALID_SIGNATURE - 编码消息的规则必须和合约
_verifyWhitelist中的规则完全一致,若合约用了EIP-712、加了链ID/合约地址作为重放防护参数,需要对应调整消息拼接逻辑 - 最终生成的
signature_bytes可以直接作为_signature参数传入合约调用
内容的提问来源于stack exchange,提问作者T digger888
相关产品推荐
相关产品推荐

