Skip to content

Instantly share code, notes, and snippets.

@isbkch
Forked from ageyev/ProofOfExistence.sol
Created March 15, 2018 18:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save isbkch/bbb5f562d93e3161e6eab5ab43a8ed97 to your computer and use it in GitHub Desktop.
Save isbkch/bbb5f562d93e3161e6eab5ab43a8ed97 to your computer and use it in GitHub Desktop.
This smartcontract is used to store documents text on the Ethereum blockchain and to get the document by document's hash (sha256).
/*
This smartcontract is used to store documents text on the Ethereum blockchain
and to get the document by document's hash (sha256).
*/
contract ProofOfExistence{
/* ---- Public variables: */
string public created;
address public manager; // account that adds info to this smartcontract
uint256 public docIndex; // record's numbers and number of records
mapping (uint256 => Doc) public indexedDocs; // docIndex => Doc
// to get Doc obj call ProofOfExistence.indexedDocs(docIndex);
mapping (bytes32 => Doc) public sha256Docs; // docHash => Doc
// to get Doc obj call ProofOfExistence.docs(docHash);
mapping (bytes32 => Doc) public sha3Docs; // docHash => Doc
// to get Doc obj call ProofOfExistence.docs(docHash);
/* ---- Stored document structure: */
struct Doc {
uint256 docIndex; // .............................................0
string publisher; // publisher's email............................1
uint256 publishedOnUnixTime; // block timestamp (block.timestamp).2
uint256 publishedInBlockNumber; // block.number...................3
string docText; // text of the document...........................4
bytes32 sha256Hash; // ...........................................5
bytes32 sha3Hash; // .............................................6
}
/* ---- Constructor: */
function ProofOfExistence(){
manager = msg.sender;
created = "cryptonomica.net";
}
/* ---- Event: */
// This generates a public event on the blockchain that will notify clients.
// In 'Mist' SmartContract page enable 'Watch contract events'
event DocumentAdded(uint256 docIndex,
string publisher,
uint256 publishedOnUnixTime);
/* ----- Main method: */
function addDoc(
string _publisher,
string _docText) returns (bytes32) {
// authorization
if (msg.sender != manager){
// throw;
return sha3("not authorized"); //
// <- is 'bytes32' too:
// "0x8aed0440c9cacb4460ecdd12f6aff03c27cace39666d71f0946a6f3e9022a4a1"
}
// chech if exists
if (sha256Docs[sha256(_docText)].docIndex > 0){
// throw;
return sha3("text already exists"); //
// <- is 'bytes32' too:
// "0xd42b321cfeadc9593d0a28c4d013aaad8e8c68fc8e0450aa419a130a53175137"
}
// document number
docIndex = docIndex + 1;
// add document data:
indexedDocs[docIndex] = Doc(docIndex,
_publisher,
now,
block.number,
_docText,
sha256(_docText),
sha3(_docText)
);
sha256Docs[sha256(_docText)] = indexedDocs[docIndex];
sha3Docs[sha3(_docText)] = indexedDocs[docIndex];
// add event
DocumentAdded(indexedDocs[docIndex].docIndex,
indexedDocs[docIndex].publisher,
indexedDocs[docIndex].publishedOnUnixTime
);
// return sha3 of the stored document
// (sha3 is better for in web3.js)
return indexedDocs[docIndex].sha3Hash;
}
/* ---- Utilities: */
function () {
// This function gets executed if a
// transaction with invalid data is sent to
// the contract or just ether without data.
// We revert the send so that no-one
// accidentally loses money when using the
// contract.
throw;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment