Uso de una biblioteca para cambiar el almacenamiento

Estoy tratando de aprender sobre el uso de bibliotecas en solidez. En el siguiente contrato de prueba, swapNumberLib no establece con éxito value1 = value2. Pensé que las bibliotecas podrían actuar sobre el almacenamiento de un contrato si las variables se pasaban a la función. ¿No funciona en este caso?

pragma solidity ^0.4.24;

library TestLibrary {
    function swapNumber(uint value1, uint value2) internal {
        value1 = value2;
    }
}

contract Test {
    uint public value1;
    uint public value2;

    constructor() public {
        value1 = 1;
        value2 = 2;
    }

    function swapNumberLib() public {
        TestLibrary.swapNumber(value1, value2);
    }

    function swapNumber() public {
        value1 = value2;
    }
}

Respuestas (1)

Según tengo entendido, las bibliotecas pueden acceder al almacenamiento por contrato, pero el punto es que es uintun tipo de valor, no un tipo de referencia. Por lo tanto, no puede especificar la storageubicación para señalar explícitamente el almacenamiento del contrato.

Esto significa que si se llama a las funciones de la biblioteca, su código se ejecuta en el contexto del contrato de llamada, es decir, apunta al contrato de llamada y, especialmente, se puede acceder al almacenamiento del contrato de llamada.
Como una biblioteca es una pieza aislada de código fuente, solo puede acceder a las variables de estado del contrato de llamada si se proporcionan explícitamente (de lo contrario, no tendría forma de nombrarlas)

del documento

arrayy structscomportarse de manera diferente, ya que puede señalar su almacenamiento en el contrato de llamada:

pragma solidity ^0.4.24;

library TestLibrary {
    function setMyArray(uint[] storage value1) internal {
        value1[0] = 100;
    }
}

contract Test {
    uint[] public arr;

    constructor() public {
        arr = [1];
    }

    function setMe() public {
        TestLibrary.setMyArray(arr);
    }
}

si elimina storagede setMyArrayeste ejemplo, ya no funcionará. O similar:

library TestLibrary {
    function setMyArray(uint[] storage value1, uint[] storage value2) internal {
        value1[0] = value2[0];
    }
}

contract Test {
    uint[] public arr;
    uint[] public arr1;

    constructor() public {
        arr = [1];
        arr1 = [2];
    }

    function setMe() public {
        TestLibrary.setMyArray(arr, arr1);
    }
}
¡Gracias por la información! En su ejemplo final, si cambio value1[0] = value2[0]a value1 = value2, ya no funciona. ¿Alguna idea de por qué?
No, no estoy seguro si es un error o no...