見出し画像

AssemblyScript API|subgraphマッピングを作成するときに使用できる組み込みAPIについて

注:graph-cli/ graph-tsversionより前にサブグラフを作成した場合0.23.0、古いバージョンのAssemblyScriptを使用している場合は、Migration Guide


このページでは、サブグラフマッピングを作成するときに使用できる組み込みAPIについて説明します。2種類のAPIがすぐに利用できます。


グラフの活字体のライブラリ(graph-ts)と
によってサブグラフファイルから生成されたコードgraph codegen。
AssemblyScriptと互換性がある限り、依存関係として他のライブラリを追加することもできます。これは言語マッピングが記述されているため、 AssemblyScriptwikiは言語および標準ライブラリ機能の優れたソースです。


インストール


で作成されたサブグラフにgraph init は、事前構成された依存関係が付属しています。これらの依存関係をインストールするために必要なのは、次のコマンドのいずれかを実行することだけです。


yarn install # Yarn
npm install  # NPM

サブグラフが最初から作成された場合、次の2つのコマンドのいずれかが依存関係としてGraphTypeScriptライブラリをインストールします。


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


APIリファレンス


@graphprotocol/graph-tsライブラリは、以下のAPIを提供します。


・ethereumイーサリアムのスマートコントラクト、イベント、ブロック、トランザクション、およびイーサリアムの値を操作するためのAPI。
・store負荷へとグラフノードストアからとにエンティティの保存API。
・logグラフノードの出力とグラフエクスプローラにメッセージをログに記録するAPI。
・ipfsIPFSからファイルをロードするためのAPI。
・jsonJSONデータを解析するためのAPI。
・crypto暗号化関数を使用するためのAPI。
・Ethereum、JSON、GraphQL、AssemblyScriptなどの異なる型システム間で変換する低レベルのプリミティブ。

組み込み型

AssemblyScriptに組み込まれている基本タイプに関するドキュメントは、 AssemblyScriptwikiにあります。


次の追加のタイプはによって提供され@graphprotocol/graph-tsます。


ByteArray 

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


ByteArrayの配列を表しu8ます。


factory

fromI32(x: i32): ByteArray-xバイトに分解します。


fromHexString(hex: string): ByteArray-入力長は偶数でなければなりません。での接頭辞0xはオプションです。


型変換


toHexString(): string-接頭辞が0x。の16進文字列に変換されます。
toString(): string -バイトをUTF-8文字列として解釈します。
toBase58(): string -バイトをbase58文字列にエンコードします。
toU32(): u32-バイトをリトルエンディアンとして解釈しますu32。オーバーフローの場合にスローします。
toI32(): i32-バイト配列をリトルエンディアンとして解釈しますi32。オーバーフローの場合にスローします。


演算子


equals(y: ByteArray): bool–と書くことができますx == y。


BigDecimal 

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


BigDecimal 任意精度の小数を表すために使用されます。


Construction


constructor(bigInt: BigInt)–BigDecimalからを作成しますBigInt。
static fromString(s: string): BigDecimal –10進文字列から解析します。

型変換


toString(): string –10進文字列に出力します。

Math


plus(y: BigDecimal): BigDecimal–と書くことができますx + y。
minus(y: BigDecimal): BigDecimal–と書くことができますx - y。
times(y: BigDecimal): BigDecimal–と書くことができますx * y。
dividedBy(y: BigDecimal): BigDecimal–と書くことができますx / y。
equals(y: BigDecimal): bool–と書くことができますx == y。
notEqual(y: BigDecimal): bool–と書くことができますx != y。
lt(y: BigDecimal): bool–と書くことができますx < y。
le(y: BigDecimal): bool–と書くことができますx <= y。
gt(y: BigDecimal): bool–と書くことができますx > y。
ge(y: BigDecimal): bool–と書くことができますx >= y。
neg(): BigDecimal-と書くことができます-x。
BigInt #
import { BigInt } from '@graphprotocol/graph-ts'
BigInt大きな整数を表すために使用されます。これには、uint32touint256およびint64toタイプのイーサリアム値が含まれint256ます。以下のすべてuint32のようなint32、uint24またはint8として表されますi32。


このBigIntクラスには次のAPIがあります。


Construction


BigInt.fromI32(x: i32): BigInt–BigIntからを作成しますi32。
BigInt.fromString(s: string): BigInt–BigInt文字列からaを解析します。
BigInt.fromUnsignedBytes(x: Bytes): BigInt–bytes符号なしのリトルエンディアン整数として解釈します。入力がビッグエンディアンの場合は、.reverse() 最初にcallしてください。
BigInt.fromSignedBytes(x: Bytes): BigInt–bytes符号付きのリトルエンディアン整数として解釈します。入力がビッグエンディアンの場合は、.reverse()最初にcallしてください 。

型変換

x.toHex(): stringBigInt–16進文字の文字列に変わります。

x.toString(): stringBigInt–10進数の文字列に変わります。

x.toI32(): i32–を;BigIntとして返しますi32。値がに収まらない場合は失敗しi32ます。最初に確認することをお勧めしx.isI32()ます。

x.toBigDecimal(): BigDecimal -小数部のない小数に変換します。

Math

x.plus(y: BigInt): BigInt–と書くことができますx + y。
x.minus(y: BigInt): BigInt–と書くことができますx - y。
x.times(y: BigInt): BigInt–と書くことができますx * y。
x.dividedBy(y: BigInt): BigInt–と書くことができますx / y。
x.mod(y: BigInt): BigInt–と書くことができますx % y。
x.equals(y: BigInt): bool–と書くことができますx == y。
x.notEqual(y: BigInt): bool–と書くことができますx != y。
x.lt(y: BigInt): bool–と書くことができますx < y。
x.le(y: BigInt): bool–と書くことができますx <= y。
x.gt(y: BigInt): bool–と書くことができますx > y。
x.ge(y: BigInt): bool–と書くことができますx >= y。
x.neg(): BigInt–と書くことができます-x。
x.divDecimal(y: BigDecimal): BigDecimal –小数で除算し、小数の結果を返します。
x.isZero(): bool –数値がゼロかどうかを確認するのに便利です。
x.isI32(): bool–番号がに収まるかどうかを確認しi32ます。
x.abs(): BigInt - 絶対値。
x.pow(exp: u8): BigInt –べき乗。
bitOr(x: BigInt, y: BigInt): BigInt–と書くことができますx | y。
bitAnd(x: BigInt, y: BigInt): BigInt–と書くことができますx & y。
leftShift(x: BigInt, bits: u8): BigInt–と書くことができますx << y。
rightShift(x: BigInt, bits: u8): BigInt–と書くことができますx >> y。


TypedMap 

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


TypedMapキーと値のペアを格納するために使用できます。この例を参照してください 。


このTypedMapクラスには次のAPIがあります。


new TypedMap<K, V>()–タイプのキーとタイプのK値を使用して空のマップを作成しますT


map.set(key: K, value: V): void–の値をkeyに設定しますvalue

map.getEntry(key: K): TypedMapEntry<K, V> | null-のキーと値のペアを返すkeyまたはnull場合keyマップに存在しません

map.get(key: K): V | null-の値を返すkeyかnullあればkeyマップに存在しません。

map.isSet(key: K): bool-リターンをtrue場合keyマップに存在し、falseそれがない場合


バイト

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


Bytesバイトの任意の長さの配列を表すために使用されます。このタイプのイーサリアム値を含むbytes、bytes32等


このBytesクラスはAssemblyScriptのUint8Arrayを拡張し、これはすべてのUint8Array機能に加えて、次の新しいメソッドをサポートします。


b.toHex() –配列内のバイトを表す16進文字列を返します
b.toString() –配列内のバイトをUnicode文字の文字列に変換します
b.toBase58() –イーサリアムバイト値をbase58エンコーディングに変換します(IPFSハッシュに使用)

Address

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


AddressBytesイーサリアムaddress値を表すために拡張されます。

BytesAPIの上に次のメソッドを追加します。

Address.fromString(s: string): AddressAddress–16進文字列からを作成します


store API 

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


storeAPIは、保存してグラフノードストアからとにエンティティを削除し、ロードすることができます。


ストアに書き込まれるエンティ@entityティーは、サブグラフのGraphQLスキーマで定義されているタイプに1対1でマップされます。これらのエンティティの操作を便利にgraph codegenするために、Graph CLIによって提供されるコマンドは、組み込みEntity 型のサブクラスであるエンティティクラスを生成します。このクラスには、スキーマ内のフィールドのプロパティゲッターとセッター、およびこれらのエンティティをロードおよび保存するメソッドが含まれます。 。


エンティティの作成


以下は、イーサリアムイベントからエンティティを作成するための一般的なパターンです。

// 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()
}

