Guest User

Untitled

a guest
Jun 20th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.35 KB | None | 0 0
  1. //Концепция контракта
  2. pragma solidity ^0.4.11;
  3. import "github.com/oraclize/ethereum-api/oraclizeAPI.sol";
  4.  
  5. /*
  6. Алгоритм
  7. 1) Клиент создает таск, и отправляет токены в общий баланс (в BigChainDB записывается количество токенов клиента)
  8. В процессе работы обновляем баланс клиента и баланс арендодателя
  9.  
  10. 2) Когда арендодатель хочет вывести средства он с помощью оракула посылает на
  11. рест get запрос, пример: testapi.com?key= Адрес отправителя.
  12. Рест возвращает количество заработанных токенов для данного адреса по курсу, и затраченным рессурсам
  13.  
  14. Арендодатель передает в get запрос свой адрес с помощью msg.sender (конструкция, которая хранит адрес отправителя)
  15.  
  16. Это безопасно и таким образом никто не сможет вставить в get запрос другой адрес.
  17.  
  18. 3) Рест возвращает из BigChainDB количество токенов для данного адреса,
  19. которые мы записываем в маппинг allowbalance, и после вывода средств обнуляем
  20. маппинг
  21.  
  22.  
  23. Проблема такого подхода
  24.  
  25. Из-за того, что в Solidity нет простого способа перевести адрес в строку, чтобы
  26. создать URL для запроса, пользователь вынужден тратить много газа,
  27.  
  28.  
  29. Для снижения затрат будем использовать циклы instructional и functional assembly
  30. Они снизят потребление газа.
  31.  
  32.  
  33. Еще одна проблема
  34. Нужно обновлять баланс в BigChainDB после транзакций, чтобы не создать возможность двойной траты
  35. */
  36.  
  37. contract Escrow is usingOraclize{
  38. // Адрес отправителя
  39. mapping (address=>string) public key;
  40. // Допустим адрес нашего рест
  41. string ourapi = "testapi.com?key=";
  42.  
  43. // Количество токенов, которые может вывести определенный адрес
  44. mapping (address=>uint) public allowbalance;
  45. //Допустим это общий баланс
  46. mapping (address=>uint) public balance;
  47.  
  48.  
  49.  
  50. // toAsciiString и char вспомогательные функции для преобразования adress в string
  51.  
  52. function toAsciiString(address x) returns (string) {
  53. bytes memory s = new bytes(40);
  54. for (uint i = 0; i < 20; i++) {
  55. byte b = byte(uint8(uint(x) / (2**(8*(19 - i)))));
  56. byte hi = byte(uint8(b) / 16);
  57. byte lo = byte(uint8(b) - 16 * uint8(hi));
  58. s[2*i] = char(hi);
  59. s[2*i+1] = char(lo);
  60. }
  61. return string(s);
  62. }
  63.  
  64. function char(byte b) returns (byte c) {
  65. if (b < 10) return byte(uint8(b) + 0x30);
  66. else return byte(uint8(b) + 0x57);
  67. }
  68.  
  69.  
  70.  
  71. // Присвоение результата запроса
  72. /*
  73. function __callback(string result) {
  74. if (msg.sender != oraclize_cbAddress()) revert();
  75.  
  76. // Вернет string нужно еще подумать как перевсти в int с минимальной потерей газа
  77. allowbalance[msg.sender] = result;
  78. updateValue();
  79. }
  80. */
  81.  
  82.  
  83. // Запрос
  84. /*
  85. function updateValue() payable {
  86. * Получив адрес в формате string мы можем создать URL запроса
  87. * ourapi + key[msg.sender]
  88. * для конкатенации используем метод oraclize strConcat
  89. * пример testapi.com?key=ca35b7d915458ef540ade6068dfe2f44e8fa733c
  90.  
  91. key[msg.sender] = toAsciiString(msg.sender);
  92.  
  93. if (oraclize_getPrice("URL") > this.balance) {
  94. LogNewOraclizeQuery("Если на кошельке недостаточно средств запрос не пройдет");
  95. } else {
  96. LogNewOraclizeQuery("Если средства есть, запрос будет отправлен, ждем результат");
  97. oraclize_query("URL", strConcat(ourapi, key[msg.sender]));
  98. }
  99. }
  100. */
  101.  
  102. // Нас интересует эта небольшая часть кода
  103. // Примерно так это должно работать
  104.  
  105.  
  106. // Арендодатель делает запрос, передает свой aдрес в get
  107. function QueryToOracle() public{
  108. //updateValue();
  109. //Допустим он сделал запрос и получил 7 токенов
  110. allowbalance[msg.sender] = 7;
  111.  
  112. }
  113.  
  114. // После того, как запрос выполнен можно забирать средства
  115. function GetMoney() public{
  116. // Обновляем баланс
  117. balance[msg.sender] += allowbalance[msg.sender];
  118. // Вычитаем из общего баланса
  119. // balance["Адрес контракта с общим балансом"] -= allowbalance[msg.sender];
  120. // После перевода сбрасываем адрес и количество доступных для вывода токенов
  121. delete allowbalance[msg.sender];
  122. delete key[msg.sender];
  123. }
  124.  
  125. }
Add Comment
Please, Sign In to add comment