Update: Now on Ethereum, wordbot.eth
Video recorded messages ought to be quite universally applicable proof-of-consent, if they include a cryptographic timestamp both within the message, verbally recording and gesturing the current block hash which cannot be known ahead of time, and then a timestamp soon afterwards when uploaded that shows that the video message existed at a certain point in time.
There could also be a dApp for gestural time stamps, that generates (on-state) a sequence of words and corresponding gestures that can be used to record a timestamp in video messages, and the sequence that is unique at any given block height is generated in a way that it cannot be known in advance, making it a "human-readable" equivalent of block hashes.
Vitalik Buterin's "proof-of-life" and the case for "human readable" blockhashes
Vitalik Buterin used the latest blockhash last year to provide a public record of "proof-of-life" that disproved the rumour that he had died in a car crash, a meme that was propagated by some person somewhere.
The next iteration of that could be "human-readable blockhahes", a sequence of word that is unique for any given block height, and that are deterministically generated so that they cannot be known in advance. These human-readable blockhashes can be used to include a legal timestamp in a public record, using video messages for example.
A smart contract for "human readable blockhashes"
This contract speaker.sol stores a list of 1024 words, and returns a sequence of words that can be used to include a legal timestamp in a public record. The code below only shows 7 out of 1024 words.
pragma solidity ^0.4.24;
contract speaker {
bytes public wordlist;
function getWords(uint _wordcount) public view returns (bytes6[]) {
bytes32 entropy;
bytes6[] memory ret = new bytes6[](_wordcount);
for(uint i = 0; i < _wordcount; i++) {
uint index = random(entropy) * 6;
bytes memory word = new bytes(6);
word[0] = wordlist[index];
word[1] = wordlist[index + 1];
word[2] = wordlist[index + 2];
word[3] = wordlist[index + 3];
word[4] = wordlist[index + 4];
word[5] = wordlist[index + 5];
bytes6 toBytes6;
assembly {
toBytes6 := mload(add(word, 32))
}
ret[i] = toBytes6;
entropy = keccak256(word);
}
return ret;
}
function random(bytes32 _entropy) internal view returns (uint16) {
return uint16(uint256(keccak256(
abi.encodePacked(
block.timestamp, block.difficulty, _entropy
)
)
)%1024);
}
constructor() {
bytes memory toBytes = new bytes(6*1024);
assembly {
mstore(add(toBytes, 32), "about")
mstore(add(toBytes, 38), "above")
mstore(add(toBytes, 44), "abroad")
mstore(add(toBytes, 50), "accept")
mstore(add(toBytes, 56), "access")
mstore(add(toBytes, 62), "acorn")
mstore(add(toBytes, 68), "acre")
Synapses
https://www.coindesk.com/proof-life-vitalik-buterin-uses-ethereum-blockchain-disprove-death-hoax/