ときにTransferチェーンの処理中にイベントが発生した、それが渡されhandleTransfer、生成使用してイベントハンドラTransfer(にエイリアスタイプTransferEventエンティティタイプと名前の競合を避けるためにここに)。このタイプでは、イベントの親トランザクションやそのパラメーターなどのデータにアクセスできます。


他のエンティティとの衝突を避けるために、各エンティティには一意のIDが必要です。イベントパラメータに、使用できる一意の識別子が含まれることはかなり一般的です。注:トランザクションハッシュをIDとして使用すると、同じトランザクション内の他のイベントがこのハッシュをIDとして持つエンティティを作成しないことを前提としています。


ストアからエンティティを読み込んでいます



エンティティがすでに存在する場合は、次の方法でストアからロードできます。

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

エンティティがストアにまだ存在していない可能性があるため、loadメソッドはタイプの値を返しますTransfer | null。したがってnull、値を使用する前にケースを確認する必要がある場合があります。

注:エンティティの読み込みは、マッピングで行われた変更がエンティティの以前のデータに依存している場合にのみ必要です。既存のエンティティを更新する2つの方法については、次のセクションを参照してください。


既存のエンティティの更新



既存のエンティティを更新するには、次の2つの方法があります。


1 たとえばTransfer.load(id)、エンティティにプロパティを設定してエンティティをロード.save()してから、ストアに戻します。



2 たとえばnew Transfer(id)、エンティティにプロパティを設定し.save()てからストアにプロパティを設定するだけで、エンティティを作成できます。エンティティがすでに存在する場合、変更はエンティティにマージされます。



生成されたプロパティセッターのおかげで、ほとんどの場合、プロパティの変更は簡単です。


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


次の2つの手順のいずれかを使用して、プロパティの設定を解除することもできます。


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


これは、オプションのプロパティ、つまり!GraphQLで宣言されていないプロパティでのみ機能します。2つの例はowner: Bytesまたはamount: BigIntです。


エンティティから配列を取得するとその配列のコピーが作成されるため、配列プロパティの更新はもう少し複雑です。これは、配列を変更した後、配列のプロパティを明示的に再設定する必要があることを意味します。以下entityは、numbers: [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()


ストアからのエンティティの削除


現在、生成されたタイプを介してエンティティを削除する方法はありません。代わりに、エンティティを削除するには、エンティティタイプの名前とエンティティIDをstore.remove次の宛先に渡す必要があります。


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


イーサリアムAPI 


イーサリアムAPIは、スマートコントラクト、パブリック状態変数、コントラクト関数、イベント、トランザクション、ブロック、およびイーサリアムデータのエンコード/デコードへのアクセスを提供します。


イーサリアムタイプのサポート

エンティティと同様graph codegenに、サブグラフで使用されるすべてのスマートコントラクトとイベントのクラスを生成します。このため、契約ABIは、サブグラフマニフェストのデータソースの一部である必要があります。通常、ABIファイルはabis/フォルダーに保存されます。


生成されたクラスを使用すると、Ethereum型と組み込み型の間の変換が バックグラウンドで行われるため、サブグラフの作成者はそれらについて心配する必要がありません。


次の例はこれを示しています。次のようなサブグラフスキーマが与えられます


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


そしてTransfer(address,address,uint256)イーサリアムのイベント署名 from、toおよびamount型の値address、address及びuint256 に変換されるAddressとBigInt、それらがに渡すことを可能にするBytes!とBigInt!の特性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()


イベントとブロック/トランザクションデータ


Transfer前の例のイベントなど、イベントハンドラーに渡されるイーサリアムイベントは、イベントパラメーターへのアクセスを提供するだけでなく、それらの親トランザクションとそれらが含まれるブロックへのアクセスも提供します。次のデータはeventインスタンスから取得できます(これらのクラスはのethereumモジュールの一部です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
 gasLimit: BigInt
 gasPrice: BigInt
 input: Bytes
}

スマートコントラクトステートへのアクセス


graph codegenによって生成されるコードには、サブグラフで使用されるスマートコントラクトのクラスも含まれています。これらを使用して、パブリック状態変数にアクセスし、現在のブロックでコントラクトの関数を呼び出すことができます。


一般的なパターンは、イベントの発生元のコントラクトにアクセスすることです。これは、次のコードで実現されます。


// 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()
}


限りERC20Contractイーサリアムではというパブリック読み取り専用の機能を持っているsymbol、それがで呼び出すことができます.symbol()。パブリック状態変数の場合、同じ名前のメソッドが自動的に作成されます。


