Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement proper context gap fixing solution #407

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion altchain-plugins/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ dependencies {
implementation("com.google.guava:guava:26.0-jre")

// Logging
implementation("io.github.microutils:kotlin-logging:1.6.26")
implementation("io.github.microutils:kotlin-logging:2.1.23")
implementation("org.apache.logging.log4j:log4j-api:$log4jVersion")
implementation("org.apache.logging.log4j:log4j-core:$log4jVersion")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,30 @@

package org.veriblock.alt.plugins

import com.google.gson.ExclusionStrategy
import com.google.gson.FieldAttributes
import com.google.gson.Gson
import com.google.gson.JsonDeserializer
import com.google.gson.JsonElement
import io.ktor.client.HttpClient
import io.ktor.client.engine.apache.Apache
import io.ktor.client.features.auth.Auth
import io.ktor.client.*
import io.ktor.client.engine.apache.*
import io.ktor.client.features.auth.*
import io.ktor.client.features.auth.providers.*
import io.ktor.client.features.json.GsonSerializer
import io.ktor.client.features.json.Json
import io.ktor.http.ContentType
import io.ktor.client.features.json.*
import io.ktor.http.*
import org.veriblock.core.crypto.MerkleRoot
import org.veriblock.core.crypto.PreviousBlockVbkHash
import org.veriblock.core.crypto.PreviousKeystoneVbkHash
import org.veriblock.core.crypto.TruncatedMerkleRoot
import org.veriblock.core.crypto.VbkHash
import org.veriblock.core.crypto.asMerkleRoot
import org.veriblock.core.crypto.asTruncatedMerkleRoot
import org.veriblock.core.crypto.asVbkHash
import org.veriblock.core.crypto.asVbkPreviousBlockHash
import org.veriblock.core.crypto.asVbkPreviousKeystoneHash
import org.veriblock.sdk.alt.plugin.HttpAuthConfig
import org.veriblock.sdk.models.SkipSerialisation
import java.lang.annotation.ElementType
import java.lang.reflect.Type

class HttpException(
Expand All @@ -26,6 +40,17 @@ class HttpException(
) : RuntimeException(message, cause)

private val gson = Gson()
.newBuilder()
.registerTypeAdapter(PreviousBlockVbkHash::class.java, JsonDeserializer { json, _, _ -> json.asString.asVbkPreviousBlockHash() })
.registerTypeAdapter(PreviousKeystoneVbkHash::class.java, JsonDeserializer { json, _, _ -> json.asString.asVbkPreviousKeystoneHash() })
.registerTypeAdapter(VbkHash::class.java, JsonDeserializer { json, _, _ -> json.asString.asVbkHash() })
.registerTypeAdapter(MerkleRoot::class.java, JsonDeserializer { json, _, _ -> json.asString.asMerkleRoot() })
.registerTypeAdapter(TruncatedMerkleRoot::class.java, JsonDeserializer { json, _, _ -> json.asString.asTruncatedMerkleRoot() })
.addDeserializationExclusionStrategy(object : ExclusionStrategy {
override fun shouldSkipField(f: FieldAttributes): Boolean = f.getAnnotation(SkipSerialisation::class.java) != null
override fun shouldSkipClass(clazz: Class<*>?): Boolean = false
})
.create()

fun <T> String.fromJson(type: Type): T = gson.fromJson(this, type)
fun <T> JsonElement.fromJson(type: Type): T = gson.fromJson(this, type)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,14 @@ import org.veriblock.core.utilities.extensions.isHex
import org.veriblock.core.utilities.extensions.toHex
import org.veriblock.sdk.alt.ApmInstruction
import org.veriblock.sdk.alt.model.Atv
import org.veriblock.sdk.alt.model.BtcBlockResponse
import org.veriblock.sdk.alt.model.PopMempool
import org.veriblock.sdk.alt.model.PopParamsResponse
import org.veriblock.sdk.alt.model.SecurityInheritingBlock
import org.veriblock.sdk.alt.model.SecurityInheritingTransaction
import org.veriblock.sdk.alt.model.SecurityInheritingTransactionVout
import org.veriblock.sdk.alt.model.SubmitPopResponse
import org.veriblock.sdk.alt.model.VbkBlockResponse
import org.veriblock.sdk.alt.model.Vtb
import org.veriblock.sdk.alt.plugin.PluginConfig
import org.veriblock.sdk.alt.plugin.PluginSpec
Expand Down Expand Up @@ -286,9 +288,9 @@ class BitcoinFamilyChain(
override fun extractAddressDisplay(addressData: ByteArray): String {
return if (config.addressPrefix != null) {
val witnessProgram = ByteArray(addressData.size - 2)
addressData.copyInto(witnessProgram, 0,2, addressData.size)
addressData.copyInto(witnessProgram, 0, 2, addressData.size)
try {
segwitToBech32(config.addressPrefix,0, witnessProgram)
segwitToBech32(config.addressPrefix, 0, witnessProgram)
} catch (exception: Exception) {
throw IllegalArgumentException("Can't extract the Bech32 address from the address data: ${addressData.toHex()}", exception)
}
Expand Down Expand Up @@ -335,21 +337,23 @@ class BitcoinFamilyChain(
return rpcRequest("getpopparams", emptyList<String>())
}

override suspend fun getVbkBlock(hash: String): VeriBlockBlock? {
override suspend fun getVbkBlockHash(height: Int): String? {
return try {
return rpcRequest("getvbkblockhash", listOf(height))
} catch (e: RpcException) {
if (e.errorCode == NOT_FOUND_ERROR_CODE) {
// Block not found
null
} else {
throw e
}
}
}

override suspend fun getVbkBlock(hash: String): VbkBlockResponse? {
logger.debug { "Retrieving the VBK block for the hash $hash" }
return try {
val response: VbkBlock = rpcRequest("getvbkblock", listOf(hash))
VeriBlockBlock(
height = response.header?.height ?: error("getvbkblock height field must be set"),
version = response.header.version ?: error("getvbkblock version field must be set"),
previousBlock = response.header.previousBlock?.asAnyVbkHash()?.trimToPreviousBlockSize() ?: error("getvbkblock previousBlock field must be set"),
previousKeystone = response.header.previousKeystone?.asAnyVbkHash()?.trimToPreviousKeystoneSize() ?: error("getvbkblock previousKeystone field must be set"),
secondPreviousKeystone = response.header.secondPreviousKeystone?.asAnyVbkHash()?.trimToPreviousKeystoneSize() ?: error("getvbkblock secondPreviousKeystone field must be set"),
merkleRoot = response.header.merkleRoot?.asTruncatedMerkleRoot() ?: error("getvbkblock merkleRoot field must be set"),
timestamp = response.header.timestamp ?: error("getvbkblock timestamp field must be set"),
difficulty = response.header.difficulty ?: error("getvbkblock difficulty field must be set"),
nonce = response.header.nonce ?: error("getvbkblock nonce field must be set")
)
return rpcRequest("getvbkblock", listOf(hash))
} catch (e: RpcException) {
if (e.errorCode == NOT_FOUND_ERROR_CODE) {
// Block not found
Expand All @@ -365,18 +369,10 @@ class BitcoinFamilyChain(
return rpcRequest("getbtcbestblockhash")
}

override suspend fun getBtcBlock(hash: String): BitcoinBlock? {
override suspend fun getBtcBlock(hash: String): BtcBlockResponse? {
logger.debug { "Retrieving the BTC block for the hash $hash" }
return try {
val response: BtcBlockBlock = rpcRequest("getbtcblock", listOf(hash))
BitcoinBlock(
version = response.header?.version ?: error("getbtcblock version field must be set"),
previousBlock = response.header.previousBlock?.asBtcHash() ?: error("getbtcblock previousBlock field must be set"),
merkleRoot = response.header.merkleRoot?.asMerkleRoot() ?: error("getbtcblock merkleRoot field must be set"),
timestamp = response.header.timestamp ?: error("getbtcblock timestamp field must be set"),
difficulty = 0, // FIXME difficulty field is not at the response
nonce = response.header.nonce ?: error("getbtcblock nonce field must be set")
)
return rpcRequest("getbtcblock", listOf(hash))
} catch (e: RpcException) {
if (e.errorCode == NOT_FOUND_ERROR_CODE) {
// Block not found
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,25 +123,6 @@ internal data class BlockChainInfo(
val initialblockdownload: Boolean
)

internal data class BtcBlockBlock(
val chainWork: String?,
val height: Int?,
val header: BtcBlockHeader?,
val status: Int?,
val vbkRefs: List<Int?>?,
val blockOfProofEndorsements: List<String?>?
)

internal data class BtcBlockHeader(
val hash: String?,
val version: Int?,
val previousBlock: String?,
val merkleRoot: String?,
val timestamp: Int?,
val bits: Long?,
val nonce: Int?
)

internal data class VbkBlock(
val chainWork: String?,
val containingEndorsements: List<String?>?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,16 @@ import org.veriblock.core.utilities.extensions.isHex
import org.veriblock.core.utilities.extensions.toHex
import org.veriblock.sdk.alt.ApmInstruction
import org.veriblock.sdk.alt.model.Atv
import org.veriblock.sdk.alt.model.BtcBlockResponse
import org.veriblock.sdk.alt.model.NetworkParam
import org.veriblock.sdk.alt.model.PopMempool
import org.veriblock.sdk.alt.model.PopParamsResponse
import org.veriblock.sdk.alt.model.PopPayoutParams
import org.veriblock.sdk.alt.model.SecurityInheritingBlock
import org.veriblock.sdk.alt.model.SecurityInheritingTransaction
import org.veriblock.sdk.alt.model.StoredInVbkBlockData
import org.veriblock.sdk.alt.model.SubmitPopResponse
import org.veriblock.sdk.alt.model.VbkBlockResponse
import org.veriblock.sdk.alt.model.Vtb
import org.veriblock.sdk.alt.plugin.PluginConfig
import org.veriblock.sdk.alt.plugin.PluginSpec
Expand Down Expand Up @@ -321,21 +324,23 @@ class EthereumFamilyChain(
)
}

override suspend fun getVbkBlock(hash: String): VeriBlockBlock? {
val response = rpcRequest<EthGetVbkBlockResponse>(
override suspend fun getVbkBlock(hash: String): VbkBlockResponse? {
return rpcRequest<VbkBlockResponse>(
method="pop_getVbkBlockByHash",
params = listOf(hash),
version = "2.0")
}

return response.header.toVbkBlock()
override suspend fun getVbkBlockHash(height: Int): String? {
TODO("Not yet implemented")
}

override suspend fun getBestKnownBtcBlockHash(): String {
logger.debug { "Retrieving the best known BTC block hash..." }
return rpcRequest("pop_getBtcBestBlockHash", version = "2.0")
}

override suspend fun getBtcBlock(hash: String): BitcoinBlock? {
override suspend fun getBtcBlock(hash: String): BtcBlockResponse? {
TODO("Not yet implemented (getBtcBlock)") // pop_getBtcBlockByHash
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,13 @@ import org.veriblock.core.utilities.extensions.asHexBytes
import org.veriblock.sdk.alt.ApmInstruction
import org.veriblock.sdk.alt.SecurityInheritingChain
import org.veriblock.sdk.alt.model.Atv
import org.veriblock.sdk.alt.model.BtcBlockResponse
import org.veriblock.sdk.alt.model.PopMempool
import org.veriblock.sdk.alt.model.PopParamsResponse
import org.veriblock.sdk.alt.model.SecurityInheritingBlock
import org.veriblock.sdk.alt.model.SecurityInheritingTransaction
import org.veriblock.sdk.alt.model.SubmitPopResponse
import org.veriblock.sdk.alt.model.VbkBlockResponse
import org.veriblock.sdk.alt.model.Vtb
import org.veriblock.sdk.alt.plugin.PluginConfig
import org.veriblock.sdk.alt.plugin.PluginSpec
Expand Down Expand Up @@ -90,15 +92,19 @@ class NxtFamilyChain(
TODO("Not yet implemented")
}

override suspend fun getVbkBlock(hash: String): VeriBlockBlock? {
override suspend fun getVbkBlock(hash: String): VbkBlockResponse? {
TODO("Not yet implemented")
}

override suspend fun getVbkBlockHash(height: Int): String? {
TODO("Not yet implemented")
}

override suspend fun getBestKnownBtcBlockHash(): String {
TODO("Not yet implemented")
}

override suspend fun getBtcBlock(hash: String): BitcoinBlock? {
override suspend fun getBtcBlock(hash: String): BtcBlockResponse? {
TODO("Not yet implemented")
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,14 @@ import org.veriblock.core.utilities.extensions.toHex
import org.veriblock.sdk.alt.ApmInstruction
import org.veriblock.sdk.alt.SecurityInheritingChain
import org.veriblock.sdk.alt.model.Atv
import org.veriblock.sdk.alt.model.BtcBlockResponse
import org.veriblock.sdk.alt.model.PopMempool
import org.veriblock.sdk.alt.model.PopParamsResponse
import org.veriblock.sdk.alt.model.SecurityInheritingBlock
import org.veriblock.sdk.alt.model.SecurityInheritingTransaction
import org.veriblock.sdk.alt.model.SecurityInheritingTransactionVout
import org.veriblock.sdk.alt.model.SubmitPopResponse
import org.veriblock.sdk.alt.model.VbkBlockResponse
import org.veriblock.sdk.alt.model.Vtb
import org.veriblock.sdk.alt.plugin.PluginConfig
import org.veriblock.sdk.alt.plugin.PluginSpec
Expand Down Expand Up @@ -136,15 +138,19 @@ class TestChain(
TODO("Not yet implemented")
}

override suspend fun getVbkBlock(hash: String): VeriBlockBlock? {
override suspend fun getVbkBlock(hash: String): VbkBlockResponse? {
TODO("Not yet implemented")
}

override suspend fun getVbkBlockHash(height: Int): String? {
TODO("Not yet implemented")
}

override suspend fun getBestKnownBtcBlockHash(): String {
TODO("Not yet implemented")
}

override suspend fun getBtcBlock(hash: String): BitcoinBlock? {
override suspend fun getBtcBlock(hash: String): BtcBlockResponse? {
TODO("Not yet implemented")
}

Expand Down
5 changes: 4 additions & 1 deletion altchain-sdk/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
import groovy.lang.GroovyObject
import org.jfrog.gradle.plugin.artifactory.dsl.PublisherConfig

repositories {
mavenCentral()
}
plugins {
java
kotlin("jvm")
Expand All @@ -28,7 +31,7 @@ dependencies {
implementation("io.github.config4k:config4k:0.4.0")

// Logging
implementation("io.github.microutils:kotlin-logging:1.6.26")
implementation("io.github.microutils:kotlin-logging:2.1.23")

// Reflection
implementation("org.reflections:reflections:0.9.12")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@ package org.veriblock.sdk.alt
import org.veriblock.core.altchain.AltchainPopEndorsement
import org.veriblock.core.contracts.BlockEvidence
import org.veriblock.sdk.alt.model.Atv
import org.veriblock.sdk.alt.model.BtcBlockResponse
import org.veriblock.sdk.alt.model.PopMempool
import org.veriblock.sdk.alt.model.PopParamsResponse
import org.veriblock.sdk.alt.model.SecurityInheritingBlock
import org.veriblock.sdk.alt.model.SecurityInheritingTransaction
import org.veriblock.sdk.alt.model.SubmitPopResponse
import org.veriblock.sdk.alt.model.VbkBlockResponse
import org.veriblock.sdk.alt.model.Vtb
import org.veriblock.sdk.models.*

Expand Down Expand Up @@ -86,7 +88,12 @@ interface SecurityInheritingChain {
/**
* Returns the VeriBlockBlock for the given [hash]
*/
suspend fun getVbkBlock(hash: String): VeriBlockBlock?
suspend fun getVbkBlock(hash: String): VbkBlockResponse?

/**
* Returns the VeriBlock Block hash on given [height] from active chain.
*/
suspend fun getVbkBlockHash(height: Int): String?

/**
* Returns the hash from the best known BTC block
Expand All @@ -96,7 +103,7 @@ interface SecurityInheritingChain {
/**
* Returns the BitcoinBlock for the given [hash]
*/
suspend fun getBtcBlock(hash: String): BitcoinBlock?
suspend fun getBtcBlock(hash: String): BtcBlockResponse?

/**
* Returns this security inheriting chain's PoP mempool (ATVs and VTBs).
Expand Down
Loading