[The Graph] AssemblyScript API

[The Graph] AssemblyScript API

Trang này tài liệu những API tích hợp có thể được sử dụng khi viết ánh xạ đồ thị con. Hai loại API có sẵn ngay lập tức:

Cũng có thể thêm các thư viện khác làm phụ thuộc, miễn là chúng tương thích với AssemblyScript . Vì đây là ánh xạ ngôn ngữ được viết bằng, nên AssemblyScript wiki là một nguồn tốt cho ngôn ngữ và các tính năng thư viện tiêu chuẩn.

Cài đặt

Các đồ thị con được tạo ra graph init đi kèm với các phụ thuộc được định cấu hình trước. Tất cả những gì cần thiết để cài đặt các phần phụ thuộc này là chạy một trong các lệnh sau:

yarn install # Yarn
npm install  # NPM

Nếu đồ thị con được tạo từ đầu, một trong hai lệnh sau sẽ cài đặt thư viện Graph TypeScript dưới dạng phụ thuộc:

yarn add --dev @graphprotocol/graph-ts         # Yarn
npm install --save-dev @graphprotocol/graph-ts # NPM

Tham chiếu API

Các @graphprotocol/graph-tsthư viện cung cấp các API sau:

  • Một ethereumAPI để làm việc với các hợp đồng thông minh Ethereum, sự kiện, khối, giao dịch và giá trị Ethereum.
  • Một storeAPI để tải và lưu các thực thể từ và vào cửa hàng Graph Node.
  • Một logAPI để ghi thông báo vào đầu ra Graph Node và Graph Explorer.
  • Một ipfsAPI để tải các tệp từ IPFS.
  • Một jsonAPI để phân tích dữ liệu JSON.
  • Một cryptoAPI để sử dụng các hàm mật mã.
  • Nguyên thủy cấp thấp để dịch giữa các hệ thống kiểu khác nhau như Ethereum, JSON, GraphQL và AssemblyScript.

Các loại tích hợp

Có thể tìm thấy tài liệu về các kiểu cơ sở được tích hợp trong AssemblyScript trong AssemblyScript wiki .

Các loại bổ sung sau đây được cung cấp bởi @graphprotocol/graph-ts.

ByteArray

import { ByteArray } from '@graphprotocol/graph-ts'

ByteArrayđại diện cho một mảng u8.

Xây dựng

  • fromI32(x: i32): ByteArray– Phân hủy xthành từng byte.
  • fromHexString(hex: string): ByteArray– Độ dài đầu vào phải chẵn. Tiền tố với 0xlà tùy chọn.

Nhập chuyển đổi

  • toHexString(): string– Chuyển đổi thành chuỗi hex có tiền tố 0x.
  • toString(): string – Thông dịch các byte dưới dạng chuỗi UTF-8.
  • toBase58(): string – Mã hóa các byte thành một chuỗi base58.
  • toU32(): u32– Thông dịch các byte như một phần tử nhỏ u32. Ném trong trường hợp tràn.
  • toI32(): i32– Thông dịch mảng byte dưới dạng một bit-endian i32. Ném trong trường hợp tràn.

Người điều hành

  • equals(y: ByteArray): bool– có thể được viết là x == y.

BigDecimal

import { BigDecimal } from '@graphprotocol/graph-ts'

BigDecimal được sử dụng để biểu diễn số thập phân chính xác tùy ý.

Xây dựng

  • constructor(bigInt: BigInt)– tạo một BigDecimaltừ an BigInt.
  • static fromString(s: string): BigDecimal – phân tích cú pháp từ một chuỗi thập phân.

Nhập chuyển đổi

  • toString(): string – in ra một chuỗi thập phân.

môn Toán

  • plus(y: BigDecimal): BigDecimal– có thể được viết là x + y.
  • minus(y: BigDecimal): BigDecimal– có thể được viết là x - y.
  • times(y: BigDecimal): BigDecimal– có thể được viết là x * y.
  • dividedBy(y: BigDecimal): BigDecimal– có thể được viết là x / y.
  • equals(y: BigDecimal): bool– có thể được viết là x == y.
  • notEqual(y: BigDecimal): bool– có thể được viết là x != y.
  • lt(y: BigDecimal): bool– có thể được viết là x < y.
  • le(y: BigDecimal): bool– có thể được viết là x <= y.
  • gt(y: BigDecimal): bool– có thể được viết là x > y.
  • ge(y: BigDecimal): bool– có thể được viết là x >= y.
  • neg(): BigDecimal– có thể được viết là -x.