サブグラフの一部であるその他のコントラクトは、生成されたコードからインポートでき、有効なアドレスにバインドできます。


取り消された通話の処理


コントラクトの読み取り専用メソッドが元に戻る可能性がある場合は、生成されたコントラクトメソッドの前にtry_.を付けて呼び出すことでそれを処理する必要があります。たとえば、GravityコントラクトはgravatarToOwnerメソッドを公開します。このコードは、そのメソッドで復帰を処理できます。

let gravity = Gravity.bind(event.address);
let callResult = gravity.try_gravatarToOwner(gravatar);
if (callResult.reverted) {
 log.info('getGravatar reverted', []);
} else {
 let owner = callResult.value;
}

GethまたはInfuraクライアントに接続されたグラフノードがすべての復帰を検出しない場合があることに注意してください。これに依存する場合は、Parityクライアントに接続されたグラフノードを使用することをお勧めします。

ABIのエンコード/デコード


ethereumモジュール内のencodeおよびdecode関数を使用して、イーサリアムのABIエンコード形式に従ってデータをエンコードおよびデコードできます。

import { Address, BigInt, ethereum } from "@graphprotocol/graph-ts";

let tupleArray: Array<ethereum.Value> = [
 ethereum.Value.fromAddress(Address.fromString("0x0000000000000000000000000000000000000420")),
 ethereum.Value.fromUnsignedBigInt(BigInt.fromI32(62))
];

let tuple = tupleArray as ethereum.Tuple;

let encoded = ethereum.encode(ethereum.Value.fromTuple(tuple))!;

let decoded = ethereum.decode("(address,uint256)", encoded);

詳細については:

ロギングとデバッグ

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


logAPIは、部分グラフがグラフノードを標準出力への情報だけでなく、グラフエクスプローラをログに記録することができます。メッセージは、さまざまなログレベルを使用してログに記録できます。引数からログメッセージを作成するために、基本的なフォーマット文字列構文が提供されています。


logAPIには、以下の機能が含まれています。


・log.debug(fmt: string, args: Array<string>): void -デバッグメッセージをログに記録します。

・log.info(fmt: string, args: Array<string>): void -情報メッセージをログに記録します。

・log.warning(fmt: string, args: Array<string>): void -警告をログに記録します。

・log.error(fmt: string, args: Array<string>): void -エラーメッセージをログに記録します。

・log.critical(fmt: string, args: Array<string>): void–重要なメッセージをログに記録し、サブグラフを終了します。

・logAPIは、書式文字列と文字列値の配列をとります。次に、プレースホルダーを配列の文字列値に置き換えます。最初の{}プレースホルダーは配列の最初の値に置き換えられ、2番目の{}プレースホルダーは2番目の値に置き換えられます。


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

1つ以上の値をログに記録する


単一の値をログに記録する


以下の例では、文字列値 "A"が配列に渡され、['A']ログに記録される前になります。


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


既存の配列から単一のエントリをログに記録する#
以下の例では、配列に3つの値が含まれているにもかかわらず、引数配列の最初の値のみがログに記録されます。


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)
}


既存のアレイから複数のエントリをログに記録する


引数配列の各エントリには{}、ログメッセージ文字列に独自のプレースホルダーが必要です。次の例では{}、ログメッセージに3つのプレースホルダーが含まれています。このため、の3つの値すべてmyArrayがログに記録されます。


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,
 )
}


既存のアレイから特定のエントリをログに記録する


配列内の特定の値を表示するには、インデックス付きの値を指定する必要があります。


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


ロギングイベント情報


以下の例では、イベントからのブロック番号、ブロックハッシュ、およびトランザクションハッシュをログに記録します。


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'


スマートコントラクトは、IPFSファイルをチェーンに固定することがあります。これにより、マッピングはコントラクトからIPFSハッシュを取得し、IPFSから対応するファイルを読み取ることができます。ファイルデータはとして返されますBytes。これには通常、さらに処理が必要jsonです。たとえば、このページの後半で説明するAPIを使用します。


IPFSハッシュまたはパスを指定すると、IPFSからのファイルの読み取りは次のように実行されます。


// 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)


注: ipfs.cat現時点では決定論的ではありません。要求がタイムアウトする前にファイルをIPFSネットワーク経由で取得できない場合は、を返し nullます。このため、結果を常に確認する価値がありnullます。ファイルを確実に取得できるようにするには、グラフノードが接続するIPFSノードにファイルを固定する必要があります。上のホスティングサービスは、これはあるhttps://api.thegraph.com/ipfs/。詳細については、 IPFSの固定のセクションを参照してください。


