Advertisement
Guest User

Contract GuestBook

a guest
Jul 27th, 2017
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.18 KB | None | 0 0
  1. pragma solidity ^0.4.13; // указываем версию компилятора
  2.  
  3. // Описание GuestBook:
  4. // + Администратор может менять название гостевой книги
  5. // + Зарегистрированный пользователь может добавлять любое сообщение
  6. // + Пользователи могут ставить рейтинг за сообщение
  7. // + Администратор может уничтожить контракт
  8. // + Администратор может удалить сообщение
  9. // + Администратор может удалить сообщение
  10. // + Имеется возможность назначить нового администратора контракта
  11. // + Имеется поиск сообщения по его id
  12.  
  13. contract GuestBook {
  14. address adminAddress; // адрес администратора
  15. string guestbookName; // название гостевой книги
  16.  
  17. // структура хранимых сообщений
  18. struct notarizedMessage {
  19. bytes32 message; // рейтинг сообщения
  20. int rating; // рейтинг сообщения
  21. uint timeStamp; // временная метка добавления сообщения в GuestBook
  22. }
  23.  
  24. // структура хранимых данных пользователей GuestBook
  25. struct User {
  26. string nickname; // имя пользователя
  27. bytes32 city; // город проживания пользователя
  28. bytes32 country; // страна проживания пользователя
  29. bytes32 email; // email пользователя
  30. bytes32[] myMessages; // список хранимых сообщений пользователя
  31. }
  32.  
  33. mapping ( uint => notarizedMessage) notarizedMessages; // позволяет отображать данные сообщения по его тексту
  34. bytes32[] userMessages; // список всех сообщений пользователей
  35.  
  36. mapping ( address => User ) Users; // позволяет отображать данные пользователя по его адресу
  37. address[] usersByAddress; // массив всех зарегистрированных пользователей в GuestBook
  38.  
  39. uint constant public config_price = 10 finney; // стоимость повышения рейтинга сообщения
  40. uint messageId = 0; // идентификатор сообщения
  41.  
  42. // события для мониторинга
  43. event registered(string _nickname, address _addr);
  44.  
  45. // это конструктор, он имеет тоже наименование, что и контракт. Он получает вызов однажды при развёртывании контракта
  46. function GuestBook() {
  47. adminAddress = msg.sender; // устанавливаем администратора, чтобы он мог удалить плохих пользователей, если это необходимо
  48. }
  49.  
  50. modifier onlyAdmin() {
  51. if (msg.sender != adminAddress) revert(); // если отправитель не является администратором, то вызываем исключение
  52. _;
  53. }
  54.  
  55. // удаляем существующего пользователя из GuestBook. Только администратор может осуществить данное действие
  56. function removeUser(address _badUser) onlyAdmin returns (bool success) {
  57. delete Users[_badUser];
  58. return true;
  59. }
  60.  
  61. // удаляем существующее сообщение из GuestBook. Только администратор может осуществить данное действие
  62. function removeMessage(uint _badIdMessage) onlyAdmin returns (bool success) {
  63. delete notarizedMessages[_badIdMessage];
  64. return true;
  65. }
  66.  
  67. // регистрируем нового пользователя
  68. function registerNewUser(string nickname, bytes32 city, bytes32 email, bytes32 country) returns (bool success) {
  69. address thisNewAddress = msg.sender;
  70. // необходима проверка существующих вводных данных от внешнего пользователя. Например был ли никнейм null или существовал ли пользователь с таким псевдонимом
  71. if(bytes(Users[msg.sender].nickname).length != 0) revert(); // проверяем наличия существования пользователя
  72. if(bytes(nickname).length == 0) revert(); // проверяем наличие указанного nickname пользователя для регистрации
  73.  
  74. Users[thisNewAddress].nickname = nickname;
  75. Users[thisNewAddress].city = city;
  76. Users[thisNewAddress].email = email;
  77. Users[thisNewAddress].country = country;
  78. usersByAddress.push(thisNewAddress); // добавляем в список нового пользователя
  79.  
  80. registered(nickname, thisNewAddress); // обращаемся к событию
  81. return true;
  82. }
  83.  
  84. // метод позволяющий добавить пользователю новое сообщение.
  85. function addMessageFromUser(bytes32 _userMessage) returns (bool success)
  86. {
  87. address thisNewAddress = msg.sender;
  88. if(bytes(Users[thisNewAddress].nickname).length == 0) revert();// убеждаемся что пользователь зарегистрирован в GuestBook
  89. if(_userMessage.length == 0) revert(); // проверяем наличие сообщения
  90.  
  91. messageId++; // увеличиваем на один идентификатор сообщения
  92.  
  93. // проверяем наличие существующего сообщения в списке всех сообщений
  94. // Вопрос: почему очень нежелательно использовать следующий цикл? К чему это может привести?
  95. bool message_found = false;
  96. for(uint i = 0; i < userMessages.length; i++)
  97. {
  98. if(userMessages[i] == _userMessage) {
  99. message_found = true; // найдено хоть одно точно такое же сообщение
  100. break;
  101. }
  102. }
  103. if (message_found == false) userMessages.push(_userMessage); // добавляем в общий список сообщение пользователя
  104.  
  105. notarizedMessages[messageId].rating = 0;
  106. notarizedMessages[messageId].message = _userMessage;
  107. notarizedMessages[messageId].timeStamp = block.timestamp; // устанавливаем метку времени создания сообщения
  108. Users[thisNewAddress].myMessages.push(_userMessage); // добавляем сообщение в список сообщений пользователя
  109. return true;
  110. }
  111.  
  112. // возвращаем список всех зарегистрированных пользователей
  113. function getUsers() constant returns (address[]) {
  114. return usersByAddress;
  115. }
  116.  
  117. // возвращаем данные зарегистрированного пользователя
  118. function getUser(address userAddress) constant returns (string, bytes32, bytes32, bytes32, bytes32[]) {
  119. return (
  120. Users[userAddress].nickname,
  121. Users[userAddress].city,
  122. Users[userAddress].email,
  123. Users[userAddress].country,
  124. Users[userAddress].myMessages
  125. );
  126. }
  127.  
  128. // возвращаем список всех сообщений
  129. function getAllMessages() constant returns (bytes32[]) {
  130. return userMessages;
  131. }
  132.  
  133. // возвращаем список сообщений пользователя
  134. function getUserMessages(address userAddress) constant returns (bytes32[]) {
  135. return Users[userAddress].myMessages;
  136. }
  137.  
  138. // получаем данные о сообщении отправив его идентификатор
  139. function getMessage(uint _messageId) constant returns (bytes32, int, uint)
  140. {
  141. return (
  142. notarizedMessages[_messageId].message,
  143. notarizedMessages[_messageId].rating,
  144. notarizedMessages[_messageId].timeStamp
  145. );
  146. }
  147.  
  148. // увеличиваем рейтинг сообщения пользователя
  149. function changeMessageRating(uint _messageId, bytes32 _vector) payable returns (bool success) {
  150. if (_vector != "higher" || _vector != "lower") revert(); // если пользователь не указал вектор рейтинга.
  151. //if (notarizedMessages[_messageId].timeStamp < 0) revert(); // если идентификатор сообщения не существует. Способ определения наличия ключа https://goo.gl/uDfYJx
  152. if (msg.value != config_price) revert(); //если пользователь не отправил необходимую сумму сердств на повышение рейтинга
  153.  
  154. if (_vector == "higher") {
  155. notarizedMessages[messageId].rating = notarizedMessages[messageId].rating++; // увеличиваем рейтинг сообщения на один
  156. }
  157.  
  158. if (_vector == "lower") {
  159. notarizedMessages[messageId].rating = notarizedMessages[messageId].rating--; // уменьшаем рейтинг сообщения на один
  160. }
  161.  
  162. return true;
  163. }
  164.  
  165. // меняем администратора GuestBook
  166. function changeAdmin(address newAdminAddress) onlyAdmin returns (bool success) {
  167. if(bytes(Users[newAdminAddress].nickname).length == 0) revert(); // убеждаемся что пользователь зарегистрирован в GuestBook
  168. adminAddress = newAdminAddress;
  169. return true;
  170. }
  171.  
  172. // меняем название гостевой книги
  173. function changeGuestBookName(string newGuestBookName) onlyAdmin {
  174. guestbookName = newGuestBookName;
  175. }
  176.  
  177. // уничтожаем контракт
  178. function killContract() onlyAdmin {
  179. selfdestruct(adminAddress);
  180. }
  181.  
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement