You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:54:05