magadanuhak/laravel-provably-fair

一个 Laravel 扩展包,用于获取可验证的随机数

1.0.5 2024-05-28 11:04 UTC

This package is auto-updated.

Last update: 2024-09-28 11:52:09 UTC


README

Laravel ProvablyFair 是一个包,允许使用客户端种子(前端字符串)和服务器种子(后端字符串)来生成随机数。

Total Downloads Latest Stable Version License

如果您知道客户端种子、服务器种子和nonce,您可以生成相同的随机数。nonce 是一个可计数的数字,用于计算相同的客户端种子和服务器种子被使用的次数。

安装

使用 composer 包管理器 composer 安装包。

composer require magadanuhak/laravel-provably-fair

用法

    $provablyFairService = new ProvablyFair(); //Initialization of provably fair
    $clientSeed = $request->client_seed; // Client seed is a string that you should get from frontend
    $resultedData = $provablyFairService->getRandomNumber($clientSeed); // This method will return an object ProvablyFairResultData

getRandomNumber($clientSeed); 的结果是

class ProvablyFairResultData
{
    public function __construct(
        public readonly string $clientSeed,
        public readonly string $serverSeed,
        public readonly int    $nonce,
        public readonly float  $resultedNumber,
        public readonly float  $minimalValue,
        public readonly float  $maximalValue,
    )
    {
    }
}

现在您可以将这些数据存储在数据库中,返回给用户。以下是从集合中随机获取一个项目的示例

class GetRandomWeapon {

    public function chances(): Collection
    {
        return collect([
            "Ak-47" => 45,
            "Mp-40" => 50,
            "AWM" => 5,
        ]);
    } 

    public function getItem(): string //Returns won Item Name 
    {
        $sum = 0;

        $provablyFairService = new ProvablyFair(); //Initialization of provably fair
        $clientSeed = $request->client_seed; // Client seed is a string that you should get from frontend
        $resultedData = $provablyFairService->getRandomNumber($clientSeed);  // This method will return an object ProvablyFairResultData
//      $resultedData = $provablyFairService->getRandomNumber($clientSeed, $serverSeed, $nonce);  // $serverSeed, $nonce are optionally This method will return an object ProvablyFairResultData

        $choice = $resultedData->resultedNumber;

        return app(
            $this->chances()
                ->map(function ($value, $item) use (&$sum) {
                    $sum += $value;
                    return $sum;
                })
                ->reduce(function ($result, $value, $key) use ($choice) {
                    if (is_string($result)) {
                        return $result;
                    }

                    if ($choice <= $value) {
                        return $key;
                    }

                    return $result + $value;
                }, 0)
        );
    }
}

默认情况下,ProvablyFair::class 绑定到 ProvablyFairContract::class。您可以使用 Laravel 服务容器依赖注入在您的 Laravel 项目中使用 ProvablyFair

class GetRandomItemByChance {
    
    public function __construct(
        ProvablyFairContract $provablyFair
    )
    {}

    public function getProvablyFairResult(string $clientSeed): ProvablyFairResultData
    {
        return $this->provablyFair->getRandomNumber($clientSeed);
    }
}

贡献

欢迎提交拉取请求。对于重大更改,请先打开一个问题来讨论您想要更改的内容。

请确保根据需要更新测试。

许可

MIT