|
1 | 1 | package goar
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "github.com/everFinance/goar/types" |
4 | 5 | "github.com/everFinance/goar/utils"
|
5 | 6 | "github.com/stretchr/testify/assert"
|
6 | 7 | "io/ioutil"
|
7 | 8 | "os"
|
| 9 | + "strconv" |
8 | 10 | "testing"
|
9 | 11 | )
|
10 | 12 |
|
@@ -348,3 +350,76 @@ func TestNewTempConn2(t *testing.T) {
|
348 | 350 | err = utils.VerifyBundleItem(*item)
|
349 | 351 | assert.NoError(t, err)
|
350 | 352 | }
|
| 353 | + |
| 354 | +func TestNewClient2(t *testing.T) { |
| 355 | + arTx := "b92IF6ZX0owPFcssPcs-qOBN2nuR0d3xLYOSovh1eck" |
| 356 | + c := NewClient("https://arweave.net") |
| 357 | + data, err := c.GetTransactionDataByGateway(arTx) |
| 358 | + |
| 359 | + assert.NoError(t, err) |
| 360 | + // data bundle binary |
| 361 | + bundle, err := utils.DecodeBundle(data) |
| 362 | + assert.NoError(t, err) |
| 363 | + |
| 364 | + bundleItems := bundle.Items |
| 365 | + for _, item := range bundleItems { |
| 366 | + t.Log(item.Id) |
| 367 | + } |
| 368 | +} |
| 369 | + |
| 370 | +func TestNewWallet2(t *testing.T) { |
| 371 | + c := NewClient("https://arweave.net") |
| 372 | + offsetResponse, err := c.getTransactionOffset("47KozLIAfVMKdxq1q3D1xFZmRpkahOOBQ8boOjSydnQ") |
| 373 | + assert.NoError(t, err) |
| 374 | + t.Log(offsetResponse.Offset) |
| 375 | + t.Log(offsetResponse.Size) |
| 376 | + size, err := strconv.ParseInt(offsetResponse.Size, 10, 64) |
| 377 | + assert.NoError(t, err) |
| 378 | + endOffset, err := strconv.ParseInt(offsetResponse.Offset, 10, 64) |
| 379 | + assert.NoError(t, err) |
| 380 | + startOffset := endOffset - size + 1 |
| 381 | + firstChunk, err := c.getChunkData(startOffset) |
| 382 | + assert.NoError(t, err) |
| 383 | + |
| 384 | + // 从 firstChunk 中获取 itemNum |
| 385 | + itemsNum := utils.ByteArrayToLong(firstChunk[:32]) |
| 386 | + t.Log(itemsNum) // 739 |
| 387 | + |
| 388 | + // 解析出 item headers 并找到headers 的 offset |
| 389 | + bundleItemStart := 32 + itemsNum*64 |
| 390 | + if len(firstChunk) < bundleItemStart { |
| 391 | + // todo 需要拉取后面的多个 chunks |
| 392 | + } |
| 393 | + containHeadersChunks := firstChunk // todo |
| 394 | + for i := 0; i < itemsNum; i++ { |
| 395 | + headerBegin := 32 + i*64 |
| 396 | + end := headerBegin + 64 |
| 397 | + headerByte := containHeadersChunks[headerBegin:end] |
| 398 | + itemBinaryLength := utils.ByteArrayToLong(headerByte[:32]) |
| 399 | + id := utils.Base64Encode(headerByte[32:64]) |
| 400 | + |
| 401 | + // --------- 1 ----2 ------ |
| 402 | + if id == "UCTEOaljmuutGJId-ktPY_q_Gbal8tyJuLfyR6BeaGw" { |
| 403 | + t.Log("found item") |
| 404 | + t.Log("item start offset", "offset", bundleItemStart, "length", itemBinaryLength) |
| 405 | + startChunkNum := bundleItemStart / types.MAX_CHUNK_SIZE |
| 406 | + startChunkOffset := bundleItemStart % types.MAX_CHUNK_SIZE |
| 407 | + data := make([]byte, 0, itemBinaryLength) |
| 408 | + for offset := startOffset + int64(startChunkNum*types.MAX_CHUNK_SIZE); offset <= startOffset+int64(bundleItemStart+itemBinaryLength); { |
| 409 | + chunk, err := c.getChunkData(offset) |
| 410 | + assert.NoError(t, err) |
| 411 | + data = append(data, chunk...) |
| 412 | + offset += int64(len(chunk)) |
| 413 | + } |
| 414 | + itemData := data[startChunkOffset : startChunkOffset+itemBinaryLength] |
| 415 | + item, err := utils.DecodeBundleItem(itemData) |
| 416 | + assert.NoError(t, err) |
| 417 | + dd, _ := utils.Base64Decode(item.Data) |
| 418 | + t.Log(string(dd)) |
| 419 | + t.Log(item.Id) |
| 420 | + t.Log(item.SignatureType) |
| 421 | + } |
| 422 | + |
| 423 | + bundleItemStart += itemBinaryLength // next itemBy start offset |
| 424 | + } |
| 425 | +} |
0 commit comments