Obtener el último estado de un activo en particular para una fecha en particular

Tengo un contrato inteligente, en el que estoy haciendo un mapeo de la identificación de la máquina y la identificación del usuario que se mencionan a continuación:

mapping(bytes32 => uint256) public machineAllocs;
machineAllocs[machineId] = userId;

Ahora, estoy asignando una identificación de usuario a una identificación de máquina y también la identificación de usuario se puede cambiar por la misma identificación de máquina. Entonces, si quiero saber que en una fecha particular cuál es el último estado (vamos a las 11:59 p. m.) de una identificación de máquina en particular, significa qué última identificación de usuario está asignada a esa identificación de máquina.

Entonces, ¿cómo obtener estos detalles?

¿Quiere un contrato inteligente para obtener los detalles o alguna aplicación fuera de la cadena de bloques, como web3?
sí, quiero obtenerlo de web3. Y si hay alguna opción en solidez, también está bien para mí. Pero, ¿es eso posible con web3 bcoz? Ya estoy recuperando el historial del objeto de evento. Pero ahora quiero una historia más específica como mencioné en mi pregunta.
¿Sabes cómo hacerlo con web3?

Respuestas (2)

Para acceder a estos detalles del historial en Solidity, tendría que almacenar cada mutación, ya que los contratos inteligentes solo pueden ver el estado actual de la cadena de bloques.

Para obtener la información desde fuera de la cadena de bloques con, por ejemplo, web3, debe hacer que su contrato inteligente registre un evento cada vez que ocurra una mutación machineAllocs.

Echale un vistazo a éste ejemplo:

pragma solidity ^0.4.22;

contract MachineMapping {

    mapping(bytes32 => uint256) public machineAllocs;


    function setMachineUserId(bytes32 _machineId, uint256 _userId) {
        emit MachineUserIdSet(_machineId, machineAllocs[_machineId], _userId);
        machineAllocs[_machineId] = _userId;
    }

    event MachineUserIdSet(bytes32 indexed machineId, uint256 oldUserId, uint256 newUserId);
}

Ahora, cuando desee buscar cada mutación para un ID de máquina determinado, puede usar web3.eth.filter.getpara obtener todos MachineUserIdSetlos eventos registrados relacionados con su contrato y el ID de máquina.

Para ver cómo, echa un vistazo a esta respuesta . ¡Buena suerte!

Según su respuesta, ya había hecho este código. Creé un evento y lo llamé en mi js mencionado a continuación: var machineHistoryEvent = contractInstance.Transferred({}, {fromBlock: 0, toBlock: 'latest'}).get((error, result) => { var blockNumber = JSON .stringify(result[i].blockNumber);} Pero ahora he asignado muchos ID de usuario a un ID de máquina en particular, y quiero obtener el último estado de ID de máquina. Significa cuál fue el último ID de usuario asignado con ID de máquina, entonces, ¿cómo? para hacerlo ?

Al callenviar una viewfunción desde web3, puede especificar el número de bloque en el que desea evaluar la llamada.

Entonces su tarea se puede descomponer en dos pasos:

  1. Encuentre el número de bloque que corresponde a la marca de tiempo que le interesa. (Podría hacer una búsqueda binaria web3.eth.getBlock()hasta que encuentre la marca de tiempo correcta, aunque podría hacerlo mejor haciendo una suposición inicial inteligente basada en aproximadamente 10-15 segundos por bloque.)
  2. Llame a su función y especifique ese número de bloque. Por ejemplo, en web3.js 0.2xx: contract.machineAllocs(x, blockNumber).
Pero en este caso, si nos volvemos más específicos, si paso la fecha del 24 de abril, me da los resultados de todas las identificaciones de las máquinas, tomemos el tiempo como 11:59 p. m. Entonces, cómo hacer eso, porque no tenemos la entrada del número de bloque para las 11:59 p. m.
De eso se trata el punto n. ° 1 en mi respuesta. ¿Hubo algo ahí que no entendiste?
Pero si estoy ingresando una marca de tiempo que no está presente en el bloque, ¿cómo obtener el estado?
Si está buscando el valor en el momento X, entonces está buscando el bloque con la marca de tiempo más alta menor o igual a X.
ok, significa que es posible obtener la marca de tiempo más alta de los bloques, ¿verdad?
No sé a qué te refieres. Cada bloque tiene exactamente una marca de tiempo asociada, y puede ver cuál es esa marca de tiempo.
Sí, eso lo sé. Y también obtengo una marca de tiempo en mi código. Pero cómo encontrar la marca de tiempo más alta para una identificación de máquina en particular del bloque, que me quedé atascado.
Puede ser que necesitemos algo de lógica como encontrar el número máximo de muchos números. Esa lógica que necesito poner para encontrar la marca de tiempo más alta para una identificación de máquina en particular para una fecha en particular.
No tengo idea de lo que estás hablando. Lo que pensé que estabas preguntando: "¿Cómo puedo averiguar el valor de machineAllocs[xyz]en una marca de tiempo dada?" Si está preguntando algo diferente, por favor explique.
No, obtuviste el point.var blockNumber correcto = JSON.stringify(result[i].blockNumber); var blockCreationTime = web3.eth.getBlock(blockNumber).timestamp; He hecho esto hasta ahora. Pero la pregunta es: para una identificación de máquina en particular, necesito encontrar el bloque de marca de tiempo más alto en ese día determinado, ¿verdad?
"Para una identificación de máquina particular"... No, ¿verdad? Si desea conocer un valor el 24 de abril a las 11:59 p. m., debe encontrar el bloque con la marca de tiempo más alta antes del 24 de abril a las 11:59 p. m. El bloque que es no tiene nada que ver con la ID de máquina que va a verificar.
Entonces, nuevamente, puede hacer una búsqueda binaria a través de los bloques hasta que encuentre el correcto. No sé cómo responder más claramente; Creo que estoy repitiendo lo mismo una y otra vez.