make additional request for blockhash in polkadot (#537)
This commit is contained in:
@@ -45,20 +45,22 @@ object BeaconChainSpecific : AbstractPollChainSpecific() {
|
||||
return ChainRequest("GET#/eth/v1/beacon/headers/head", RestParams.emptyParams())
|
||||
}
|
||||
|
||||
override fun parseBlock(data: ByteArray, upstreamId: String): BlockContainer {
|
||||
override fun parseBlock(data: ByteArray, upstreamId: String, api: ChainReader): Mono<BlockContainer> {
|
||||
val blockHeader = Global.objectMapper.readValue<BeaconChainBlockHeader>(data)
|
||||
|
||||
return BlockContainer(
|
||||
height = blockHeader.height,
|
||||
hash = BlockId.from(blockHeader.hash),
|
||||
difficulty = BigInteger.ZERO,
|
||||
timestamp = Instant.EPOCH,
|
||||
full = false,
|
||||
json = data,
|
||||
parsed = blockHeader,
|
||||
transactions = emptyList(),
|
||||
upstreamId = upstreamId,
|
||||
parentHash = BlockId.from(blockHeader.parentHash),
|
||||
return Mono.just(
|
||||
BlockContainer(
|
||||
height = blockHeader.height,
|
||||
hash = BlockId.from(blockHeader.hash),
|
||||
difficulty = BigInteger.ZERO,
|
||||
timestamp = Instant.EPOCH,
|
||||
full = false,
|
||||
json = data,
|
||||
parsed = blockHeader,
|
||||
transactions = emptyList(),
|
||||
upstreamId = upstreamId,
|
||||
parentHash = BlockId.from(blockHeader.parentHash),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -29,20 +29,22 @@ object CosmosChainSpecific : AbstractPollChainSpecific() {
|
||||
val log = LoggerFactory.getLogger(this::class.java)
|
||||
override fun latestBlockRequest(): ChainRequest = ChainRequest("block", ObjectParams())
|
||||
|
||||
override fun parseBlock(data: ByteArray, upstreamId: String): BlockContainer {
|
||||
override fun parseBlock(data: ByteArray, upstreamId: String, api: ChainReader): Mono<BlockContainer> {
|
||||
val result = Global.objectMapper.readValue(data, CosmosBlockResult::class.java)
|
||||
|
||||
return BlockContainer(
|
||||
height = result.block.header.height.toLong(),
|
||||
hash = BlockId.from(result.blockId.hash),
|
||||
difficulty = BigInteger.ZERO,
|
||||
timestamp = result.block.header.time,
|
||||
full = false,
|
||||
json = data,
|
||||
parsed = result,
|
||||
transactions = emptyList(),
|
||||
upstreamId = upstreamId,
|
||||
parentHash = BlockId.from(result.block.header.lastBlockId.hash),
|
||||
return Mono.just(
|
||||
BlockContainer(
|
||||
height = result.block.header.height.toLong(),
|
||||
hash = BlockId.from(result.blockId.hash),
|
||||
difficulty = BigInteger.ZERO,
|
||||
timestamp = result.block.header.time,
|
||||
full = false,
|
||||
json = data,
|
||||
parsed = result,
|
||||
transactions = emptyList(),
|
||||
upstreamId = upstreamId,
|
||||
parentHash = BlockId.from(result.block.header.lastBlockId.hash),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -46,12 +46,12 @@ object EthereumChainSpecific : AbstractPollChainSpecific() {
|
||||
|
||||
private val log: Logger = LoggerFactory.getLogger(EthereumChainSpecific::class.java)
|
||||
|
||||
override fun parseBlock(data: ByteArray, upstreamId: String): BlockContainer {
|
||||
return BlockContainer.fromEthereumJson(data, upstreamId)
|
||||
override fun parseBlock(data: ByteArray, upstreamId: String, api: ChainReader): Mono<BlockContainer> {
|
||||
return Mono.just(BlockContainer.fromEthereumJson(data, upstreamId))
|
||||
}
|
||||
|
||||
override fun getFromHeader(data: ByteArray, upstreamId: String, api: ChainReader): Mono<BlockContainer> {
|
||||
return Mono.just(parseBlock(data, upstreamId))
|
||||
return parseBlock(data, upstreamId, api)
|
||||
}
|
||||
|
||||
override fun latestBlockRequest() =
|
||||
|
||||
@@ -121,12 +121,12 @@ abstract class AbstractChainSpecific : ChainSpecific {
|
||||
abstract class AbstractPollChainSpecific : AbstractChainSpecific() {
|
||||
|
||||
override fun getLatestBlock(api: ChainReader, upstreamId: String): Mono<BlockContainer> {
|
||||
return api.read(latestBlockRequest()).map {
|
||||
parseBlock(it.getResult(), upstreamId)
|
||||
return api.read(latestBlockRequest()).flatMap {
|
||||
parseBlock(it.getResult(), upstreamId, api)
|
||||
}
|
||||
}
|
||||
|
||||
abstract fun latestBlockRequest(): ChainRequest
|
||||
|
||||
abstract fun parseBlock(data: ByteArray, upstreamId: String): BlockContainer
|
||||
abstract fun parseBlock(data: ByteArray, upstreamId: String, api: ChainReader): Mono<BlockContainer>
|
||||
}
|
||||
|
||||
@@ -26,20 +26,22 @@ import java.time.Instant
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
object NearChainSpecific : AbstractPollChainSpecific() {
|
||||
override fun parseBlock(data: ByteArray, upstreamId: String): BlockContainer {
|
||||
override fun parseBlock(data: ByteArray, upstreamId: String, api: ChainReader): Mono<BlockContainer> {
|
||||
val block = Global.objectMapper.readValue(data, NearBlock::class.java).header
|
||||
|
||||
return BlockContainer(
|
||||
height = block.height,
|
||||
hash = BlockId.fromBase64(block.hash),
|
||||
difficulty = BigInteger.ZERO,
|
||||
timestamp = Instant.ofEpochMilli(TimeUnit.MILLISECONDS.convert(block.timestamp, TimeUnit.NANOSECONDS)),
|
||||
full = false,
|
||||
json = data,
|
||||
parsed = block,
|
||||
transactions = emptyList(),
|
||||
upstreamId = upstreamId,
|
||||
parentHash = BlockId.fromBase64(block.prevHash),
|
||||
return Mono.just(
|
||||
BlockContainer(
|
||||
height = block.height,
|
||||
hash = BlockId.fromBase64(block.hash),
|
||||
difficulty = BigInteger.ZERO,
|
||||
timestamp = Instant.ofEpochMilli(TimeUnit.MILLISECONDS.convert(block.timestamp, TimeUnit.NANOSECONDS)),
|
||||
full = false,
|
||||
json = data,
|
||||
parsed = block,
|
||||
transactions = emptyList(),
|
||||
upstreamId = upstreamId,
|
||||
parentHash = BlockId.fromBase64(block.prevHash),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -39,22 +39,22 @@ import java.time.Instant
|
||||
object PolkadotChainSpecific : AbstractPollChainSpecific() {
|
||||
|
||||
private val log = LoggerFactory.getLogger(PolkadotChainSpecific::class.java)
|
||||
override fun parseBlock(data: ByteArray, upstreamId: String): BlockContainer {
|
||||
override fun parseBlock(data: ByteArray, upstreamId: String, api: ChainReader): Mono<BlockContainer> {
|
||||
val response = Global.objectMapper.readValue(data, PolkadotBlockResponse::class.java)
|
||||
|
||||
return makeBlock(response.block.header, data, upstreamId)
|
||||
return api.read(ChainRequest("chain_getBlockHash", ListParams(response.block.header.number)))
|
||||
.map { makeBlock(it.getResultAsProcessedString(), response.block.header, data, upstreamId) }
|
||||
}
|
||||
|
||||
override fun getFromHeader(data: ByteArray, upstreamId: String, api: ChainReader): Mono<BlockContainer> {
|
||||
val header = Global.objectMapper.readValue(data, PolkadotHeader::class.java)
|
||||
|
||||
return Mono.just(makeBlock(header, data, upstreamId))
|
||||
return api.read(ChainRequest("chain_getBlockHash", ListParams(header.number)))
|
||||
.map { makeBlock(it.getResultAsProcessedString(), header, data, upstreamId) }
|
||||
}
|
||||
|
||||
private fun makeBlock(header: PolkadotHeader, data: ByteArray, upstreamId: String): BlockContainer {
|
||||
private fun makeBlock(id: String, header: PolkadotHeader, data: ByteArray, upstreamId: String): BlockContainer {
|
||||
return BlockContainer(
|
||||
height = header.number.substring(2).toLong(16),
|
||||
hash = BlockId.from(header.parentHash), // todo
|
||||
hash = BlockId.from(id),
|
||||
difficulty = BigInteger.ZERO,
|
||||
timestamp = Instant.EPOCH,
|
||||
full = false,
|
||||
|
||||
@@ -27,20 +27,22 @@ object StarknetChainSpecific : AbstractPollChainSpecific() {
|
||||
|
||||
private val log = LoggerFactory.getLogger(StarknetChainSpecific::class.java)
|
||||
|
||||
override fun parseBlock(data: ByteArray, upstreamId: String): BlockContainer {
|
||||
override fun parseBlock(data: ByteArray, upstreamId: String, api: ChainReader): Mono<BlockContainer> {
|
||||
val block = Global.objectMapper.readValue(data, StarknetBlock::class.java)
|
||||
|
||||
return BlockContainer(
|
||||
height = block.number,
|
||||
hash = BlockId.from(block.hash),
|
||||
difficulty = BigInteger.ZERO,
|
||||
timestamp = block.timestamp,
|
||||
full = false,
|
||||
json = data,
|
||||
parsed = block,
|
||||
transactions = emptyList(),
|
||||
upstreamId = upstreamId,
|
||||
parentHash = BlockId.from(block.parent),
|
||||
return Mono.just(
|
||||
BlockContainer(
|
||||
height = block.number,
|
||||
hash = BlockId.from(block.hash),
|
||||
difficulty = BigInteger.ZERO,
|
||||
timestamp = block.timestamp,
|
||||
full = false,
|
||||
json = data,
|
||||
parsed = block,
|
||||
transactions = emptyList(),
|
||||
upstreamId = upstreamId,
|
||||
parentHash = BlockId.from(block.parent),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user