AssemblyScript API

in #web34 years ago

Trang này ghi lại những API tích hợp có thể được sử dụng khi viết mapping cho subgraph. 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 dependencies, miễn là chúng tương thích với AssemblyScript. Vì đây được viết bằng ngôn ngữ mapping, 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

Subgraph được tạo vớigraph init đi kèm với các dependencies được định cấu hình trước. Tất cả những gì cần thiết để cài đặt các dependencies này là chạy một trong các lệnh sau:

yarn install # Yarn
npm install # NPM

Nếu subgraph đượ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 dependencies:

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

Tham chiếu API

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

  • Một ethereum API để làm việc với hợp đồng thông minh Ethereum, sự kiện, khối, giao dịch và giá trị Ethereum.
  • Một store API để tải và lưu các thực thể từ và vào Graph Node.
  • Một log API để ghi các thông báo vào đầu ra Graph Node và Graph Explorer.
  • Một ipfs API để tải tệp từ IPFS.
  • Một json API để phân tích dữ liệu JSON.
  • Một crypto API để sử dụng các hàm mật mã.
  • Dữ liệu 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 đượ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 x thành bytes.
  • fromHexString(hex: string): ByteArray - Độ dài đầu vào phải bằng. Tiền tố bằng 0x là tùy chọn.

Nhập chuyển đổi

  • toHexString(): string - Chuyển đổi thành một chuỗi hex có tiền tố là 0x.
  • toString(): string - Diễn giải 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 - Diễn giải các byte là một phần tử nhỏ u32. Ném trong trường hợp tràn.
  • toI32(): i32 - Diễn giải mảng byte là một phần tử nhỏ 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 thị số thập phân chính xác tùy ý.

Xây dựng

  • constructor(bigInt: BigInt) - tạo mộtBigDecimal từ mộtBigInt.
  • 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 thành một chuỗi thập phân.

Toán

  • plus(y: BigDecimal): BigDecimal - có thể viết làx + y.
  • minus(y: BigDecimal): BigDecimal - có thể viết là x - y.
  • times(y: BigDecimal): BigDecimal -có thể viết là x * y.
  • dividedBy(y: BigDecimal): BigDecimal - có thể viết là x / y.
  • equals(y: BigDecimal): bool - có thể viết là x == y.
  • notEqual(y: BigDecimal): bool - có thể viết là x != y.
  • lt(y: BigDecimal): bool - có thể viết là x < y.
  • le(y: BigDecimal): bool - có thể viết là x <= y.
  • gt(y: BigDecimal): bool - có thể viết là x > y.
  • ge(y: BigDecimal): bool - có thể viết là x >= y.
  • neg(): BigDecimal - có thể 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 đếnuint256int64 đếnint256. Mọi thứ dướiuint32, như làint32, uint24 hoặc int8 được biểu thị lài32.

Lớp BigInt có API sau:

Xây dựng

  • BigInt.fromI32(x: i32): BigInt - tạo mộtBigInt từ mộti32
  • BigInt.fromUnsignedBytes(x: Bytes): BigInt - Diễn giảibytes dưới dạng một số nguyên không dấu, little-endian. Nếu đầu vào của bạn là big-endian, hãy gọi .reverse() đầu tiên.
  • BigInt.fromSignedBytes(x: Bytes): BigInt - Diễn giải bytes dưới dạng một số nguyên có dấu, little-endian. Nếu đầu vào của bạn là big-endian, hãy gọi .reverse() đầu tiên.

Nhập chuyển đổi

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

Toán

  • x.plus(y: BigInt): BigInt - có thể viết là x + y.
  • x.minus(y: BigInt): BigInt - có thể viết là x - y.
  • x.times(y: BigInt): BigInt - có thể viết là x * y.
  • x.dividedBy(y: BigInt): BigInt - có thể viết là x / y.
  • x.mod(y: BigInt): BigInt - có thể viết là x % y.
  • x.equals(y: BigInt): bool - có thể viết là x == y.
  • x.notEqual(y: BigInt): bool - có thể viết là x != y.
  • x.lt(y: BigInt): bool - có thể viết là x < y.
  • x.le(y: BigInt): bool - có thể viết là x <= y.
  • x.gt(y: BigInt): bool - có thể viết là x > y.
  • x.ge(y: BigInt): bool - có thể viết là x >= y.
  • x.neg(): BigInt - có thể 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 để kiểm tra nếu số bằng 0.
  • x.isI32(): bool - Kiểm tra xem con số có khớp vớii32.
  • x.abs(): BigInt - Giá trị tuyệt đối.
  • x.pow(exp: u8): BigInt - Luỹ thừa.

TypedMap

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

TypedMap có 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.

Lớp TypedMap có API sau:

  • new TypedMap<K, V>() - tạo một bản đồ trống với các loại phím K và các giá trị của loại T
  • map.set(key: K, value: V): void - đặt giá trị của key thành value
  • map.getEntry(key: K): TypedMapEntry<K, V> | null - trả về cặp khóa-giá trị cho một key hoặc null nếukey không tồn tại trong bản đồ
  • map.get(key: K): V | null - trả về giá trị cho một key hoặcnull nếu key không tồn tại trong bản đồ
  • map.isSet(key: K): bool - trả vềtrue nếu key tồn tại trong bản đồ và false nếu nó không

Bytes

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 thuộc loại bytes, bytes32 v.v..

LớpBytes mở rộng Uint8Array của AssemblyScript và điều này hỗ trợ tất cả chức năngUint8Array cộng với các phương pháp mới 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 thành mã hóa base58 (được sử dụng cho các hàm băm IPFS)

Address

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

Address kéo dàiBytes đại diện cho giá trị Ethereum address .

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

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

Lưu trữ API

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

API store cho phép tải, lưu và loại bỏ các thực thể từ và đến lưu trữ Graph Node.

Các thực thể được ghi vào map lưu trữ 1-1 với loại@entity đượ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, lệnhgraph codegen đượ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 phần mềm cài sẵn loạiEntity với bộ nhận thuộc tính và bộ định vị 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 phổ biến để 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 sự kiệnTransfer gặp phải trong khi xử lý chuỗi, nó được chuyển đến handleTransfer xử lý sự kiện bằng cách sử dụng loạiTransfer (bí danh là TransferEvent ở đây để tránh xung đột đặt tên với loại 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.

Tải các thực thể từ lưu trữ

Nếu một thực thể đã tồn tại, nó có thể được tải từ lưu trữ 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 lưu trữ, phương thức load trả về một giá trị kiểu Transfer | null. Do đó, có thể cần phải kiểm tra trường hợpnull trước khi sử dụng giá trị.

Ghi chú: Việc tải các thực thể chỉ cần thiết nếu các thay đổi được thực hiện trong mapping 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. Tải thực thể với ví dụ: Transfer.load(id), đặt thuộc tính trên thực thể, sau đó .save() nó trở lại lưu trữ.
  2. Chỉ cần tạo thực thể với ví dụ: new Transfer(id), đặt thuộc tính trên thực thể, sau đó .save() nó đến lưu trữ. 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: Bytes hoặcamount: 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. Các giả định sau entity có một trườngnumbers: [BigInt!]! .

// 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 lưu trữ

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ể tới store.remove:

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

Ethereum API

API Ethereum cung cấp quyền truy cập vào hợp đồng thông minh, 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 codegen tạ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 subgraph. Đố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 bản kê khai subgraph. Thông thường, các tệp ABI được lưu trữ trong một thư mụcabis/ .

Với các lớp được tạo, chuyển đổi giữa các loại Ethereum và các kiểu dựng sẵn diễn ra ở hậu trường để các tác giả của subgraph 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 đồ subgraph 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, from, toamount giá trị của loại address, addressuint256 được chuyển đổi thành AddressBigInt, cho phép chúng được chuyển cho Bytes!BigInt! thuộc tính của thực thểTransfer:

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 đến xử lý sự kiện, chẳng hạn nhưsự kiệnTransfer 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 đây có thể được lấy từ cá thểevent (các lớp này là một phần của ethereum mô-đ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 codegen cũng bao gồm các lớp cho các hợp đồng thông minh được sử dụng trong subgraph. 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àERC20Contract trên Ethereum có một chức năng chỉ đọc công khai được gọi là symbol, nó có thể được gọi với.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'

logAPI cho phép các subgraph ghi thông tin vào đầu ra chuẩn của Graph Node 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ố.

log API 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 lại một 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 và kết thúc subgraph.

log API nhận 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 đăng nhập:

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 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ý. Do đó, cả ba giá trị trong myArray đượ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..."
])
}

IPFS API

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 mapping 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ả lại dưới dạng Bytes, thường yêu cầu xử lý thêm, ví dụ: với json API được ghi lại sau trên trang này.

Với một 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 không phải là xác định vào lúc này. Nếu không thể truy xuất tệp qua mạng IPFS trước khi hết thời gian yêu cầu, tệp sẽ trả về null. Do đó, luôn có giá trị khi 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.

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 callback 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à json, cái phải được chuyển cho ipfs.map. Với cờjson , 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. Cuộc gọi đến ipfs.map sẽ đọc từng dòng trong tệp, giải mã hóa nó thành một JSONValue và gọi lại cho từng callback . Sau đó, lệnh gọi lại có thể sử dụng các thao tác 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.map kết thúc thành công; trong khi chờ đợi, chúng được lưu trong bộ nhớ và kích thước của tệp ipfs.map có thể do đó quá trình bị hạn chế.

Nếu thành công, ipfs.map trả lại 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.map bị hủy bỏ và subgraph được đánh dấu là không thành công.

Crypto API

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

crypto APIlàm cho một hàm mật mã có sẵn để sử dụng trong mapping. Hiện tại, chỉ có một:

  • crypto.keccak256(input: ByteArray): ByteArray

JSON API

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

Dữ liệu JSON có thể được phân tích cú pháp bằng cách sử dụng json API:

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

Lớp JSONValue cung cấp một cách để kéo các giá trị ra khỏi 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, JSONValue đi kèm với một kind thuộc tí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ị là null:

  • value.isNull(): boolean

Khi loại giá trị là chắc chắn, nó có thể được chuyển đổi thành kiểu tích hợp 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 JSONValue với một trong 5 phương pháp trên)

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

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 không gian tên dataSource :

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

Thực thể và DataSourceContext

Lớp nền tảngEntity và lớp conDataSourceContext có trợ giúp để linh động thiết lập và lấy 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

Source

Coin Marketplace

STEEM 0.19
TRX 0.15
JST 0.029
BTC 62922.70
ETH 2543.02
USDT 1.00
SBD 2.83