¿Cómo almacenar la clave pública en el contrato de Ethereum?

Quiero almacenar una clave pública de una dirección de Ethereum en un contrato. ¿Cuál es el tipo de datos primitivo aconsejable para almacenar una clave pública?

  1. ¿Debo almacenar como String o Bytes32?
  2. ¿Es seguro almacenar una clave pública en un contrato? Sé que es una clave PÚBLICA, pero aún así... quiero saber cualquier peligro que deba tener en cuenta.

¡Gracias!

Respuestas (2)

Almacene siempre las claves como bytes, ya que se sabe que las cadenas en algunos idiomas terminan en bytes de valor nulo. Puede usar un atributo bytes32 para almacenar la clave y un método getter para recuperarlo del contrato implementado (instanciado):

contract PubKey {
         bytes32 pubKey;

         function PubKey(bytes32 initKey) {
             pubKey = initKey;
         }

         function getPubKey() constant returns (bytes32) {

            return pubKey;

         }
    }

Editar:

La clave pública tiene una longitud de 64 bytes sin incluir su prefijo:

contract PubKey {
    uint8[] pubKeyBytes;

    function PubKey(uint8[] initKey) {
       for(uint i = 0; i < initKey.length; i++) {
          pubKeyBytes.push(initKey[i]);
       }
}

function getPubKeyByte(uint i) constant returns (uint) {
    return pubKeyBytes[i];
}

Esto es costoso ya que cada recuperación de la clave pública debe llamarse 64 veces. usar dos fragmentos de 32 bytes es más barato (pero más feo):

contract PubKey {
     bytes32 pubKeyHalf1, pubKeyHalf2;

     function PubKey(bytes32 initKeyHalf1, bytes32 initKeyHalf2) {
         pubKeyHalf1 = initKeyHalf1;
         pubKeyHalf2 = initKeyHalf2;
     }

     function getPubKeyHalf1() constant returns (bytes32) {
        return pubKeyHalf1;
     }

     function getPubKeyHalf2() constant returns (bytes32) {
        return pubKeyHalf2;
     }
}
Gracias por su respuesta. También tengo una pregunta de seguimiento. ¿Cómo sería la función de acceso? Digamos... la función getPubKey() devuelve (bytes32), ¿deberíamos reconstruir en bytes32 antes de devolver la PubKey?
@etherfaces hace preguntas adicionales como hilos nuevos. Esa es la forma recomendada,
He actualizado la respuesta.
En la función getPubKey, la línea: (byte) (key[i]) = pubKey[i] da error. Parece que la sintaxis no es válida. Publicaré una nueva pregunta sobre cómo convertir una matriz de bytes a bytes32 en solidez.
Cuando llame al constructor del contrato, pase el argumento como una cadena de la forma "0x1234...".
Seguramente me estoy perdiendo algo justo en frente de mí, pero ¿no son 32 bytes 1 byte corto? ¿No necesita almacenar la coordenada x de 32 bytes y también el signo?
Esta respuesta está desactualizada. "La clave privada debe tener 32 bytes y no comenzar con 0x00 y la clave pública debe estar sin comprimir y tener 64 bytes o 65 con el prefijo 0x04 constante. Más sobre eso en la siguiente sección". kobl.one/blog/create-full-ethereum-keypair-and-address . PubKey tiene una longitud de 64 bytes.
Esta podría ser una pregunta estúpida, pero ¿qué tiene de malo el tipo de datos de la dirección?
Pero aún puede almacenar la clave pública comprimida, ¿no? ¿Realmente no hay mejor manera de hacer esto que dos bytes32? @jasper: las direcciones tienen solo 20 bytes. No hay espacio suficiente.

También puede almacenar la clave pública en bytesvariable, pero eso consumirá más gas. En mi prueba simple, almacenar una clave pública en dos bytes32variables usa ~ 67,000 gas, y almacenarla en una bytesvariable usa ~ 85,000 gas