Ce qui est signé, conservé et prouvable, exactement.
Chaque rouage, dans l'ordre où il intervient.
1. L'empreinte
Le SHA-256 réduit tout fichier à 64 caractères. Impossible à inverser : l'empreinte est publique, le fichier reste privé.
halden-tessel-msa-2026.txt
SHA-256
2. Le message signé
Le portefeuille affiche un message EIP-712 lisible : cette empreinte, ce titre, ce rôle.
- documentHash
- 0x5fc1d7e707db3f710ebf2bd323356513b95e4c5ac1e5ff9c997d5f811bdd39b6
- title
- Master Services Agreement — Halden Freight
- signer
- 0xfb250521274230730f6e7ad41fc50974805ae30c
- role
- signer
- decision
- approve
- nonce
- 7
3. Le registre
Des événements : adresses, empreintes, blocs. Jamais de noms ni de contenu.
interface ISignChainRegistry {
event EnvelopeCreated(bytes32 indexed docHash, address indexed sender,
address[] signers, bool sequential, string cid);
event DocumentSigned(bytes32 indexed docHash, address indexed signer,
uint64 timestamp);
event DocumentDeclined(bytes32 indexed docHash, address indexed signer,
bytes32 reasonHash);
event EnvelopeVoided(bytes32 indexed docHash);
function createEnvelope(bytes32 docHash, address[] calldata signers,
bool sequential, string calldata cid) external;
function sign(bytes32 docHash, bytes calldata sig) external; // EIP-712
function decline(bytes32 docHash, bytes32 reasonHash,
bytes calldata sig) external;
function voidEnvelope(bytes32 docHash) external; // sender only
}4. Où vit le document
Empreinte seule (par défaut)
Les parties gardent le fichier ; la chaîne garde la preuve.
Copie chiffrée sur IPFS
Chiffrée dans le navigateur, épinglée sur IPFS, son CID inscrit avec le dossier.
5. La vérification
Hacher, chercher, contrôler chaque signature. N'importe quel outil SHA-256 et explorateur de blocs suffit.
Vérifier un fichierconst hash = sha256(await file.arrayBuffer()) // 1. fingerprint
const logs = await client.getContractEvents({ // 2. look it up
address: REGISTRY, abi, eventName: "DocumentSigned",
args: { docHash: `0x${hash}` },
})
for (const s of receipt.signatures) // 3. check each one
assert(await verifyTypedData({ ...domain, message, signature: s.signature,
address: s.signer }))Valeur juridique
L'ESIGN, eIDAS et la loi québécoise sur le cadre juridique des TI admettent en général une signature liée à une personne et à un document intact. Testaments et actes notariés exigent davantage. Pas un avis juridique.
Pour les développeurs
src/lib/demo reflète ce contrat appel par appel, prêt à céder la place à wagmi et viem.
Voyez-le fonctionner.
Envoyez un contrat d'exemple, cosignez-en un, puis essayez de le falsifier.