Concatenar arreglos en Solidity

¿Cuál es la mejor práctica para concatenar arreglos en Solidity?

Tengo esto (que compila):

contract Concatenator {
    address[]  Accounts1;
    function ConcatenateArrays(address[] Accounts2){
        uint i = 0;
        while (i++ < Accounts2.length) {
            Accounts1.push(Accounts2[i]);
        }
    } 
}

Sin embargo, tengo la sensación de que podría haber una mejor manera de hacerlo. De ahí esta pregunta.

Además, noté que, si paso las 2 matrices a la función, aparece un error de memoria. ¿Por qué no puedo pasar las dos matrices directamente a la función?

Respuestas (1)

El código en la pregunta se ejecuta sin gas porque idebe incrementarse después, Accounts1.push(Accounts2[i]);de lo contrario, Accounts2[i]es un acceso fuera de los límites. Más fácil de usar un forbucle:

contract Concatenator {
    address[]  Accounts1;
    function ConcatenateArrays(address[] Accounts2){
        for (uint i=0; i < Accounts2.length; i++) {
            Accounts1.push(Accounts2[i]);
        }
    } 
}

Al pasar 2 matrices a una función, no puede cambiar el tamaño de ninguna de ellas y debe asignar y devolver una nueva matriz. Aquí hay un ejemplo:

function ConcatenateArrays(address[] Accounts, address[] Accounts2) returns(address[]) {
    address[] memory returnArr = new address[](Accounts.length + Accounts2.length);

    uint i=0;
    for (; i < Accounts.length; i++) {
        returnArr[i] = Accounts[i];
    }

    uint j=0;
    while (j < Accounts.length) {
        returnArr[i++] = Accounts2[j++];
    }

    return returnArr;
} 

Nota: memoryy la matriz de tamaño dinámico devuelta no es accesible desde otra función de Solidity (solo en web3.js): consulte ¿Cuáles son las dificultades o limitaciones comunes al codificar en Solidity?

Si la longitud de las matrices es grande, costará mucho combustible.
@NinjaMAN Tiene razón y la mayoría de las respuestas se proporcionan con la suposición de que el desarrollador ha examinado su diseño de cerca y todavía necesita hacer lo que está pidiendo.