Plutonomicon / cardano-transaction-lib

A Purescript library for building smart contract transactions on Cardano
https://plutonomicon.github.io/cardano-transaction-lib/
MIT License
93 stars 50 forks source link

Ogmios based protocol params? #346

Closed adamczykm closed 2 years ago

adamczykm commented 2 years ago

CTL server could set the current protocol parameters by querying the Ogmios instance for it. Now they are set from a static file which requires keeping it consistent or errors will happen. These errors might not be immediately recognized as PP mismatch errors which cost us dev time.

Luis-omega commented 2 years ago

Let me write the path I would follow for this tomorrow, please help me to correct it if needed.

ngua commented 2 years ago

@Luis-omega I can answer some of these questions

  1. We don't connect to Ogmios at the moment. You'll need to use the websockets package to open a connection to Ogmios and make the query
  2. You need to send a local state query request to Omgios where the query field is currentProtocolParameters
  3. You do need to write a custom JSON decoder for the response, as what Ogmios gives you won't decode into cardano-api's ProtocolParameters
  4. In newEnvIO, you should make the Ogmios query and parse the response to get the protocol parameters. You'll also need to add a command-line flag for the Ogmios host/port
  5. That's up to you, you could just adapt the current approach
  6. Testing might be tricky as we don't want to depend on a running node and Ogmios instance for the tests. You could just add a test for parsing the query response (as a fixture)
ngua commented 2 years ago

Ah here's another thing: you should probably implement some retry logic. Websocket connections can be kind of tricky

adamczykm commented 2 years ago

@ngua do you think that we could make use of overriding pparams locally?

ngua commented 2 years ago

@adamczykm What would be the use-case for that?

adamczykm commented 2 years ago

Idk. Maybe for some hacky workarounds and tests during debugging.

Luis-omega commented 2 years ago

Thanks for the help @ngua it saves me lots of time.

I now need more help in the translation from Ogmios response to real Cardano parameters.

This is the current file under server/config

