KIT

Codec

Codec<TFrom, TTo> = FixedSizeCodec<TFrom, TTo> | VariableSizeCodec<TFrom, TTo>

一个可以将值编码为字节数组或从字节数组解码值的对象。

Codec 可以是:

  • 一个 FixedSizeCodec,其中所有编码后的值都具有相同的固定大小。
  • 一个 VariableSizeCodec,其中编码后的值的大小可以变化。

类型参数

类型参数默认类型
TFrom-
TTo extends TFromTFrom

示例

const codec: Codec<string>;
const bytes = codec.encode('hello');
const value = codec.decode(bytes); // 'hello'

备注

为了方便起见,codec 可以编码比它们解码的类型更宽松的类型。 也就是说,类型 TFrom 可以是类型 TTo 的超集。 例如,一个 Codec<bigint | number, bigint> 可以编码 bigintnumber 值,但总是解码为 bigint

const codec: Codec<bigint | number, bigint>;
const bytes = codec.encode(42);
const value = codec.decode(bytes); // 42n

值得注意的是,codec 是编码器和解码器的联合。 这意味着一个 Codec<TFrom, TTo> 可以使用 combineCodec 函数从一个 Encoder<TFrom> 和一个 Decoder<TTo> 组合而成。 这对于希望向其用户公开所有三种类型的对象的库作者特别有用。

const encoder: Encoder<bigint | number>;
const decoder: Decoder<bigint>;
const codec: Codec<bigint | number, bigint> = combineCodec(encoder, decoder);

除了组合编码器和解码器之外,还可以使用 createCodec 函数从头开始创建 codec,但更常见的是使用 @solana/codecs 包的各种助手将多个 codec 组合在一起。

例如,下面是如何为一个包含 name 字符串和 age 数字的 Person 对象类型创建一个 Codec

import { getStructCodec, addCodecSizePrefix, getUtf8Codec, getU32Codec } from '@solana/codecs';
 
type Person = { name: string; age: number };
const getPersonCodec = (): Codec<Person> =>
    getStructCodec([
        ['name', addCodecSizePrefix(getUtf8Codec(), getU32Codec())],
        ['age', getU32Codec()],
    ]);

请注意,组合的 Codec 类型非常聪明,可以理解它们是固定大小还是可变大小。 在上面的例子中,getU32Codec() 是一个固定大小的 codec,而 addCodecSizePrefix(getUtf8Codec(), getU32Codec()) 是一个可变大小的 codec。 这使得最终的 Person codec 成为一个可变大小的 codec。

参见

On this page