本文是下面介绍的 tsunagi-functions 的 Go 实现版本。

交易构建的内部处理以及给节点的通知方式也请参考以下文章。

如果您不熟悉 Symbol 区块链,可以在这里快速学习。

存储库

连接后分钟 c 土壤温度 s

为了提供功能,以后sdk这个名字会改成functions。

测试

我把测试脚本放在下面。如果可以执行,则该逻辑可以按原样用于执行。

test_0_1.go

模组.go
module hello
go 1.18

require (
	golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e
	golang.org/x/exp v0.0.0-20221004215720-b9f4876ce741
	golang.org/x/text v0.3.6
	golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect
	github.com/davecgh/go-spew v1.1.1 // indirect
	github.com/pmezard/go-difflib v1.0.0 // indirect
	github.com/stretchr/testify v1.8.0 // indirect
	gopkg.in/yaml.v3 v3.0.1 // indirect
)

测试运行
go test

实现示例

首先,让我们看一个简单的实现示例。

转账交易

func getNetworkInfo() map[string]any {
	return map[string]any{
		"version":1,
		"network":"TESTNET",
		"generationHash":"7fccd304802016bebbcd342a332f91ff1f3bb5e902988b352697be245f48e836",
		"epochAdjustment":1637848847,
		"catjasonBase":"https://xembook.github.io/tsunagi-sdk/catjson/",
	}
}

func getDeadline(network map[string]any) int {
	//	now := time.Now()
	now := network["epochAdjustment"].(int)
	deadline := ((now + 7200) - network["epochAdjustment"].(int)) * 1000
	return deadline
}

func getPayload(tx map[string]any,network map[string]any) string {
	catjson := loadCatjson(tx,network)
	layout := loadLayout(tx,catjson,false)
	preparedTx := prepareTransaction(tx,layout,network) //TX事前準備
	parsedTx := parseTransaction(preparedTx,layout,catjson,network)
	builtTx := buildTransaction(parsedTx) 
	signature := signTransaction(builtTx,"94ee0f4d7fe388ac4b04a6a6ae2ba969617879b83616e4d25710d688a89d80c7",network)
	builtTx = updateTransaction(builtTx,"signature","value",signature)
	//	txHash := hashTransaction(tx1["signer_public_key"].(string),signature,builtTx,network);
	payload := hexlifyTransaction(builtTx,0)
	return payload
}

network  := getNetworkInfo()
deadline := getDeadline(network)

tx1 := map[string]any{
	"type" : "TRANSFER",
	"signer_public_key" : "5f594dfc018578662e0b5a2f5f83ecfb1cda2b32e29ff1d9b2c5e7325c4cf7cb",
	"fee" : 25000,
	"deadline" : deadline,
	"recipient_address" : generateAddressId("TCO7HLVDQUX6V7C737BCM3VYJ3MKP6REE2EKROA"),
	"mosaics" : []any{
		map[string]any{"mosaic_id" :  0x2A09B7F9097934C2, "amount" : 1},
		map[string]any{"mosaic_id" :  0x3A8416DB2D53B6C8, "amount" : 100},
	},
	"message" : "Hello Tsunagi(Catjson) SDK!",
}

payload := getPayload(tx1,network)


通知

	client := &http.Client{}
	json, _ := json.Marshal(payload)
	req , _ := http.NewRequest(http.MethodPut, "https://sym-test-02.opening-line.jp:3001/transactions", bytes.NewBuffer(json))
	req.Header.Set("Content-Type", "application/json; charset=utf-8")
	resp, _ := client.Do(req)
	fmt.Println(resp.StatusCode)

联署

对于需要共同签名的交易,除了 tx1 之外,还必须添加以下定义和签名。


cosignature1 := map[string]any{
	"version":0,
	"signer_public_key":"6199bae3b241df60418e258d046c22c8c1a5de2f4f325753554e7fd9c650afec",
	"signature":"",
}

cosignature2 := map[string]any{
	"version":0,
	"signer_public_key":"886adfbd4213576d63ea7e7a4bece61c6933c27cd2ff36f85155c8febfb6eb4e",
	"signature":"",
}

aggTx := map[string]any{
	"type" : "AGGREGATE_COMPLETE",
	"signer_public_key" : "5f594dfc018578662e0b5a2f5f83ecfb1cda2b32e29ff1d9b2c5e7325c4cf7cb",
	"fee" : 1000000,
	"deadline" : deadline,
	"transactions": []any{tx1,tx2,tx3},
	"cosignatures": []any{cosignature1,cosignature2},
}

catjson := loadCatjson(aggTx,network)
layout := loadLayout(aggTx,catjson,false)
preparedTx := prepareTransaction(aggTx,layout,network) //TX事前準備
parsedTx := parseTransaction(preparedTx,layout,catjson,network)
builtTx := buildTransaction(parsedTx) 
signature := signTransaction(builtTx,"94ee0f4d7fe388ac4b04a6a6ae2ba969617879b83616e4d25710d688a89d80c7",network)
builtTx = updateTransaction(builtTx,"signature","value",signature)
txHash := hashTransaction(aggTx["signer_public_key"].(string),signature,builtTx,network);

preparedTx["cosignatures"].([]any)[0].(map[string]any)["signature"] = cosignTransaction(txHash,"fa6373f4f497773c5cc55c103e348b139461d61fd4b45387e69d08a68000e06b")
preparedTx["cosignatures"].([]any)[1].(map[string]any)["signature"] = cosignTransaction(txHash,"1e090b2a266877a9f88a510af2eb0945a63dc69dbce674ccd83272717d4175cf")

idx := slices.IndexFunc(layout, func(item any) bool {return item.(map[string]any)["name"] == "cosignatures"})
if idx >= 0 {
	cosignaturesLayout := layout[idx].(map[string]any)
	parsedCosignatures := parseTransaction(preparedTx,[]any{cosignaturesLayout},catjson,network)
	builtTx = updateTransaction(builtTx,"cosignatures","layout",parsedCosignatures[0].(map[string]any)["layout"])
}
payload := hexlifyTransaction(builtTx,0);

我们已经在测试脚本中编写了各种其他事务,所以请尝试一下!


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308633114.html

相关文章:

  • 2021-07-30
  • 2021-08-26
  • 2021-08-24
  • 2022-12-23
  • 2021-10-26
  • 2021-09-16
  • 2022-01-17
  • 2021-11-18
猜你喜欢
  • 2021-05-28
  • 2021-05-21
  • 2022-12-23
  • 2021-06-21
  • 2021-10-16
  • 2023-01-09
  • 2021-04-21
相关资源
相似解决方案