Necesitamos detectar que el trabajo enviado se convirtió en un tío. ¿Cómo haría esto con geth api? Pensé en verificar el número de bloque enviado más tarde en busca de tíos que coincidan con el hash de mi bloque. ¿Hay una mejor manera?
Aquí están mis scripts para verificar e imprimir bloques, tíos y transacciones. Verá la lógica para recuperar los detalles del tío dentro de la getMinedBlocks()
función.
Los he enumerado por separado para facilitar la lectura. Si tiene la intención de usarlo en geth
, probablemente querrá concatenar las siguientes 5 funciones en un solo archivo para copiar y pegar fácilmente en la geth
consola.
imprimirTransacción(txHash)
function printTransaction(txHash) {
var tx = eth.getTransaction(txHash);
if (tx != null) {
console.log(" tx hash : " + tx.hash + "\n"
+ " nonce : " + tx.nonce + "\n"
+ " blockHash : " + tx.blockHash + "\n"
+ " blockNumber : " + tx.blockNumber + "\n"
+ " transactionIndex: " + tx.transactionIndex + "\n"
+ " from : " + tx.from + "\n"
+ " to : " + tx.to + "\n"
+ " value : " + tx.value + "\n"
+ " gasPrice : " + tx.gasPrice + "\n"
+ " gas : " + tx.gas + "\n"
+ " input : " + tx.input);
}
}
imprimirBloque(bloque)
function printBlock(block) {
console.log("Block number : " + block.number + "\n"
+ " hash : " + block.hash + "\n"
+ " parentHash : " + block.parentHash + "\n"
+ " nonce : " + block.nonce + "\n"
+ " sha3Uncles : " + block.sha3Uncles + "\n"
+ " logsBloom : " + block.logsBloom + "\n"
+ " transactionsRoot: " + block.transactionsRoot + "\n"
+ " stateRoot : " + block.stateRoot + "\n"
+ " miner : " + block.miner + "\n"
+ " difficulty : " + block.difficulty + "\n"
+ " totalDifficulty : " + block.totalDifficulty + "\n"
+ " extraData : " + block.extraData + "\n"
+ " size : " + block.size + "\n"
+ " gasLimit : " + block.gasLimit + "\n"
+ " gasUsed : " + block.gasUsed + "\n"
+ " timestamp : " + block.timestamp + "\n"
+ " transactions : " + block.transactions + "\n"
+ " uncles : " + block.uncles);
if (block.transactions != null) {
console.log("--- transactions ---");
block.transactions.forEach( function(e) {
printTransaction(e);
})
}
}
imprimirTío(bloque, tíoNúmero, tío)
function printUncle(block, uncleNumber, uncle) {
console.log("Block number : " + block.number + " , uncle position: " + uncleNumber + "\n"
+ " Uncle number : " + uncle.number + "\n"
+ " hash : " + uncle.hash + "\n"
+ " parentHash : " + uncle.parentHash + "\n"
+ " nonce : " + uncle.nonce + "\n"
+ " sha3Uncles : " + uncle.sha3Uncles + "\n"
+ " logsBloom : " + uncle.logsBloom + "\n"
+ " transactionsRoot: " + uncle.transactionsRoot + "\n"
+ " stateRoot : " + uncle.stateRoot + "\n"
+ " miner : " + uncle.miner + "\n"
+ " difficulty : " + uncle.difficulty + "\n"
+ " totalDifficulty : " + uncle.totalDifficulty + "\n"
+ " extraData : " + uncle.extraData + "\n"
+ " size : " + uncle.size + "\n"
+ " gasLimit : " + uncle.gasLimit + "\n"
+ " gasUsed : " + uncle.gasUsed + "\n"
+ " timestamp : " + uncle.timestamp + "\n"
+ " transactions : " + uncle.transactions + "\n");
}
getMinedBlocks(minero, startBlockNumber, endBlockNumber)
Si startBlockNumber
no se especifica, se establecerá de forma predeterminada en los últimos 10.000 bloques. Esto toma algo de tiempo para escanear, así que reduzca este número a 1000 para reducir el tiempo de escaneo.
Si endBlockNumber
no se especifica, se establecerá de forma predeterminada en el último número de bloque.
function getMinedBlocks(miner, startBlockNumber, endBlockNumber) {
if (endBlockNumber == null) {
endBlockNumber = eth.blockNumber;
console.log("Using endBlockNumber: " + endBlockNumber);
}
if (startBlockNumber == null) {
startBlockNumber = endBlockNumber - 10000;
console.log("Using startBlockNumber: " + startBlockNumber);
}
console.log("Searching for miner \"" + miner + "\" within blocks " + startBlockNumber + " and " + endBlockNumber + "\"");
for (var i = startBlockNumber; i <= endBlockNumber; i++) {
if (i % 1000 == 0) {
console.log("Searching block " + i);
}
var block = eth.getBlock(i);
if (block != null) {
if (block.miner == miner || miner == "*") {
console.log("Found block " + block.number);
printBlock(block);
}
if (block.uncles != null) {
for (var j = 0; j < 2; j++) {
var uncle = eth.getUncle(i, j);
if (uncle != null) {
if (uncle.miner == miner || miner == "*") {
console.log("Found uncle " + block.number + " uncle " + j);
printUncle(block, j, uncle);
}
}
}
}
}
}
}
getMyMinedBlocks(startBlockNumber, endBlockNumber)
function getMyMinedBlocks(startBlockNumber, endBlockNumber) {
getMinedBlocks(eth.accounts[0], startBlockNumber, endBlockNumber);
}
Ejemplos para usar la función anterior
Estos son algunos ejemplos del uso de las funciones anteriores en la red principal pública Ethereum.
Bloque de impresión extraído por "0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5". Ver https://etherscan.io/block/1325630
getMinedBlocks("0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5", 1325620, 1325640);
Imprimir bloque con tíos minado por "0xf3b9d2c81f2b24b0fa0acaaa865b7d9ced5fc2fb". Ver https://etherscan.io/block/1325635
getMinedBlocks("0xf3b9d2c81f2b24b0fa0acaaa865b7d9ced5fc2fb", 1325630, 1325640);
con la salida:
> getMinedBlocks("0xf3b9d2c81f2b24b0fa0acaaa865b7d9ced5fc2fb", 1325630, 1325640);
Searching for miner "0xf3b9d2c81f2b24b0fa0acaaa865b7d9ced5fc2fb" within blocks 1325630 and 1325640"
Found uncle 1325635 uncle 0
Block number : 1325635 , uncle position: 0
Uncle number : 1325634
hash : 0xae03bb2d5f1fbde4e22bf79850307ab6ae7d8545a9f0de4a5f529095546308c0
parentHash : 0x771b46e0310666780a55b1d603648d89e7d8cc3feac20a175117b4cb7e206a75
nonce : 0xeff5922de2f569e8
sha3Uncles : 0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347
logsBloom : 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
transactionsRoot: 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421
stateRoot : 0xafca80bc836c00c7eeb4b6f3254573f72d38a0738ce4793da7d5222ed6c0c5cd
miner : 0xf3b9d2c81f2b24b0fa0acaaa865b7d9ced5fc2fb
difficulty : 26564802678158
totalDifficulty : 0
extraData : 0x426974436c756220455448204d696e696e6720506f6f6c
size : 0
gasLimit : 4712388
gasUsed : 0
timestamp : 1460501836
transactions : undefined
Imprimir bloque con tíos. Ver https://etherscan.io/block/907703
getMinedBlocks("*", 907703, 907703);
Imprimir bloques que mi minero ha extraído entre los bloques 1321603 y 1321605
getMyMinedBlocks(1321603, 1321605);
normalmente lo verías en el minero...
pero si lo necesita para una transacción, sugeriría usar este comando
https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgetuncle
bolaum
VoR0220
bolaum