引言
Solana Blinks 是一种链上活动链接,它允许用户直接从社交媒体或其他链下平台与区块链交互,无需导航到不同的应用程序或网页。在本文中,我们将探讨如何使用 Go 语言构建一个简单的 Blink 应用,专注于铸造 NFTs 的场景。本教程将涉及设置 Web 服务器、处理 CORS 配置、定义 API 端点以及实现铸造 NFT 的关键功能。
环境准备
首先,确保你已安装 Go 并创建一个新的项目。在命令行中运行以下命令来创建项目目录:
bash
mkdir solana_blinks
cd solana_blinks
go mod init github.com/yourusername/solana_blinks
设置 Web 服务器与 CORS 配置
接下来,我们使用 Gin 框架来设置基本的 Web 服务器和 CORS 配置。在项目根目录下创建一个 main.go
文件,添加以下代码:
“`go
package main
import (
log
net/http
os
github.com/gin-gonic/gin
github.com/yourusername/cors
)
var corsConfig = cors.DefaultConfig()
corsConfig.AllowAllOrigins = true
corsConfig.AddAllowHeaders([]string{Content-Length, Content-Type, Access-Control-Allow-Origin})
corsConfig.AddAllowMethods([]string{GET, POST, OPTIONS})
func main() {
router := gin.Default()
port := os.Getenv(PORT)
if port == {
port = 8081
}
router.Use(cors.New(corsConfig))
router.GET(/actions.json, actionsRulesHandler)
router.GET(/api/actions/mint_nft, getActionsHandler)
router.OPTIONS(/api/actions/mint_nft, optionsHandler)
router.POST(/api/actions/mint_nft, postHandler)
log.Println(StickyLabs Blink Active 🚀)
log.Println(Server is running)
err := router.Run(fmt.Sprintf(:%v, port))
if err != nil {
log.Fatal(err)
}
}
“`
定义 API 端点
在上述代码中,我们定义了几个关键的 API 端点:
- GET /actions.json:返回元数据、支持的操作和所需的参数。
- GET /api/actions/mint_nft:用于获取铸造 NFT 的元数据。
- OPTIONS /api/actions/mint_nft:处理 CORS 要求。
- POST /api/actions/mint_nft:处理铸造 NFT 的请求。
实现铸造 NFT 的主要处理程序
我们将在 main.go
文件中定义这些处理程序。以下是 getActionsHandler
和 postHandler
的实现示例:
“go
json:title
// ActionGetResponse 结构体用于返回铸造 NFT 的元数据。
type ActionGetResponse struct {
Title string
json:icon
Icon string
json:description
Description string
json:label
Label string
json:label
Links struct {
Actions []struct {
Label string
json:href
Href string
json:name
Parameters []struct {
Name string
json:label
Label string
json:required
Required bool
json:parameters
}
json:actions
}
json:links`
}
}
func getActionsHandler(c *gin.Context) {
// 这里填充铸造 NFT 的元数据
payload := ActionGetResponse{
Title: Mint NFT,
Icon: https://youricon.com/solanadevs.jpg,
Description: Transfer SOL to another Solana wallet,
Label: Transfer,
Links: struct {
Actions []struct {
Label string json:label
Href string json:href
Parameters []struct {
Name string json:name
Label string json:label
Required bool json:required
} json:parameters
} json:actions
}{
Actions: []struct {
Label string json:label
Href string json:href
Parameters []struct {
Name string json:name
Label string json:label
Required bool json:required
} json:parameters
}{
{
Label: Mint NFT,
Href: /api/actions/mintnft,
Parameters: []struct {
Name string json:name
Label string json:label
Required bool json:required
}{
{Name: name, Label: Enter the Name of the NFT, Required: true},
{Name: symbol, Label: Enter the Symbol of the NFT, Required: true},
{Name: uri, Label: Enter the Uri of the NFT, Required: true},
},
},
},
},
}
c.JSON(http.StatusOK, payload)
}
// ActionPostRequest 结构体用于接收铸造 NFT 的请求参数。
type ActionPostRequest struct {
Name string json:name
Symbol string json:symbol
URI string json:uri
}
// ActionPostResponse 结构体用于返回铸造 NFT 的序列化交易和签名信息。
type ActionPostResponse struct {
Fields ActionPostResponseFields json:fields
}
type ActionPostResponseFields struct {
Transaction string json:transaction
Message string json:message
}
func postHandler(c *gin.Context) {
var request ActionPostRequest
if err := c.ShouldBindJSON(&request); err != nil {
c.JSON(http.StatusBadRequest, gin.H{error: Invalid request data})
return
}
// 这里可以添加对 Solana API 的调用逻辑来铸造 NFT
// 假设交易序列化和签名已经完成
transaction := TXN1234567890
message := Your transaction message
response := ActionPostResponse{
Fields: ActionPostResponseFields{
Transaction: transaction,
Message: message,
},
}
c.JSON(http.StatusOK, response)
}
“`
总结
本教程提供了一个基础的框架,用于构建使用 Go 语言的 Solana Blinks 应用。通过定义适当的 API 端点和处理程序,你可以扩展此应用以支持更多类型的链上活动。确保在实际部署前,对代码进行详细的测试和安全检查。
Views: 0