13. Copyright Drecom Co., Ltd. All Rights Reserved. 13
LoveChainコントラクト
function proposeTo(address to) public
msg.sender から to に対してプロポーズ。
▼既に to から msg.sender に対してプロポーズ済だった場合、
partner[msg.sender] = to;
partner[to] = msg.sender;
▼まだ to からプロポーズされてない場合、
propose[msg.sender] = to;
14. Copyright Drecom Co., Ltd. All Rights Reserved. 14
LoveChainコントラクト
function addMessage(string message) public
パートナーとの `partnerMessages` にメッセージを追加。
`partnerMessages` のキーは uint256 になっていて、ここには
「パートナー2人の `address` 」
を元にして作られたハッシュが入る。
15. Copyright Drecom Co., Ltd. All Rights Reserved. 15
LoveChainコントラクト
function craetePartnerBytes(address a, address b) private pure returns(bytes) {
bytes memory arr = new bytes(64);
bytes32 first;
bytes32 second;
if (uint160(a)< uint160(b)){ // 小さい方が先頭にくるように調整している
first = keccak256(a);
second = keccak256(b);
} else {
first = keccak256(b);
second = keccak256(a);
}
for (uint i = 0; i < 32; i++){
arr[i]= first[i];
arr[i+ 32] = second[i];
}
return arr;
}
16. Copyright Drecom Co., Ltd. All Rights Reserved. 16
LoveChainコントラクト
function addMessage(string message) public {
address target = partner[msg.sender];
require(isPartner(msg.sender, target) == true);
uint index = partnerMessages[uint256(keccak256(craetePartnerBytes(msg.sender, target)))].push(message) - 1;
Message(msg.sender, target, message, index);
}
17. Copyright Drecom Co., Ltd. All Rights Reserved. 17
LoveChainコントラクト
function getPartnerMessage(address a, address b, uint index) public view returns
(string)
パートナーのメッセージを取得する。
address さえ知っていれば誰でも叩ける。
パートナーでない address を指定した場合は revert となる。
18. Copyright Drecom Co., Ltd. All Rights Reserved. 18
LoveChainコントラクト
function getPartnerMessage(address a, address b, uint index) public view returns (string) {
require(isPartner(a,b) == true);
uint256 key = uint256(keccak256(craetePartnerBytes(a,b)));
if (isHiddenMessages[key] == true) {
require((msg.sender == a) || (msg.sender == b));
}
uint count = partnerMessages[key].length;
require(index < count);
return partnerMessages[key][index];
}
19. Copyright Drecom Co., Ltd. All Rights Reserved. 19
LoveChainコントラクト
function farewellTo(address to) public
パートナーとお別れする。
別れると先ほど紹介した `partnerMessageCount` や `getPartnerMessage` が revert となるため、
メッセージが見れなくなる。