Created
March 26, 2019 13:20
-
-
Save oneamitj/0941cf764cf5804999c3fd82a98f1c72 to your computer and use it in GitHub Desktop.
An example of using ethereum to save data.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Estimated Gas: 1,368,083 | |
pragma solidity ^0.4.24; | |
library StringOperation {function concat(string string1, string string2, string sep) internal pure returns (string){ | |
bytes memory string1Bytes = bytes(string1); | |
bytes memory string2Bytes = bytes(string2); | |
bytes memory sepBytes = bytes(sep); | |
string memory concatString = new string(string1Bytes.length + sepBytes.length + string2Bytes.length); | |
bytes memory concatStringBytes = bytes(concatString); | |
uint k = 0; | |
// Concat string1 | |
for (uint i = 0; i < string1Bytes.length; i++) concatStringBytes[k++] = string1Bytes[i]; | |
// Concat sep | |
for (i = 0; i < sepBytes.length; i++) concatStringBytes[k++] = sepBytes[i]; | |
// Concat string2 | |
for (i = 0; i < string2Bytes.length; i++) concatStringBytes[k++] = string2Bytes[i]; | |
return string(concatStringBytes); | |
} | |
} | |
contract DBExample { | |
using StringOperation for *; | |
struct SomeStruct { | |
string data1; | |
string data2; | |
string data3; | |
string data4; | |
} | |
address owner; | |
address[] private admins; | |
// user => SomeStruct | |
mapping (address => SomeStruct[]) userSomeStruct; | |
event BroadcastSomeStruct(address receiver, string data3, string dataDetails); | |
// modifier to check if caller is owner | |
modifier ifOwner() { | |
if (msg.sender != owner) { | |
revert(); | |
} | |
_; /* _means contiune normal flow */ | |
} | |
constructor() public { | |
owner = msg.sender; | |
admins.push(owner); | |
} | |
function assignSomeStruct(address user, string data1, string data2, string data3, string data4) public ifOwner { | |
SomeStruct memory someStruct; | |
someStruct.data1 = data1; | |
someStruct.data2 = data2; | |
someStruct.data3 = data3; | |
someStruct.detail = data4; | |
userSomeStruct[user].push(someStruct); | |
emit BroadcastSomeStruct(user, data3, data4); | |
} | |
function viewAllSomeStruct(address user) public constant returns (string allSomeStruct){ | |
SomeStruct[] memory someStructs = userSomeStruct[user]; | |
string memory someStructString; | |
for(uint i = 0; i < someStructs.length; i++) { | |
someStructString = StringOperation.concat( | |
someStructs[i].data1, | |
someStructs[i].data2, | |
" "); | |
someStructString = StringOperation.concat( | |
someStructString, | |
someStructs[i].data3, | |
" "); | |
someStructString = StringOperation.concat( | |
someStructString, | |
someStructs[i].detail, | |
" "); | |
if (i > 0) { | |
allSomeStruct = StringOperation.concat( | |
allSomeStruct, | |
someStructString, | |
","); | |
} else { | |
allSomeStruct = someStructString; | |
} | |
} | |
allSomeStruct = StringOperation.concat( | |
"SomeStructID data2 data3 SomeStructDetail", | |
allSomeStruct, | |
","); | |
} | |
function viewSomeStructByData2(address user, string data2) public constant returns (string someStruct){ | |
SomeStruct[] memory someStructs = userSomeStruct[user]; | |
for(uint i = 0; i < someStructs.length; i++) { | |
if (keccak256(someStructs[i].data2) == keccak256(data2)) { | |
someStruct = StringOperation.concat( | |
someStructs[i].data1, | |
someStructs[i].data2, | |
" "); | |
someStruct = StringOperation.concat( | |
someStruct, | |
someStructs[i].data3, | |
" "); | |
someStruct = StringOperation.concat( | |
someStruct, | |
someStructs[i].detail, | |
" "); | |
someStruct = StringOperation.concat( | |
"SomeStructID data2 data3 SomeStructDetail", | |
someStruct, | |
","); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment