POS RPC

id Título custom_edit_url palabras clave (keywords)
pos_rpc PoS JSON RPC https://github.com/Conflux-Chain/conflux-doc/edit/master/docs/pos-rpc.md conflux, pos-rpc, SDK

conflux-rust introduce la finalidad de PoS a partir de la v1.2.0 para acelerar la finalidad de los bloques y evitar ataques del 51%. La finalidad de PoS introducirá una blockchain de PoS independiente para el consenso de PoS y la finalización de bloques de PoW. En consecuencia, PoS también tiene sus propios métodos RPC para obtener datos de la blockchain de PoS.

Actualmente, solo los nodos de archivo de conflux-rust pueden proporcionar el servicio PoS RPC al público. public_rpc_apis debe configurarse para abrir el RPC.

Puedes agregar el grupo pos al grupo de métodos RPC actual.

public_rpc_apis = "safe,pos"

O simplemente configura public_rpc_apis en all para abrir todos los métodos RPC.

public_rpc_apis = "all"

Conceptos básicos

épocas

El concepto de época también se utiliza en PoS. Sin embargo, a diferencia de la época en PoW, una época en PoS representa el período de un comité, comenzando desde el período 1. Cada época equivale a una hora en promedio. Después de cada época, una parte de los miembros del comité son reemplazados. Las recompensas por participar en el consenso de PoS también se otorgan por época.

ronda

Una blockchain de PoS realizará en promedio una ronda de consenso cada minuto (es decir, intentará generar un bloque de PoS). Esto significa que cada época tendrá 60 rondas, y con cada nueva época, la ronda comenzará desde 1 nuevamente.

Nota: No todas las rondas generarán un bloque. puede haber fallas en la red o en el consenso que impidan que se genere un bloque.

Número de bloque

El número de bloque es la altura del bloque y se agrega uno por cada bloque nuevo generado.

Después de que un miembro del comité proponga un bloque de PoS, se enviará a la red para su votación. Cuando el bloque obtiene suficientes votos, se etiqueta como votado. Sin embargo, el bloque aún se ha comprometido. Cuando se creen tres bloques consecutivos, se enviará el bloque correspondiente a la primera ronda. Entonces su estado cambiará de voted (votado) a committed (comprometido).

pivotDecision

pivotDecision es la decisión final de la blockchain PoS sobre un bloque en la blockchain PoW. Una vez que el PoS hace referencia a un bloque en el PoW, el bloque PoW se finaliza y no habrá más reversión. Los bloques en la blockchain de PoS incluirán atributos de PivotDecision, lo que indica que este bloque de PoS ha finalizado un bloque en la blockchain de PoW. PivotDecision es el número de bloque o valor hash de un bloque en la blockchain PoW.

Dirección de PoS

A diferencia del formato de la dirección PoW, la dirección de la cuenta PoS es un valor hash de 256 bits, p.

0x046ca462890f25ed9394ca9f92c979ff48e1738a81822ecab96d83813c1a433c

Modelo PoS

AccountStatus

Después de que una cuenta se registre para participar en el consenso de PoS, o agregue participación en los votos, los votos primero pasarán al estado de inQueue y luego se bloquearán después de siete días.
Cuando el usuario realiza un comando de desbloqueo, los votos que se desbloquearán primero pasarán al estado outQueue. Luego, también lleva siete días desbloquearse.

  • availableVotes: QUANTITY el número de votos actualmente disponibles para la cuenta. Es igual a la suma inQueue + locked (bloqueado).
  • forfeited: QUANTITY: la cantidad de votos que están bloqueados y no se pueden recuperar si la cuenta se identifica como maliciosa.
  • ForceRetired: QUANTITY - el número de votos que se ven obligados a retirarse.
  • inQueue: Array of VotesInQueue - el número de votos que actualmente están esperando ser bloqueados.
  • locked: QUANTITY - el número de votos que están bloqueados actualmente.
  • outQueue: Array of VotesInQueue - el número de votos que actualmente están esperando ser desbloqueados.
  • unlocked: QUANTITY - el número de votos que están desbloqueados actualmente.

Decisión

La decisión de la blockchain PoS sobre la altura de la blockchain PoW. El bloque de PoW que decide la blockchain de PoS es el bloque Finalizado.

  • height: QUANTITY - la altura del bloque PoW.
  • blockHash: HASH - el valor hash del bloque PoW.

VotesInQueue

La información sobre los votos en cola de un usuario.

  • endBlockNumber: QUANTITY - número de bloque cuando el estado termina.
  • power: QUANTITY - número de votos en el estado actual.

RPCs

pos_getStatus

Devuelve el estado actual de la blockchain de PoS.

Parámetros

Empty

Retorna

Object - Objeto de estado de PoS.

  • epoch: QUANTITY - El número de época actual de la blockchain de puntos de PoS.
  • latestCommitted: QUANTITY: el número del último bloque comprometido. Los bloques comprometidos no se revertirán.
  • latestVoted: QUANTITY - El número del último bloque votado con éxito, o nulo (si no hay bloques completados con la votación).
  • pivotDecision: Decision - La decisión final de la blockchain de PoS sobre el último bloque de pivote de PoW.

Ejemplo

Petición

curl --location --request POST 'http://localhost:12537' \
--header 'Content-Type: application/json' \
--data-raw '{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "pos_getStatus",
    "params": []
}'

Resultado

{
    "jsonrpc": "2.0",
    "result": {
        "epoch": "0x56",
        "latestCommitted": "0x140c",
        "latestVoted": "0x140e",
        "pivotDecision": {
          "height": "0x113af0",
          "blockHash": "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"
        }
    },
    "id": 1
}

pos_getAccount

Obtén la información de la cuenta de PoS

Parámetros

  1. ADDRESS: 32 Bytes - Dirección de la cuenta de PoS.
  2. [QUANTITY]: número de bloque, opcional para consultar el estado de la cuenta a una determinada altura de bloque.
params: [
  "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b",
  "0x100"
]

Retorna

Objeto: el objeto de la cuenta, o nulo (si la cuenta correspondiente a la dirección no existe)

  • address: ADDRESS - la dirección de la cuenta.
  • blockNumber: QUANTITY - el número de bloque correspondiente al estado.
  • status: OBJECT: el estado actual del usuario; consulta Estado de la cuenta para obtener más información.

Ejemplo

Petición

curl --location --request POST 'http://localhost:12537' \
--header 'Content-Type: application/json' \
--data-raw '{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "pos_getAccount",
    "params": ["0x046ca462890f25ed9394ca9f92c979ff48e1738a81822ecab96d83813c1a433c"]
}'

Respuesta

{
    "jsonrpc": "2.0",
    "result": {
        "address": "0x046ca462890f25ed9394ca9f92c979ff48e1738a81822ecab96d83813c1a433c",
        "blockNumber": "0x14a7",
        "status": {
            "availableVotes": "0x513",
            "forfeited": "0x0",
            "forceRetired": null,
            "inQueue": [],
            "locked": "0x513",
            "outQueue": [],
            "unlocked": "0x0"
        }
    },
    "id": 1
}

pos_getCom Committee

Obtén la información actual del comité de PoS de forma predeterminada. También puedes obtener la información del comité para un bloque en el historial especificando blockNumber.

Parámetros

  1. [QUANTITY] - Número de bloque, opcional para consultar la información del comité a una determinada altura de bloque.

Retorna

  • currentCommittee: OBJECT - miembros actuales del comité, consulta CurrentCom Committee para obtener más información.
  • elections: Array - nodos que se postulan para las elecciones.
CurrentCommittee

Información actual del comité.

  • epochNumber: QUANTITY - número de época del mandato del comité.
  • nodes: Array of CommitteNode - lista de miembros del comité.
  • quorumVotingPower: QUANTITY - el número mínimo de votos necesarios para llegar a un consenso.
  • totalVotingPower: QUANTITY - el número total de votos de los miembros actuales del comité.
CommitteNode

Información de los miembros del comité.

  • address: ADDRESS - número de cuenta.
  • votingPower: QUANTITY - número de votos.
Elección
  • isFinalized: BOOLEAN - si la elección está finalizada o no.
  • startBlockNumber: QUANTITY - el número de bloque inicial.
  • topElectingNodes: Array of CommitteNode - los 50 nodos mejor clasificados después de la elección.

Ejemplo

Petición

curl --location --request POST 'http://localhost:12537' \
--header 'Content-Type: application/json' \
--data-raw '{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "pos_getCommittee",
    "params": []
}'

Resultado

{
    "jsonrpc": "2.0",
    "result": {
        "currentCommittee": {
            "epochNumber": "0x5a",
            "nodes": [
                {
                    "address": "0x046ca462890f25ed9394ca9f92c979ff48e1738a81822ecab96d83813c1a433c",
                    "votingPower": "0xc8"
                },
                {
                    "address": "0x459b19e745eb410c3696ff1ed15f9de9bb46aa5fefc27b0b6e8b8d7aaadfe8c0",
                    "votingPower": "0x32"
                }
            ],
            "quorumVotingPower": "0xa7",
            "totalVotingPower": "0xfa"
        },
        "elections": [
            {
                "isFinalized": false,
                "startBlockNumber": "0x1518",
                "topElectingNodes": [
                    {
                        "address": "0x046ca462890f25ed9394ca9f92c979ff48e1738a81822ecab96d83813c1a433c",
                        "votingPower": "0x2a"
                    },
                    {
                        "address": "0x459b19e745eb410c3696ff1ed15f9de9bb46aa5fefc27b0b6e8b8d7aaadfe8c0",
                        "votingPower": "0x8"
                    }
                ]
            },
            {
                "isFinalized": false,
                "startBlockNumber": "0x1554",
                "topElectingNodes": []
            }
        ]
    },
    "id": 1
}

pos_getBlockByHash

Obtén información de bloque por su valor hash

Parámetros

  1. HASH: el valor hash del bloque
params: [
  "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"
]

Retorna

  • epoch: QUANTITY - la época en la que está el bloque.
  • hash: HASH - el valor hash del bloque.
  • height: QUANTITY - la altura del bloque.
  • miner: [ADDRESS] - creador del bloque, puede ser null (núlo).
  • nextTxNumber: QUANTITY - el número de la siguiente transacción.
  • parentHash: HASH - el valor hash del bloque padre.
  • pivotDecision: Decision - la desición de de la blockchain PoW.
  • round: QUANTITY - ronda actual.
  • signatures: Array of Signature - las firmas del bloque.
  • timestamp: QUANTITY - estampado de tiempo (timestamp) del bloque
Firma

Información de la firma del bloque:

  • account: ADDRESS - dirección de la cuenta correspondiente en la firma.
  • votes: QUANTITY - número de votos en la cuenta correspondiente en la firma.

Ejemplo

Petición

curl --location --request POST 'http://localhost:12537' \
--header 'Content-Type: application/json' \
--data-raw '{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "pos_getBlockByHash",
    "params": ["0x2b8b9d33e79e1735817a1278a9c8c5be828101b281bd4190531686153bee317b"]
}'

Respuesta

{
    "jsonrpc": "2.0",
    "result": {
        "epoch": "0x5a",
        "hash": "0x2b8b9d33e79e1735817a1278a9c8c5be828101b281bd4190531686153bee317b",
        "height": "0x14ef",
        "miner": "0x046ca462890f25ed9394ca9f92c979ff48e1738a81822ecab96d83813c1a433c",
        "nextTxNumber": "0x1da7",
        "parentHash": "0x89cf3089296679dfef822d3dca037decab2a301de6f047e56c69cb34ae0b79e2",
        "pivotDecision": {
          "height": "0x113af0",
          "blockHash": "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"
        },
        "round": "0x13",
        "signatures": [
            {
                "account": "0x046ca462890f25ed9394ca9f92c979ff48e1738a81822ecab96d83813c1a433c",
                "votes": "0xc8"
            },
            {
                "account": "0x459b19e745eb410c3696ff1ed15f9de9bb46aa5fefc27b0b6e8b8d7aaadfe8c0",
                "votes": "0x32"
            }
        ],
        "timestamp": "0x5cce0e869522a"
    },
    "id": 1
}

pos_getBlockByNumber

Obtén la información del bloque por su número de bloque.

Parámetros

  1. QUANTITY|TAG: el número o TAG del bloque(ejemplo de tags: latest_committed, latest_voted).

Retorna

Lo mismo que pos_getBlockByHash.

Ejemplo

Petición

curl --location --request POST 'http://localhost:12537' \
--header 'Content-Type: application/json' \
--data-raw '{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "pos_getBlockByNumber",
    "params": ["0x14ef"]
}'

pos_getRewardsByEpoch

Obtén la información de las recompensas por su época en PoS

Parámetros

  1. QUANTITY: Número de época.
params: [
  "0x4a"
]

Retorna

  • accountRewards: Array of AccountReward.
  • powEpochHash: HASH - el valor hash del bloque PoW cuando se realizan las recompensas.
AccountReward
  • posAddress: ADDRESS - dirección de la cuenta en PoS.
  • powAddress: BASE32 - dirección de la cuenta en PoW.
  • reward: QUANTITY - el número de recompensas, en la unidad de Drip.

Ejemplo

Petición

curl --location --request POST 'http://localhost:12537' \
--header 'Content-Type: application/json' \
--data-raw '{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "pos_getRewardsByEpoch",
    "params": ["0x4a"]
}'

Respuesta

{
    "jsonrpc": "2.0",
    "result": {
        "accountRewards": [
            {
                "posAddress": "0x459b19e745eb410c3696ff1ed15f9de9bb46aa5fefc27b0b6e8b8d7aaadfe8c0",
                "powAddress": "NET8888:TYPE.USER:AAKSNR7XKKFFAM17MNESKAGU076T8FAG3YJ6PTHN16",
                "reward": "0x14931d20aa21eae3e6f"
            },
            {
                "posAddress": "0x046ca462890f25ed9394ca9f92c979ff48e1738a81822ecab96d83813c1a433c",
                "powAddress": "NET8888:TYPE.USER:AAPXUPNXG96GZ4077DAV0151K7P8498N9A6DMAWK1N",
                "reward": "0x2d49549e023888cd390"
            }
        ],
        "powEpochHash": "0x361cb0f19fd13c30da467d20a84ef01aabcd55e9812c5e2fd0721ea11a52e9f1"
    },
    "id": 1
}

pos_getTransactionByNumber

Obtén la información de la transacción por su número de transacción.

Parámetros

  1. QUANTITY: número de transacción.
params: [
  "0x4a"
]

Retorna

La información de la transacción.

  • hash: HASH - el valor hash de la transacción.
  • from: ADDRESS - la dirección del del remitente.
  • number: QUANTITY - número de transacción.
  • blockHash: [HASH] - el valor hash del bloque al que pertenece la transacción.
  • blockNumber: [QUANTITY] - el número de bloque del bloque al que pertenece la transacción.
  • payload: [OBJECT] - información de la transacción. El contenido del payload difiere con los diferentes tipos de transacciones…
  • status: [ENUM] - el estado de la transacción. Los valores posibles son: Executed, Failed, Discard.
  • timestamp: [QUANTITY] - la marca de tiempo de la transacción.
  • type: ENUM el tipo de transacción. Los valores posibles son: BlockMetadata, Election, Retire, - Register, UpdateVotingPower, PivoteDecision, Dispute, Other.

Hay seis tipos de payload, la carga útil de las transacciones BlockMetadata es nula:

Register:

  • vrfPublicKey: STRING - la llave pública VRF.
  • publicKey: STRING - la llave pública.
{
  "publicKey": "0x90901cc921cd86c6a67bdb7652a3dc4e03e069c6ef6d8294eb4e856e396bb10e2191996a914eaaa9dfdaa75f2a3d70a3",
  "vrfPublicKey": "0x02a0c4e36a2e9a3a2804486b7c849d0eb6f30094e3fe91a9015e9c16f9279fbff8"
}

Election:

  • publicKey: STRING - la llave pública.
  • targetTerm: QUANTITY - el número de comité bajo elección (época).
  • vrfProof: STRING - la prueba VRF.
  • vrfPublicKey: STRING - la clave pública VRF.
{
  "publicKey": "0x8abc04b696da9699601c595cf3a9539e657262d42eef6b63fb324bb5b987418bf5491b04ed21edce4296174cb6d95fcc",
  "targetTerm": "0x7",
  "vrfProof": "0x03c09bec671c32ca143f67f3f965cf913993a53cc268f12954649d54548afe70e75c87fda23fbd01cd9e4af184aa06af01adfa0fce92697e811635190935cecf48aca9804a12e604df6f19455d1ca59f4f",
  "vrfPublicKey": "0x03862bbe4b6591457ebf5d410ab12fe8e9bebe80171a8d2f73db45c5933a8173a4"
}

UpdateVotingPower:

  • address: HASH - dirección de la cuenta en PoS.
  • votingPower: QUANTITY - el número de votos aumentados.
{
  "address": "0x52893f0ecd91f68b7db8a6eb04eb888b5ca1b208009eb9dfb434ad5da372f6f2",
  "votingPower": "0xb"
}

Retire:

  • address: HASH - dirección de la cuenta en PoS.
  • votingPower: QUANTITY - el número de votos retirados.
{
  "address": "c70a93136ddff3023c4c5244c2be9141d242cdcb11d7ed15c053728c959b87bc",
  "votingPower": "0xa"
}

PivotDecision:

  • height: QUANTITY - la altura de la decisión de pivote.
  • blockHash: HASH - el valor hash de la decisión de pivote.
{
   "blockHash": "0x0abf7b384d8bb02a98f21d1582e6d465b1e2382978d5473cbceb473039b0eef3",
   "height": "0x2900"
}

Dispute:

  • address: HASH - dirección de la cuenta.
  • blsPublicKey: STRING - la clave pública BLS.
  • vrfPublicKey: STRING - la clave pública VRF.
  • conflictingVotes: ConflictingVotes - información de los votos en conflicto.

La estructura de ConflictingVotes se muestra a continuación:

  • conflictVoteType: STRING - el tipo de voto de conflicto. Los valores posibles son: proposal, vote.
  • first: STRING - el primer voto.
  • second: STRING - el segundo voto.

Ejemplo

Petición:

curl --location --request POST 'http://localhost:12537' \
--header 'Content-Type: application/json' \
--data-raw '{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "pos_getTransactionByNumber",
    "params": ["0x71"]
}'

Respuesta

{
    "jsonrpc": "2.0",
    "result": {
        "blockHash": "0x355497700fc4c530c4eefa47c90deb052baaba4950934dfa6143f3c7321f3df1",
        "blockNumber": "0x3a",
        "from": "0x6f2e774cb8b83957d29e6a0b06551c11e632e1a0f46bee0d82b2fdc2b82fe4f9",
        "hash": "0x5505191e2f783e141fb8c84193829e494a27f197840987821514a12a0e04a10c",
        "number": "0x71",
        "payload": {
            "blockHash": "0xd66e1d6050d7070cab189a524782381e211508fa204a0674ea35fa1523cfba90",
            "height": "0x129"
        },
        "status": "Executed",
        "timestamp": "0x5cd05bea6a9b0",
        "type": "PivotDecision"
    },
    "id": 1
}

Más información

  1. Common Errors
  2. Harfork height