get('addr'); if (empty($addr)) return errjson('请填写钱包地址'); $signature = $post->get('sign'); if (empty($signature)) return errjson('请填写签名'); $message = $post->get('hash'); if (empty($message)) return errjson('请填写hash'); //composer require simplito/elliptic-php kornrunner/keccak require_once PATH_ROOT . '../libs/ethereum/autoload.php'; $prefix = "\x19Ethereum Signed Message:\n" . strlen($message); $hash = \kornrunner\Keccak::hash($prefix . $message, 256); $signature = substr($signature, 2); if (strlen($signature) !== 130) return '签名数据长度错误'; $r = substr($signature, 0, 64); $s = substr($signature, 64, 64); $v = substr($signature, 128, 2); $v = hexdec($v); if ($v == 27 || $v == 28) $v -= 27; $ec = new \Elliptic\EC('secp256k1'); $publicKey = $ec->recoverPubKey($hash, [ 'r' => $r, 's' => $s ], $v); $publicKeyHex = $publicKey->encode('hex'); $publicKeyBytes = substr(hex2bin($publicKeyHex), 1); $addressFromKey = '0x' . substr(\kornrunner\Keccak::hash($publicKeyBytes, 256), 24); $addressFromKey = strtolower($addressFromKey); $ret['msg'] = strtolower($addr) === $addressFromKey ? "签名验证成功" : "签名验证失败"; return succjson($ret); } }