pragma solidity ^0.4.24;
// Searcher is an interface for contracts that want to be notified of incoming data
//
contract Searcher {
// poke is called when new data arrives
//
function poke() public;
// this is called to ensure that only valid Searchers can be added to the Lighthouse - returns an arbitrarily chosen number
//
function identify() external pure returns(uint) {
return 0xda4b055;
}
}
// for operation of this contract see the readme file.
//
contract Lighthouse {
address public auth = msg.sender; // ownable model. No real value in making it transferrable.
Searcher seeker; // a single contract that can be notified of data changes
uint value; // holds all the data bit fiddled into a single 32 byte word.
uint maxAge; // if non zero, sets a limit to data validity
// admin functions
modifier onlyAuth {
require(auth == msg.sender, "Unauthorised access");
_;
}
function changeAuth(address newAuth) public onlyAuth {
auth = newAuth;
}
function changeSearcher(Searcher newSeeker) public onlyAuth {
seeker = newSeeker;
require(seeker.identify() == 0xda4b055,"invalid searcher");
}
function setMaxAge(uint newMaxAge) public onlyAuth {
maxAge = newMaxAge;
}
function notTooLongSinceUpdated() public view returns (bool) {
uint since = now - ((value >> 128) &
0x000000000000000000000000000000000000000000000000ffffffffffffffff);
return (since < maxAge) || (maxAge == 0);
}
function peekData() external view returns (uint128 v,bool b) {
v = uint128(value);
b = notTooLongSinceUpdated() && value != 0;
return;
}
function peekUpdated() external view returns (uint32 v,bool b) {
uint v2 = value >> 128;
v = uint32(v2);
b = notTooLongSinceUpdated() && value != 0;
return;
}
function peekLastNonce() external view returns (uint32 v,bool b) {
uint v2 = value >> 192;
v = uint32(v2);
b = notTooLongSinceUpdated() && value != 0;
return;
}
function peek() external view returns (bytes32 v ,bool ok) {
v = bytes32(value & 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff);
ok = notTooLongSinceUpdated() && value != 0;
return;
}
function read() external view returns (bytes32 x) {
require(notTooLongSinceUpdated() && value != 0, "Invalid data stored");
return bytes32(value & 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff);
}
function write(uint DataValue, uint nonce) external onlyAuth {
require ((DataValue >> 128) == 0, "Value too large");
require ((nonce >> 32) == 0, "Nonce too large");
value = DataValue + (nonce << 192) + (now << 128) ;
if (address(seeker) != address(0)) {
seeker.poke();
}
}
}
{
"compilationTarget": {
"Lighthouse.sol": "Lighthouse"
},
"evmVersion": "byzantium",
"libraries": {},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"constant":false,"inputs":[{"name":"newAuth","type":"address"}],"name":"changeAuth","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"peekData","outputs":[{"name":"v","type":"uint128"},{"name":"b","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"read","outputs":[{"name":"x","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"peek","outputs":[{"name":"v","type":"bytes32"},{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newMaxAge","type":"uint256"}],"name":"setMaxAge","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"DataValue","type":"uint256"},{"name":"nonce","type":"uint256"}],"name":"write","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"peekUpdated","outputs":[{"name":"v","type":"uint32"},{"name":"b","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"peekLastNonce","outputs":[{"name":"v","type":"uint32"},{"name":"b","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newSeeker","type":"address"}],"name":"changeSearcher","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"auth","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"notTooLongSinceUpdated","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"}]