BigInt

import { BigInt } from '@graphprotocol/graph-ts'

BigIntđược sử dụng để biểu diễn số nguyên lớn. Điều này bao gồm các giá trị Ethereum thuộc loại uint32đến uint256và int64đến int256. Mọi thứ bên dưới uint32, chẳng hạn như int32uint24hoặc int8được biểu thị bằng i32.

Các BigIntlớp có API sau:

Xây dựng

  • BigInt.fromI32(x: i32): BigInt– tạo ra BigInttừ mộti32
  • BigInt.fromUnsignedBytes(x: Bytes): BigInt– Thông dịch bytesdưới dạng số nguyên không dấu, ít cuối. Nếu đầu vào của bạn là big-endian, hãy gọi .reverse() trước.
    • BigInt.fromSignedBytes(x: Bytes): BigInt– Thông dịch bytesdưới dạng số nguyên có dấu, có dấu nhỏ. Nếu đầu vào của bạn là big-endian, hãy gọi .reverse()trước.

    Nhập chuyển đổi

  • x.toHex(): string– Biến BigIntthành một chuỗi ký tự thập lục phân.
  • x.toString(): string– chuyển BigIntthành chuỗi số thập phân.
  • x.toI32(): i32– trả về BigIntdưới dạng một i32; không thành công nếu giá trị không phù hợp i32. Bạn nên kiểm tra trước x.isI32().
  • x.toBigDecimal(): BigDecimal – Chuyển đổi thành số thập phân không có phần phân số.

môn Toán

  • x.plus(y: BigInt): BigInt– có thể được viết là x + y.
  • x.minus(y: BigInt): BigInt– có thể được viết là x - y.
  • x.times(y: BigInt): BigInt– có thể được viết là x * y.
  • x.dividedBy(y: BigInt): BigInt– có thể được viết là x / y.
  • x.mod(y: BigInt): BigInt– có thể được viết là x % y.
  • x.equals(y: BigInt): bool– có thể được viết là x == y.
  • x.notEqual(y: BigInt): bool– có thể được viết là x != y.
  • x.lt(y: BigInt): bool– có thể được viết là x < y.
  • x.le(y: BigInt): bool– có thể được viết là x <= y.
  • x.gt(y: BigInt): bool– có thể được viết là x > y.
  • x.ge(y: BigInt): bool– có thể được viết là x >= y.
  • x.neg(): BigInt– có thể được viết là -x.
  • x.divDecimal(y: BigDecimal): BigDecimal – Chia cho một số thập phân, cho một kết quả thập phân.
  • x.isZero(): bool – Thuận tiện cho việc kiểm tra nếu số 0.
  • x.isI32(): bool– Kiểm tra xem số có khớp với một i32.
  • x.abs(): BigInt – Giá trị tuyệt đối.
  • x.pow(exp: u8): BigInt – Luỹ thừa.

TypedMap

import { TypedMap } from '@graphprotocol/graph-ts'

TypedMapcó thể được sử dụng cho các cặp khóa-giá trị được lưu trữ. Hãy xem ví dụ này .

Các TypedMaplớp có API sau:

  • new TypedMap<K, V>()– tạo một bản đồ trống với các khóa loại Kvà giá trị của loạiT
  • map.set(key: K, value: V): void– đặt giá trị của keythànhvalue
  • map.getEntry(key: K): TypedMapEntry<K, V> | null– trả về cặp khóa-giá trị cho một keyhoặc nullnếu cặp keykhông tồn tại trong bản đồ
  • map.get(key: K): V | null– trả về giá trị cho a keyhoặc nullnếu giá trị keykhông tồn tại trong bản đồ
  • map.isSet(key: K): bool– trả về truenếu keytồn tại trong bản đồ và falsenếu không

Byte

import { Bytes } from '@graphprotocol/graph-ts'

Bytesđược sử dụng để đại diện cho các mảng byte có độ dài tùy ý. Điều này bao gồm các giá trị Ethereum của loại bytesbytes32v.v.

Các Byteslớp học kéo dài AssemblyScript của Uint8Array và điều này hỗ trợ tất cả các Uint8Arraychức năng, cộng với phương pháp mới như sau:

  • b.toHex() – trả về một chuỗi thập lục phân đại diện cho các byte trong mảng
  • b.toString() – chuyển đổi các byte trong mảng thành một chuỗi ký tự unicode
  • b.toBase58() – chuyển giá trị Ethereum Byte sang mã hóa base58 (được sử dụng cho các hàm băm IPFS)

Địa chỉ

import { Address } from '@graphprotocol/graph-ts'

Addressmở rộng Bytesđể đại diện cho addresscác giá trị Ethereum .

Nó thêm phương thức sau vào đầu BytesAPI:

  • Address.fromString(s: string): Address– tạo một Addresstừ một chuỗi thập lục phân

API cửa hàng

import { store } from '@graphprotocol/graph-ts'

Các storeAPI cho phép để tải, tiết kiệm và thực thể remove từ và đến các cửa hàng đồ Node.

Các thực thể được ghi vào cửa hàng ánh xạ @entity1-1 với các loại được xác định trong lược đồ GraphQL của đồ thị con. Để làm việc với các thực thể này thuận tiện, graph codegenlệnh được cung cấp bởi Graph CLI tạo ra các lớp thực thể, là các lớp con của kiểu tích hợp sẵn Entity , với các bộ nhận và thiết lập thuộc tính cho các trường trong lược đồ cũng như các phương thức để tải và lưu các thực thể này .

Tạo thực thể

Sau đây là một mẫu chung để tạo các thực thể từ các sự kiện Ethereum.

// Import the Transfer event class generated from the ERC20 ABI
import { Transfer as TransferEvent } from '../generated/ERC20/ERC20'

// Import the Transfer entity type generated from the GraphQL schema
import { Transfer } from '../generated/schema'

// Transfer event handler
export function handleTransfer(event: TransferEvent): void {
  // Create a Transfer entity, using the hexadecimal string representation
  // of the transaction hash as the entity ID
  let id = event.transaction.hash.toHex()
  let transfer = new Transfer(id)

  // Set properties on the entity, using the event parameters
  transfer.from = event.params.from
  transfer.to = event.params.to
  transfer.amount = event.params.amount

  // Save the entity to the store
  transfer.save()
}

Khi một Transfersự kiện gặp phải trong khi xử lý chuỗi, nó sẽ được chuyển đến handleTransfertrình xử lý sự kiện bằng cách sử dụng Transferkiểu đã tạo (đặt biệt danh TransferEventở đây để tránh xung đột đặt tên với kiểu thực thể). Loại này cho phép truy cập dữ liệu như giao dịch mẹ của sự kiện và các tham số của nó.

Mỗi thực thể phải có một ID duy nhất để tránh va chạm với các thực thể khác. Việc tham số sự kiện bao gồm một mã định danh duy nhất có thể được sử dụng là điều khá phổ biến. Lưu ý: Việc sử dụng hàm băm giao dịch làm ID giả định rằng không có sự kiện nào khác trong cùng một giao dịch tạo ra các thực thể có hàm băm này làm ID.

Đang tải các thực thể từ cửa hàng

Nếu một thực thể đã tồn tại, nó có thể được tải từ cửa hàng với những thứ sau:

let id = event.transaction.hash.toHex() // or however the ID is constructed
let transfer = Transfer.load(id)
if (transfer == null) {
  transfer = new Transfer(id)
}

// Use the Transfer entity as before

Vì thực thể có thể chưa tồn tại trong cửa hàng nên loadphương thức trả về một giá trị kiểu Transfer | null. Do đó, có thể cần phải kiểm tra nulltrường hợp trước khi sử dụng giá trị.

Lưu ý: Việc tải thực thể chỉ cần thiết nếu những thay đổi được thực hiện trong ánh xạ phụ thuộc vào dữ liệu trước đó của một thực thể. Xem phần tiếp theo để biết hai cách cập nhật các thực thể hiện có.

Cập nhật các thực thể hiện có

Có hai cách để cập nhật một thực thể hiện có:

  1. Nạp đối tượng bằng ví dụ Transfer.load(id), đặt thuộc tính trên đối tượng, sau đó .save()nó trở lại cửa hàng.
  2. Đơn giản chỉ cần tạo thực thể với ví dụ: new Transfer(id)thiết lập các thuộc tính trên thực thể, sau đó .save()nó vào cửa hàng. Nếu thực thể đã tồn tại, các thay đổi sẽ được hợp nhất vào nó.

Trong hầu hết các trường hợp, việc thay đổi thuộc tính diễn ra ngay lập tức, nhờ vào các bộ thiết lập thuộc tính đã tạo:

let transfer = new Transfer(id)
transfer.from = ...
transfer.to = ...
transfer.amount = ...

Cũng có thể hủy đặt thuộc tính bằng một trong hai hướng dẫn sau:

transfer.from.unset()
transfer.from = null

Điều này chỉ hoạt động với các thuộc tính tùy chọn, tức là các thuộc tính được khai báo mà không có !trong GraphQL. Hai ví dụ sẽ là owner: Byteshoặc amount: BigInt.

Cập nhật các thuộc tính mảng có liên quan nhiều hơn một chút, vì việc nhận một mảng từ một thực thể sẽ tạo ra một bản sao của mảng đó. Điều này có nghĩa là các thuộc tính mảng phải được đặt lại một cách rõ ràng sau khi thay đổi mảng. Giả sử sau đây entitycó một numbers: [BigInt!]!trường.

// This won't work
entity.numbers.push(BigInt.fromI32(1))
entity.save()

// This will work
let numbers = entity.numbers
numbers.push(BigInt.fromI32(1))
entity.numbers = numbers
entity.save()

Xóa các thực thể khỏi cửa hàng

Hiện không có cách nào để xóa một thực thể thông qua các loại đã tạo. Thay vào đó, việc xóa một thực thể yêu cầu chuyển tên của loại thực thể và ID thực thể thành store.remove:

import { store } from '@graphprotocol/graph-ts'
...
let id = event.transaction.hash.toHex()
store.remove('Transfer', id)

API Ethereum

API Ethereum cung cấp quyền truy cập vào các hợp đồng thông minh, các biến trạng thái công khai, chức năng hợp đồng, sự kiện, giao dịch và khối.

Hỗ trợ các loại Ethereum

Như với các thực thể, graph codegentạo các lớp cho tất cả các hợp đồng và sự kiện thông minh được sử dụng trong một đồ thị con. Đối với điều này, các ABI hợp đồng cần phải là một phần của nguồn dữ liệu trong tệp kê khai đoạn con. Thông thường, các tệp ABI được lưu trữ trong một abis/thư mục.

Với các lớp được tạo, việc chuyển đổi giữa các loại Ethereum và các loại tích hợp diễn ra ở hậu trường để các tác giả bài báo phụ không phải lo lắng về chúng.

Ví dụ sau đây minh họa điều này. Đưa ra một lược đồ con như

type Transfer @entity {
  from: Bytes!
  to: Bytes!
  amount: BigInt!
}

và một Transfer(address,address,uint256)chữ ký sự kiện trên Ethereum, các fromtovà amountgiá trị của loại hình addressaddressvà uint256 được chuyển đổi thành Addressvà BigInt, cho phép chúng được chuyển sang cho người Bytes!và BigInt!tài sản của các Transfertổ chức:

let id = event.transaction.hash.toHex()
let transfer = new Transfer(id)
transfer.from = event.params.from
transfer.to = event.params.to
transfer.amount = event.params.amount
transfer.save()

Sự kiện và dữ liệu khối / giao dịch

Các sự kiện Ethereum được chuyển cho các trình xử lý sự kiện, chẳng hạn như Transfersự kiện trong các ví dụ trước, không chỉ cung cấp quyền truy cập vào các tham số sự kiện mà còn cho giao dịch mẹ của chúng và khối mà chúng là một phần. Dữ liệu sau có thể được lấy từ các eventphiên bản (các lớp này là một phần của ethereummô-đun trong graph-ts):

class Event {
  address: Address
  logIndex: BigInt
  transactionLogIndex: BigInt
  logType: string | null
  block: Block
  transaction: Transaction
  parameters: Array<EventParam>
}

class Block {
  hash: Bytes
  parentHash: Bytes
  unclesHash: Bytes
  author: Address
  stateRoot: Bytes
  transactionsRoot: Bytes
  receiptsRoot: Bytes
  number: BigInt
  gasUsed: BigInt
  gasLimit: BigInt
  timestamp: BigInt
  difficulty: BigInt
  totalDifficulty: BigInt
  size: BigInt | null
}

class Transaction {
  hash: Bytes
  index: BigInt
  from: Address
  to: Address | null
  value: BigInt
  gasUsed: BigInt
  gasPrice: BigInt
  input: Bytes
}

Quyền truy cập vào trạng thái hợp đồng thông minh

