以下是使用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的安全最佳實踐。