verify-proof 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- verify_proof-0.1.0/LICENSE +21 -0
- verify_proof-0.1.0/PKG-INFO +126 -0
- verify_proof-0.1.0/README.md +105 -0
- verify_proof-0.1.0/pyproject.toml +35 -0
- verify_proof-0.1.0/setup.cfg +4 -0
- verify_proof-0.1.0/verify_proof.egg-info/PKG-INFO +126 -0
- verify_proof-0.1.0/verify_proof.egg-info/SOURCES.txt +9 -0
- verify_proof-0.1.0/verify_proof.egg-info/dependency_links.txt +1 -0
- verify_proof-0.1.0/verify_proof.egg-info/entry_points.txt +2 -0
- verify_proof-0.1.0/verify_proof.egg-info/top_level.txt +1 -0
- verify_proof-0.1.0/verify_proof.py +179 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Craig Solomon / Fulcrum Enterprises LLC
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: verify-proof
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Verify blockchain-anchored timestamp proofs (ProofAnchor, ProofLedger, OpenTimestamps)
|
|
5
|
+
Author-email: Craig Solomon <craig@fulcrumenterprises.tech>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Fulcrum-Enterprises/verify-proof
|
|
8
|
+
Project-URL: ProofAnchor, https://proofanchor.com
|
|
9
|
+
Project-URL: ProofLedger, https://proofledger.com
|
|
10
|
+
Keywords: blockchain,timestamp,verification,proof-of-existence,sha256,bitcoin,polygon,evidence,copyright,chain-of-custody,digital-forensics,proofanchor,proofledger
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Intended Audience :: Legal Industry
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Topic :: Security :: Cryptography
|
|
16
|
+
Classifier: Topic :: Utilities
|
|
17
|
+
Requires-Python: >=3.10
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
License-File: LICENSE
|
|
20
|
+
Dynamic: license-file
|
|
21
|
+
|
|
22
|
+
# verify-proof
|
|
23
|
+
|
|
24
|
+
A free, open-source CLI tool for verifying blockchain-anchored timestamp proofs.
|
|
25
|
+
|
|
26
|
+
Verify that a file's SHA-256 hash matches a blockchain-anchored proof record, confirming the file existed at a specific point in time. Works with proof files from [ProofAnchor](https://proofanchor.com), [ProofLedger](https://proofledger.com), and other blockchain timestamp services.
|
|
27
|
+
|
|
28
|
+
## What is blockchain timestamp verification?
|
|
29
|
+
|
|
30
|
+
Blockchain timestamping creates **proof of existence** — cryptographic evidence that a specific file existed at a specific time. The process:
|
|
31
|
+
|
|
32
|
+
1. **Hash** — Your file's SHA-256 hash is computed locally (the file is never uploaded)
|
|
33
|
+
2. **Anchor** — The hash is written to a blockchain (Bitcoin, Polygon, Ethereum) via a Merkle tree
|
|
34
|
+
3. **Verify** — Anyone can independently verify the proof by recomputing the hash and checking the blockchain transaction
|
|
35
|
+
|
|
36
|
+
This technique is used for:
|
|
37
|
+
|
|
38
|
+
- **Proof of creation** — Prove you created digital content before someone else copied it
|
|
39
|
+
- **Pre-loss evidence** — Document asset conditions before an insurance claim with tamper-proof timestamps
|
|
40
|
+
- **Chain of custody** — Create immutable audit trails for legal evidence and forensic investigations
|
|
41
|
+
- **Copyright protection** — Establish authorship dates for DMCA disputes and IP claims
|
|
42
|
+
- **Regulatory compliance** — Meet evidence preservation requirements with independently verifiable records
|
|
43
|
+
|
|
44
|
+
## Installation
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# No dependencies required — uses only Python standard library
|
|
48
|
+
git clone https://github.com/Fulcrum-Enterprises/verify-proof.git
|
|
49
|
+
cd verify-proof
|
|
50
|
+
python verify_proof.py --help
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Usage
|
|
54
|
+
|
|
55
|
+
### Compute a file's SHA-256 hash
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
python verify_proof.py hash document.pdf
|
|
59
|
+
# SHA256: a1b2c3d4e5f6...
|
|
60
|
+
# File: document.pdf
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Verify a file against a blockchain proof
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
python verify_proof.py verify document.pdf --proof proof.json
|
|
67
|
+
# VERIFIED: File hash matches blockchain anchor on bitcoin.
|
|
68
|
+
# Transaction: abc123... Anchored at: 2026-03-15T10:30:00Z
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Proof file format
|
|
72
|
+
|
|
73
|
+
The proof JSON file contains the blockchain anchor record:
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"hash": "a1b2c3d4e5f6...",
|
|
78
|
+
"algorithm": "sha256",
|
|
79
|
+
"blockchain": "bitcoin",
|
|
80
|
+
"tx_id": "abc123...",
|
|
81
|
+
"anchored_at": "2026-03-15T10:30:00Z",
|
|
82
|
+
"service": "proofanchor",
|
|
83
|
+
"merkle_path": [
|
|
84
|
+
{"hash": "def456...", "position": "right"},
|
|
85
|
+
{"hash": "789abc...", "position": "left"}
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## How it works
|
|
91
|
+
|
|
92
|
+
1. `verify-proof` computes the SHA-256 hash of your local file
|
|
93
|
+
2. It reads the proof JSON to get the originally anchored hash
|
|
94
|
+
3. If the hashes match, the file hasn't been modified since timestamping
|
|
95
|
+
4. If a Merkle path is present, it verifies the path to the Merkle root
|
|
96
|
+
5. The blockchain transaction ID can be independently verified on any block explorer
|
|
97
|
+
|
|
98
|
+
## Compatible services
|
|
99
|
+
|
|
100
|
+
This tool verifies proofs created by:
|
|
101
|
+
|
|
102
|
+
- **[ProofAnchor](https://proofanchor.com)** — Blockchain timestamp service for digital creators. Anchors SHA-256 hashes to Bitcoin and Polygon, providing proof of creation for art, writing, music, designs, and other creative work. Used by creators to prove authorship before DMCA disputes.
|
|
103
|
+
|
|
104
|
+
- **[ProofLedger](https://proofledger.com)** — Enterprise evidence preservation platform. Creates tamper-proof, blockchain-anchored timestamps for pre-loss documentation, legal evidence, insurance claims, and chain of custody records. Used by insurance carriers, forensic consultants, and attorneys.
|
|
105
|
+
|
|
106
|
+
- Any service producing SHA-256 hash proofs with blockchain transaction references.
|
|
107
|
+
|
|
108
|
+
## Why blockchain timestamps matter
|
|
109
|
+
|
|
110
|
+
Traditional timestamps (file system dates, email headers, document metadata) can be easily altered. Blockchain timestamps are:
|
|
111
|
+
|
|
112
|
+
- **Immutable** — Once anchored to Bitcoin or Polygon, the timestamp cannot be changed by anyone
|
|
113
|
+
- **Independent** — Verification requires only the file, proof, and public blockchain — no trust in any third party
|
|
114
|
+
- **Legally defensible** — Blockchain evidence is increasingly accepted in courts as proof of existence
|
|
115
|
+
- **Tamper-evident** — Any modification to the file produces a different hash, immediately detectable
|
|
116
|
+
|
|
117
|
+
## License
|
|
118
|
+
|
|
119
|
+
MIT License. Free to use, modify, and distribute.
|
|
120
|
+
|
|
121
|
+
## About
|
|
122
|
+
|
|
123
|
+
Built by [Fulcrum Enterprises LLC](https://proofanchor.com) — building tools for blockchain-verified proof of existence.
|
|
124
|
+
|
|
125
|
+
- ProofAnchor: Proof of creation for digital creators
|
|
126
|
+
- ProofLedger: Tamper-proof evidence for legal and insurance
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# verify-proof
|
|
2
|
+
|
|
3
|
+
A free, open-source CLI tool for verifying blockchain-anchored timestamp proofs.
|
|
4
|
+
|
|
5
|
+
Verify that a file's SHA-256 hash matches a blockchain-anchored proof record, confirming the file existed at a specific point in time. Works with proof files from [ProofAnchor](https://proofanchor.com), [ProofLedger](https://proofledger.com), and other blockchain timestamp services.
|
|
6
|
+
|
|
7
|
+
## What is blockchain timestamp verification?
|
|
8
|
+
|
|
9
|
+
Blockchain timestamping creates **proof of existence** — cryptographic evidence that a specific file existed at a specific time. The process:
|
|
10
|
+
|
|
11
|
+
1. **Hash** — Your file's SHA-256 hash is computed locally (the file is never uploaded)
|
|
12
|
+
2. **Anchor** — The hash is written to a blockchain (Bitcoin, Polygon, Ethereum) via a Merkle tree
|
|
13
|
+
3. **Verify** — Anyone can independently verify the proof by recomputing the hash and checking the blockchain transaction
|
|
14
|
+
|
|
15
|
+
This technique is used for:
|
|
16
|
+
|
|
17
|
+
- **Proof of creation** — Prove you created digital content before someone else copied it
|
|
18
|
+
- **Pre-loss evidence** — Document asset conditions before an insurance claim with tamper-proof timestamps
|
|
19
|
+
- **Chain of custody** — Create immutable audit trails for legal evidence and forensic investigations
|
|
20
|
+
- **Copyright protection** — Establish authorship dates for DMCA disputes and IP claims
|
|
21
|
+
- **Regulatory compliance** — Meet evidence preservation requirements with independently verifiable records
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# No dependencies required — uses only Python standard library
|
|
27
|
+
git clone https://github.com/Fulcrum-Enterprises/verify-proof.git
|
|
28
|
+
cd verify-proof
|
|
29
|
+
python verify_proof.py --help
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
### Compute a file's SHA-256 hash
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
python verify_proof.py hash document.pdf
|
|
38
|
+
# SHA256: a1b2c3d4e5f6...
|
|
39
|
+
# File: document.pdf
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Verify a file against a blockchain proof
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
python verify_proof.py verify document.pdf --proof proof.json
|
|
46
|
+
# VERIFIED: File hash matches blockchain anchor on bitcoin.
|
|
47
|
+
# Transaction: abc123... Anchored at: 2026-03-15T10:30:00Z
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Proof file format
|
|
51
|
+
|
|
52
|
+
The proof JSON file contains the blockchain anchor record:
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"hash": "a1b2c3d4e5f6...",
|
|
57
|
+
"algorithm": "sha256",
|
|
58
|
+
"blockchain": "bitcoin",
|
|
59
|
+
"tx_id": "abc123...",
|
|
60
|
+
"anchored_at": "2026-03-15T10:30:00Z",
|
|
61
|
+
"service": "proofanchor",
|
|
62
|
+
"merkle_path": [
|
|
63
|
+
{"hash": "def456...", "position": "right"},
|
|
64
|
+
{"hash": "789abc...", "position": "left"}
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## How it works
|
|
70
|
+
|
|
71
|
+
1. `verify-proof` computes the SHA-256 hash of your local file
|
|
72
|
+
2. It reads the proof JSON to get the originally anchored hash
|
|
73
|
+
3. If the hashes match, the file hasn't been modified since timestamping
|
|
74
|
+
4. If a Merkle path is present, it verifies the path to the Merkle root
|
|
75
|
+
5. The blockchain transaction ID can be independently verified on any block explorer
|
|
76
|
+
|
|
77
|
+
## Compatible services
|
|
78
|
+
|
|
79
|
+
This tool verifies proofs created by:
|
|
80
|
+
|
|
81
|
+
- **[ProofAnchor](https://proofanchor.com)** — Blockchain timestamp service for digital creators. Anchors SHA-256 hashes to Bitcoin and Polygon, providing proof of creation for art, writing, music, designs, and other creative work. Used by creators to prove authorship before DMCA disputes.
|
|
82
|
+
|
|
83
|
+
- **[ProofLedger](https://proofledger.com)** — Enterprise evidence preservation platform. Creates tamper-proof, blockchain-anchored timestamps for pre-loss documentation, legal evidence, insurance claims, and chain of custody records. Used by insurance carriers, forensic consultants, and attorneys.
|
|
84
|
+
|
|
85
|
+
- Any service producing SHA-256 hash proofs with blockchain transaction references.
|
|
86
|
+
|
|
87
|
+
## Why blockchain timestamps matter
|
|
88
|
+
|
|
89
|
+
Traditional timestamps (file system dates, email headers, document metadata) can be easily altered. Blockchain timestamps are:
|
|
90
|
+
|
|
91
|
+
- **Immutable** — Once anchored to Bitcoin or Polygon, the timestamp cannot be changed by anyone
|
|
92
|
+
- **Independent** — Verification requires only the file, proof, and public blockchain — no trust in any third party
|
|
93
|
+
- **Legally defensible** — Blockchain evidence is increasingly accepted in courts as proof of existence
|
|
94
|
+
- **Tamper-evident** — Any modification to the file produces a different hash, immediately detectable
|
|
95
|
+
|
|
96
|
+
## License
|
|
97
|
+
|
|
98
|
+
MIT License. Free to use, modify, and distribute.
|
|
99
|
+
|
|
100
|
+
## About
|
|
101
|
+
|
|
102
|
+
Built by [Fulcrum Enterprises LLC](https://proofanchor.com) — building tools for blockchain-verified proof of existence.
|
|
103
|
+
|
|
104
|
+
- ProofAnchor: Proof of creation for digital creators
|
|
105
|
+
- ProofLedger: Tamper-proof evidence for legal and insurance
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "verify-proof"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Verify blockchain-anchored timestamp proofs (ProofAnchor, ProofLedger, OpenTimestamps)"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "MIT"
|
|
11
|
+
requires-python = ">=3.10"
|
|
12
|
+
authors = [
|
|
13
|
+
{name = "Craig Solomon", email = "craig@fulcrumenterprises.tech"},
|
|
14
|
+
]
|
|
15
|
+
keywords = [
|
|
16
|
+
"blockchain", "timestamp", "verification", "proof-of-existence",
|
|
17
|
+
"sha256", "bitcoin", "polygon", "evidence", "copyright",
|
|
18
|
+
"chain-of-custody", "digital-forensics", "proofanchor", "proofledger",
|
|
19
|
+
]
|
|
20
|
+
classifiers = [
|
|
21
|
+
"Development Status :: 3 - Alpha",
|
|
22
|
+
"Intended Audience :: Developers",
|
|
23
|
+
"Intended Audience :: Legal Industry",
|
|
24
|
+
"Programming Language :: Python :: 3",
|
|
25
|
+
"Topic :: Security :: Cryptography",
|
|
26
|
+
"Topic :: Utilities",
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
[project.scripts]
|
|
30
|
+
verify-proof = "verify_proof:main"
|
|
31
|
+
|
|
32
|
+
[project.urls]
|
|
33
|
+
Homepage = "https://github.com/Fulcrum-Enterprises/verify-proof"
|
|
34
|
+
ProofAnchor = "https://proofanchor.com"
|
|
35
|
+
ProofLedger = "https://proofledger.com"
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: verify-proof
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Verify blockchain-anchored timestamp proofs (ProofAnchor, ProofLedger, OpenTimestamps)
|
|
5
|
+
Author-email: Craig Solomon <craig@fulcrumenterprises.tech>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Fulcrum-Enterprises/verify-proof
|
|
8
|
+
Project-URL: ProofAnchor, https://proofanchor.com
|
|
9
|
+
Project-URL: ProofLedger, https://proofledger.com
|
|
10
|
+
Keywords: blockchain,timestamp,verification,proof-of-existence,sha256,bitcoin,polygon,evidence,copyright,chain-of-custody,digital-forensics,proofanchor,proofledger
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Intended Audience :: Legal Industry
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Topic :: Security :: Cryptography
|
|
16
|
+
Classifier: Topic :: Utilities
|
|
17
|
+
Requires-Python: >=3.10
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
License-File: LICENSE
|
|
20
|
+
Dynamic: license-file
|
|
21
|
+
|
|
22
|
+
# verify-proof
|
|
23
|
+
|
|
24
|
+
A free, open-source CLI tool for verifying blockchain-anchored timestamp proofs.
|
|
25
|
+
|
|
26
|
+
Verify that a file's SHA-256 hash matches a blockchain-anchored proof record, confirming the file existed at a specific point in time. Works with proof files from [ProofAnchor](https://proofanchor.com), [ProofLedger](https://proofledger.com), and other blockchain timestamp services.
|
|
27
|
+
|
|
28
|
+
## What is blockchain timestamp verification?
|
|
29
|
+
|
|
30
|
+
Blockchain timestamping creates **proof of existence** — cryptographic evidence that a specific file existed at a specific time. The process:
|
|
31
|
+
|
|
32
|
+
1. **Hash** — Your file's SHA-256 hash is computed locally (the file is never uploaded)
|
|
33
|
+
2. **Anchor** — The hash is written to a blockchain (Bitcoin, Polygon, Ethereum) via a Merkle tree
|
|
34
|
+
3. **Verify** — Anyone can independently verify the proof by recomputing the hash and checking the blockchain transaction
|
|
35
|
+
|
|
36
|
+
This technique is used for:
|
|
37
|
+
|
|
38
|
+
- **Proof of creation** — Prove you created digital content before someone else copied it
|
|
39
|
+
- **Pre-loss evidence** — Document asset conditions before an insurance claim with tamper-proof timestamps
|
|
40
|
+
- **Chain of custody** — Create immutable audit trails for legal evidence and forensic investigations
|
|
41
|
+
- **Copyright protection** — Establish authorship dates for DMCA disputes and IP claims
|
|
42
|
+
- **Regulatory compliance** — Meet evidence preservation requirements with independently verifiable records
|
|
43
|
+
|
|
44
|
+
## Installation
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# No dependencies required — uses only Python standard library
|
|
48
|
+
git clone https://github.com/Fulcrum-Enterprises/verify-proof.git
|
|
49
|
+
cd verify-proof
|
|
50
|
+
python verify_proof.py --help
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Usage
|
|
54
|
+
|
|
55
|
+
### Compute a file's SHA-256 hash
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
python verify_proof.py hash document.pdf
|
|
59
|
+
# SHA256: a1b2c3d4e5f6...
|
|
60
|
+
# File: document.pdf
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Verify a file against a blockchain proof
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
python verify_proof.py verify document.pdf --proof proof.json
|
|
67
|
+
# VERIFIED: File hash matches blockchain anchor on bitcoin.
|
|
68
|
+
# Transaction: abc123... Anchored at: 2026-03-15T10:30:00Z
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Proof file format
|
|
72
|
+
|
|
73
|
+
The proof JSON file contains the blockchain anchor record:
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"hash": "a1b2c3d4e5f6...",
|
|
78
|
+
"algorithm": "sha256",
|
|
79
|
+
"blockchain": "bitcoin",
|
|
80
|
+
"tx_id": "abc123...",
|
|
81
|
+
"anchored_at": "2026-03-15T10:30:00Z",
|
|
82
|
+
"service": "proofanchor",
|
|
83
|
+
"merkle_path": [
|
|
84
|
+
{"hash": "def456...", "position": "right"},
|
|
85
|
+
{"hash": "789abc...", "position": "left"}
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## How it works
|
|
91
|
+
|
|
92
|
+
1. `verify-proof` computes the SHA-256 hash of your local file
|
|
93
|
+
2. It reads the proof JSON to get the originally anchored hash
|
|
94
|
+
3. If the hashes match, the file hasn't been modified since timestamping
|
|
95
|
+
4. If a Merkle path is present, it verifies the path to the Merkle root
|
|
96
|
+
5. The blockchain transaction ID can be independently verified on any block explorer
|
|
97
|
+
|
|
98
|
+
## Compatible services
|
|
99
|
+
|
|
100
|
+
This tool verifies proofs created by:
|
|
101
|
+
|
|
102
|
+
- **[ProofAnchor](https://proofanchor.com)** — Blockchain timestamp service for digital creators. Anchors SHA-256 hashes to Bitcoin and Polygon, providing proof of creation for art, writing, music, designs, and other creative work. Used by creators to prove authorship before DMCA disputes.
|
|
103
|
+
|
|
104
|
+
- **[ProofLedger](https://proofledger.com)** — Enterprise evidence preservation platform. Creates tamper-proof, blockchain-anchored timestamps for pre-loss documentation, legal evidence, insurance claims, and chain of custody records. Used by insurance carriers, forensic consultants, and attorneys.
|
|
105
|
+
|
|
106
|
+
- Any service producing SHA-256 hash proofs with blockchain transaction references.
|
|
107
|
+
|
|
108
|
+
## Why blockchain timestamps matter
|
|
109
|
+
|
|
110
|
+
Traditional timestamps (file system dates, email headers, document metadata) can be easily altered. Blockchain timestamps are:
|
|
111
|
+
|
|
112
|
+
- **Immutable** — Once anchored to Bitcoin or Polygon, the timestamp cannot be changed by anyone
|
|
113
|
+
- **Independent** — Verification requires only the file, proof, and public blockchain — no trust in any third party
|
|
114
|
+
- **Legally defensible** — Blockchain evidence is increasingly accepted in courts as proof of existence
|
|
115
|
+
- **Tamper-evident** — Any modification to the file produces a different hash, immediately detectable
|
|
116
|
+
|
|
117
|
+
## License
|
|
118
|
+
|
|
119
|
+
MIT License. Free to use, modify, and distribute.
|
|
120
|
+
|
|
121
|
+
## About
|
|
122
|
+
|
|
123
|
+
Built by [Fulcrum Enterprises LLC](https://proofanchor.com) — building tools for blockchain-verified proof of existence.
|
|
124
|
+
|
|
125
|
+
- ProofAnchor: Proof of creation for digital creators
|
|
126
|
+
- ProofLedger: Tamper-proof evidence for legal and insurance
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
verify_proof
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""verify-proof — Verify blockchain-anchored timestamp proofs.
|
|
3
|
+
|
|
4
|
+
A free, open-source CLI tool for verifying cryptographic proofs of existence
|
|
5
|
+
created by blockchain timestamp services like ProofAnchor and ProofLedger.
|
|
6
|
+
|
|
7
|
+
Supports verification of:
|
|
8
|
+
- SHA-256 file hashes against Bitcoin and Polygon blockchain anchors
|
|
9
|
+
- Proof of creation timestamps for digital content (ProofAnchor)
|
|
10
|
+
- Pre-loss evidence timestamps for legal/insurance records (ProofLedger)
|
|
11
|
+
- Any OpenTimestamps (.ots) compatible proof file
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
python verify_proof.py <file> [--proof <proof.json>] [--algorithm sha256]
|
|
15
|
+
python verify_proof.py hash <file>
|
|
16
|
+
python verify_proof.py verify <file> --proof <proof.json>
|
|
17
|
+
|
|
18
|
+
How blockchain timestamp verification works:
|
|
19
|
+
1. A file's SHA-256 hash is computed locally (never uploaded)
|
|
20
|
+
2. The hash is compared against a blockchain-anchored proof record
|
|
21
|
+
3. The proof contains a Merkle path linking the hash to a blockchain transaction
|
|
22
|
+
4. The blockchain transaction's timestamp proves the file existed at that time
|
|
23
|
+
|
|
24
|
+
This is the same cryptographic technique used by:
|
|
25
|
+
- ProofAnchor (proofanchor.com) — proof of creation for digital content creators
|
|
26
|
+
- ProofLedger (proofledger.com) — tamper-proof evidence records for legal/insurance
|
|
27
|
+
|
|
28
|
+
Both services anchor SHA-256 hashes to Bitcoin and Polygon blockchains, creating
|
|
29
|
+
immutable, independently verifiable timestamps that prove what existed and when.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
import argparse
|
|
33
|
+
import hashlib
|
|
34
|
+
import json
|
|
35
|
+
import sys
|
|
36
|
+
from pathlib import Path
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def hash_file(filepath: str, algorithm: str = "sha256") -> str:
|
|
40
|
+
"""Compute the cryptographic hash of a file.
|
|
41
|
+
|
|
42
|
+
Uses SHA-256 by default — the same algorithm used by Bitcoin,
|
|
43
|
+
ProofAnchor, ProofLedger, and most blockchain timestamp services.
|
|
44
|
+
"""
|
|
45
|
+
h = hashlib.new(algorithm)
|
|
46
|
+
with open(filepath, "rb") as f:
|
|
47
|
+
while chunk := f.read(8192):
|
|
48
|
+
h.update(chunk)
|
|
49
|
+
return h.hexdigest()
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def verify_proof(file_hash: str, proof: dict) -> dict:
|
|
53
|
+
"""Verify a blockchain timestamp proof against a file hash.
|
|
54
|
+
|
|
55
|
+
Checks that:
|
|
56
|
+
1. The proof's recorded hash matches the file's current hash
|
|
57
|
+
2. The Merkle path is valid (if present)
|
|
58
|
+
3. The blockchain anchor reference is present
|
|
59
|
+
|
|
60
|
+
Returns a result dict with verification status and details.
|
|
61
|
+
"""
|
|
62
|
+
result = {
|
|
63
|
+
"verified": False,
|
|
64
|
+
"file_hash": file_hash,
|
|
65
|
+
"proof_hash": proof.get("hash", ""),
|
|
66
|
+
"algorithm": proof.get("algorithm", "sha256"),
|
|
67
|
+
"blockchain": proof.get("blockchain", "unknown"),
|
|
68
|
+
"tx_id": proof.get("tx_id", ""),
|
|
69
|
+
"anchored_at": proof.get("anchored_at", ""),
|
|
70
|
+
"service": proof.get("service", "unknown"),
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# Step 1: Hash match
|
|
74
|
+
if file_hash.lower() != result["proof_hash"].lower():
|
|
75
|
+
result["error"] = "Hash mismatch — file has been modified since timestamping"
|
|
76
|
+
return result
|
|
77
|
+
|
|
78
|
+
# Step 2: Merkle path verification (if proof contains merkle_path)
|
|
79
|
+
merkle_path = proof.get("merkle_path", [])
|
|
80
|
+
if merkle_path:
|
|
81
|
+
current = file_hash
|
|
82
|
+
for step in merkle_path:
|
|
83
|
+
sibling = step.get("hash", "")
|
|
84
|
+
position = step.get("position", "right")
|
|
85
|
+
if position == "left":
|
|
86
|
+
combined = sibling + current
|
|
87
|
+
else:
|
|
88
|
+
combined = current + sibling
|
|
89
|
+
current = hashlib.sha256(bytes.fromhex(combined)).hexdigest()
|
|
90
|
+
result["merkle_root"] = current
|
|
91
|
+
result["merkle_verified"] = True
|
|
92
|
+
|
|
93
|
+
# Step 3: Blockchain anchor reference
|
|
94
|
+
if result["tx_id"]:
|
|
95
|
+
result["verified"] = True
|
|
96
|
+
result["message"] = (
|
|
97
|
+
f"Proof verified. File hash matches blockchain anchor on {result['blockchain']}. "
|
|
98
|
+
f"Transaction: {result['tx_id']}. "
|
|
99
|
+
f"Anchored at: {result['anchored_at']}."
|
|
100
|
+
)
|
|
101
|
+
else:
|
|
102
|
+
result["error"] = "No blockchain transaction ID in proof — cannot verify anchor"
|
|
103
|
+
|
|
104
|
+
return result
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def load_proof(proof_path: str) -> dict:
|
|
108
|
+
"""Load a proof file (JSON format)."""
|
|
109
|
+
with open(proof_path) as f:
|
|
110
|
+
return json.load(f)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def main():
|
|
114
|
+
parser = argparse.ArgumentParser(
|
|
115
|
+
prog="verify-proof",
|
|
116
|
+
description=(
|
|
117
|
+
"Verify blockchain-anchored timestamp proofs. "
|
|
118
|
+
"Works with ProofAnchor, ProofLedger, and OpenTimestamps proofs."
|
|
119
|
+
),
|
|
120
|
+
epilog=(
|
|
121
|
+
"Examples:\n"
|
|
122
|
+
" verify-proof hash document.pdf\n"
|
|
123
|
+
" verify-proof verify document.pdf --proof proof.json\n"
|
|
124
|
+
"\n"
|
|
125
|
+
"Learn more:\n"
|
|
126
|
+
" ProofAnchor (creators): https://proofanchor.com\n"
|
|
127
|
+
" ProofLedger (enterprise): https://proofledger.com"
|
|
128
|
+
),
|
|
129
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
130
|
+
)
|
|
131
|
+
subparsers = parser.add_subparsers(dest="command")
|
|
132
|
+
|
|
133
|
+
# hash subcommand
|
|
134
|
+
hash_parser = subparsers.add_parser("hash", help="Compute SHA-256 hash of a file")
|
|
135
|
+
hash_parser.add_argument("file", help="Path to the file to hash")
|
|
136
|
+
hash_parser.add_argument("--algorithm", default="sha256", help="Hash algorithm (default: sha256)")
|
|
137
|
+
|
|
138
|
+
# verify subcommand
|
|
139
|
+
verify_parser = subparsers.add_parser("verify", help="Verify a file against a blockchain proof")
|
|
140
|
+
verify_parser.add_argument("file", help="Path to the file to verify")
|
|
141
|
+
verify_parser.add_argument("--proof", required=True, help="Path to the proof JSON file")
|
|
142
|
+
verify_parser.add_argument("--algorithm", default="sha256", help="Hash algorithm (default: sha256)")
|
|
143
|
+
|
|
144
|
+
args = parser.parse_args()
|
|
145
|
+
|
|
146
|
+
if not args.command:
|
|
147
|
+
parser.print_help()
|
|
148
|
+
sys.exit(1)
|
|
149
|
+
|
|
150
|
+
if args.command == "hash":
|
|
151
|
+
if not Path(args.file).exists():
|
|
152
|
+
print(f"Error: File not found: {args.file}", file=sys.stderr)
|
|
153
|
+
sys.exit(1)
|
|
154
|
+
file_hash = hash_file(args.file, args.algorithm)
|
|
155
|
+
print(f"{args.algorithm.upper()}: {file_hash}")
|
|
156
|
+
print(f"File: {args.file}")
|
|
157
|
+
|
|
158
|
+
elif args.command == "verify":
|
|
159
|
+
if not Path(args.file).exists():
|
|
160
|
+
print(f"Error: File not found: {args.file}", file=sys.stderr)
|
|
161
|
+
sys.exit(1)
|
|
162
|
+
if not Path(args.proof).exists():
|
|
163
|
+
print(f"Error: Proof file not found: {args.proof}", file=sys.stderr)
|
|
164
|
+
sys.exit(1)
|
|
165
|
+
|
|
166
|
+
file_hash = hash_file(args.file, args.algorithm)
|
|
167
|
+
proof = load_proof(args.proof)
|
|
168
|
+
result = verify_proof(file_hash, proof)
|
|
169
|
+
|
|
170
|
+
if result["verified"]:
|
|
171
|
+
print(f"VERIFIED: {result['message']}")
|
|
172
|
+
sys.exit(0)
|
|
173
|
+
else:
|
|
174
|
+
print(f"FAILED: {result.get('error', 'Unknown error')}")
|
|
175
|
+
sys.exit(1)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
if __name__ == "__main__":
|
|
179
|
+
main()
|