canonicalize($payload); $encoded = json_encode($canonical, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); if ($encoded === false) { throw new \InvalidArgumentException('Knowledge payload cannot be encoded.'); } return hash('sha256', $encoded); } private function canonicalize(array $payload): array { if (! $this->isList($payload)) { ksort($payload); } foreach ($payload as $key => $value) { if (is_array($value)) { $payload[$key] = $this->canonicalize($value); } } return $payload; } private function isList(array $payload): bool { return array_keys($payload) === range(0, count($payload) - 1); } }