Mã được tạo bởi graph codegencũng bao gồm các lớp cho các hợp đồng thông minh được sử dụng trong đoạn con. Chúng có thể được sử dụng để truy cập các biến trạng thái công khai và gọi các hàm của hợp đồng tại khối hiện tại.

Một mô hình phổ biến là truy cập vào hợp đồng mà từ đó một sự kiện bắt nguồn. Điều này đạt được với đoạn mã sau:

// Import the generated contract class
import { ERC20Contract } from '../generated/ERC20Contract/ERC20Contract'
// Import the generated entity class
import { Transfer } from '../generated/schema'

export function handleTransfer(event: Transfer) {
  // Bind the contract to the address that emitted the event
  let contract = ERC20Contract.bind(event.address)

  // Access state variables and functions by calling them
  let erc20Symbol = contract.symbol()
}

Miễn là ERC20Contracttrên Ethereum có một chức năng chỉ đọc công khai được gọi symbol, nó có thể được gọi bằng .symbol(). Đối với các biến trạng thái công khai, một phương thức có cùng tên được tạo tự động.

Bất kỳ hợp đồng nào khác là một phần của tiểu mục đều có thể được nhập từ mã đã tạo và có thể được ràng buộc với một địa chỉ hợp lệ.

Ghi nhật ký và gỡ lỗi

import { log } from '@graphprotocol/graph-ts'

Các logAPI cho phép đồ thị con để đăng nhập thông tin cho Graph Node chuẩn đầu ra cũng như Graph Explorer. Tin nhắn có thể được ghi lại bằng các cấp độ nhật ký khác nhau. Cú pháp chuỗi định dạng cơ bản được cung cấp để soạn thông báo nhật ký từ đối số.

Các logAPI bao gồm các chức năng sau:

  • log.debug(fmt: string, args: Array<string>): void – ghi lại một thông báo gỡ lỗi.
  • log.info(fmt: string, args: Array<string>): void – ghi lại một tin nhắn thông tin.
  • log.warning(fmt: string, args: Array<string>): void – ghi cảnh báo.
  • log.error(fmt: string, args: Array<string>): void – ghi lại một thông báo lỗi.
  • log.critical(fmt: string, args: Array<string>): void– ghi lại một thông điệp quan trọng  kết thúc tiểu đoạn.

Các logAPI mất một chuỗi định dạng và một mảng các giá trị chuỗi. Sau đó, nó thay thế trình giữ chỗ bằng các giá trị chuỗi từ mảng. Trình giữ chỗ {} đầu tiên được thay thế bằng giá trị đầu tiên trong mảng, trình giữ chỗ {} thứ hai được thay thế bằng giá trị thứ hai, v.v.

log.info('Message to be displayed: {}, {}, {}', [
  value.toString(),
  anotherValue.toString(),
  'already a string',
])

Ghi nhật ký một hoặc nhiều giá trị

Ghi nhật ký một giá trị

Trong ví dụ dưới đây, giá trị chuỗi “A” được chuyển vào một mảng để trở thành ['A']trước khi được ghi:

let myValue = 'A'

export function handleSomeEvent(event: SomeEvent): void {
  // Displays : "My value is: A"
  log.info('My value is: {}', [myValue])
}

Ghi nhật ký một mục nhập từ một mảng hiện có

Trong ví dụ dưới đây, chỉ giá trị đầu tiên của mảng đối số được ghi lại, mặc dù mảng chứa ba giá trị.

let myArray = ['A', 'B', 'C']

export function handleSomeEvent(event: SomeEvent): void {
  // Displays : "My value is: A"  (Even though three values are passed to `log.info`)
  log.info('My value is: {}', myArray)
}

Ghi nhật ký nhiều mục nhập từ một mảng hiện có

Mỗi mục nhập trong mảng đối số yêu cầu trình giữ chỗ riêng của nó {}trong chuỗi thông báo nhật ký. Ví dụ dưới đây chứa ba trình giữ chỗ {}trong thông báo nhật ký. Vì điều này, cả ba giá trị trong myArrayđều được ghi lại.

let myArray = ['A', 'B', 'C']

export function handleSomeEvent(event: SomeEvent): void {
  // Displays : "My first value is: A, second value is: B, third value is: C"
  log.info(
    'My first value is: {}, second value is: {}, third value is: {}',
    myArray,
  )
}

Ghi nhật ký một mục cụ thể từ một mảng hiện có

