蝴蝶团队/avalanche-cb58

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

1.2 2021-03-06 14:38 UTC

This package is auto-updated.

Last update: 2024-09-06 22:52:23 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 "butterfly-team/avalanche-cb58:^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)。有关更多信息,请参阅许可证文件