在 PHP 中验证以太坊 (Web3) 签名消息

Verifying Ethereum (Web3) signed message in PHP

如何使用 PHP 验证以太坊签名消息?

使用 Web3.js 中的 web3.personal.sign 函数对消息进行签名,然后将签名发送到服务器。我如何用 PHP 验证它?

是否有一些预构建的包(在 Packagist 上)或者我应该从头开始做?是否可以在不连接到 RPC 节点或链(链下)的情况下执行此操作?

我已经在 Ethereum StackExchange 上找到了 some question about this,但是它非常复杂而且有点旧,所以我想知道是否有更新更好的解决方案。

我也找到了 some package on GitHub,但我不知道它是否适用于 web3.personal.sign

我找到的一些链接:

可以使用包 php-ecrecover 验证签名的消息。

您可以使用此包获取原始消息地址,然后验证它是否与预期地址相同。

JS 签名:

let message = 'Hello World!'
let address = web3.eth.coinbase

web3.personal.sign(web3.fromUtf8(message), address, console.log);

PHP 验证:

$address = '0xe12Aa5FB5659bb0DB3f488e29701fE303bcBAf65';
$message = 'Hello World!';
$signed = '0x2cb6b41177a5e6690ebbc61f182758fcf8f54403edcb848fc1089a772227d55163804b4dc7fcf72d15f0d977d741f6dd6bcc4fc4c74916378afcad06be77b2101b';

if ($address == personal_ecRecover($message, $signed)) {
    echo 'Message verified';
} else {
    echo 'Message not verified';
}