{
  "txFeePerByte": 44,
  "minUTxOValue": null,
  "stakePoolDeposit": 500000000,
  "utxoCostPerWord": 34482,
  "decentralization": 0.25,
  "poolRetireMaxEpoch": 18,
  "extraPraosEntropy": null,
  "collateralPercentage": 150,
  "stakePoolTargetNum": 150,
  "maxBlockBodySize": 65536,
  "maxTxSize": 16384,
  "treasuryCut": 0.2,
  "minPoolCost": 340000000,
  "maxCollateralInputs": 3,
  "maxValueSize": 5000,
  "maxBlockExecutionUnits": {
    "memory": 50000000,
    "steps": 40000000000
  },
  "maxBlockHeaderSize": 1100,
  "costModels": {
    "PlutusScriptV1": {
      "sha2_256-memory-arguments": 4,
      "equalsString-cpu-arguments-constant": 1000,
      "cekDelayCost-exBudgetMemory": 100,
      "lessThanEqualsByteString-cpu-arguments-intercept": 103599,
      "divideInteger-memory-arguments-minimum": 1,
      "appendByteString-cpu-arguments-slope": 621,
      "blake2b-cpu-arguments-slope": 29175,
      "iData-cpu-arguments": 150000,
      "encodeUtf8-cpu-arguments-slope": 1000,
      "unBData-cpu-arguments": 150000,
      "multiplyInteger-cpu-arguments-intercept": 61516,
      "cekConstCost-exBudgetMemory": 100,
      "nullList-cpu-arguments": 150000,
      "equalsString-cpu-arguments-intercept": 150000,
      "trace-cpu-arguments": 150000,
      "mkNilData-memory-arguments": 32,
      "lengthOfByteString-cpu-arguments": 150000,
      "cekBuiltinCost-exBudgetCPU": 29773,
      "bData-cpu-arguments": 150000,
      "subtractInteger-cpu-arguments-slope": 0,
      "unIData-cpu-arguments": 150000,
      "consByteString-memory-arguments-intercept": 0,
      "divideInteger-memory-arguments-slope": 1,
      "divideInteger-cpu-arguments-model-arguments-slope": 118,
      "listData-cpu-arguments": 150000,
      "headList-cpu-arguments": 150000,
      "chooseData-memory-arguments": 32,
      "equalsInteger-cpu-arguments-intercept": 136542,
      "sha3_256-cpu-arguments-slope": 82363,
      "sliceByteString-cpu-arguments-slope": 5000,
      "unMapData-cpu-arguments": 150000,
      "lessThanInteger-cpu-arguments-intercept": 179690,
      "mkCons-cpu-arguments": 150000,
      "appendString-memory-arguments-intercept": 0,
      "modInteger-cpu-arguments-model-arguments-slope": 118,
      "ifThenElse-cpu-arguments": 1,
      "mkNilPairData-cpu-arguments": 150000,
      "lessThanEqualsInteger-cpu-arguments-intercept": 145276,
      "addInteger-memory-arguments-slope": 1,
      "chooseList-memory-arguments": 32,
      "constrData-memory-arguments": 32,
      "decodeUtf8-cpu-arguments-intercept": 150000,
      "equalsData-memory-arguments": 1,
      "subtractInteger-memory-arguments-slope": 1,
      "appendByteString-memory-arguments-intercept": 0,
      "lengthOfByteString-memory-arguments": 4,
      "headList-memory-arguments": 32,
      "listData-memory-arguments": 32,
      "consByteString-cpu-arguments-intercept": 150000,
      "unIData-memory-arguments": 32,
      "remainderInteger-memory-arguments-minimum": 1,
      "bData-memory-arguments": 32,
      "lessThanByteString-cpu-arguments-slope": 248,
      "encodeUtf8-memory-arguments-intercept": 0,
      "cekStartupCost-exBudgetCPU": 100,
      "multiplyInteger-memory-arguments-intercept": 0,
      "unListData-memory-arguments": 32,
      "remainderInteger-cpu-arguments-model-arguments-slope": 118,
      "cekVarCost-exBudgetCPU": 29773,
      "remainderInteger-memory-arguments-slope": 1,
      "cekForceCost-exBudgetCPU": 29773,
      "sha2_256-cpu-arguments-slope": 29175,
      "equalsInteger-memory-arguments": 1,
      "indexByteString-memory-arguments": 1,
      "addInteger-memory-arguments-intercept": 1,
      "chooseUnit-cpu-arguments": 150000,
      "sndPair-cpu-arguments": 150000,
      "cekLamCost-exBudgetCPU": 29773,
      "fstPair-cpu-arguments": 150000,
      "quotientInteger-memory-arguments-minimum": 1,
      "decodeUtf8-cpu-arguments-slope": 1000,
      "lessThanInteger-memory-arguments": 1,
      "lessThanEqualsInteger-cpu-arguments-slope": 1366,
      "fstPair-memory-arguments": 32,
      "modInteger-memory-arguments-intercept": 0,
      "unConstrData-cpu-arguments": 150000,
      "lessThanEqualsInteger-memory-arguments": 1,
      "chooseUnit-memory-arguments": 32,
      "sndPair-memory-arguments": 32,
      "addInteger-cpu-arguments-intercept": 197209,
      "decodeUtf8-memory-arguments-slope": 8,
      "equalsData-cpu-arguments-intercept": 150000,
      "mapData-cpu-arguments": 150000,
      "mkPairData-cpu-arguments": 150000,
      "quotientInteger-cpu-arguments-constant": 148000,
      "consByteString-memory-arguments-slope": 1,
      "cekVarCost-exBudgetMemory": 100,
      "indexByteString-cpu-arguments": 150000,
      "unListData-cpu-arguments": 150000,
      "equalsInteger-cpu-arguments-slope": 1326,
      "cekStartupCost-exBudgetMemory": 100,
      "subtractInteger-cpu-arguments-intercept": 197209,
      "divideInteger-cpu-arguments-model-arguments-intercept": 425507,
      "divideInteger-memory-arguments-intercept": 0,
      "cekForceCost-exBudgetMemory": 100,
      "blake2b-cpu-arguments-intercept": 2477736,
      "remainderInteger-cpu-arguments-constant": 148000,
      "tailList-cpu-arguments": 150000,
      "encodeUtf8-cpu-arguments-intercept": 150000,
      "equalsString-cpu-arguments-slope": 1000,
      "lessThanByteString-memory-arguments": 1,
      "multiplyInteger-cpu-arguments-slope": 11218,
      "appendByteString-cpu-arguments-intercept": 396231,
      "lessThanEqualsByteString-cpu-arguments-slope": 248,
      "modInteger-memory-arguments-slope": 1,
      "addInteger-cpu-arguments-slope": 0,
      "equalsData-cpu-arguments-slope": 10000,
      "decodeUtf8-memory-arguments-intercept": 0,
      "chooseList-cpu-arguments": 150000,
      "constrData-cpu-arguments": 150000,
      "equalsByteString-memory-arguments": 1,
      "cekApplyCost-exBudgetCPU": 29773,
      "quotientInteger-memory-arguments-slope": 1,
      "verifySignature-cpu-arguments-intercept": 3345831,
      "unMapData-memory-arguments": 32,
      "mkCons-memory-arguments": 32,
      "sliceByteString-memory-arguments-slope": 1,
      "sha3_256-memory-arguments": 4,
      "ifThenElse-memory-arguments": 1,
      "mkNilPairData-memory-arguments": 32,
      "equalsByteString-cpu-arguments-slope": 247,
      "appendString-cpu-arguments-intercept": 150000,
      "quotientInteger-cpu-arguments-model-arguments-slope": 118,
      "cekApplyCost-exBudgetMemory": 100,
      "equalsString-memory-arguments": 1,
      "multiplyInteger-memory-arguments-slope": 1,
      "cekBuiltinCost-exBudgetMemory": 100,
      "remainderInteger-memory-arguments-intercept": 0,
      "sha2_256-cpu-arguments-intercept": 2477736,
      "remainderInteger-cpu-arguments-model-arguments-intercept": 425507,
      "lessThanEqualsByteString-memory-arguments": 1,
      "tailList-memory-arguments": 32,
      "mkNilData-cpu-arguments": 150000,
      "chooseData-cpu-arguments": 150000,
      "unBData-memory-arguments": 32,
      "blake2b-memory-arguments": 4,
      "iData-memory-arguments": 32,
      "nullList-memory-arguments": 32,
      "cekDelayCost-exBudgetCPU": 29773,
      "subtractInteger-memory-arguments-intercept": 1,
      "lessThanByteString-cpu-arguments-intercept": 103599,
      "consByteString-cpu-arguments-slope": 1000,
      "appendByteString-memory-arguments-slope": 1,
      "trace-memory-arguments": 32,
      "divideInteger-cpu-arguments-constant": 148000,
      "cekConstCost-exBudgetCPU": 29773,
      "encodeUtf8-memory-arguments-slope": 8,
      "quotientInteger-cpu-arguments-model-arguments-intercept": 425507,
      "mapData-memory-arguments": 32,
      "appendString-cpu-arguments-slope": 1000,
      "modInteger-cpu-arguments-constant": 148000,
      "verifySignature-cpu-arguments-slope": 1,
      "unConstrData-memory-arguments": 32,
      "quotientInteger-memory-arguments-intercept": 0,
      "equalsByteString-cpu-arguments-constant": 150000,
      "sliceByteString-memory-arguments-intercept": 0,
      "mkPairData-memory-arguments": 32,
      "equalsByteString-cpu-arguments-intercept": 112536,
      "appendString-memory-arguments-slope": 1,
      "lessThanInteger-cpu-arguments-slope": 497,
      "modInteger-cpu-arguments-model-arguments-intercept": 425507,
      "modInteger-memory-arguments-minimum": 1,
      "sha3_256-cpu-arguments-intercept": 0,
      "verifySignature-memory-arguments": 1,
      "cekLamCost-exBudgetMemory": 100,
      "sliceByteString-cpu-arguments-intercept": 150000
    }
  },
  "maxTxExecutionUnits": {
    "memory": 10000000,
    "steps": 10000000000
  },
  "protocolVersion": {
    "minor": 0,
    "major": 2
  },
  "txFeeFixed": 155381,
  "stakeAddressDeposit": 2000000,
  "monetaryExpansion": 3.0e-3,
  "poolPledgeInfluence": 0.3,
  "executionUnitPrices": {
    "priceSteps": 7.21e-5,
    "priceMemory": 5.77e-2
  }
}

