bsc的dummyId, 在非0的情况下,如果出现重复,bscscan会报fail

发布时间 2023-10-31 15:39:47作者: 若-飞

bsc的dummyId,

在非0的情况下,如果出现重复,bscscan会报fail:

主要代码是这样:

func main() {
	serverAddress, contractAddress, ownerPublicKey, ownerPrivateKey := GetConfig()
	fmt.Printf("serverAddress:%v, contractAddress:%v, ownerPublicKey:%v, ownerPrivateKey:%v", serverAddress, contractAddress, ownerPublicKey, ownerPrivateKey)

	// 注意,如果dummyId重复了,会导致网络fail!!!
	// dummyId如果为0是无所谓的
	var (
		pId            = int64(0)                                                           // 勋章ID
		dummyId        = int64(0)                                                           // 全局唯一ID,可以是表的ID,自己生成也行,仅用来进行防止重复mint
		level          = int64(0)                                                           // 勋章等级
		userPublicKey  = "0x42e89025aa15e8c70aa5b713f"                      
		userPrivateKey = "x x x x x" 
		canTransfer    = false                                                              // 勋章是否支持转账
	)

	// 连接到节点
	client, _ := ethclient.Dial(serverAddress)
	chainId, err := client.ChainID(context.Background())
	if err != nil {
		panic(err)
	}

	// 服务器签名:使用合约管理员的私钥
	sign, err := MedalNftSigner(ownerPrivateKey, chainId.Int64(), contractAddress, pId, dummyId, level, userPublicKey, canTransfer)
	if err != nil {
		panic(err)
	}
	fmt.Printf("sign:%v\n", sign)

	// 用户信息
	userPrivateKeyEcdsa, err := crypto.HexToECDSA(userPrivateKey)
	if err != nil {
		panic(err)
	}
	auth, err := Author(userPrivateKeyEcdsa, client, 500000, 0)
	if err != nil {
		panic(err)
	}

	medal, err := triplec.NewTriplec(common.HexToAddress(contractAddress), client)
	if err != nil {
		panic(err)
	}

	// 客户端调用claim,验证签名:签名
	{
		signBytes, err := hexutil.Decode(sign)
		if err != nil {
			panic(err)
		}

		tx, err := medal.Claim(auth, big.NewInt(pId), big.NewInt(dummyId), big.NewInt(level), common.HexToAddress(userPublicKey), canTransfer, signBytes)
		if err != nil {
			panic(err)
		}
		hash := tx.Hash().Hex()
		fmt.Printf("hash:%s \n", hash)
	}

}