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:
- Thư viện Graph TypeScript (
graph-ts
) và - Mã được tạo từ các tệp subgraph bởi
graph codegen
.
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ủyx
thành bytes.fromHexString(hex: string): ByteArray
- Độ dài đầu vào phải bằng. Tiền tố bằng0x
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
đếnuint256
và int64
đế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ảibytes
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ếnBigInt
thành một chuỗi ký tự thập lục phân.x.toString(): string
- biếnBigInt
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ớii32
. Bạn nên kiểm tra trướcx.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ímK
và các giá trị của loạiT
map.set(key: K, value: V): void
- đặt giá trị củakey
thànhvalue
map.getEntry(key: K): TypedMapEntry<K, V> | null
- trả về cặp khóa-giá trị cho mộtkey
hoặcnull
nếukey
không tồn tại trong bản đồmap.get(key: K): V | null
- trả về giá trị cho mộtkey
hoặcnull
nếukey
không tồn tại trong bản đồmap.isSet(key: K): bool
- trả vềtrue
nếukey
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ảngb.toString()
- chuyển đổi các byte trong mảng thành một chuỗi ký tự unicodeb.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ó:
- 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ữ. - 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
, to
và amount
giá trị của loại address
, address
và uint256
được chuyển đổi thành Address
và BigInt
, cho phép chúng được chuyển cho Bytes!
và 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'
log
API 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ảngBytes
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 đổiJSONValue
với một trong 5 phương pháp trên)
Loại tham chiếu chuyển đổi
![](https://steemitimages.com/640x0/https://cdn-images-1.medium.com/max/800/1*zXTTAvAJtQA62T7zgpnwaQ.jpeg)
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