天天看點

手把手教你用Go語言編寫Fabric智能合約,輕松入門區塊鍊開發

作者:威哥說程式設計

以下是使用Go語言編寫的一個簡單的轉賬智能合約,代碼中有詳細的注釋:

package main

import (
	"fmt"

	"github.com/hyperledger/fabric-contract-api-go/contractapi"
)

// 定義智能合約結構體
type TransferContract struct {
	contractapi.Contract
}

// 轉賬方法,接收轉出賬戶名、轉入賬戶名和轉賬金額三個參數
func (tc *TransferContract) Transfer(ctx contractapi.TransactionContextInterface, from, to string, amount int) error {
	// 檢查轉賬金額是否合法
	if amount <= 0 {
		return fmt.Errorf("轉賬金額 %d 不合法", amount)
	}

	// 讀取轉出賬戶的餘額
	fromAccount, err := ctx.GetStub().GetState(from)
	if err != nil {
		return fmt.Errorf("讀取賬戶 %s 失敗", from)
	}

	// 如果轉出賬戶不存在,則傳回錯誤
	if fromAccount == nil {
		return fmt.Errorf("賬戶 %s 不存在", from)
	}

	// 将餘額從位元組數組中解碼為整數
	fromBalance := int(fromAccount[0])

	// 如果餘額不足,則傳回錯誤
	if fromBalance < amount {
		return fmt.Errorf("賬戶 %s 餘額不足", from)
	}

	// 更新轉出賬戶餘額
	fromBalance -= amount
	if fromBalance == 0 {
		// 如果餘額為0,則從賬本中删除該賬戶
		err = ctx.GetStub().DelState(from)
		if err != nil {
			return fmt.Errorf("删除賬戶 %s 失敗", from)
		}
	} else {
		// 如果餘額不為0,則将新餘額儲存到賬本中
		err = ctx.GetStub().PutState(from, []byte{byte(fromBalance)})
		if err != nil {
			return fmt.Errorf("更新賬戶 %s 失敗", from)
		}
	}

	// 更新轉入賬戶餘額
	toAccount, err := ctx.GetStub().GetState(to)
	if err != nil {
		return fmt.Errorf("讀取賬戶 %s 失敗", to)
	}

	// 如果轉入賬戶不存在,則建立一個新賬戶
	if toAccount == nil {
		err = ctx.GetStub().PutState(to, []byte{byte(amount)})
		if err != nil {
			return fmt.Errorf("建立賬戶 %s 失敗", to)
		}
	} else {
		// 如果轉入賬戶已存在,則将轉賬金額添加到賬戶餘額中
		toBalance := int(toAccount[0])
		toBalance += amount
		err = ctx.GetStub().PutState(to, []byte{byte(toBalance)})
		if err != nil {
			return fmt.Errorf("更新賬戶 %s 失敗", to)
		}
	}

	// 輸出轉賬資訊
	fmt.Printf("賬戶 %s 轉賬 %d 到賬戶 %s 成功\n", from, amount, to)

	return nil
}

func main() {
	// 建立新的鍊碼對象
	transferContract := new(TransferContract)

// 建立新的鍊碼
cc, err := contractapi.NewChaincode(transferContract)
if err != nil {
	return fmt.Errorf("建立鍊碼失敗: %v", err)
}

// 啟動鍊碼伺服器
if err := cc.Start(); err != nil {
	return fmt.Errorf("啟動鍊碼伺服器失敗: %v", err)
}

return nil           

以上代碼中,我們建立了一個名為`TransferContract`的智能合約,包含一個`Transfer`方法,用于實作轉賬功能。在該方法中,我們首先檢查轉賬金額是否合法,然後讀取轉出賬戶的餘額,更新轉出賬戶和轉入賬戶的餘額,并輸出轉賬資訊。最後,我們使用`contractapi.NewChaincode`建立了一個新的鍊碼,并使用`cc.Start()`方法啟動了鍊碼伺服器。

請注意,此示例僅用于示範目的。在實際開發中,您需要根據您的實際需求編寫更複雜的智能合約,并遵循Fabric的安全最佳實踐。