And this is the Ogmios response :

{
  "type": "jsonwsp/response",
  "version": "1.0",
  "servicename": "ogmios",
  "methodname": "Query",
  "result": {
    "minFeeCoefficient": 44,
    "minFeeConstant": 155381,
    "maxBlockBodySize": 98304,
    "maxBlockHeaderSize": 1100,
    "maxTxSize": 16384,
    "stakeKeyDeposit": 2000000,
    "poolDeposit": 500000000,
    "poolRetirementEpochBound": 18,
    "desiredNumberOfPools": 500,
    "poolInfluence": "3/10",
    "monetaryExpansion": "3/1000",
    "treasuryExpansion": "1/5",
    "decentralizationParameter": "0/1",
    "extraEntropy": "neutral",
    "protocolVersion": {
      "major": 6,
      "minor": 0
    },
    "minPoolCost": 340000000,
    "coinsPerUtxoWord": 34482,
    "costModels": {
      "plutus:v1": {
        "addInteger-cpu-arguments-intercept": 197209,
        "addInteger-cpu-arguments-slope": 0,
        "addInteger-memory-arguments-intercept": 1,
        "addInteger-memory-arguments-slope": 1,
        "appendByteString-cpu-arguments-intercept": 396231,
        "appendByteString-cpu-arguments-slope": 621,
        "appendByteString-memory-arguments-intercept": 0,
        "appendByteString-memory-arguments-slope": 1,
        "appendString-cpu-arguments-intercept": 150000,
        "appendString-cpu-arguments-slope": 1000,
        "appendString-memory-arguments-intercept": 0,
        "appendString-memory-arguments-slope": 1,
        "bData-cpu-arguments": 150000,
        "bData-memory-arguments": 32,
        "blake2b-cpu-arguments-intercept": 2477736,
        "blake2b-cpu-arguments-slope": 29175,
        "blake2b-memory-arguments": 4,
        "cekApplyCost-exBudgetCPU": 29773,
        "cekApplyCost-exBudgetMemory": 100,
        "cekBuiltinCost-exBudgetCPU": 29773,
        "cekBuiltinCost-exBudgetMemory": 100,
        "cekConstCost-exBudgetCPU": 29773,
        "cekConstCost-exBudgetMemory": 100,
        "cekDelayCost-exBudgetCPU": 29773,
        "cekDelayCost-exBudgetMemory": 100,
        "cekForceCost-exBudgetCPU": 29773,
        "cekForceCost-exBudgetMemory": 100,
        "cekLamCost-exBudgetCPU": 29773,
        "cekLamCost-exBudgetMemory": 100,
        "cekStartupCost-exBudgetCPU": 100,
        "cekStartupCost-exBudgetMemory": 100,
        "cekVarCost-exBudgetCPU": 29773,
        "cekVarCost-exBudgetMemory": 100,
        "chooseData-cpu-arguments": 150000,
        "chooseData-memory-arguments": 32,
        "chooseList-cpu-arguments": 150000,
        "chooseList-memory-arguments": 32,
        "chooseUnit-cpu-arguments": 150000,
        "chooseUnit-memory-arguments": 32,
        "consByteString-cpu-arguments-intercept": 150000,
        "consByteString-cpu-arguments-slope": 1000,
        "consByteString-memory-arguments-intercept": 0,
        "consByteString-memory-arguments-slope": 1,
        "constrData-cpu-arguments": 150000,
        "constrData-memory-arguments": 32,
        "decodeUtf8-cpu-arguments-intercept": 150000,
        "decodeUtf8-cpu-arguments-slope": 1000,
        "decodeUtf8-memory-arguments-intercept": 0,
        "decodeUtf8-memory-arguments-slope": 8,
        "divideInteger-cpu-arguments-constant": 148000,
        "divideInteger-cpu-arguments-model-arguments-intercept": 425507,
        "divideInteger-cpu-arguments-model-arguments-slope": 118,
        "divideInteger-memory-arguments-intercept": 0,
        "divideInteger-memory-arguments-minimum": 1,
        "divideInteger-memory-arguments-slope": 1,
        "encodeUtf8-cpu-arguments-intercept": 150000,
        "encodeUtf8-cpu-arguments-slope": 1000,
        "encodeUtf8-memory-arguments-intercept": 0,
        "encodeUtf8-memory-arguments-slope": 8,
        "equalsByteString-cpu-arguments-constant": 150000,
        "equalsByteString-cpu-arguments-intercept": 112536,
        "equalsByteString-cpu-arguments-slope": 247,
        "equalsByteString-memory-arguments": 1,
        "equalsData-cpu-arguments-intercept": 150000,
        "equalsData-cpu-arguments-slope": 10000,
        "equalsData-memory-arguments": 1,
        "equalsInteger-cpu-arguments-intercept": 136542,
        "equalsInteger-cpu-arguments-slope": 1326,
        "equalsInteger-memory-arguments": 1,
        "equalsString-cpu-arguments-constant": 1000,
        "equalsString-cpu-arguments-intercept": 150000,
        "equalsString-cpu-arguments-slope": 1000,
        "equalsString-memory-arguments": 1,
        "fstPair-cpu-arguments": 150000,
        "fstPair-memory-arguments": 32,
        "headList-cpu-arguments": 150000,
        "headList-memory-arguments": 32,
        "iData-cpu-arguments": 150000,
        "iData-memory-arguments": 32,
        "ifThenElse-cpu-arguments": 1,
        "ifThenElse-memory-arguments": 1,
        "indexByteString-cpu-arguments": 150000,
        "indexByteString-memory-arguments": 1,
        "lengthOfByteString-cpu-arguments": 150000,
        "lengthOfByteString-memory-arguments": 4,
        "lessThanByteString-cpu-arguments-intercept": 103599,
        "lessThanByteString-cpu-arguments-slope": 248,
        "lessThanByteString-memory-arguments": 1,
        "lessThanEqualsByteString-cpu-arguments-intercept": 103599,
        "lessThanEqualsByteString-cpu-arguments-slope": 248,
        "lessThanEqualsByteString-memory-arguments": 1,
        "lessThanEqualsInteger-cpu-arguments-intercept": 145276,
        "lessThanEqualsInteger-cpu-arguments-slope": 1366,
        "lessThanEqualsInteger-memory-arguments": 1,
        "lessThanInteger-cpu-arguments-intercept": 179690,
        "lessThanInteger-cpu-arguments-slope": 497,
        "lessThanInteger-memory-arguments": 1,
        "listData-cpu-arguments": 150000,
        "listData-memory-arguments": 32,
        "mapData-cpu-arguments": 150000,
        "mapData-memory-arguments": 32,
        "mkCons-cpu-arguments": 150000,
        "mkCons-memory-arguments": 32,
        "mkNilData-cpu-arguments": 150000,
        "mkNilData-memory-arguments": 32,
        "mkNilPairData-cpu-arguments": 150000,
        "mkNilPairData-memory-arguments": 32,
        "mkPairData-cpu-arguments": 150000,
        "mkPairData-memory-arguments": 32,
        "modInteger-cpu-arguments-constant": 148000,
        "modInteger-cpu-arguments-model-arguments-intercept": 425507,
        "modInteger-cpu-arguments-model-arguments-slope": 118,
        "modInteger-memory-arguments-intercept": 0,
        "modInteger-memory-arguments-minimum": 1,
        "modInteger-memory-arguments-slope": 1,
        "multiplyInteger-cpu-arguments-intercept": 61516,
        "multiplyInteger-cpu-arguments-slope": 11218,
        "multiplyInteger-memory-arguments-intercept": 0,
        "multiplyInteger-memory-arguments-slope": 1,
        "nullList-cpu-arguments": 150000,
        "nullList-memory-arguments": 32,
        "quotientInteger-cpu-arguments-constant": 148000,
        "quotientInteger-cpu-arguments-model-arguments-intercept": 425507,
        "quotientInteger-cpu-arguments-model-arguments-slope": 118,
        "quotientInteger-memory-arguments-intercept": 0,
        "quotientInteger-memory-arguments-minimum": 1,
        "quotientInteger-memory-arguments-slope": 1,
        "remainderInteger-cpu-arguments-constant": 148000,
        "remainderInteger-cpu-arguments-model-arguments-intercept": 425507,
        "remainderInteger-cpu-arguments-model-arguments-slope": 118,
        "remainderInteger-memory-arguments-intercept": 0,
        "remainderInteger-memory-arguments-minimum": 1,
        "remainderInteger-memory-arguments-slope": 1,
        "sha2_256-cpu-arguments-intercept": 2477736,
        "sha2_256-cpu-arguments-slope": 29175,
        "sha2_256-memory-arguments": 4,
        "sha3_256-cpu-arguments-intercept": 0,
        "sha3_256-cpu-arguments-slope": 82363,
        "sha3_256-memory-arguments": 4,
        "sliceByteString-cpu-arguments-intercept": 150000,
        "sliceByteString-cpu-arguments-slope": 5000,
        "sliceByteString-memory-arguments-intercept": 0,
        "sliceByteString-memory-arguments-slope": 1,
        "sndPair-cpu-arguments": 150000,
        "sndPair-memory-arguments": 32,
        "subtractInteger-cpu-arguments-intercept": 197209,
        "subtractInteger-cpu-arguments-slope": 0,
        "subtractInteger-memory-arguments-intercept": 1,
        "subtractInteger-memory-arguments-slope": 1,
        "tailList-cpu-arguments": 150000,
        "tailList-memory-arguments": 32,
        "trace-cpu-arguments": 150000,
        "trace-memory-arguments": 32,
        "unBData-cpu-arguments": 150000,
        "unBData-memory-arguments": 32,
        "unConstrData-cpu-arguments": 150000,
        "unConstrData-memory-arguments": 32,
        "unIData-cpu-arguments": 150000,
        "unIData-memory-arguments": 32,
        "unListData-cpu-arguments": 150000,
        "unListData-memory-arguments": 32,
        "unMapData-cpu-arguments": 150000,
        "unMapData-memory-arguments": 32,
        "verifySignature-cpu-arguments-intercept": 3345831,
        "verifySignature-cpu-arguments-slope": 1,
        "verifySignature-memory-arguments": 1
      }
    },
    "prices": {
      "memory": "577/10000",
      "steps": "721/10000000"
    },
    "maxExecutionUnitsPerTransaction": {
      "memory": 16000000,
      "steps": 10000000000
    },
    "maxExecutionUnitsPerBlock": {
      "memory": 80000000,
      "steps": 40000000000
    },
    "maxValueSize": 5000,
    "collateralPercentage": 150,
    "maxCollateralInputs": 3
  },
  "reflection": null
}

I don't know where to find minUTxOValue, so, unless I see it or someone points it (please), I guess I need to put a question in Ogmios about the right correspondence.

Luis-omega commented 2 years ago

The current Aeson parser (relating file params to real protocol parameters ) is here : https://input-output-hk.github.io/cardano-node/cardano-api/lib/src/Cardano.Api.ProtocolParameters.html#ProtocolParameters

Luis-omega commented 2 years ago

I was able to eliminate possibilities and get most of the map, the only parameter that I still don't know how to get is minUTxOValue

Luis-omega commented 2 years ago

Just an update :

I got most of it implemented and now the Haskell server refuses to start nix run -L .#ctl-runtime, probably because is failing to attempt to decode minUTxOValue or I have noticed that Ogmios isn't ready before Haskell server dies.

I got little time remaining this week, so I probably going to clean the code on Friday and track the server crash on Monday.

The draft branch is compiling now in case someone wants to look for the crash.

ngua commented 2 years ago

@Luis-omega

Luis-omega commented 2 years ago

I will try these on Monday.

Luis-omega commented 2 years ago

I don't know why, but :

Aditional things :

So, once I fix those and do a little cleanup, the pr would be ready to review.