2015-08-22 3 views
6

Как объединить строки в прочность?Строка конкатенации в прочности?

var str = 'asdf' 
var b = str + 'sdf' 

, кажется, не работает ..

Я посмотрел документацию (https://github.com/ethereum/wiki/wiki/Solidity-Tutorial#elementary-types-value-types) и там много не упоминается о конкатенации. Но указано, что он работает с точкой ('.')?

"[...] a mapping key k is located at sha3(k . p) where . is concatenation." 

Не работает для меня тоже ..:/

ответ

9

Вы не можете конкатенации строк. Вы также не можете проверить равные (str0 == str1). Тип строки был недавно добавлен обратно на язык, поэтому, вероятно, потребуется некоторое время, пока все это не сработает. То, что вы можете сделать (которое они недавно добавили), - это использовать строки как ключи для сопоставлений.

Конкатенация, на которую вы указываете, как адреса памяти вычисляются на основе типов полей и т. Д., Но это обрабатывается компилятором.

7

You have to do it manually for now

монолитность не обеспечивает встроенный конкатенации и сравнения строк.
Однако вы можете найти библиотеки и контракты, которые реализуют конкатенацию и сравнение строк.

StringUtils.sol библиотека инвентарь струна сравнение.
Oraclize contract srtConcat function реализует конкатенацию строк.

Если вам нужно конкатенацию, чтобы получить хэш строки результата, обратите внимание, что встроенные функции хеширования в солидности: sha256, ripemd160, sha3. Они принимают переменное количество аргументов и выполняют конкатенацию перед вычислением хэша.

7

Ответ от Ethereum Stack Exchange:

library может использоваться, например:

import "github.com/Arachnid/solidity-stringutils/strings.sol"; 

contract C { 
    using strings for *; 
    string public s; 

    function foo(string s1, string s2) { 
    s = s1.toSlice().concat(s2.toSlice()); 
    } 
} 

Используйте выше для quick test, которые вы можете изменить для ваших нужд.


С concatenating strings needs to be done manually for now, и делать это в контракте может потреблять ненужный газ (новая строка должна быть выделен, а затем каждый символ написано), стоит учесть, что использование так, что нужна конкатенация?

Если DApp может быть написан таким образом, чтобы интерфейс соединял строки, а затем передавал их в контракт для обработки, это может быть лучший дизайн.

Или, если контракт хочет хэш одну длинную строку, обратите внимание, что все встроенные в хэширования функции в солидности (sha256, ripemd160, sha3) принимает переменное число аргументов и будет выполнять конкатенацию перед вычислением хэш ,

1

Вот еще один способ выполнения строк в Solidity.Это также показано в этом tutorial:

pragma solidity ^0.4.19; 

library Strings { 

    function concat(string _base, string _value) internal returns (string) { 
     bytes memory _baseBytes = bytes(_base); 
     bytes memory _valueBytes = bytes(_value); 

     string memory _tmpValue = new string(_baseBytes.length + _valueBytes.length); 
     bytes memory _newValue = bytes(_tmpValue); 

     uint i; 
     uint j; 

     for(i=0; i<_baseBytes.length; i++) { 
      _newValue[j++] = _baseBytes[i]; 
     } 

     for(i=0; i<_valueBytes.length; i++) { 
      _newValue[j++] = _valueBytes[i++]; 
     } 

     return string(_newValue); 
    } 

} 

contract TestString { 

    using Strings for string; 

    function testConcat(string _base) returns (string) { 
     return _base.concat("_Peter"); 
    } 
}