此範例讀取簽名的 Command 和 Registry 從 SDK已驗證嵌入
ProtocolBundle,然後提供類型化的記憶體中權限適配器。它不會讀取存儲庫文件。它為首次準入和歷史重播斷言相同的記錄 ID、簽名雜湊值和記錄位元組,並且只有一個附加。
#include <missionweaveprotocol/admission.hpp>
#include <missionweaveprotocol/bundle.hpp>
#include <cstddef>
#include <cstdint>
#include <iostream>
#include <optional>
#include <ranges>
#include <stdexcept>
#include <string_view>
#include <utility>
#include <vector>
namespace {
constexpr std::string_view service_id = "urn:missionweaveprotocol:service:admission";
class CurrentRegistry final : public missionweaveprotocol::AdmissionCurrentKeyResolver,
public missionweaveprotocol::KeyResolver {
public:
explicit CurrentRegistry(const missionweaveprotocol::AssetBytes registry)
: registry_(registry.begin(), registry.end()) {}
[[nodiscard]] missionweaveprotocol::KeyRegistrySnapshot
resolve_current(const missionweaveprotocol::KeyResolutionRequest&) const override {
return snapshot();
}
[[nodiscard]] missionweaveprotocol::KeyRegistrySnapshot
resolve(const missionweaveprotocol::KeyResolutionRequest&) const override {
return snapshot();
}
private:
[[nodiscard]] missionweaveprotocol::KeyRegistrySnapshot snapshot() const {
return missionweaveprotocol::KeyRegistrySnapshot::organization_wide(registry_);
}
std::vector<std::uint8_t> registry_;
};
class FixedTrustedContext final : public missionweaveprotocol::TrustedAdmissionContext {
public:
[[nodiscard]] missionweaveprotocol::AdmissionContextValue issue(std::string_view,
std::string_view) const override {
return {
.admission_record_id = "urn:missionweaveprotocol:admission-record:website-example",
.trusted_accepted_at = "2026-07-15T00:05:00Z",
.accepted_by = {.type = "service", .id = std::string{service_id}},
};
}
};
class InMemoryAdmissionLog final : public missionweaveprotocol::AdmissionLog {
public:
[[nodiscard]] missionweaveprotocol::AdmissionLookup lookup(std::string_view,
std::string_view) const override {
return record_ ? missionweaveprotocol::AdmissionLookup::found(*record_)
: missionweaveprotocol::AdmissionLookup::authoritative_absence();
}
[[nodiscard]] missionweaveprotocol::AuthenticatedAdmissionRecord
append_or_return_existing(std::string_view, std::string_view,
const missionweaveprotocol::AssetBytes candidate_bytes) const override {
if (record_) {
return *record_;
}
record_.emplace(
std::vector<std::uint8_t>{candidate_bytes.begin(), candidate_bytes.end()},
missionweaveprotocol::Principal{.type = "service", .id = std::string{service_id}});
append_count_ += 1;
return *record_;
}
[[nodiscard]] std::size_t append_count() const noexcept { return append_count_; }
private:
mutable std::optional<missionweaveprotocol::AuthenticatedAdmissionRecord> record_;
mutable std::size_t append_count_ = 0;
};
} // namespace
int main() {
const auto protocol = missionweaveprotocol::ProtocolBundle::verify();
const auto cryptography = missionweaveprotocol::ProtocolBundle::verify_cryptography();
const auto admission = missionweaveprotocol::ProtocolBundle::verify_admission();
if (protocol.schema_files != 22 || cryptography.evaluation_count != 62 ||
admission.evaluation_count != 30) {
throw std::runtime_error("embedded bundle identity is inconsistent");
}
const auto document = missionweaveprotocol::ProtocolBundle::cryptography(
"vectors/signed-documents/valid/command.json");
const auto registry =
missionweaveprotocol::ProtocolBundle::cryptography("keys/registry-valid.json");
if (!document || !registry) {
throw std::runtime_error("packaged Command or Registry is missing");
}
const CurrentRegistry current_registry{*registry};
const InMemoryAdmissionLog admission_log;
const FixedTrustedContext trusted_context;
const missionweaveprotocol::AdmissionService service;
const auto first =
service.admit_first(missionweaveprotocol::SignedDocumentKind::command, *document,
current_registry, admission_log, trusted_context);
const auto historical =
service.verify_historical_admission(missionweaveprotocol::SignedDocumentKind::command,
*document, current_registry, admission_log);
if (first.record().admission_record_id() != historical.record().admission_record_id()) {
throw std::runtime_error("historical replay returned a different record ID");
}
if (first.verified().signing_hash() != historical.verified().signing_hash()) {
throw std::runtime_error("historical replay returned a different signing hash");
}
if (!std::ranges::equal(first.record_bytes(), historical.record_bytes())) {
throw std::runtime_error("historical replay returned different record bytes");
}
if (!(admission_log.append_count() == 1)) {
throw std::runtime_error("Admission Log did not append exactly once");
}
std::cout << "first admission: " << first.record().admission_record_id() << '\n';
std::cout << "historical replay: " << historical.record().admission_record_id() << '\n';
}
複製 admission.cpp 以及以下內容 CMakeLists.txt
到一個空的消費者目錄。建立配方定義了可執行檔本身並添加了精確固定的 SDK
checkout 作為依賴項;它不依賴消費者尚未聲明的目標。
cmake_minimum_required(VERSION 3.24)
project(missionweaveprotocol_website_admission LANGUAGES CXX)
if(NOT DEFINED MISSIONWEAVEPROTOCOL_SDK_ROOT)
message(FATAL_ERROR "Set MISSIONWEAVEPROTOCOL_SDK_ROOT to the exact-pinned C++ SDK checkout")
endif()
set(MISSIONWEAVEPROTOCOL_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(MISSIONWEAVEPROTOCOL_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
add_subdirectory("${MISSIONWEAVEPROTOCOL_SDK_ROOT}"
"${CMAKE_BINARY_DIR}/missionweaveprotocol-sdk")
add_executable(missionweaveprotocol_website_admission admission.cpp)
target_link_libraries(missionweaveprotocol_website_admission
PRIVATE MissionWeaveProtocol::sdk)
target_compile_features(missionweaveprotocol_website_admission PRIVATE cxx_std_20)
從該消費者目錄中,運行:
-DMISSIONWEAVEPROTOCOL_SDK_ROOT=/absolute/path/to/exact/cpp-sdk \
-DOPENSSL_ROOT_DIR=/absolute/path/to/openssl-3
cmake --build build --target missionweaveprotocol_website_admission --parallel 2
./build/missionweaveprotocol_website_admission
預期輸出包含相同的記錄 ID first admission 和 historical replay.