@ganache/rlp
递归长度 前缀编码 为了Node.js.
依据 https://github.com/ethereumjs/rlp 页面存档备份,存于互联网档案馆,附带一些优化 用于编码 :
function encodeRange<
T extends EncodingInput | Readonly<EncodingInput>,
Start extends RangeOf<T["length"]>
>(
items: T,
start: Start,
length: Exclude<Remainders<T["length"], Start>, 0>
): { length: number; output: Buffer[] } {
//...;
}
开始 RLP 编码 items从 start 直至 length调用 RLP.digest 改为
完成编码.
返回包含总计的对象 length 编码部分中的所有数据,
财务报告和审定财务报表 output,一组编码缓冲器.
function digest(ranges: Readonly<Buffer[]>[], length: number) {
// ...
}
完成编码开始于 encodeRange。 。 。 .
A 返回编码数据的缓冲.
其他变化:
- 次要优化到
encode encode只接受缓冲器或嵌入式缓冲器阵列,字符串,数字,比值, 和BN的支持已经取消.
这些修改允许以块来编码数据,避免处理相同的数据 在与Ganache的常见情况下,输入多次。 示例
type EthereumRawTx = [
nonce: Buffer,
gasPrice: Buffer,
gas: Buffer,
to: Buffer,
value: Buffer,
data: Buffer,
v: Buffer,
r: Buffer,
s: Buffer
];
// encode the first 6 entries
const partialRlp = encodeRange(raw, 0, 6);
// encode the last 3 entires
const signature = encodeRange(raw, 6, 3);
// combine all entries
const serialized = digest(
[partialRlp.output, signature.output],
partialRlp.length + signature.length
);
return {
// computing the `from` address requires entries 0-6
from: computeFromAddress(partialRlp, v.toNumber(), raw, chainId),
// hash requires entries 0-9
hash: Data.from(keccak(serialized), 32),
// serialized uses all entries for storage/transmission
serialized
};