ipfs.mapを使用して、より大きなファイルをストリーミング方式で処理することもできます。この関数は、IPFSファイルのハッシュまたはパス、コールバックの名前、およびフラグがその動作を変更することを期待しています。


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')
 let title = obj.get('title')
 if (!id || !title) {
   return
 }
 // Callbacks can also created entities
 let newItem = new Item(id.toString())
 newItem.title = title.toString()
 newitem.parent = userData.toString() // Set parent to "parentId"
 newitem.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'))



現在サポートされているフラグはjson、だけです。これはに渡す必要があります ipfs.map。jsonフラグ、IPFSファイルは、JSON値の一連の1行に1つの値で構成しなければなりません。toipfs.mapを呼び出すと、ファイル内の各行が読み取られ、逆シリアル化されてJSONValue、それぞれのコールバックが呼び出されます。コールバックは、エンティティ操作を使用して、からのデータを格納できますJSONValue。エンティティの変更は、呼び出したハンドラーがipfs.map正常に終了した場合にのみ保存されます。その間、それらはメモリに保持されるipfs.mapため、処理できるファイルのサイズは制限されます。


成功すると、voidをipfs.mapに返します。コールバックの呼び出しによってエラーが発生した場合、呼び出されたハンドラーipfs.mapは中止され、サブグラフは失敗としてマークされます。


クリプトAPI 

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


cryptoAPIは、マッピングで使用する暗号化機能が利用できるようになります。現在、1つだけあります。


crypto.keccak256(input: ByteArray): ByteArray
JSON API #
import { json, JSONValueKind } from '@graphprotocol/graph-ts'


JSONデータは、jsonAPIを使用して解析できます。


・json.fromBytes(data: Bytes): JSONValue–Bytes配列からJSONデータを解析します


このJSONValueクラスは、任意のJSONドキュメントから値を引き出す方法を提供します。JSON値はブール値、数値、配列などJSONValueである可能kind性があるため、値の型をチェックするためのプロパティが付属しています。


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


さらに、値がnull次のとおりであるかどうかを確認する方法があります。


・value.isNull(): boolean

値の型が特定されている場合は、次のいずれかの方法を使用して組み込み型に変換できます 。


value.toBool(): boolean
value.toI64(): i64
value.toF64(): f64
value.toBigInt(): BigInt
value.toString(): string
value.toArray(): Array<JSONValue>-(そしてJSONValue上記の5つの方法のいずれかで変換します)


type変換リファレンス

Source (s) Destination Conversion function
Address Bytes none
Address ID s.toHexString()
Address String s.toHexString()
BigDecimal String s.toString()
BigInt BigDecimal s.toBigDecimal()
BigInt String (hexadecimal) s.toHexString() or s.toHex()
BigInt String (unicode) s.toString()
BigInt i32 s.toI32()
Boolean Boolean none
Bytes (signed) BigInt BigInt.fromSignedBytes(s)
Bytes (unsigned) BigInt BigInt.fromUnsignedBytes(s)
Bytes String (hexadecimal) s.toHexString() or s.toHex()
Bytes String (unicode) s.toString()
Bytes String (base58) s.toBase58()
Bytes i32 s.toI32()
Bytes u32 s.toU32()
Bytes JSON json.fromBytes(s)
int8 i32 none
int32 i32 none
int32 BigInt Bigint.fromI32(s)
uint24 i32 none
int64 - int256 BigInt none
uint32 - uint256 BigInt none
JSON boolean s.toBool()
JSON i64 s.toI64()
JSON u64 s.toU64()
JSON f64 s.toF64()
JSON BigInt s.toBigInt()
JSON string s.toString()
JSON Array s.toArray()
JSON Object s.toObject()
String Address Address.fromString(s)
String BigDecimal BigDecimal.fromString(s)
String (hexadecimal) Bytes ByteArray.fromHexString(s)
String (UTF-8) Bytes ByteArray.fromUTF8(s)


データソースメタデータ


dataSourceネームスペースを介してハンドラーを呼び出したデータソースのコントラクトアドレス、ネットワーク、およびコンテキストを調べることができます。


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



エンティティとDataSourceContext 


基本Entityクラスと子DataSourceContextクラスには、フィールドを動的に設定および取得するためのヘルパーがあります。


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





この記事が気に入ったらサポートをしてみませんか?