Estoy buscando una estructura de datos como esta:
[
"data": {
"id": 0,
"hash" : "5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9",
"owner" : 0,
"status" : "allocated"
},
"data": {
"id": 1,
"hash" : "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b",
"owner" : null,
"status" : "pending"
},
"data": {
"id": 2,
"hash" : "d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35",
"owner" : 0
"status" : "allocated"
},
"data": {
"id": 3,
"hash" : "4e07408562bedb8b60ce05c1decfe3ad16b72230967de01f640b7e4729b49fce",
"owner" : 1
"status" : "allocated"
},
"data": {
"id": 4,
"hash" : "4b227777d4dd1fc61c6f884f48641d02b4d121d3fd328cb08b5531fcacdabf8a",
"owner" : null
"status" : null
}
]
Mi caso de uso tendría un gran valor de registros almacenados, desde 0 hasta muchos cuatrillones, registrando su propietario y estado.
Específicamente, me gustaría tener acceso a los siguientes tipos de consultas, escritas en SQL aquí (pero no es necesario, por supuesto, estar abierto a aprender cualquier otro idioma o paquete para la lógica de consulta):
SELECT * FROM dataset WHERE data.owner = 1;
SELECT * FROM dataset WHERE data.id = 4;
UPDATE dataset SET data.status = "pending" WHERE data.id = 4;
UPDATE dataset SET data.status = "allocated", data.owner = 1 WHERE data.id = 4 and data.status = "pending";
Me gustaría completar previamente los valores de los ID una vez fuera de la cadena y cargarlos todos a la vez, pero luego hacer cálculos como las declaraciones de ACTUALIZACIÓN por contrato en la cadena.
Mis preguntas muy novatas son:
Nota al margen, escribiendo solo números enteros de 0...5500000000 = 55 GB, por lo que probablemente sea una cantidad costosa de datos.
Debería pensar en usar un contrato inteligente con la estructura de datos de almacenamiento de mapas de las estructuras. Primero, defina una estructura que represente su objeto
struct Data {
string hash,
uint owner,
string status
}
Luego puede definir un mapeo que mapee el ID de datos único a sus valores, por ejemplo:
mapping(uint=>Data) idTodataMapping;
uint[] allIds;
Estos campos serán replicados por todos los nodos y le brindan la distribución de datos que está buscando. Y allIds
se puede usar para almacenar todas las claves para el mapeo, de modo que pueda recorrer el mapeo más tarde. Tenga en cuenta que puede omitir esta matriz y reemplazarla con una simple uint count
si las identificaciones son incrementales.
Ahora, si desea manipular datos, hasta ahora no hay nada como las consultas SQL en Solidity, pero puede lograr lo que desea al recorrer su archivo idTodataMapping
. Por ejemplo:
for (uint i = 0; i < allIds.length; i++) {
if (idTodataMapping[i].owner == "1") {
idTodataMapping[i].status = "allocated";
}
}
¿Es ETH una buena opción para esto? Si no, ¿hay alguna más adecuada?
No, almacenar datos en ethereum es costoso. almacenar un byte de datos en ethereum cuesta 68gas. Al precio actual de la gasolina, esto es 0,043 USD por Kbyte, es decir, alrededor de 45000 USD por GB.
Guardar los datos en la cadena de bloques no es una opción.
Jaime
chuletas
chuletas
Jaime
chuletas
Jaime