How the system works
ValiBlocks connects data-generating systems — ePRO apps and EDC platforms — to independent verifiers such as regulators, sponsors, and auditors through a neutral, tamper-evident on-chain registry. No personal or clinical data ever leaves the vendor system.
storeHash() on the contract. Only the digest is sent on-chain; the clinical data stays in the vendor database.trialId, recordId, amendmentVersion, algorithmId) alongside the plaintext records.getVersion() with the supplied metadata to retrieve the on-chain record. No wallet or permissions are required.Steps taken by the ePRO or EDC system each time a data point is recorded or amended.
| Field | Description |
|---|---|
trialId | The bytes32 trial identifier assigned at trial creation |
recordId | Your internal identifier for this data point within the trial |
amendmentVersion | A strictly-increasing version number for this record (e.g. 1, 2, 3 or a date such as 20250401) |
algorithmId | Numeric algorithm ID used to produce the digest (e.g. 1 = SHA-256) |
digest | The bytes32 hash, for local reference and to include in data exports |
storeHash(trialId, recordId, digest, algorithmId, amendmentVersion) on the ValGuard contract with the required ETH fee. The contract records the digest, the submitting wallet address, and the block timestamp in an append-only version history for that record.
Steps taken by an independent third party to verify a data point received from a vendor — months or years after the original submission.
trialId, recordId, amendmentVersion, and algorithmId.
algorithms(algorithmId) on the contract to confirm the algorithm description (e.g. "SHA-256"). This provides an on-chain, vendor-independent confirmation of which hash function was used.
getVersion(trialId, recordId, amendmentVersion) on the contract. No ETH fee, wallet, or special permissions are required — the function is publicly accessible to anyone who knows the identifiers.
hash field:
timestamp gives the earliest possible moment the data could have existed in this exact form, independently verified by the blockchain.
getFullHistory(trialId, recordId) to retrieve every version ever submitted for this record, oldest first. Each entry includes the submitter's wallet address, providing a complete, tamper-evident chain of custody that does not rely on the vendor's internal audit system.
trialId and recordId, which the vendor supplies as part of the data export. The non-guessability of trialId prevents enumeration of records by uninvited parties.