2015-08-22 18 views
6

come concatenare le stringhe in solidità?Concatenamento di stringhe in solidità?

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

sembra non funzionare ..

ho guardato la documentazione (https://github.com/ethereum/wiki/wiki/Solidity-Tutorial#elementary-types-value-types) e non c'è molto accennato circa la concatenazione di stringhe. Ma si afferma che funziona con il punto ('.')?

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

non ha funzionato anche per me ..:/

risposta

9

Non è possibile concatenare le stringhe. Non è ancora possibile controllare uguali (str0 == str1). Il tipo di stringa è stato aggiunto di recente alla lingua, quindi ci vorrà un po 'di tempo prima che tutto funzioni. Quello che puoi fare (che hanno aggiunto di recente) è usare le stringhe come chiavi per i mapping.

La concatenazione a cui si sta facendo riferimento è come vengono calcolati gli indirizzi di archiviazione in base ai tipi di campo e così via, ma questo viene gestito dal compilatore.

7

You have to do it manually for now

Solidità non forniscono built-in concatenazione di stringhe e confronto tra stringhe.
Tuttavia, è possibile trovare librerie e contratti che implementano concatenazione e confronto di stringhe.

StringUtils.sol libreria esegue il confronto di stringhe.
Oraclize contract srtConcat function implementa concatenazione di stringhe.

Se avete bisogno di concatenazione di ottenere un hash di una stringa risultato, notare che ci sono built-in funzioni di hashing in Solidità: sha256, ripemd160, sha3. Prendono un numero variabile di argomenti ed eseguono la concatenazione prima di calcolare l'hash.

7

Una risposta dal Ethereum Stack Exchange:

Un library può essere utilizzato, ad esempio:

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()); 
    } 
} 

Utilizzare il sopra per un quick test che è possibile modificare per le vostre esigenze.


Dal concatenating strings needs to be done manually for now, e di farlo in un contratto può consumare gas inutili (nuova stringa deve essere allocata e poi ogni personaggio scritto), vale la pena considerare che cosa è il caso d'uso che ha bisogno di concatenazione di stringhe?

Se il DApp può essere scritto in modo tale che il frontend concateni le stringhe e quindi lo passa al contratto per l'elaborazione, questo potrebbe essere un progetto migliore.

Oppure, se un contratto vuole hash una singola stringa lunga, si noti che tutte le funzioni built-in hashing a Solidità (sha256, ripemd160, sha3) prendere un numero variabile di argomenti e si esibirà la concatenazione prima di calcolare l'hash .

1

Ecco un altro modo per concatenare le stringhe in Solidità.È anche mostrato in questo 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"); 
    } 
}