Để hiển thị một giá trị cụ thể trong mảng, giá trị được lập chỉ mục phải được cung cấp.

export function handleSomeEvent(event: SomeEvent): void {
  // Displays : "My third value is C"
  log.info('My third value is: {}', [myArray[2]])
}

Ghi nhật ký thông tin sự kiện

Ví dụ bên dưới ghi lại số khối, băm khối và băm giao dịch từ một sự kiện:

import { log } from '@graphprotocol/graph-ts'

export function handleSomeEvent(event: SomeEvent): void {
  log.debug('Block number: {}, block hash: {}, transaction hash: {}', [
    event.block.number.toString(), // "47596000"
    event.block.hash.toHexString(), // "0x..."
    event.transaction.hash.toHexString(), // "0x..."
  ])
}

API IPFS

import { ipfs } from '@graphprotocol/graph-ts'

Hợp đồng thông minh đôi khi cố định các tệp IPFS trên chuỗi. Điều này cho phép ánh xạ để lấy các băm IPFS từ hợp đồng và đọc các tệp tương ứng từ IPFS. Dữ liệu tệp sẽ được trả về Bytes, thường yêu cầu xử lý thêm, ví dụ như với jsonAPI được ghi lại sau trên trang này.

Với hàm băm hoặc đường dẫn IPFS, việc đọc tệp từ IPFS được thực hiện như sau:

// Put this inside an event handler in the mapping
let hash = 'QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D'
let data = ipfs.cat(hash)

// Paths like `QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D/Makefile`
// that include files in directories are also supported
let path = 'QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D/Makefile'
let data = ipfs.cat(path)

Lưu ý: ipfs.cat hiện tại không có tính xác định. Nếu tệp không thể được truy xuất qua mạng IPFS trước khi hết thời gian yêu cầu, tệp sẽ trở lại null. Do đó, luôn có giá trị kiểm tra kết quả null. Để đảm bảo rằng các tệp có thể được truy xuất, chúng phải được ghim vào nút IPFS mà Graph Node kết nối. Trên dịch vụ được lưu trữ , đây là https://api.thegraph.com/ipfs/ . Xem phần ghim IPFS để biết thêm thông tin.

Nó cũng có thể xử lý các tệp lớn hơn theo cách truyền trực tuyến với ipfs.map. Hàm mong đợi băm hoặc đường dẫn cho tệp IPFS, tên của lệnh gọi lại và cờ để sửa đổi hành vi của nó:

import { JSONValue, Value } from '@graphprotocol/graph-ts'

export function processItem(value: JSONValue, userData: Value): void {
  // See the JSONValue documentation for details on dealing
  // with JSON values
  let obj = value.toObject()
  let id = obj.get('id').toString()
  let title = obj.get('title').toString()

  // Callbacks can also created entities
  let newItem = new Item(id)
  item.title = title
  item.parent = userData.toString() // Set parent to "parentId"
  item.save()
}

// Put this inside an event handler in the mapping
ipfs.map('Qm...', 'processItem', Value.fromString('parentId'), ['json'])

// Alternatively, use `ipfs.mapJSON`
ipfs.mapJSON('Qm...', 'processItem', Value.fromString('parentId'))

Cờ duy nhất hiện được hỗ trợ là cờ jsonnày phải được chuyển tới ipfs.map. Với jsoncờ, tệp IPFS phải bao gồm một loạt các giá trị JSON, một giá trị trên mỗi dòng. Lệnh gọi tới ipfs.mapsẽ đọc từng dòng trong tệp, giải mã hóa nó thành a JSONValuevà gọi lệnh gọi lại cho từng dòng. Sau đó, gọi lại có thể sử dụng các hoạt động thực thể để lưu trữ dữ liệu từ JSONValue. Các thay đổi thực thể chỉ được lưu trữ khi trình xử lý đã gọi ipfs.mapkết thúc thành công; trong khi chờ đợi, chúng được lưu trong bộ nhớ và do đó kích thước của tệp ipfs.mapcó thể xử lý bị hạn chế.

Thành công, ipfs.maplợi nhuận void. Nếu bất kỳ lệnh gọi lại nào gây ra lỗi, trình xử lý đã gọi ipfs.mapsẽ bị hủy bỏ và đồ thị con được đánh dấu là không thành công.

API tiền điện tử

import { crypto } from '@graphprotocol/graph-ts'

Các cryptoAPI làm cho một chức năng mã hóa có sẵn để sử dụng trong các ánh xạ. Hiện tại, chỉ có một:

  • crypto.keccak256(input: ByteArray): ByteArray

API JSON

import { json, JSONValueKind } from '@graphprotocol/graph-ts'

Dữ liệu JSON có thể được phân tích cú pháp bằng jsonAPI:

  • json.fromBytes(data: Bytes): JSONValue– phân tích cú pháp dữ liệu JSON từ một Bytesmảng

Các JSONValuelớp học cung cấp một cách để kéo giá trị ra của một tài liệu JSON tùy ý. Vì các giá trị JSON có thể là boolean, số, mảng và hơn thế nữa, nên JSONValueđi kèm với một thuộc kindtính để kiểm tra loại giá trị:

let value = json.fromBytes(...)
if (value.kind == JSONValueKind.BOOL) {
  ...
}

Ngoài ra, có một phương pháp để kiểm tra xem giá trị có phải là null:

  • value.isNull(): boolean

Khi kiểu của một giá trị là chắc chắn, nó có thể được chuyển đổi thành kiểu cài sẵn bằng một trong các phương pháp sau:

  • value.toBool(): boolean
  • value.toI64(): i64
  • value.toF64(): f64
  • value.toBigInt(): BigInt
  • value.toString(): string
  • value.toArray(): Array<JSONValue>– (và sau đó chuyển đổi JSONValuebằng một trong 5 phương pháp trên)

Loại tham chiếu chuyển đổi

(Các) nguồn Nơi Đến Chức năng chuyển đổi
Địa chỉ Byte không ai
Địa chỉ TÔI s.toHexString ()
Địa chỉ Chuỗi s.toHexString ()
BigDecimal Chuỗi s.toString ()
BigInt BigDecimal s.toBigDecimal ()
BigInt Chuỗi (thập lục phân) s.toHexString () hoặc s.toHex ()
BigInt Chuỗi (unicode) s.toString ()
BigInt i32 s.toI32 ()
Boolean Boolean không ai
Byte (đã ký) BigInt BigInt.fromSignedBytes (s)
Byte (không dấu) BigInt BigInt.fromUnsignedBytes (s)
Byte Chuỗi (thập lục phân) s.toHexString () hoặc s.toHex ()
Byte Chuỗi (unicode) s.toString ()
Byte Chuỗi (base58) s.toBase58 ()
Byte i32 s.toI32 ()
Byte u32 s.toU32 ()
Byte JSON json.fromBytes (các)
int8 i32 không ai
int32 i32 không ai
int32 BigInt Bigint.fromI32 (s)
uint24 i32 không ai
int64 – int256 BigInt không ai
uint32 – uint256 BigInt không ai
JSON boolean s.toBool ()
JSON i64 s.toI64 ()
JSON u64 s.toU64 ()
JSON f64 s.toF64 ()
JSON BigInt s.toBigInt ()
JSON chuỗi s.toString ()
JSON Mảng s.toArray ()
JSON Vật s.toObject ()
Chuỗi Địa chỉ Address.fromString (s)
Chuỗi BigDecimal BigDecimal.fromString (s)
Chuỗi (thập lục phân) Byte ByteArray.fromHexString (các)
Chuỗi (UTF-8) Byte ByteArray.fromUTF8 (s)

Siêu dữ liệu nguồn dữ liệu

Bạn có thể kiểm tra địa chỉ hợp đồng, mạng và ngữ cảnh của nguồn dữ liệu đã gọi trình xử lý thông qua dataSourcekhông gian tên:

  • dataSource.address(): Address
  • dataSource.network(): string
  • dataSource.context(): DataSourceContext

Thực thể và DataSourceContext

Lớp cơ sở Entityvà lớp con DataSourceContextcó các trình trợ giúp để thiết lập động và nhận các trường:

  • setString(key: string, value: string): void
  • setI32(key: string, value: i32): void
  • setBigInt(key: string, value: BigInt): void
  • setBytes(key: string, value: Bytes): void
  • setBoolean(key: string, value: bool): void
  • setBigDecimal(key, value: BigDecimal): void
  • getString(key: string): string
  • getI32(key: string): i32
  • getBigInt(key: string): BigInt
  • getBytes(key: string): Bytes
  • getBoolean(key: string): boolean
  • getBigDecimal(key: string): BigDecimal

Jade Vo

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.