首页 > 其他分享 >go-ethereum mint nft用户支付实现

go-ethereum mint nft用户支付实现

时间:2023-10-02 22:00:44浏览次数:34  
标签:nil err mint BETA ethereum go panic

代码:

package main

// 签名用的公钥私钥也是采用的owner的公钥私钥

import (
	"context"
	"fmt"
	"math/big"

	"user-pay/triplec"

	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/common/hexutil"
	"github.com/ethereum/go-ethereum/crypto"
	"github.com/ethereum/go-ethereum/ethclient"
)

const (
	BETA_SERVER_ADDRESS             = "https://data-seed-prebsc-1-s1.bnbchain.org:8545"
	BETA_CONTRACT_ADDRESS           = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
	BETA_CONTRACT_OWNER_PUBLIC_KEY  = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
	BETA_CONTRACT_OWNER_PRIVATE_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
)

func GetConfig() (string, string, string, string) {
	// 默认返回 beta 配置
	return BETA_SERVER_ADDRESS, BETA_CONTRACT_ADDRESS, BETA_CONTRACT_OWNER_PUBLIC_KEY, BETA_CONTRACT_OWNER_PRIVATE_KEY
}

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

	var (
		pId            = int64(1)                                                           // 勋章ID
		dummyId        = int64(1)                                                           // 全局唯一ID,可以是表的ID,自己生成也行,仅用来进行防止重复mint
		level          = int64(0)                                                           // 勋章等级
		userPublicKey  = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"                          // 用户公钥
		userPrivateKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"                          // 用户私钥
		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)
	}

}

流程是:

0. 需要全局设置一个signer,用于验证签名的:参考上一篇文章:https://www.cnblogs.com/zhanchenjin/p/17740483.html

1. 服务器签名:使用合约管理员的私钥对一笔交易进行签名

2. 客户端使用签名发起claim交易:

标签:nil,err,mint,BETA,ethereum,go,panic
From: https://www.cnblogs.com/zhanchenjin/p/17740492.html

相关文章

  • 用go封装一下二级认证功能
    用go封装一下二级认证本篇为用go设计开发一个自己的轻量级登录库/框架吧-秋玻-博客园(cnblogs.com)的二级认证业务篇,会讲讲二级认证业务的实现,给库/框架增加新的功能。源码:https://github.com/weloe/token-go在一个系统中,为了保证账号安全性,我们除了登录之外可能还会进行......
  • go-ethereum设置signer
    设置代码:packagemain//签名用的公钥私钥也是采用的owner的公钥私钥import( "fmt" "set_signer/triplec" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethc......
  • 点云配准算法-旋转矩阵估计-Kabsch-Umeyama algorithm
    Kabsch-Umeyamaalgorithm参考文献:https://www.wikiwand.com/en/Kabsch_algorithm面向点云配准,最小化两点集均方根误差(RMSD,rootmeansquareddeviation)来计算最佳旋转矩阵。注:该算法只能计算旋转矩阵,做点云配准还需要计算平移向量。当平移和旋转都正确计算出,该算法有......
  • javascript: Sorting Algorithms
     //SortingAlgorithmsintJavaScripthttps://www.geeksforgeeks.org/sorting-algorithms//***fileSort.js*1.BubbleSort冒泡排序法*@paramarry*@paramnszie*/functionBubbleSort(arry,nszie){vari,j,temp;varswapped;for(i=0;i......
  • 10 Rules of Good and Bad Studying 学习的10条好与坏规则
    10RulesofGoodStudying良好学习的10条法则Userecall.Afteryoureadapage,lookawayandrecallthemainideas.Highlightverylittle,andneverhighlightanythingyouhaven’tputinyourmindfirstbyrecalling.Tryrecallingmainideaswhenyouare......
  • 5.go语言函数提纲
    1本篇前瞻前端时间的繁忙,未曾更新go语言系列。由于函数非常重要,为此将本篇往前提一提,另外补充一些有关go新版本前面遗漏的部分。需要恭喜你的事情是本篇学完,go语言中基础部分已经学完一半,这意味着你可以使用go语言去解决大部分的Leetcode的题,为此后面的1篇,将带领大家去巩固go语......
  • MongoDB使用教程
    一、基本概念一)数据库(database)数据库是一个仓库,在仓库中可以存放集合二)集合(collection)集合类似于数组,在集合中可以存放文档三)文档(document)文档是数据库中的最小单位,存储和操作的内容都是文档在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或......
  • MongoDB搭建
    一、Docker-composeversion:'3'services:mongodb:image:mongocontainer_name:mongodbrestart:alwaysports:-27017:27017volumes:-/var/docker/server/mongodb/database:/data/dbenvironment:-MONGO_......
  • Go结构体深度探索:从基础到应用
    在Go语言中,结构体是核心的数据组织工具,提供了灵活的手段来处理复杂数据。本文深入探讨了结构体的定义、类型、字面量表示和使用方法,旨在为读者呈现Go结构体的全面视角。通过结构体,开发者可以实现更加模块化、高效的代码设计。这篇文章旨在为您提供关于结构体的深入理解,助您更好地......
  • GO语言实战之接口实现与方法集
    写在前面嗯,学习GO,所以有了这篇文章博文内容为《GO语言实战》读书笔记之一主要涉及知识接口是什么方法集(值接收和指针接收)多态傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比......