golang区块链智能合约开发套件插件库gno的使用

Golang区块链智能合约开发套件插件库Gno的使用

Gno是一个基于Tendermint共识的区块链平台,它解释了一种确定性的Go变体用于编写智能合约。

关键特性

  • Go语法:如果你了解Go,你就了解Gno
  • 确定性执行:完全可预测的合约行为
  • 可组合包:像常规Go一样导入和重用代码
  • 自动持久化状态:全局变量在调用之间自动保存
  • 贡献系统:奖励开源贡献者
  • 开发者体验:包括测试、调试和热重载开发的全面工具

快速开始

安装Gno

# 克隆Gno仓库
git clone https://github.com/gnolang/gno.git
cd gno

# 构建Gno
make install

第一个智能合约示例

下面是一个简单的Gno智能合约示例,实现了一个基本的计数器:

// counter.gno
package counter

// 状态变量会自动持久化
var count int

// 增加计数器
func Increment() {
    count++
}

// 减少计数器
func Decrement() {
    count--
}

// 获取当前计数
func GetCount() int {
    return count
}

// 重置计数器
func Reset() {
    count = 0
}

部署合约

# 部署合约到测试网络
gnokey maketx addpkg \
    --pkgpath "gno.land/r/demo/counter" \
    --pkgdir "./examples/counter" \
    --gas-fee 1ugnot \
    --gas-wanted 2000000 \
    --broadcast true \
    --chainid "testchain" \
    --remote "testnet.gno.land:36657" \
    mykey

调用合约方法

// call_counter.gno
package main

import (
    "std"
    
    "gno.land/r/demo/counter"
)

func main() {
    // 调用合约方法
    counter.Increment()
    count := counter.GetCount()
    
    // 打印结果
    std.Print("Current count: ", count)
}

Gno Playground

Gno Playground是一个Web应用程序,允许用户编写、共享和部署Gno代码。开发者可以无缝地测试、调试和部署领域和包,同时能够与同行合作处理项目并寻求帮助。

更多示例

Gno仓库提供了多个智能合约示例:

  1. Bank - 基本代币合约
  2. Escrow - 托管合约
  3. Auction - 拍卖合约
  4. DAO - 去中心化自治组织
  5. NFT - 非同质化代币合约

社区资源

  • Discord - 实时支持和开发讨论
  • Twitter - 官方公告和更新
  • YouTube - 教程、研讨会和开发电话
  • Reddit - 论坛式讨论

贡献指南

欢迎通过GitHub Issues报告错误和请求功能,或遵循贡献指南提交代码。


更多关于golang区块链智能合约开发套件插件库gno的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang区块链智能合约开发套件插件库gno的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Gno:Go语言区块链智能合约开发套件

Gno (Gnolang) 是一个基于Go语言的智能合约开发框架,专为区块链应用设计。它提供了完整的工具链和运行时环境,让开发者能够用熟悉的Go语法编写智能合约。

Gno核心特性

  1. Go语言兼容:使用Go语法和大部分标准库
  2. 确定性执行:确保区块链节点间执行结果一致
  3. 轻量级VM:比WASM更高效的执行环境
  4. 内置安全机制:防止不安全的操作

安装Gno开发环境

# 安装gnokey和gno开发工具
go install github.com/gnolang/gno/gnokey@latest
go install github.com/gnolang/gno/gno@latest

# 验证安装
gno version
gnokey version

开发第一个智能合约

创建一个简单的计数器合约:

// counter.gno
package counter

import "std"

var count int

func Increment() {
    count++
}

func GetCount() int {
    return count
}

func init() {
    count = 0 // 初始化计数器
}

部署合约到测试网络

// deploy.gno
package main

import (
    "std"
    "gno.land/p/demo/counter"
)

func main() {
    // 部署合约
    std.DeployContract("counter", counter.Package{})
}

使用gnokey部署:

gnokey maketx addpkg \
    --pkgpath "gno.land/r/demo/counter" \
    --pkgdir ./counter \
    --gas-fee 1ugnot \
    --gas-wanted 2000000 \
    --broadcast true \
    --chainid testchain \
    --remote testnet.gno.land:36657 \
    mykey

与合约交互

调用合约方法:

// call.gno
package main

import (
    "std"
    "gno.land/r/demo/counter"
)

func main() {
    // 调用Increment方法
    counter.Increment()
    
    // 获取当前计数
    current := counter.GetCount()
    std.Print(current)
}

Gno标准库重要组件

  1. std:提供区块链基础操作
  2. gno.land/p/demo:示例合约
  3. gno.land/r/demo:可执行合约

测试合约

Gno支持原生Go测试:

// counter_test.gno
package counter

import "testing"

func TestCounter(t *testing.T) {
    if GetCount() != 0 {
        t.Fatal("count should be 0 at start")
    }
    
    Increment()
    if GetCount() != 1 {
        t.Fatal("count should be 1 after increment")
    }
}

运行测试:

gno test counter.gno

最佳实践

  1. 保持合约简单:复杂逻辑拆分为多个合约
  2. 最小化存储使用:区块链存储成本高
  3. 输入验证:严格验证所有外部输入
  4. 事件日志:使用std.Log记录重要操作
  5. 升级策略:设计可升级的合约架构

高级特性示例

// bank.gno
package bank

import (
    "std"
    "strings"
)

var balances = std.NewMap[string]int64{}

// Deposit adds amount to account's balance
func Deposit(account string, amount int64) {
    if amount <=  {
        panic("amount must be positive")
    }
    
    if !strings.HasPrefix(account, "gno1") {
        panic("invalid account format")
    }
    
    current := balances.Get(account, 0)
    balances.Set(account, current+amount)
    
    std.Log("Deposit", account, amount)
}

// Withdraw subtracts amount from account's balance
func Withdraw(account string, amount int64) {
    current := balances.Get(account, 0)
    if current < amount {
        panic("insufficient balance")
    }
    balances.Set(account, current-amount)
}

// Balance returns the account's balance
func Balance(account string) int64 {
    return balances.Get(account, 0)
}

Gno为Go开发者提供了进入区块链世界的便捷通道,结合了Go语言的简洁性和区块链的安全特性,是开发去中心化应用的强大工具。

回到顶部