tuupola/base58

任意数据的 Base58 编码和解码器

2.1.0 2020-09-09 11:38 UTC

This package is auto-updated.

Last update: 2024-09-18 14:46:01 UTC


README

这个库实现了 Base58 编码。除了整数外,它还可以对任意数据进行编码和解码。也就是说,Base58 很适合解码大整数,但并不是为了解码长段二进制数据而设计的。

Latest Version Software License Build StatusCoverage

安装

使用 composer 安装。

$ composer require tuupola/base58

这个分支需要 PHP 7.1 或更高版本。较旧的 1.x 分支也支持 PHP 5.6 和 7.0。

$ composer require "tuupola/base58:^1.0"

用法

此包同时提供纯 PHP 和基于 GMP 的编码器。默认情况下,如果安装了扩展,编码器和解码器将使用 GMP 函数。如果没有 GMP,则将使用纯 PHP 编码器。

$base58 = new Tuupola\Base58;

$encoded = $base58->encode(random_bytes(128));
$decoded = $base58->decode($encoded);

如果您正在对整数进行编码和解码,请使用隐式的 decodeInteger() 和 encodeInteger() 方法。

$integer = $base58->encodeInteger(987654321); /* 1TFvCj */
print $base58->decodeInteger("1TFvCj", true); /* 987654321 */

请注意,对字符串和整数进行编码将产生不同的结果。

$string = $base58->encode("987654321"); /* gE62MGeOBMPt */
$integer = $base58->encodeInteger(987654321); /* 1TFvCj */

字符集

默认情况下,Base58 使用 GMP 风格的字符集。提供了 BitcoinFlickrRippleIPFS 字符集的快捷方式。您也可以使用任何自定义的 58 个字符。

use Tuupola\Base58;

print Base58::GMP /* 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv */
print Base58::BITCOIN /* 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz */
print Base58::FLICKR /* 123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ */
print Base58::RIPPLE /* rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz */
print Base58::IPFS /* 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz */

$default = new Base58(["characters" => Base58::GMP]);
$bitcoin = new Base58(["characters" => Base58::BITCOIN]);
print $default->encode("Hello world!"); /* 1LDlk6QWOejX6rPrJ */
print $bitcoin->encode("Hello world!"); /* 2NEpo7TZRhna7vSvL */

Base58Check 支持

此库支持比特币地址中使用的 Base58Check 编码。解码将验证版本和校验和。如果其中任何一个失败,将抛出 RuntimeException

use Tuupola\Base58;

$base58check = new Base58([
    "characters" => Base58::BITCOIN,
    "check" => true,
    "version" => 0x00
]);

print $base58check->encode("Hello world!"); /* 19wWTEnNTWna86WmtFsTAr5 */

try {
    $base58check->decode("19wWTEnNTWna86WmtFsTArX");
} catch (RuntimeException $exception) {
    /* Checksum "84fec52c" does not match the expected "84fec512" */
    print $exception->getMessage();
}

速度

如果可能,请安装 GMP。它是比纯 PHP 编码器快得多的编码器。以下基准测试是对 random_bytes(128) 数据进行编码。BCMatch 编码器也包括在内,但它主要只是作为一个好奇心。它太慢,无法使用。

$ vendor/bin/phpbench run benchmarks/ --report=default

+-----------------------+------------------+--------------+
| subject               | mean             | diff         |
+-----------------------+------------------+--------------+
| benchGmpEncoder       | 101,832.994ops/s | 0.00%        |
| benchGmpEncoderCustom | 97,656.250ops/s  | +4.28%       |
| benchPhpEncoder       | 305.913ops/s     | +33,188.19%  |
| benchBcmathEncoder    | 32.457ops/s      | +313,643.79% |
+-----------------------+------------------+--------------+

静态代理

如果您更喜欢使用静态语法,请使用提供的静态代理。

use Tuupola\Base58Proxy as Base58;

$encoded = Base58::encode(random_bytes(128));
$decoded = Base58::decode($encoded);

测试

您可以手动运行测试,或者在每个代码更改时自动运行。自动测试需要 entr 工作。

$ make test
$ brew install entr
$ make watch

贡献

有关详细信息,请参阅 CONTRIBUTING

安全性

如果您发现任何与安全性相关的问题,请通过电子邮件 tuupola@appelsiini.net 而不是使用问题跟踪器。

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件