From 188f757169300e6fe53f9234cdb540ff4aa82c2f Mon Sep 17 00:00:00 2001 From: Gary Malouf <982483+gmalouf@users.noreply.github.com> Date: Thu, 7 Nov 2024 14:50:46 -0500 Subject: [PATCH 1/7] Add support for storing and serving heartbeat transaction types (note: this initial commit depends on a non-merged branch of go-algorand-sdk). --- api/README.md | 2 +- api/converter_utils.go | 16 ++ api/generate.sh | 18 -- api/generated/common/routes.go | 372 ++++++++++++++------------- api/generated/common/types.go | 44 ++++ api/generated/v2/routes.go | 452 +++++++++++++++++---------------- api/generated/v2/types.go | 47 ++++ api/indexer.oas2.json | 68 ++++- api/indexer.oas3.yml | 80 +++++- go.mod | 2 +- go.sum | 7 +- idb/txn_type_enum.go | 2 + 12 files changed, 670 insertions(+), 440 deletions(-) delete mode 100755 api/generate.sh diff --git a/api/README.md b/api/README.md index 3e2f2f2db..23c35b22f 100644 --- a/api/README.md +++ b/api/README.md @@ -9,7 +9,7 @@ The API is defined using [OpenAPI v2](https://swagger.io/specification/v2/) in * The Makefile will install our fork of **oapi-codegen**, use `make oapi-codegen` to install it directly. 1. Document your changes by editing **indexer.oas2.yml** -2. Regenerate the endpoints by running **generate.sh**. The sources at **generated/** will be updated. +2. Regenerate the endpoints by running **make generate** from the `api` directory. The sources at **generated/** will be updated. 3. Update the implementation in **handlers.go**. It is sometimes useful to consult **generated/routes.go** to make sure the handler properly implements **ServerInterface**. ## What codegen tool is used? diff --git a/api/converter_utils.go b/api/converter_utils.go index 8b4081acd..b3f971cb7 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -306,6 +306,7 @@ func signedTxnWithAdToTransaction(stxn *sdk.SignedTxnWithAD, extra rowData) (gen var assetTransfer *generated.TransactionAssetTransfer var application *generated.TransactionApplication var stateProof *generated.TransactionStateProof + var heartbeat *generated.TransactionHeartBeat switch stxn.Txn.Type { case sdk.PaymentTx: @@ -509,6 +510,20 @@ func signedTxnWithAdToTransaction(stxn *sdk.SignedTxnWithAD, extra rowData) (gen StateProofType: uint64Ptr(uint64(stxn.Txn.StateProofType)), } stateProof = &proofTxn + case sdk.HeartbeatTx: + hb := stxn.Txn.HeartbeatTxnFields + hbTxn := generated.TransactionHeartBeat{ + HbAddress: hb.HbAddress.String(), + HbProof: generated.HbProofFields{ + HbPk: byteSliceOmitZeroPtr(hb.HbProof.PK[:]), + HbPk1sig: byteSliceOmitZeroPtr(hb.HbProof.PK1Sig[:]), + HbPk2: byteSliceOmitZeroPtr(hb.HbProof.PK2[:]), + HbPk2sig: byteSliceOmitZeroPtr(hb.HbProof.PK2Sig[:]), + HbSig: byteSliceOmitZeroPtr(hb.HbProof.Sig[:]), + }, + HbSeed: hb.HbSeed[:], + } + heartbeat = &hbTxn } var localStateDelta *[]generated.AccountStateDelta @@ -585,6 +600,7 @@ func signedTxnWithAdToTransaction(stxn *sdk.SignedTxnWithAD, extra rowData) (gen PaymentTransaction: payment, KeyregTransaction: keyreg, StateProofTransaction: stateProof, + HeartBeatTransaction: heartbeat, ClosingAmount: uint64Ptr(uint64(stxn.ClosingAmount)), ConfirmedRound: uint64Ptr(extra.Round), IntraRoundOffset: uint64Ptr(uint64(extra.Intra)), diff --git a/api/generate.sh b/api/generate.sh deleted file mode 100755 index 86dae2a06..000000000 --- a/api/generate.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash -set -e - -rootdir=`dirname $0` -pushd $rootdir - -# Convert v2 to v3 -curl -s -X POST "https://converter.swagger.io/api/convert" -H "accept: application/json" -H "Content-Type: application/json" -d @./indexer.oas2.json -o 3.json - -python3 -c "import json; import sys; json.dump(json.load(sys.stdin), sys.stdout, indent=2, sort_keys=True)" < 3.json > indexer.oas3.yml -rm 3.json - -echo "generating code." -oapi-codegen -package generated -type-mappings integer=uint64 -generate types -o generated/v2/types.go -exclude-tags=common indexer.oas3.yml -oapi-codegen -package generated -type-mappings integer=uint64 -generate server,spec -o generated/v2/routes.go -exclude-tags=common indexer.oas3.yml - -oapi-codegen -package common -type-mappings integer=uint64 -generate types -o generated/common/types.go -include-tags=common indexer.oas3.yml -oapi-codegen -package common -type-mappings integer=uint64 -generate server,spec -o generated/common/routes.go -include-tags=common indexer.oas3.yml diff --git a/api/generated/common/routes.go b/api/generated/common/routes.go index bf1f44d7f..2db8b6e16 100644 --- a/api/generated/common/routes.go +++ b/api/generated/common/routes.go @@ -72,189 +72,195 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "H4sIAAAAAAAC/+x9f5PbNrLgV0HpXlXsnDjjOJvU26naeuXYScW1dtZlT7J3z5O7hciWhB0KYABwJCXn", - "736FboAESVCiZsZjb9X+ZY+IHw10o9Hon3/McrWplARpzezij1nFNd+ABY1/8TxXtbSZKNxfBZhci8oK", - "JWcX4RszVgu5ms1nwv1acbuezWeSb6Bt4/rPZxp+q4WGYnZhdQ3zmcnXsOFuYLuvXGs/0ocP8xkvCg3G", - "DGf9myz3TMi8rAtgVnNpeO4+GbYVds3sWhjmOzMhmZLA1JLZdacxWwooC3MWgP6tBr2PoPaTj4M4n+0y", - "Xq6U5rLIlkpvuJ1dzJ75fh+OfvYzZFqVMFzjc7VZCAlhRdAsqEEOs4oVsMRGa26Zg86tMzS0ihngOl+z", - "pdJHlklAxGsFWW9mF+9nBmQBGjGXg7jB/y41wO+QWa5XYGe/zlO4W1rQmRWbxNJeesxpMHVpDcO2uMaV", - "uAHJXK8z9ro2li2Accne/vCcff31139mtI0WCk9wo6tqZ4/X1GCh4BbC5ylIffvDc5z/nV/g1Fa8qkqR", - "c7fu5PF51n5nL1+MLaY7SIIghbSwAk0bbwykz+oz9+XANKHjsQlqu84c2Ywj1p94w3Ill2JVaygcNdYG", - "6GyaCmQh5Ipdw34Uhc00H+8ELmCpNEykUmp8r2Qaz/9J6XShdhnBNCAatlA75r45TrpSvMy4XuEK2Rcg", - "c+XweHHDyxq+OGM/KM2EtGbucQ2+oZD24qunX//JN9F8yxZ7C4N2i2//dPHsL3/xzSotpOWLEvw2Dpob", - "qy/WUJbKd/DMbDiu+3Dxv/73f5+dnX0xhgz857QLKq+1Bpnvs5UGjhxnzeVwD996CjJrVZcFW/MbJBe+", - "wavT92WuLx0P3M0z9lrkWj0rV8ow7gmvgCWvS8vCxKyWpWP1bjR/fJkwrNLqRhRQzB3OtmuRr1nO/YZg", - "O7YVZemotjZQjG1IenVHuEPTycF1q/3ABX2+m9Gu68hOwA75x3D53+88lywK4X7iJRMWNoaZOl8zbjxU", - "a1UWRPTRBcBKlfOSFdxyZqxyjHWptJd4iOvOff9WiGM5IrBgi32/pSw6ox/v4/YHdlWp3MqWvDSQ3q+w", - "+niTcJWxbMHLcuZvLCdo+Smz5gdeVSbDFWfGcgtxm6pyLaSSkBBAmh+41nzv/jZ276QsZK2zFjtZXioD", - "mVVHBLAgU+GGRSJTvGMniWPscg0MJ3cfSBRFypaOS5flnlmPAEcQLAhfcyaWbK9qtsWjU4pr7O9X42h6", - "wxzyEWUdSdFxszHiHmxGgrQXSpXAJZL2GngBOlOy3A/37Uf8yNxHtiz56oz9fQ3+MLu730FH4MyZBltr", - "6aisVPk1KxQYJpV1coPlQvZFdjMCfwzPEdD9qyFzpDcuv5ThSFJzJ6rg3hSNaDNnBZSA+GnPD/5qrFZ7", - "xJuj4jlTlaNXVdvhuZaFH5Y+94850vzoAyVeyZFFl2Ij7HC5r/lObOoNk/Vm4TC2bGQdqzxqkE41sBzJ", - "bdFhWhVfgWHgRCFBryucxyHZ4VADz9fjDJVgOsJDN3yXaVXLYsIjwjKlYyHNVJCLpYCCNaOMwdJOcwwe", - "IU+Dp33aROCEQUbBaWY5Ao6EXQKtjrO4L4igCKtn7Gd/7eFXq65BNrcj8XlglYYboWrTdBqTltzUh6Uj", - "qSxklYal2A2BfOe3wzE3auPv5o2Xpz0LgIJ5PuCGI0Y5ClM04amPhgU38O2fxiTm9quGa9gn74s+AdBy", - "Gi3F2n2hvodX0cxw5FBPpEMSD2L6O0h7k+gOG2XENhLinfvqmUpaI9TpP0HkjucmfUR2J90QjRFu5rGt", - "6M308Z6hRqwyGnFwSsTq0okRS1GiiPFPdzgCZmvj7qUuboPQYcRKcltruLiSX7q/WMbeWS4Lrgv3y4Z+", - "el2XVrwTK/dTST+9UiuRvxOrsU0JsCZ1RdhtQ/+48dK6IbtrlpuaInxOzVBx1/Aa9hrcHDxf4j+7JRIS", - "X+rfSWzEK9FWyzEAUvqRV0pd11W8oXlHX7jYs5cvxogFhzzED5F3mEpJA0i1z0iQeOt/cz85lgcSOXok", - "C5z/0yh8RLVjV1pVoK2AWD/r/vsfGpazi9n/OG/1uefUzZz7CWfNI82OXWV0gLn1LIxYl2dqJAxsqtrS", - "1Z7iDs1xft/A1p+zRYta/BNySxvUBeMRbCq7f+wA9rCb+9st03mQTNy3/qPiI+4jXe4ZXtLDkX82/uFX", - "8ZWQuPA52zoxe8OvHVfgUtk1aOZwAcaGa57YH938jWLZywr+rXA2S52YBE7NnZHaYu2VE3ffobh7Hyju", - "PRtPwHUKpH9jvsH8YGPvkwRW94T7gxr3q6v3vKpEsbu6+rXz4hKygF0aHx8V2aVaZQW3/HY0unrhuiYI", - "9HOmoa41474I6H6J5wQsPOyNel/bdc+H7VY89t+cNXEq7s5UjQH7HS+5zO/lOl34oSZj+LWQAoH4kVRd", - "/0ZzQHOzlfeBYr+793KQSeM++Qj/G7mpM9zYMe6M2vtC6SREPvCLEKe8j036VIT/b4q/X4r/rlT59a1w", - "eQhVOOqxmdXu/udVu9Ss36kdE5K0f17y+U7t4HN98iwcbJOPxXdq98JPqfS/9muEFj6Fgr/zfjEGjbwy", - "3lm35O+1VvoesBvehj145rMNGMNXkLa9xGsMDacsKgCMCAG3BNRQ/wi8tOvna/gIBzUa+8hxvWyVsfew", - "sR+VZUd642Prj1Z15LHXHfZELhtNYz733ft82EVny6czxA5O++xwOo7NaUj+EOwPsYEh4dLnfbaj68hh", - "inu3RjIPXskr+QKWQqK1/+JKOj50vuBG5Oa8NqD9A/NspdgF80O+4JZfydm8f0GN2erQBctDU9WLUuTs", - "GvYpLJBvWGIEZXkZOTBEbmLebNxaIIZ0RqNmjhxUbTPvlZpp2HJdJOA1jdEaRyZ/tUOzzpkfm2zr3uvV", - "j5+m/YHP09Dn/qA7mJBdfy2HyJ+U9RZovmVESKw2YNg/Nrx6L6T9lWVX9ZMnXwN7VlWt5vsfrXOZAxRt", - "X/eqRsfFIg4z2FnNM/QpSROKqTd405Ylw7ZdxzWtVppvvE9K3yXuwE7T5NNuqmhZuKJ31OvDPHpG9FCF", - "v7M1lENHulMRE725b42XI+/2A67dl1EEAl9xIU3g7UaspKNq7825AJa7uxyKM/ZyyZA3zTsBDD4Uw/O9", - "hgEIQw6Y7NKtC10kWM4lOmZWBbrCCcm43PeNsgasDZbwt3AN+8vIw+JES713x+JHLraidsM1l1uLVbbl", - "hm0UWulzkLbcew+vBAmmgamFtORq0nF1HAASOR66UxHpD8dcNyNnNl5VbFWqhecdDS1eNMQY+oyziTcO", - "AHMPLCL5nu66gh5bPR2zMZfV01fnxrvTITu4plsT11Jog36CwD2r5/FhuAWNeSfGISh/XwNKUUqjM1+X", - "jkw4vCnybnyU0NkSpBU3kEEpVmKRinPKeefGDJ6u3iO0GcEwsWTCGuZVqA4IIZnmcgVOenEShzK8pKiM", - "JDQlNzZbA9d2AXzEbw4R0zqKd5bt+rOtY1lKlkLC3G0O7BwdC7cTGiRsoXCrEdq3Ye4Or0euegSIAE+h", - "YBI8oTvuIe5Zeq6NkJnfuoQjaJBfmt0NAmpwC4yPEsJF3zeAAQxq6/DioFDe937gWV67J2gatIprK3JR", - "TbO7ESBvOn3cIMdkt6S0ppZ9oWwgPyVBpsaZW/NwptqQ17ZbV7jswuj07kGozxi6qvlNWpToyN1EThG+", - "uUYP87BUiiQaA8eMicdh8u7a40O35iYcPIyTCPfEJIl1hJm15Ov4aES/8btDuHlLuOFjOz3uG4e+4X13", - "NxQhhnEOwamUIkGDT1xwhAveb+5fx+/qsnTcppbXUm3dc+YU/7b5jI78EOAbhWIKfQ6E4UH8wkSocXD8", - "bblE/pExIQt3iPDRwW0IW1G5oOiAlic7Xr5yP565ARx1uQEmj5AiWz8kSthKlTQw+0nF50+uTgFSgsB7", - "hYex8YKJ/ob0KxzFdJTYyZ9eyDTF5eGUu3dCRypCwDDWaAEgyS2fCTlnjpXd8NKxMqtING0GST+1HnVe", - "SV5wN4/HnmBpDRGtCCWXk9ZEss5tVhOL/wHo9NvkAMQLtcswdm8IK4bgVVXWMDElyz1FuvTf6TiCW4/K", - "kUKCl/I17CnIBsO+8JSgRtbzjwWUykn6akBhLaKOAH9XwO8RmsMCfoqaDZIeSd4t2R0I1To69Yh8PUZ2", - "j5CG7gBAX//eOFd7Dc9RpUxXlBle/O1tOG+d2Ykjp9nI2FEcEnyXipJYHNnfoRqv8Wl905d+ksq6TitG", - "TRZeDxW9hVK3n2NHuZIGpKkxGtKqXJVnAy2dgRLwGZF1BLLsGhJBXu9C40hvxx6JpXufP45eBxpWwljo", - "xCk28QdteMUeY/sqbi1oN/z/efRfF++fZf/Ns9+fZH/+n+e//vGnD4+/HPz49MNf/vL/uj99/eEvj//r", - "P2Yj1zI4cVst02t6q1Rz8WFjho07S3twqG+UhQzffdkNL1PmvR/wUZiUtDqIZBRMK0Z07jjRNeyzQpR1", - "mhZ/arigqRfIqYVkwB0n5DZfozTdmdG1OTAbvn9GVvWK39uiJpCzdqjvDvwvQtc9fnroECeIKYX2IXJG", - "9/EAW0PJ6AWUZLwcz3pBB61wDc8OGQ4GB6MIYx96LUZQjN88NFJyLV1/0PFVoCUd5RZho7hbM1jRVB3Q", - "tgmZjUXQLW+UXB9d1xOvLtb3+FHSKhb/8Q7LGw4/dXnJ9ETTvB0QYaeoLEkAGtAUnhU/2BF6iuwiw8vV", - "PSOMf3DQAYmES4pHl30hs0dnTVjxNFwEWcFHOau6uQkPy7L3R3OQeGzR2lPkx5ZabfCwDWXNWAE5opfo", - "UF17tfRm9WmThvTi+CU+UI7agYGXf4X9L64tYtX1DhLm1FPSqmnCKy+8OO6EmrvZvFKU70c8SvkUtDBG", - "9phgh2wTHQv1iSegVCuTivFbtSGxMRUswD2KYQd5bVu1Z0+53uj/H1YG7BsS0uGLkc8BJXk6LCng/vix", - "jmDsTcMePybCeFVpdcPLzNtyk9wcWwRr7wPLWukDdfn9s1dvPMRoQASus+atkV4INmrfGJ/tWpyooY4Y", - "g1ERFRQA/SvdG3OF6RiAt5hSovd0dcKTpyLamNaIHx1TbxBeBlH7RPOudzKgJR5yNmgVPuRr0PUv4Ddc", - "lEFlH2BMXxW0pNaV4+TbIh7gzn4KkV9Jdq/8f3B40yfhCKOJZziQMWJDeUsMUz4zRIss9xhFowCS5Ybv", - "HbWQWnbIcWS9Qc1OZkqRMot11ZUMW428Z91Q7mo9NIj7biboxHpgRYMnty/4+Y/t1kJ5Z7dait9qYKIA", - "ad0njWeudwzdqQsJtG79eklYsCnR1gO+X3DCU14uPm/PnRbXjHKb94t7nySsiYQ1v54Gd3d5x7Qq3KEc", - "h0AcfsTETkQDcF80qslARY2FgcuOGfkE78J4xoHYMOIZGJ07Kbyd4xZYOZ5OMzyUfF6nNH846R0Up4m6", - "0+vHZEutfk950W6H00YTUq/0oJNfL71zMvKKEb10d7dAUZNg664gNa/eOwPVvx0b20abY7VFzughG5O7", - "YxtM1yV1hJHjecMwEK6vrn6lh2Ww83JJB+w55mrtPHnSxzR2UD6n8dtj6mEe6iP4dsHz68RiWq/AjiXa", - "KhY6NSnTutg5Y5GDYdPWZx+rQG+E7bL79kV1W8mWpp0s07YiLFJTLLz63IulUYlharnl0oYccp6B+d4G", - "yKTjem2VNhazWSZXWUAuNrwcMe+1DLIQK0FJ32oDUcoy359VSkhLRFMIU5V8T+6W7Y68XLIn84h5eSQU", - "4kYYsSgBW3xFLRbcoCzSaphCF7cqkHZtsPnTCc3XtSw0FHbts+kZxZpHBypoGs+PBdgtgGRPsN1Xf2aP", - "0MvFiBt47DbPy5Szi6/+jBZG+uNJmpdj3tFR3hpYeppq0aeHurpL0Q+W5rWUZ/ukM0NdppwYbOkZ/vET", - "s+GSr1LZvg7AQn1au35vH2RBKTNRZGLCpucFyx3XydbcrFPpiXO12Qi78f4ORm0ctbQJsWiuMArZ9Ild", - "N+CEj+iBXLG0cu1hNT7pXMw/8Q10N3HOuGGmdqC2SivP3M6YTwVXUC7OVpuIW0IpnckjjXS+yyjhcm2X", - "2X+yfM01zx0rOxuDMlt8+6chpN9hvjyG+aGhoLmmA/7g263BgL6ZdtCCmOT7sEdSyWzj2EPx2HPq7pkb", - "dWdKs+W+w8nhIafKSG6U7DBV8YjL3om+5IEB70hxzTJOIruTV/bgBFjrBDX8/PaVlwc2SkNXt7oIMUUd", - "yUKD1QJuMPQijRs35h1RoMtJm38X6D+tDT0Ih5EAFU5sSlSnQPPhdnj/9WbZY49epa6vASohV+fkv43C", - "NI3aF6MXStYjGstKOdlJ8JJhI1bxvdvlRgQ94Bu+BDBZrsoS8uQbtRd95Zqzigs6NnGGzeD4eGCuFUgw", - "woxc51dX71dr90Jxn91NHGlZKCCAfO7Mwx/RAPhIhP0KpIP75YtjUA8G7rpVUKjTUR1Oxx/sZ9/HDebT", - "92Y47/guu3YO3jch3S/B6do//Nb6GAY9Qtj+a8O/+9Q1VfkfBsroaIyFo9qalyG2E6l7CdoXMOmAgzoY", - "LDEBwIyQ10d984+mq3jr24471V9dvdeycJh77sPnyEeqa8cmZG452iVAFi30+ZqLEZ9UA5Ce0H1wM75T", - "2gpy2gH4xA58VvP8OqmAvHRfTOPER572kTufmRzIhdaIN67PZZgtZYwVGzCWb6rk3lnjdo7uArxX3PY1", - "XRzDNJArWRhHQTkwqJRZH8soYNJT7SROVgpDsk7MmXOlKfssyq5W9aK9p27Jwbj2LoyZVsqOAerg7CQk", - "UMoyXtu1u8JCHAFgrYD+Sij6Dd+tMgp6Yq+dlBHy9vKy3M+ZsF/QONp7dnK2AX1dArMagG3XygArgd9A", - "W1QER/vCsMudKAyWDClhJ3K10rxai5wpXYCmajOuOb6lqZOf78kZ81G9Pg7icidxeU1xg3idtMwQvdJY", - "tOIVz0mE6/+MtR4MlDdgztjlVhEQps1tYJz02+mxqC3FDBZiuQTkHrgcfIpjv/ZDBBOWR8FQg2ZYv6aH", - "5wEDCsvMmj/95tsxQnv6zbcpWnv347On33zrJGEuGa93ohRc7+NmrtWcLWpRWp9om7MbyK3SscZBSGOB", - "FwPaIm2UnwVlmWUtc++G1nSJi9i8+/HZN189/b9Pv/nWq6+iWUIUtA+wA3kjtJLuU1AYNhTip2xmg50w", - "9hNIS3YnM3wvp251h5oc0bKTz6kR84EXXXNuj4VtSD8VDn4JxQr0vL2IHV9tc464x53SkQS8BAoRc/ei", - "kFaros6BMl286/CNCCwxAKkpnxC52+BZD1WEWjiDJrWRWRh7iS/gJ/Qgk6q7QjxjcAOaYnragR7R5RDB", - "ZSzX6KeEbkt+qVA8Tl/tdbXSvIBpXgh4Wf1MPZrEDWGEG3XaAL+49v0HVucN0JGs0wJsFMjhZJT4zk3d", - "OQe4xOj77e1YBOUPVJlHQ0mhblgZBdvOB6+zJUDmBMEkxbtXEybgynOoHKXHlSgB3F1DJx3PMlbIC0Jb", - "EwRNQXhpDRbClOW8zOuSnhIHRMhtzku0BLWEXcLSKkd7caWt1hQg3FwL9BCnkiI0n3Z3WNQD00bdgN77", - "FqR5CRU83LnRPdedoaiclXADZRJw4Bplhx/Vlm243De4cFO0YMyjyLgGchKC0UOEsP2zVwpF4NM58wR5", - "GEiHipHNLWI8V6CFKkTOhPwn+IMePx2QYqgUkJJWyBqLP2lo4aarnmGIbj8Md0gBOulS7ODiFhxgbRSH", - "hG0H20X0UOgGQxjLr4HADsHEXrqZilMNRhR1GrKl5nkXstOI0R/et9zCuW5Qa+6JLnvMqznkhw5dn5Z7", - "ZNPD1nCXRvlUhy9PYVa8ifhinocnnMV9BqrQckRjoKzCSzvK3dKMfQPadN2QIzMB7I6M7Vp0xqe8XCG1", - "wemzZMEfzYzOtyd23NJckJ8p8B77+7QKqR0cSVrWAGC2wubrLBU44gGgFg6Gt/0n/HBKki7wFMJyCbmd", - "AgNG7VBFrFEo6LOD4gXwAiPG26grirfqg/LoJ8Xc0CYSeaQR+JBoJR4c5fEJCc0bCjlG/L+oibTvA+7R", - "E2LCMQgyjsd9cst8G088L5uod872YHBXGu/y6IxgZpK0iTdMWkDJ94emxAbdSRuZNxi36c7BBB7uQiFv", - "9tEg5DC1P2eHJndN+gtujufwVMSldgaYVAknt5BLswmh8lkJEz6bSRuWI2a+QTIO5WrnbNExSDy8UfF+", - "0mKk4xpD8MlgG/BL2Af8o78Rn9i6Esrs+nuSVvJrmlCipLJJkima71FINMUZ4PpD8j3uq8hOpKaeJStQ", - "1Gewb6l9+v6GlyOBlm+h0mBQT8DZ5ffPXnmnmLFwyzwd6Xh19Z5bR1PYj40mm/own41khri6er9Ajkl5", - "HxpsDK2LSR9qx4iE6+4+D3rfziVvLIlqtKHBF38I0F9DABiruPCOXm2s6XBnfdDxMLp7ShBZi+D+InxU", - "7+gR+pGb9Q88t0rvhxlc3dN6JLXO1dV7h+9Ttvirb9Ps3oGQnuQyyt/TVZE1/n/oexfkIbUc5PFhmMhn", - "zb3mLPzpXvpR0p7m+2w+G+gBWlzEeYgTfkZr/Ey5DVmo5DbE9Gi65mKRNWEjqYqO85lPtxznmD0aCiZM", - "thErjSJPetTxNNHRFZW4YUjUTpRF9mLNuCzeI9LOwnsQt+BFN4KfOUXQL2UBO9CtZeZ1u7qepZzUR1gY", - "2GStMjXNm4jYH1Y+oDh8N4WxUBzQ1ixPPIrk8VM6MW3S+OXtxpcZisky24JYrdMb++ZWQzsx+jjSbh4e", - "aSkG9xq1/s/cgUSKHGG0y5YNH0yGHnFs9A2wI/Z7u6blfy4hqRrcG6YaAdcWJxLCf45sdr+yUIJRG7Gp", - "SnL+9KxkkPvqpEQTbYDJx49Xuu+gj48evgG39ki8/6iN28JyPCXV4ViNv8nnalOVMC48V1yS+LwU0r/b", - "t2tu42LqwQak8rzWrRG3H43xCy8FVfk1mMVQKlVh2sLKCun+gwkcVG3p/8C1+w85FXX/R1QVyUluqBni", - "BZNfhYFCJOdsPqPOs0DZSSkq6Zg02JRuOquAT3TCRluaBCgwIKHNJn3Oc0v2T++sKcFulb5OPGMWBvVJ", - "Hb+quOzrkJtybeuK0xOFNx4UPoVrkxWuAc1DZmpD3jUd/4mjvBJ2laO10wEs9OZmIoTN5il5A9rbPpTP", - "KUlWDkpTO0jYxDx4p6wpxapvmQBokhvK8IWW2OZWSCTVYNq3CdVaOn4nR75CQ5fNXO8rq86xDTY5N1bX", - "uTXktdnOOaBKt9HkvHS8fl5fpHCSgDKC7JlWZRpugI+p6dFVC36rwSEZTXWuMWsGSCF2KtPu7zGNnd5a", - "BCR2haGgKXKwK/chWSZ3e77h1Xua5VeWsbcEcVNKAT3yNmZVne65RUOlQDe8tNnoK8fLl+wdL20sRjiA", - "vJ9H4yEznriWJNjk6PmneHI4mG5Pgm7BUBwS97e3EPdHeQfO21wUJIF1j9QNaIqFnkwOv4QeH+azB13H", - "2+bEDrlCtL5pq4g3JWINaRVL+BqOU5sqmcuCRfMbhmcj4SuIRxek1fvbpBkSq8yU6oTlvROrd67DkS0N", - "zQZ7Wqot6MzNewDFZTA1UrwNteykkm5qudB45CkBBXOLMbfbCBr4pJ3wXY7vRTt2zymFl7mSWWf2h+U6", - "xC8zpK6syXJwZPf4prt7VXhbn8q1kEnshVylMz86Rn8N+89Dl5DwOB7gE02848ocfGj81Dg0REamrTci", - "k5GwK+gcqSLhnmsoafpyOQfOle2eq9a/aCNyrTg6Y7Qpp2EgwfrHHvoyNrtxyMEkrVymxNzU+XJfQeOU", - "Oyy1s+FVeG/hO9wJwWcfU2nF3jbuyEOP0lxJywUW1EkK9+SMC2WFjKrVjZ99VuT7S3Qz93xNDu9PvkEC", - "igxXsf+2+/9wy6wGeHgP12vYZ6VYghUjBuly6VbyV9iz0Ozs3mSKsRxJHYMfah5Kiglo8z4xpenLCr/E", - "6aUY8VEMkjbhL8MKsKA3jhTXass2db5G2Z2vICRYQoMNepb3JuqMHjJSdNOD+fhAU/GcBqKw/5LrFWjm", - "I/GbuiTBALThAs9J6w3cj89FRzGeMsYdS/v0mlIBRLwLTadRDqhEdqkAxjXsz8kyiL/fgpGMp5IaAQzz", - "Sn1EkO6UnirOaXaEXq87RlUq9tVJ/taAf4/GVQefVyGcaFwdZmubujxcBx6H2sBwndOjceK9TTxx27VN", - "9QwYbu6IQf+YHX+kZIs39yIfx74M4WP/+OofTMMSNOqtvvwSh//yy7n3V/jH0+5nR21ffpl2akqenPvz", - "G2gqAbgx/HRJ6ugWgO3ZUOmSNxROS45r7kJTEl02y7IX8iQLhskGUDzhGAECpaog2RqLlcU3KCaA07Cq", - "S06hPkJK0J1OUzL90PPf7qRXdeGflzuZahuLk9g62o5UgdCoCvPtKuf2yslRnqUcMxrddsQ2J1I7ImVX", - "ucuIP1BKl2bEEGF6lzEv/RhHSjheXb03K4lquaCMEyFLAArAhOEuNTWZA0KZx5CpqAlng99qXvpwPYnB", - "cZeYtie/BkkVHB2X89V3GUhTa68SdLDieA4UP4yKL3PTNrltLcfxgmBXV+91Ttpf79Huk0Fg5inq6sSM", - "wiFHHS6q4tq7J+ZYMjon2XI3l28Y4ovRV/TY0wvJWG/Gbfi9bNFxZAlmXAz9R4Zv65e0pdDTuQjbpJK9", - "m5ny3z96+eIxE/1i6HHWx+ihdXzZcQmVaRBRhpEBLP3ck6dAsQQYC+fpBRayJYyogg+W73Bj4auQ6nhg", - "q74L9lEoJ2ZV+JEbrNLhm7eR9J9jKoUOkOzli6Sc0cmOe3JJiPlspVWdjtxeaTQN9X1B3SMABSx6wJNz", - "2fnTb75lhViBsWfs75hcjy7fYV20LjaZaOutdUp5MgSsSdBKYpAPRozmXHuEDoKDhQ9KxGEeHsO3yU8+", - "n6FcktldKsD95UBmYZWP4MTcohG/6bi930dYu5BWc2K+mVouk/l2/4a/t24ROvBkDUOsT+DK17DXcFvZ", - "5a/YuSkxOs55SuQ8WGvndoynBD4SOVDuEsfn66dZe4LO2CvXm4FcKu1e1ZsaLX2ww8R83uAWS6mYvs62", - "5aExc538HbRCpYFkyhu2+2es2WyMsuQ5yvPGRxE7GJrEuo1i8tE7lGbmBORjepMOjxqrpRUk/rht/CXa", - "xcpdPA7ov69FmaCCSrnvJoZjzqRiCp2D4paU1qDNukgw+7DwDiE97DGP04kXaVO/owSMh3wV1dZoNRL5", - "msu2YvvxkgxDmpxWk3lQlChxzNMVI9wCVrSA1b3A+Wkd9aQaCQ91H1AM0UAZEhvt2QMnA+L7DUh7S873", - "hnqTbwLWs9WHXwB65AUQeh+rA3wN+8yq9NhAhiWSzJunFupJidtGa5yPvHuaGLtQA7+VXekEORFhWaNB", - "NzJdBj2pf9I1/mTXsG+9XeJagfRsusUri67FtBb8UmygfZeQIJcSgcSkK5Gel+l3LeVEIpb9xYHlNMMc", - "pgozQhXU9zBNTLbzRmQbGXoHeY5ucQoiNyTMxXEgzGNfQTewDx0TG0VdJ8kF6gzO2IsmSQz6IVKsfZs5", - "hvRZfW9FyojSZEkWOui9uA76anRoRGc3PDUJRuAbkGzk2gylJN+E50tsMKYICs12S9Btu5QyJrRc6t/b", - "hkM9UGhWVehZMKLR8q2MrdA4NIbp1imz4vtZEAZn85lblvvHge3+Xerf3T9VVWKV02o59MlMH2BPExnO", - "kwhxn3VfrR1BsjmJLWkd0YAerKPnA3eXVIO3uVVPVU/GCnRKR97+8JyX5eVOej/AYdjbAc9LXlHo2yvv", - "cdlwaMfGvftu0Fp57hBbYnieOxGvaFM+RHB+YVi/bgolghhWTjngjXmUQ/dFgJg2uV6NrhsVVkMxVOSM", - "61VN6YceYH1HVjDysuGVKHxCxmEhOy+yEVuoNRRMaZ/KSyx9nraxSg7Hy1TR7lVeZhR5Kxq2WShGKH3u", - "Hj9Q+WTrSmZ541nu7kn3wrSKXZFH9tXsjL2knDEaeEEMVgsLqTpKnfVj8tstYFnnQNFZg92oCt6ZO0Wd", - "mlsGKVsD+k8kSqT9S9bjQoyZegRjY1yJpKoukj4Bhp4Pi4lhsQCp7L8QniZV5rq6eg8VHqxu2Ys4jqKq", - "mmJdJbh9/63GADjHsHHYER2t0iBWcqQWOxLIkoeLwPTRlbwOulzKpxuMEW8Gt0Qjjt+OiaLlhQajFAK8", - "yLCU/QGX7wR7bfZipDg8Mbgm2aRpY2+MX2VUA2PaEgObeROtEAk7iLL3ub5blFS7cx213gAdrnGsbyfA", - "KFF5Lb4L+0Mfk8wiK+dByYxKNpRu4cSfNGTh/gwcSxZUzaFu45Wu5DP2O2jlH6vNUO5AtLpxnwbc50c9", - "S3RqCquYQbf+lCcWrKHFH5AORwtAXV293/GBlIEw3UG+uF0Nr6M4/mGklEiM42Aq8zVE7lgJiGY8sLFt", - "zOXQIsYL3Neo/kLs40VMpikoQLvta6ogsfDtSBmTg9hcHsTmgfE7GZi24XVI6YfT7NO/JinX1TbsOPVI", - "xXWOxyi2FaWGU085/I3zwCTSCC/kuxJHmPUAeYyb0jknL9FnZER3rzLjBa8A3xnzLCSdyNtAuQzcLNjm", - "gvU4pjR3M9G9tuHVvVaPO8o8IojHfQ5g1OOgzWvmL+ZEKnMaofVtcLJmsEYmRMYT1x5GT6MQv/bTWfG4", - "KoRZq7osqDDEBnOxtW/MBHZ8AahGLmwLcpEbB3pdxEHWJpoh3mzGXrqRebnlexMUtS1ljQ8XdpXKRySU", - "hHGyRtIup/dG5+QmDrmoBEjb+NzEeHFEPq7eTA/s1aSO61AWOXHTaC284z1vK6l1TW/B8uarRfHohp77", - "beZlV11AAwdVtGvzPIwdVtSgNLrQjqcUSdXTa7b0CNPzttGD3M7rFU9lctSLuBxNM87epJLdAOARo4x0", - "jRzSXnN93bkE/WH1A8gVpRPojNqRMaIkAAZKSkXai0Eei5AxUHpTxpt6UYoczQjo9N0YFrzHf8Heclmo", - "DfshJPN59MvbHx4zDaYubSCykNnYEZ+H5NOWExhdeKWXfuXvomiZZvlCeovKShirE4rLB18V5nw85nDk", - "Gi2Nbb2OyGBN6R4HAeHCc8H0NYQTXsM+K0RZjxKya3VddBNumnqBZeGEpKy8C25z9GYZgGAOTH3Ew8G1", - "KWmp6OZw15VOOzC4XH9iOrNUvfPzuRHQkadEMK8e5p7ecnMq+/TdiH/6mW4nH5J42IZJRImAHT5DQZTe", - "xX8nKSuaguK0nPRhfFXCVtjqupS2RT9l4xkaGRKOupx2x0u7nQY5CyfBwmdiKHG5CfH293dLKxlh/8IX", - "Ky0j4WdZy8L0trAth3/A/npQ9vGiT2hz0JQ7JhRMlQQ6QbNdSNBw6YNO2nhpY1QuWiM81pqkqpJ/k+Xe", - "J6XrV/Rot7LS6kYUqUL0pVqJ3JAK5lSL8avQ98N8tqlLK245zuvQl0zY6etQrPxVKAuuCwbF02+++erP", - "3VQInxG7Gm5S0r3HL8trGbkVeVeObVY3gYkFVJ6t1JBljRrb9Kq1PTTGtVTi1uk2MgRkPPQ9KFq9g8hi", - "z3hE6sqJ7aUV7U9z99uam3XLOqOyxVhGmjPPr/pefxhfFBn6Hjj83BN2difHjN7xGGMc7SH5HM5GzB6J", - "HqayxNcRJxmscOOXSHpXRy8h6BL3uirByXYtDxxNoxNQQ1d+mPOdGFb5j8dL7zo2wNKBykkilJfVCZOt", - "xIUKghaqW3gHD/bnXQxXKi/eWoNxEKW9b9Y6mWnkUP7NNvNhIq/6Sbh919vTXmYS3LdRCbe6/kQJbA7R", - "wOeRxSHtiHVYZB7LxcCmBOY1yaj6SajGpecoK+wh0h/Nt9p9P0/PaOLB6Xu5jbmnmSo4qF1GoaNxhi72", - "ksi/9WpEOVZSvhqfco+Mv74AQHe/7h6S/wEjBJaKshtIy3PbphafPfMjzXyR39na2spcnJ9vt9uzMM1Z", - "rjbnK4xyyqyq8/V5GAjTSHZSp/kuvvqVu3bLvRW5Yc/evEQhWdgSMGACURcl1L2YPT17QqkXQfJKzC5m", - "X589OfuKjsga6eKc0hy7/64ozMFRDUrCLwsMQb+GOFEy1s7GVMjY/emTJ2Eb/DMxMk+e/9MQQ5tmMY2n", - "wU3ubsQjtKc9jgryJyooy2uptpJ9r7UiBmnqzYbrPUZA21pLw54+ecLE0qd3psQf3Ilp72cUkTv71fU7", - "v3l6HvmJ9X45/yO4aIjiw5HP57yqTBYZkI+2D1b4g60SUXzT+0yaoVeAMrRNzxf9ev5H10T9YWKz8wVW", - "ipjaFKZOf+79/EPb/uLx7/M/gmr5w4FP5z4txaHuI/tG1WbO/yD3aVJVRFOlO3XY/h9256FDja52x3x2", - "8f6PHp+BHd9UJSCLmX34tSHvhkN5Mv8wb34plbquq/gXA1zna+y+y5QWKyEd+W75agU66zGY/x8AAP//", - "+ge3+k7gAAA=", + "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", + "qxXorMdg/n8AAAD//wyLHMD35wAA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/common/types.go b/api/generated/common/types.go index 3a0e083ca..dc19fdeaa 100644 --- a/api/generated/common/types.go +++ b/api/generated/common/types.go @@ -36,6 +36,7 @@ const ( TransactionTxTypeAfrz TransactionTxType = "afrz" TransactionTxTypeAppl TransactionTxType = "appl" TransactionTxTypeAxfer TransactionTxType = "axfer" + TransactionTxTypeHb TransactionTxType = "hb" TransactionTxTypeKeyreg TransactionTxType = "keyreg" TransactionTxTypePay TransactionTxType = "pay" TransactionTxTypeStpf TransactionTxType = "stpf" @@ -61,6 +62,7 @@ const ( TxTypeAfrz TxType = "afrz" TxTypeAppl TxType = "appl" TxTypeAxfer TxType = "axfer" + TxTypeHb TxType = "hb" TxTypeKeyreg TxType = "keyreg" TxTypePay TxType = "pay" TxTypeStpf TxType = "stpf" @@ -561,6 +563,24 @@ type HashFactory struct { // * sha256 type Hashtype string +// HbProofFields \[hbprf\] HbProof is a signature using HeartbeatAddress's partkey, thereby showing it is online. +type HbProofFields struct { + // HbPk \[p\] Public key of the heartbeat message. + HbPk *[]byte `json:"hb-pk,omitempty"` + + // HbPk1sig \[p1s\] Signature of OneTimeSignatureSubkeyOffsetID(PK, Batch, Offset) under the key PK2. + HbPk1sig *[]byte `json:"hb-pk1sig,omitempty"` + + // HbPk2 \[p2\] Key for new-style two-level ephemeral signature. + HbPk2 *[]byte `json:"hb-pk2,omitempty"` + + // HbPk2sig \[p2s\] Signature of OneTimeSignatureSubkeyBatchID(PK2, Batch) under the master key (OneTimeSignatureVerifier). + HbPk2sig *[]byte `json:"hb-pk2sig,omitempty"` + + // HbSig \[s\] Signature of the heartbeat message. + HbSig *[]byte `json:"hb-sig,omitempty"` +} + // HealthCheck A health check response. type HealthCheck struct { Data *map[string]interface{} `json:"data,omitempty"` @@ -827,6 +847,12 @@ type Transaction struct { // Group \[grp\] Base64 encoded byte array of a sha512/256 digest. When present indicates that this transaction is part of a transaction group and the value is the sha512/256 hash of the transactions in that group. Group *[]byte `json:"group,omitempty"` + // HeartBeatTransaction Fields for a heartbeat transaction. + // + // Definition: + // data/transactions/heartbeat.go : HeartBeatTxnFields + HeartBeatTransaction *TransactionHeartBeat `json:"heart-beat-transaction,omitempty"` + // Id Transaction ID Id *string `json:"id,omitempty"` @@ -897,6 +923,7 @@ type Transaction struct { // * \[afrz\] asset-freeze-transaction // * \[appl\] application-transaction // * \[stpf\] state-proof-transaction + // * \[hb\] heart-beat-transaction TxType TransactionTxType `json:"tx-type"` } @@ -910,6 +937,7 @@ type Transaction struct { // * \[afrz\] asset-freeze-transaction // * \[appl\] application-transaction // * \[stpf\] state-proof-transaction +// * \[hb\] heart-beat-transaction type TransactionTxType string // TransactionApplication Fields for application transactions. @@ -1019,6 +1047,22 @@ type TransactionAssetTransfer struct { Sender *string `json:"sender,omitempty"` } +// TransactionHeartBeat Fields for a heartbeat transaction. +// +// Definition: +// data/transactions/heartbeat.go : HeartBeatTxnFields +type TransactionHeartBeat struct { + // HbAddress \[hbad\] HbAddress is the account this txn is proving onlineness for. + HbAddress string `json:"hb-address"` + + // HbProof \[hbprf\] HbProof is a signature using HeartbeatAddress's partkey, thereby showing it is online. + HbProof HbProofFields `json:"hb-proof"` + + // HbSeed \[hbsd\] HbSeed must be the block seed for the block before this transaction's + // // firstValid.. + HbSeed []byte `json:"hb-seed"` +} + // TransactionKeyreg Fields for a keyreg transaction. // // Definition: diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index 6b9f38d0d..f9e87cec8 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1212,229 +1212,235 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "lrsEplHBUCfD7ulxPOC1avkiYIHke/RC2D+7HX2PFvGo89WCm6H57LfJ/UcLnsK/TuFfJ9H0Pr0H4JDP", - "//DXc7/HAFzzMUnObcPx0mRcsfzkK3CnvgJA5sbSwntMKg1TnsjNSZn3abs6dCnm+YyWVORsr0YOWW9t", - "QA3t6/aslxIIisuHDwRmJ0X1k51ko5NsdCpddwpsGhvYdDSm67jcSEw8R0lpr7ngp2ydqVdv1jwNJ5Ht", - "z8SAHJLqomWeAF2so0+78l1glgv7pGLmi50y3ynbxSnbxSnbxSnbxSnbxcexRp/yUpzyUpzEt3/vvBRj", - "PE6cEdMCKgVDV+ZWY3z+B7mQu3ZC6S3qmVzNuGCNAORX0BQLNdIeFDRaUhPeYd/QSKKDl8GedWVKlgPv", - "KzjhgFCcM34N/50rxn5nmaHKMtdj3tvWajyAUBozmj+ujXnQ2ixTjAo34vOBaFdGVa0gDa0JuWoJJX4l", - "U8snb2VN1nBZSn4F/V1dTbvpKyjI2qnRaiQxqh40TrvuGcCzN/PI9D4MQKckKqckKqckKn8CbcislPmV", - "Pv8DjjpDPcJeIzZ0GlJiPLUf9yku8DLidOm0UDFAtyRqPzBaMEWkffTnJV2ckX/Yywm3D1xLjafQ00Zn", - "A2skhWSoC3EKgC4PoAfo3xKmzOyUd0sCd0arwEmcAsM/4+s5SjUZeYaOzcDb1Uh6dj3NNnIN7HiXaQ9i", - "4mG5fYOX6knTedJ0njSdJ03nSdN5yut70p+e9Kcn/elJf3rSn570p3euP/2YOs+7rxV60qqetKontc1H", - "DQuKj/b8DysT7Q8MIlZ8LFsv5JCKNca6MdFBTii7vxxq90hCou066LKOv5ynGJoTeflUtMIfphPN1LW/", - "67UqJxeTpTGVvjg/Zxu6qkp2lsvVOSSpcP3/CHy/XK3goQq/uJGjXxwps903mVTcvr1lptd0sWAqszMj", - "zI/PHk0+/J8AAAD//3BbS4jifQEA", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index 36d8da56d..d33b0464a 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -36,6 +36,7 @@ const ( TransactionTxTypeAfrz TransactionTxType = "afrz" TransactionTxTypeAppl TransactionTxType = "appl" TransactionTxTypeAxfer TransactionTxType = "axfer" + TransactionTxTypeHb TransactionTxType = "hb" TransactionTxTypeKeyreg TransactionTxType = "keyreg" TransactionTxTypePay TransactionTxType = "pay" TransactionTxTypeStpf TransactionTxType = "stpf" @@ -61,6 +62,7 @@ const ( TxTypeAfrz TxType = "afrz" TxTypeAppl TxType = "appl" TxTypeAxfer TxType = "axfer" + TxTypeHb TxType = "hb" TxTypeKeyreg TxType = "keyreg" TxTypePay TxType = "pay" TxTypeStpf TxType = "stpf" @@ -92,6 +94,7 @@ const ( LookupAccountTransactionsParamsTxTypeAfrz LookupAccountTransactionsParamsTxType = "afrz" LookupAccountTransactionsParamsTxTypeAppl LookupAccountTransactionsParamsTxType = "appl" LookupAccountTransactionsParamsTxTypeAxfer LookupAccountTransactionsParamsTxType = "axfer" + LookupAccountTransactionsParamsTxTypeHb LookupAccountTransactionsParamsTxType = "hb" LookupAccountTransactionsParamsTxTypeKeyreg LookupAccountTransactionsParamsTxType = "keyreg" LookupAccountTransactionsParamsTxTypePay LookupAccountTransactionsParamsTxType = "pay" LookupAccountTransactionsParamsTxTypeStpf LookupAccountTransactionsParamsTxType = "stpf" @@ -110,6 +113,7 @@ const ( LookupAssetTransactionsParamsTxTypeAfrz LookupAssetTransactionsParamsTxType = "afrz" LookupAssetTransactionsParamsTxTypeAppl LookupAssetTransactionsParamsTxType = "appl" LookupAssetTransactionsParamsTxTypeAxfer LookupAssetTransactionsParamsTxType = "axfer" + LookupAssetTransactionsParamsTxTypeHb LookupAssetTransactionsParamsTxType = "hb" LookupAssetTransactionsParamsTxTypeKeyreg LookupAssetTransactionsParamsTxType = "keyreg" LookupAssetTransactionsParamsTxTypePay LookupAssetTransactionsParamsTxType = "pay" LookupAssetTransactionsParamsTxTypeStpf LookupAssetTransactionsParamsTxType = "stpf" @@ -135,6 +139,7 @@ const ( Afrz SearchForTransactionsParamsTxType = "afrz" Appl SearchForTransactionsParamsTxType = "appl" Axfer SearchForTransactionsParamsTxType = "axfer" + Hb SearchForTransactionsParamsTxType = "hb" Keyreg SearchForTransactionsParamsTxType = "keyreg" Pay SearchForTransactionsParamsTxType = "pay" Stpf SearchForTransactionsParamsTxType = "stpf" @@ -649,6 +654,24 @@ type HashFactory struct { // * sha256 type Hashtype string +// HbProofFields \[hbprf\] HbProof is a signature using HeartbeatAddress's partkey, thereby showing it is online. +type HbProofFields struct { + // HbPk \[p\] Public key of the heartbeat message. + HbPk *[]byte `json:"hb-pk,omitempty"` + + // HbPk1sig \[p1s\] Signature of OneTimeSignatureSubkeyOffsetID(PK, Batch, Offset) under the key PK2. + HbPk1sig *[]byte `json:"hb-pk1sig,omitempty"` + + // HbPk2 \[p2\] Key for new-style two-level ephemeral signature. + HbPk2 *[]byte `json:"hb-pk2,omitempty"` + + // HbPk2sig \[p2s\] Signature of OneTimeSignatureSubkeyBatchID(PK2, Batch) under the master key (OneTimeSignatureVerifier). + HbPk2sig *[]byte `json:"hb-pk2sig,omitempty"` + + // HbSig \[s\] Signature of the heartbeat message. + HbSig *[]byte `json:"hb-sig,omitempty"` +} + // HealthCheck A health check response. type HealthCheck struct { Data *map[string]interface{} `json:"data,omitempty"` @@ -915,6 +938,12 @@ type Transaction struct { // Group \[grp\] Base64 encoded byte array of a sha512/256 digest. When present indicates that this transaction is part of a transaction group and the value is the sha512/256 hash of the transactions in that group. Group *[]byte `json:"group,omitempty"` + // HeartBeatTransaction Fields for a heartbeat transaction. + // + // Definition: + // data/transactions/heartbeat.go : HeartBeatTxnFields + HeartBeatTransaction *TransactionHeartBeat `json:"heart-beat-transaction,omitempty"` + // Id Transaction ID Id *string `json:"id,omitempty"` @@ -985,6 +1014,7 @@ type Transaction struct { // * \[afrz\] asset-freeze-transaction // * \[appl\] application-transaction // * \[stpf\] state-proof-transaction + // * \[hb\] heart-beat-transaction TxType TransactionTxType `json:"tx-type"` } @@ -998,6 +1028,7 @@ type Transaction struct { // * \[afrz\] asset-freeze-transaction // * \[appl\] application-transaction // * \[stpf\] state-proof-transaction +// * \[hb\] heart-beat-transaction type TransactionTxType string // TransactionApplication Fields for application transactions. @@ -1107,6 +1138,22 @@ type TransactionAssetTransfer struct { Sender *string `json:"sender,omitempty"` } +// TransactionHeartBeat Fields for a heartbeat transaction. +// +// Definition: +// data/transactions/heartbeat.go : HeartBeatTxnFields +type TransactionHeartBeat struct { + // HbAddress \[hbad\] HbAddress is the account this txn is proving onlineness for. + HbAddress string `json:"hb-address"` + + // HbProof \[hbprf\] HbProof is a signature using HeartbeatAddress's partkey, thereby showing it is online. + HbProof HbProofFields `json:"hb-proof"` + + // HbSeed \[hbsd\] HbSeed must be the block seed for the block before this transaction's + // // firstValid.. + HbSeed []byte `json:"hb-seed"` +} + // TransactionKeyreg Fields for a keyreg transaction. // // Definition: diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index 76c11d21d..a266975a0 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -1993,7 +1993,8 @@ "asset-transfer-transaction", "keyreg-transaction", "payment-transaction", - "state-proof-transaction" + "state-proof-transaction", + "heart-beat-transaction" ], "properties": { "application-transaction": { @@ -2011,6 +2012,9 @@ "state-proof-transaction": { "$ref": "#/definitions/TransactionStateProof" }, + "heart-beat-transaction": { + "$ref": "#/definitions/TransactionHeartBeat" + }, "auth-addr": { "description": "\\[sgnr\\] this is included with signed transactions when the signing address does not equal the sender. The backend can use this to ensure that auth addr is equal to the accounts auth addr.", "type": "string", @@ -2111,7 +2115,7 @@ "$ref": "#/definitions/TransactionSignature" }, "tx-type": { - "description": "\\[type\\] Indicates what type of transaction this is. Different types have different fields.\n\nValid types, and where their fields are stored:\n* \\[pay\\] payment-transaction\n* \\[keyreg\\] keyreg-transaction\n* \\[acfg\\] asset-config-transaction\n* \\[axfer\\] asset-transfer-transaction\n* \\[afrz\\] asset-freeze-transaction\n* \\[appl\\] application-transaction\n* \\[stpf\\] state-proof-transaction", + "description": "\\[type\\] Indicates what type of transaction this is. Different types have different fields.\n\nValid types, and where their fields are stored:\n* \\[pay\\] payment-transaction\n* \\[keyreg\\] keyreg-transaction\n* \\[acfg\\] asset-config-transaction\n* \\[axfer\\] asset-transfer-transaction\n* \\[afrz\\] asset-freeze-transaction\n* \\[appl\\] application-transaction\n* \\[stpf\\] state-proof-transaction\n* \\[hb\\] heart-beat-transaction", "type": "string", "enum": [ "pay", @@ -2120,7 +2124,8 @@ "axfer", "afrz", "appl", - "stpf" + "stpf", + "hb" ], "x-algorand-format": "tx-type-enum" }, @@ -2278,6 +2283,29 @@ } } }, + "TransactionHeartBeat": { + "description": "Fields for a heartbeat transaction.\n\nDefinition:\ndata/transactions/heartbeat.go : HeartBeatTxnFields", + "type": "object", + "required": [ + "hb-address", + "hb-proof", + "hb-seed" + ], + "properties": { + "hb-address": { + "description": "\\[hbad\\] HbAddress is the account this txn is proving onlineness for.", + "type": "string" + }, + "hb-proof": { + "$ref": "#/definitions/HbProofFields" + }, + "hb-seed": { + "description": "\\[hbsd\\] HbSeed must be the block seed for the block before this transaction's\n\t// firstValid..", + "type": "string", + "format": "byte" + } + } + }, "TransactionAssetTransfer": { "description": "Fields for an asset transfer transaction.\n\nDefinition:\ndata/transactions/asset.go : AssetTransferTxnFields", "type": "object", @@ -2509,6 +2537,37 @@ } } }, + "HbProofFields": { + "description": "\\[hbprf\\] HbProof is a signature using HeartbeatAddress's partkey, thereby showing it is online.", + "type": "object", + "properties": { + "hb-sig": { + "description": "\\[s\\] Signature of the heartbeat message.", + "type": "string", + "format": "byte" + }, + "hb-pk": { + "description": "\\[p\\] Public key of the heartbeat message.", + "type": "string", + "format": "byte" + }, + "hb-pk2": { + "description": "\\[p2\\] Key for new-style two-level ephemeral signature.", + "type": "string", + "format": "byte" + }, + "hb-pk1sig": { + "description": "\\[p1s\\] Signature of OneTimeSignatureSubkeyOffsetID(PK, Batch, Offset) under the key PK2.", + "type": "string", + "format": "byte" + }, + "hb-pk2sig": { + "description": "\\[p2s\\] Signature of OneTimeSignatureSubkeyBatchID(PK2, Batch) under the master key (OneTimeSignatureVerifier).", + "type": "string", + "format": "byte" + } + } + }, "IndexerStateProofMessage": { "type": "object", "properties": { @@ -2873,7 +2932,8 @@ "axfer", "afrz", "appl", - "stpf" + "stpf", + "hb" ], "type": "string", "name": "tx-type", diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index 9a425b354..da8102d14 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -252,7 +252,8 @@ "axfer", "afrz", "appl", - "stpf" + "stpf", + "hb" ], "type": "string" } @@ -1492,6 +1493,42 @@ ], "type": "string" }, + "HbProofFields": { + "description": "\\[hbprf\\] HbProof is a signature using HeartbeatAddress's partkey, thereby showing it is online.", + "properties": { + "hb-pk": { + "description": "\\[p\\] Public key of the heartbeat message.", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + }, + "hb-pk1sig": { + "description": "\\[p1s\\] Signature of OneTimeSignatureSubkeyOffsetID(PK, Batch, Offset) under the key PK2.", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + }, + "hb-pk2": { + "description": "\\[p2\\] Key for new-style two-level ephemeral signature.", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + }, + "hb-pk2sig": { + "description": "\\[p2s\\] Signature of OneTimeSignatureSubkeyBatchID(PK2, Batch) under the master key (OneTimeSignatureVerifier).", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + }, + "hb-sig": { + "description": "\\[s\\] Signature of the heartbeat message.", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + } + }, + "type": "object" + }, "HealthCheck": { "description": "A health check response.", "properties": { @@ -1940,6 +1977,9 @@ "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string" }, + "heart-beat-transaction": { + "$ref": "#/components/schemas/TransactionHeartBeat" + }, "id": { "description": "Transaction ID", "type": "string" @@ -2021,7 +2061,7 @@ "$ref": "#/components/schemas/TransactionStateProof" }, "tx-type": { - "description": "\\[type\\] Indicates what type of transaction this is. Different types have different fields.\n\nValid types, and where their fields are stored:\n* \\[pay\\] payment-transaction\n* \\[keyreg\\] keyreg-transaction\n* \\[acfg\\] asset-config-transaction\n* \\[axfer\\] asset-transfer-transaction\n* \\[afrz\\] asset-freeze-transaction\n* \\[appl\\] application-transaction\n* \\[stpf\\] state-proof-transaction", + "description": "\\[type\\] Indicates what type of transaction this is. Different types have different fields.\n\nValid types, and where their fields are stored:\n* \\[pay\\] payment-transaction\n* \\[keyreg\\] keyreg-transaction\n* \\[acfg\\] asset-config-transaction\n* \\[axfer\\] asset-transfer-transaction\n* \\[afrz\\] asset-freeze-transaction\n* \\[appl\\] application-transaction\n* \\[stpf\\] state-proof-transaction\n* \\[hb\\] heart-beat-transaction", "enum": [ "pay", "keyreg", @@ -2029,7 +2069,8 @@ "axfer", "afrz", "appl", - "stpf" + "stpf", + "hb" ], "type": "string", "x-algorand-format": "tx-type-enum" @@ -2187,6 +2228,30 @@ ], "type": "object" }, + "TransactionHeartBeat": { + "description": "Fields for a heartbeat transaction.\n\nDefinition:\ndata/transactions/heartbeat.go : HeartBeatTxnFields", + "properties": { + "hb-address": { + "description": "\\[hbad\\] HbAddress is the account this txn is proving onlineness for.", + "type": "string" + }, + "hb-proof": { + "$ref": "#/components/schemas/HbProofFields" + }, + "hb-seed": { + "description": "\\[hbsd\\] HbSeed must be the block seed for the block before this transaction's\n\t// firstValid..", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + } + }, + "required": [ + "hb-address", + "hb-proof", + "hb-seed" + ], + "type": "object" + }, "TransactionKeyreg": { "description": "Fields for a keyreg transaction.\n\nDefinition:\ndata/transactions/keyreg.go : KeyregTxnFields", "properties": { @@ -3367,7 +3432,8 @@ "axfer", "afrz", "appl", - "stpf" + "stpf", + "hb" ], "type": "string" } @@ -4546,7 +4612,8 @@ "axfer", "afrz", "appl", - "stpf" + "stpf", + "hb" ], "type": "string" } @@ -4889,7 +4956,8 @@ "axfer", "afrz", "appl", - "stpf" + "stpf", + "hb" ], "type": "string" } diff --git a/go.mod b/go.mod index 6e2af3088..692fa3867 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.23.3 require ( github.com/algorand/avm-abi v0.2.0 - github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241114170414-874d2110dae4 + github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241031201855-9f36e068282d github.com/algorand/go-codec/codec v1.1.10 github.com/algorand/oapi-codegen v1.12.0-algorand.0 github.com/davecgh/go-spew v1.1.1 diff --git a/go.sum b/go.sum index 107f1976a..186c136ee 100644 --- a/go.sum +++ b/go.sum @@ -62,8 +62,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/algorand/avm-abi v0.2.0 h1:bkjsG+BOEcxUcnGSALLosmltE0JZdg+ZisXKx0UDX2k= github.com/algorand/avm-abi v0.2.0/go.mod h1:+CgwM46dithy850bpTeHh9MC99zpn2Snirb3QTl2O/g= -github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241114170414-874d2110dae4 h1:qQXdtMWlP9ynxeDEhWpUWer3AM51482pnfe7ptTDXm0= -github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241114170414-874d2110dae4/go.mod h1:BkHnK2PuCqzdGPNeWUo5yo6lRjyDZ9QoMN8GIjfijrA= +github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241031201855-9f36e068282d h1:PXvo5iN4CLOAFAAqoyknBUddU9EpVCuw4Y6YKyQS7Ko= +github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241031201855-9f36e068282d/go.mod h1:mDZGN/SiSzdAweSziqnOYPhGZJEK1pQSVtMq5FLIWxM= github.com/algorand/go-codec/codec v1.1.10 h1:zmWYU1cp64jQVTOG8Tw8wa+k0VfwgXIPbnDfiVa+5QA= github.com/algorand/go-codec/codec v1.1.10/go.mod h1:YkEx5nmr/zuCeaDYOIhlDg92Lxju8tj2d2NrYqP7g7k= github.com/algorand/oapi-codegen v1.12.0-algorand.0 h1:W9PvED+wAJc+9EeXPONnA+0zE9UhynEqoDs4OgAxKhk= @@ -175,9 +175,8 @@ github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/ github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v4.3.1+incompatible h1:0/KbAdpx3UXAx1kEOWHJeOkpbgRFGHVgv+CFIY7dBJI= -github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= diff --git a/idb/txn_type_enum.go b/idb/txn_type_enum.go index 39f0c6cac..286129dce 100644 --- a/idb/txn_type_enum.go +++ b/idb/txn_type_enum.go @@ -20,6 +20,7 @@ const ( TypeEnumAssetFreeze TypeEnumApplication TypeEnumStateProof + TypeEnumHeartbeat ) var typeEnumMap = map[string]TxnTypeEnum{ @@ -30,6 +31,7 @@ var typeEnumMap = map[string]TxnTypeEnum{ "afrz": TypeEnumAssetFreeze, "appl": TypeEnumApplication, "stpf": TypeEnumStateProof, + "hb": TypeEnumHeartbeat, } func makeTypeEnumString() string { From a1cc8aff6c5975ef9923725d2d01a9339013183a Mon Sep 17 00:00:00 2001 From: Gary Malouf <982483+gmalouf@users.noreply.github.com> Date: Wed, 27 Nov 2024 11:54:51 -0500 Subject: [PATCH 2/7] Update to latest go-algorand-sdk heartbeat snapshot. --- go.mod | 2 +- go.sum | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 692fa3867..df840f9ab 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.23.3 require ( github.com/algorand/avm-abi v0.2.0 - github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241031201855-9f36e068282d + github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241127164804-625a18def941 github.com/algorand/go-codec/codec v1.1.10 github.com/algorand/oapi-codegen v1.12.0-algorand.0 github.com/davecgh/go-spew v1.1.1 diff --git a/go.sum b/go.sum index 186c136ee..4589c5a07 100644 --- a/go.sum +++ b/go.sum @@ -62,8 +62,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/algorand/avm-abi v0.2.0 h1:bkjsG+BOEcxUcnGSALLosmltE0JZdg+ZisXKx0UDX2k= github.com/algorand/avm-abi v0.2.0/go.mod h1:+CgwM46dithy850bpTeHh9MC99zpn2Snirb3QTl2O/g= -github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241031201855-9f36e068282d h1:PXvo5iN4CLOAFAAqoyknBUddU9EpVCuw4Y6YKyQS7Ko= -github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241031201855-9f36e068282d/go.mod h1:mDZGN/SiSzdAweSziqnOYPhGZJEK1pQSVtMq5FLIWxM= +github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241127164804-625a18def941 h1:ApRVtpHa4FCd3xt3LUGZNjbuXHUvyOruNPPe9HWyMWU= +github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241127164804-625a18def941/go.mod h1:BkHnK2PuCqzdGPNeWUo5yo6lRjyDZ9QoMN8GIjfijrA= github.com/algorand/go-codec/codec v1.1.10 h1:zmWYU1cp64jQVTOG8Tw8wa+k0VfwgXIPbnDfiVa+5QA= github.com/algorand/go-codec/codec v1.1.10/go.mod h1:YkEx5nmr/zuCeaDYOIhlDg92Lxju8tj2d2NrYqP7g7k= github.com/algorand/oapi-codegen v1.12.0-algorand.0 h1:W9PvED+wAJc+9EeXPONnA+0zE9UhynEqoDs4OgAxKhk= @@ -175,8 +175,9 @@ github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/ github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.3.1+incompatible h1:0/KbAdpx3UXAx1kEOWHJeOkpbgRFGHVgv+CFIY7dBJI= +github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= From 0d8ea5781295ab56bf35f77f2a462b9e866a7a7c Mon Sep 17 00:00:00 2001 From: Gary Malouf <982483+gmalouf@users.noreply.github.com> Date: Fri, 6 Dec 2024 17:38:38 -0500 Subject: [PATCH 3/7] Support generating synthetic payout transaction based off Payout being set in block header. --- e2e_tests/docker/indexer/Dockerfile | 2 +- idb/postgres/internal/writer/write_txn.go | 52 +++- .../writer/write_txn_participation.go | 9 + idb/postgres/internal/writer/writer_test.go | 252 +++++++++++++++++- idb/postgres/postgres.go | 3 +- 5 files changed, 311 insertions(+), 7 deletions(-) diff --git a/e2e_tests/docker/indexer/Dockerfile b/e2e_tests/docker/indexer/Dockerfile index 754e1e8b4..50bff4ae1 100644 --- a/e2e_tests/docker/indexer/Dockerfile +++ b/e2e_tests/docker/indexer/Dockerfile @@ -1,4 +1,4 @@ -ARG GO_IMAGE=golang:1.213.3 +ARG GO_IMAGE=golang:1.23.3 FROM $GO_IMAGE ARG CHANNEL=stable diff --git a/idb/postgres/internal/writer/write_txn.go b/idb/postgres/internal/writer/write_txn.go index 4a6be5f0b..4ee769839 100644 --- a/idb/postgres/internal/writer/write_txn.go +++ b/idb/postgres/internal/writer/write_txn.go @@ -28,7 +28,7 @@ func transactionAssetID(stxnad *types.SignedTxnWithAD, intra uint, block *types. case types.ApplicationCallTx: assetid = uint64(stxnad.Txn.ApplicationID) if assetid == 0 { - assetid = uint64(stxnad.ApplyData.ApplicationID) + assetid = stxnad.ApplyData.ApplicationID } if assetid == 0 { if block == nil { @@ -42,7 +42,7 @@ func transactionAssetID(stxnad *types.SignedTxnWithAD, intra uint, block *types. case types.AssetConfigTx: assetid = uint64(stxnad.Txn.ConfigAsset) if assetid == 0 { - assetid = uint64(stxnad.ApplyData.ConfigAsset) + assetid = stxnad.ApplyData.ConfigAsset } if assetid == 0 { if block == nil { @@ -112,6 +112,7 @@ func yieldInnerTransactions(ctx context.Context, stxnad *types.SignedTxnWithAD, // Writes database rows for transactions (including inner transactions) to `outCh`. func yieldTransactions(ctx context.Context, block *types.Block, modifiedTxns []types.SignedTxnInBlock, outCh chan []interface{}) error { intra := uint(0) + for idx, stib := range block.Payset { var stxnad types.SignedTxnWithAD var err error @@ -123,7 +124,7 @@ func yieldTransactions(ctx context.Context, block *types.Block, modifiedTxns []t } txn := &stxnad.Txn - typeenum, ok := idb.GetTypeEnum(types.TxType(txn.Type)) + typeenum, ok := idb.GetTypeEnum(txn.Type) if !ok { return fmt.Errorf("yieldTransactions() get type enum") } @@ -153,9 +154,54 @@ func yieldTransactions(ctx context.Context, block *types.Block, modifiedTxns []t } } + if block.ProposerPayout > 0 { + stxnad := SignedTransactionFromBlockPayout(block) + typeenum, ok := idb.GetTypeEnum(stxnad.Txn.Type) + if !ok { + return fmt.Errorf("yieldTransactions() ProposerPayout get type enum - should NEVER happen") + } + id := crypto.TransactionIDString(stxnad.Txn) + extra := idb.TxnExtra{} + row := []interface{}{ + uint64(block.Round), intra, int(typeenum), 0, id, + encoding.EncodeSignedTxnWithAD(stxnad), + encoding.EncodeTxnExtra(&extra)} + select { + case <-ctx.Done(): + return fmt.Errorf("yieldTransactions() ProposerPayout ctx.Err(): %w", ctx.Err()) + case outCh <- row: + } + intra++ + } + return nil } +// SignedTransactionFromBlockPayout creates a synthetic transaction for the proposer payout. +func SignedTransactionFromBlockPayout(block *types.Block) types.SignedTxnWithAD { + stxnad := types.SignedTxnWithAD{ + SignedTxn: types.SignedTxn{ + Txn: types.Transaction{ + Type: types.PaymentTx, + Header: types.Header{ + Sender: block.FeeSink, + Note: []byte("ProposerPayout for Round " + fmt.Sprint(block.Round)), + FirstValid: block.Round, + LastValid: block.Round, + GenesisID: block.GenesisID, + GenesisHash: block.GenesisHash, + }, + PaymentTxnFields: types.PaymentTxnFields{ + Receiver: block.Proposer, + Amount: block.ProposerPayout, + }, + }, + }, + } + + return stxnad +} + // AddTransactions adds transactions from `block` to the database. // `modifiedTxns` contains enhanced apply data generated by evaluator. func AddTransactions(block *types.Block, modifiedTxns []types.SignedTxnInBlock, tx pgx.Tx) error { diff --git a/idb/postgres/internal/writer/write_txn_participation.go b/idb/postgres/internal/writer/write_txn_participation.go index 65edf1c1c..38b5add50 100644 --- a/idb/postgres/internal/writer/write_txn_participation.go +++ b/idb/postgres/internal/writer/write_txn_participation.go @@ -125,6 +125,15 @@ func AddTransactionParticipation(block *types.Block, tx pgx.Tx) error { next, rows = addInnerTransactionParticipation(&stxnib.SignedTxnWithAD, uint64(block.Round), next+1, rows) } + if block.ProposerPayout > 0 { + // FeeSink is the sender, Proposer is the receiver. + participants := []types.Address{block.FeeSink, block.Proposer} + for j := range participants { + rows = append(rows, []interface{}{participants[j][:], uint64(block.Round), next}) + } + next++ + } + _, err := tx.CopyFrom( context.Background(), pgx.Identifier{"txn_participation"}, diff --git a/idb/postgres/internal/writer/writer_test.go b/idb/postgres/internal/writer/writer_test.go index d793b97a4..e0edcbfb8 100644 --- a/idb/postgres/internal/writer/writer_test.go +++ b/idb/postgres/internal/writer/writer_test.go @@ -168,7 +168,7 @@ func TestWriterSpecialAccounts(t *testing.T) { assert.Equal(t, expected, accounts) } -func TestWriterTxnTableBasic(t *testing.T) { +func TestWriterTxnTableBasicNoPayout(t *testing.T) { db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) defer shutdownFunc() @@ -255,6 +255,116 @@ func TestWriterTxnTableBasic(t *testing.T) { assert.NoError(t, rows.Err()) } +func TestWriterTxnTableBasicWithProposalPayout(t *testing.T) { + db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) + defer shutdownFunc() + + block := sdk.Block{ + BlockHeader: sdk.BlockHeader{ + Round: sdk.Round(2), + TimeStamp: 333, + GenesisID: test.MakeGenesis().ID(), + GenesisHash: test.MakeGenesis().Hash(), + RewardsState: sdk.RewardsState{ + FeeSink: test.FeeAddr, + RewardsLevel: 111111, + }, + TxnCounter: 9, + UpgradeState: sdk.UpgradeState{ + CurrentProtocol: "future", + }, + Proposer: test.AccountE, + ProposerPayout: 2000000, + }, + Payset: make([]sdk.SignedTxnInBlock, 2), + } + + stxnad0 := test.MakePaymentTxn( + 1000, 1, 0, 0, 0, 0, sdk.Address(test.AccountA), sdk.Address(test.AccountB), sdk.Address{}, + sdk.Address{}) + var err error + block.Payset[0], err = + util.EncodeSignedTxn(block.BlockHeader, stxnad0.SignedTxn, stxnad0.ApplyData) + require.NoError(t, err) + + stxnad1 := test.MakeAssetConfigTxn( + 0, 100, 1, false, "ma", "myasset", "myasset.com", sdk.Address(test.AccountA)) + block.Payset[1], err = + util.EncodeSignedTxn(block.BlockHeader, stxnad1.SignedTxn, stxnad1.ApplyData) + require.NoError(t, err) + + f := func(tx pgx.Tx) error { + return writer.AddTransactions(&block, block.Payset, tx) + } + err = pgutil.TxWithRetry(db, serializable, f, nil) + require.NoError(t, err) + + rows, err := db.Query(context.Background(), "SELECT * FROM txn ORDER BY intra") + require.NoError(t, err) + defer rows.Close() + + var round uint64 + var intra uint64 + var typeenum uint + var asset uint64 + var txid []byte + var txn []byte + var extra []byte + + require.True(t, rows.Next()) + err = rows.Scan(&round, &intra, &typeenum, &asset, &txid, &txn, &extra) + require.NoError(t, err) + assert.Equal(t, block.Round, sdk.Round(round)) + assert.Equal(t, uint64(0), intra) + assert.Equal(t, idb.TypeEnumPay, idb.TxnTypeEnum(typeenum)) + assert.Equal(t, uint64(0), asset) + assert.Equal(t, crypto2.TransactionIDString(stxnad0.Txn), string(txid)) + { + stxn, err := encoding.DecodeSignedTxnWithAD(txn) + require.NoError(t, err) + assert.Equal(t, stxnad0, stxn) + } + assert.Equal(t, "{}", string(extra)) + + require.True(t, rows.Next()) + err = rows.Scan(&round, &intra, &typeenum, &asset, &txid, &txn, &extra) + require.NoError(t, err) + assert.Equal(t, block.Round, sdk.Round(round)) + assert.Equal(t, uint64(1), intra) + assert.Equal(t, idb.TypeEnumAssetConfig, idb.TxnTypeEnum(typeenum)) + assert.Equal(t, uint64(9), asset) + assert.Equal(t, crypto2.TransactionIDString(stxnad1.Txn), string(txid)) + { + stxn, err := encoding.DecodeSignedTxnWithAD(txn) + require.NoError(t, err) + assert.Equal(t, stxnad1, stxn) + } + assert.Equal(t, "{}", string(extra)) + + // Payout should be the last transaction. + require.True(t, rows.Next()) + err = rows.Scan(&round, &intra, &typeenum, &asset, &txid, &txn, &extra) + require.NoError(t, err) + + assert.Equal(t, block.Round, sdk.Round(round)) + assert.Equal(t, uint64(2), intra) + assert.Equal(t, idb.TypeEnumPay, idb.TxnTypeEnum(typeenum)) + assert.Equal(t, uint64(0), asset) + + // Intentionally using synthetic payout transaction logic; we are testing insertion and validity + payoutTxn := writer.SignedTransactionFromBlockPayout(&block) + assert.Equal(t, crypto2.TransactionIDString(payoutTxn.Txn), string(txid)) + { + stxn, err := encoding.DecodeSignedTxnWithAD(txn) + require.NoError(t, err) + assert.Equal(t, payoutTxn, stxn) + } + assert.Equal(t, "{}", string(extra)) + + assert.False(t, rows.Next()) + assert.NoError(t, rows.Err()) +} + // Test that asset close amount is written even if it is missing in the apply data // in the block (it is present in the "modified transactions"). func TestWriterTxnTableAssetCloseAmount(t *testing.T) { @@ -314,7 +424,7 @@ func TestWriterTxnTableAssetCloseAmount(t *testing.T) { assert.NoError(t, rows.Err()) } -func TestWriterTxnParticipationTable(t *testing.T) { +func TestWriterTxnParticipationTableNoPayout(t *testing.T) { type testtype struct { name string payset sdk.Payset @@ -425,6 +535,144 @@ func TestWriterTxnParticipationTable(t *testing.T) { } } +func TestWriterTxnParticipationTableWithPayout(t *testing.T) { + type testtype struct { + name string + payset sdk.Payset + expected []txnParticipationRow + } + + makeBlockFunc := func() sdk.Block { + return sdk.Block{ + BlockHeader: sdk.BlockHeader{ + Round: sdk.Round(2), + GenesisID: test.MakeGenesis().ID(), + GenesisHash: test.MakeGenesis().Hash(), + RewardsState: sdk.RewardsState{ + FeeSink: test.FeeAddr, + }, + UpgradeState: sdk.UpgradeState{ + CurrentProtocol: "future", + }, + Proposer: test.AccountE, + ProposerPayout: 2000000, + }, + } + } + + var tests []testtype + { + stxnad0 := test.MakePaymentTxn( + 1000, 1, 0, 0, 0, 0, sdk.Address(test.AccountA), sdk.Address(test.AccountB), sdk.Address{}, + sdk.Address{}) + stib0, err := util.EncodeSignedTxn(makeBlockFunc().BlockHeader, stxnad0.SignedTxn, stxnad0.ApplyData) + require.NoError(t, err) + + stxnad1 := test.MakeAssetConfigTxn( + 0, 100, 1, false, "ma", "myasset", "myasset.com", sdk.Address(test.AccountC)) + stib1, err := util.EncodeSignedTxn(makeBlockFunc().BlockHeader, stxnad1.SignedTxn, stxnad1.ApplyData) + require.NoError(t, err) + + testcase := testtype{ + name: "basic", + payset: []sdk.SignedTxnInBlock{stib0, stib1}, + expected: []txnParticipationRow{ + { + addr: test.AccountA, + round: 2, + intra: 0, + }, + { + addr: test.AccountB, + round: 2, + intra: 0, + }, + { + addr: test.AccountC, + round: 2, + intra: 1, + }, + // Payout involved accounts + { + addr: test.AccountE, + round: 2, + intra: 2, + }, + { + addr: test.FeeAddr, + round: 2, + intra: 2, + }, + }, + } + tests = append(tests, testcase) + } + { + stxnad := test.MakeCreateAppTxn(sdk.Address(test.AccountA)) + stxnad.Txn.ApplicationCallTxnFields.Accounts = + []sdk.Address{sdk.Address(test.AccountB), sdk.Address(test.AccountC)} + stib, err := util.EncodeSignedTxn(makeBlockFunc().BlockHeader, stxnad.SignedTxn, stxnad.ApplyData) + require.NoError(t, err) + + testcase := testtype{ + name: "app_call_addresses", + payset: []sdk.SignedTxnInBlock{stib}, + expected: []txnParticipationRow{ + { + addr: sdk.Address(test.AccountA), + round: 2, + intra: 0, + }, + { + addr: sdk.Address(test.AccountB), + round: 2, + intra: 0, + }, + { + addr: sdk.Address(test.AccountC), + round: 2, + intra: 0, + }, + // Payout involved accounts + { + addr: test.AccountE, + round: 2, + intra: 1, + }, + { + addr: test.FeeAddr, + round: 2, + intra: 1, + }, + }, + } + tests = append(tests, testcase) + } + + for _, testcase := range tests { + t.Run(testcase.name, func(t *testing.T) { + db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) + defer shutdownFunc() + + block := makeBlockFunc() + block.Payset = testcase.payset + + f := func(tx pgx.Tx) error { + return writer.AddTransactionParticipation(&block, tx) + } + err := pgutil.TxWithRetry(db, serializable, f, nil) + require.NoError(t, err) + + results, err := txnParticipationQuery( + db, `SELECT * FROM txn_participation ORDER BY round, intra, addr`) + assert.NoError(t, err) + + // Verify expected participation + assert.Equal(t, testcase.expected, results) + }) + } +} + // Create a new account and then delete it. func TestWriterAccountTableBasic(t *testing.T) { db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index 1a6850ccb..777c4f9c5 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -698,8 +698,9 @@ func buildTransactionQuery(tf idb.TransactionFilter) (query string, whereArgs [] whereStr := strings.Join(whereParts, " AND ") query += " WHERE " + whereStr } + if joinParticipation { - // this should match the index on txn_particpation + // this should match the index on txn_participation query += " ORDER BY p.addr, p.round DESC, p.intra DESC" } else { // this should explicitly match the primary key on txn (round,intra) From d978ad2f38aaf2381aa6ae7d2289b20df790a6f1 Mon Sep 17 00:00:00 2001 From: Gary Malouf <982483+gmalouf@users.noreply.github.com> Date: Tue, 10 Dec 2024 16:07:27 -0500 Subject: [PATCH 4/7] Heartbeat should be a single word in language/types throughout indexer. --- api/converter_utils.go | 14 +- api/generated/common/routes.go | 96 +++++----- api/generated/common/types.go | 16 +- api/generated/v2/routes.go | 174 +++++++++--------- api/generated/v2/types.go | 16 +- api/indexer.oas2.json | 12 +- api/indexer.oas3.yml | 10 +- idb/postgres/internal/writer/write_txn.go | 1 - .../writer/write_txn_participation.go | 1 - 9 files changed, 169 insertions(+), 171 deletions(-) diff --git a/api/converter_utils.go b/api/converter_utils.go index b3f971cb7..4327102e2 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -306,7 +306,7 @@ func signedTxnWithAdToTransaction(stxn *sdk.SignedTxnWithAD, extra rowData) (gen var assetTransfer *generated.TransactionAssetTransfer var application *generated.TransactionApplication var stateProof *generated.TransactionStateProof - var heartbeat *generated.TransactionHeartBeat + var heartbeat *generated.TransactionHeartbeat switch stxn.Txn.Type { case sdk.PaymentTx: @@ -512,7 +512,7 @@ func signedTxnWithAdToTransaction(stxn *sdk.SignedTxnWithAD, extra rowData) (gen stateProof = &proofTxn case sdk.HeartbeatTx: hb := stxn.Txn.HeartbeatTxnFields - hbTxn := generated.TransactionHeartBeat{ + hbTxn := generated.TransactionHeartbeat{ HbAddress: hb.HbAddress.String(), HbProof: generated.HbProofFields{ HbPk: byteSliceOmitZeroPtr(hb.HbProof.PK[:]), @@ -574,9 +574,9 @@ func signedTxnWithAdToTransaction(stxn *sdk.SignedTxnWithAD, extra rowData) (gen for _, t := range stxn.ApplyData.EvalDelta.InnerTxns { extra2 := extra if t.Txn.Type == sdk.ApplicationCallTx { - extra2.AssetID = uint64(t.ApplyData.ApplicationID) + extra2.AssetID = t.ApplyData.ApplicationID } else if t.Txn.Type == sdk.AssetConfigTx { - extra2.AssetID = uint64(t.ApplyData.ConfigAsset) + extra2.AssetID = t.ApplyData.ConfigAsset } else { extra2.AssetID = 0 } @@ -600,7 +600,7 @@ func signedTxnWithAdToTransaction(stxn *sdk.SignedTxnWithAD, extra rowData) (gen PaymentTransaction: payment, KeyregTransaction: keyreg, StateProofTransaction: stateProof, - HeartBeatTransaction: heartbeat, + HeartbeatTransaction: heartbeat, ClosingAmount: uint64Ptr(uint64(stxn.ClosingAmount)), ConfirmedRound: uint64Ptr(extra.Round), IntraRoundOffset: uint64Ptr(uint64(extra.Intra)), @@ -767,9 +767,9 @@ func (si *ServerImplementation) transactionParamsToTransactionFilter(params gene func (si *ServerImplementation) maxAccountsErrorToAccountsErrorResponse(maxErr idb.MaxAPIResourcesPerAccountError) generated.ErrorResponse { addr := maxErr.Address.String() - max := uint64(si.opts.MaxAPIResourcesPerAccount) + maxResults := si.opts.MaxAPIResourcesPerAccount extraData := map[string]interface{}{ - "max-results": max, + "max-results": maxResults, "address": addr, "total-assets-opted-in": maxErr.TotalAssets, "total-created-assets": maxErr.TotalAssetParams, diff --git a/api/generated/common/routes.go b/api/generated/common/routes.go index 2db8b6e16..ebe0c71e8 100644 --- a/api/generated/common/routes.go +++ b/api/generated/common/routes.go @@ -213,54 +213,54 @@ var swaggerSpec = []string{ "XL5hyIiA3u3HVC8kY70Zf8Pv5bePY+EwR2zoPzJ8W3GpOYQj2VPbNLi9m5kqdjx6+eIxw+ouY3U2IkXr", "+LLjok/TIKKcSANY+tlyT4FiCTAWgNgLhWZLGDEFHyw45MZCrZAqD2GrftDIUSgn5oH5gRusK+Sbt7k/", "PsXkLx0g2csXSTmjk8/75CI289lKqzqda2Kl8Wmo773ulAAUsEiBJ3fY86dffc0KsQJjz9jfMR0oXb7D", - "So5dbDLRVojsFB9mCFiTUprEIB8+Hc259ggdpDMQPowah/kIHoHAtc0WwO0t7zV0+/0GuB2tO3KkPsN8", - "hlJOZnepBB8vBxIQq3wEO+ZWjrhXJ+znPtJ6CGk1J1aeKfTBHcJHvrmtk4UOHF7DkIYm8Phr2Gu4rST0", - "I3ZuSiyP87ES+RjWGrsdGyuBj0ROlbvEYfzyadaexzP2yvVmIJdKOx19U+O7IewwMal/votlXkzfadvy", - "+Ji5U/4BWqEJQjLln8n7J7bZbIwy5zlqB8ZnUXAwNInFGzPnowuUjeYE5GPScIcHl9XSChKm3Db+Gu1i", - "5a4xB/Tf16JMUEGl3HcTwzFnUjGFrkZxS0rr0madJZh9WowOIT0s04jLKRRpxwFHCRgP/iqqLdTaN/I1", - "lyuYXpJmSJPTatIPirIljnm6Yo5bwIoWsLoXOD+u259UI+Hx7gMKNRooQ2xji3vgZGh8vwF521voDfUm", - "Twes560P6xN6RJ8IvY/VQb+GfWZVemygZyqS8xvFDa2uxG2jNc5HtKgmxphcuWJJmE6QEziWNT4PRw+h", - "werqFcTGO+0a9q3vTFwrlZSwW+hsdC2mbeqXYgOtlkNiYUqgEpOuRFJW01oy5YQjlv3ZgeU0wxymCjNC", - "FdT3ME1MfjWOyDZ6Nh7kebvFKYicmjAX0YEwt30F3cBmdHNszH6dJD9ogThjL5okWejVSLlG2sxZZB3r", - "+z5SRqgmS7zQwYrGdbB+o3skus7hqUkwAt+AZCPXZigl+SY8X2KDMbNSaLZbgm7bpUw7oeVS/9E2HFqV", - "QrOqQj+FEfuYb2VshU9NI5j2rdYLzASaFsxbL9CK72dBXpzNZ27l7h+3MvfvUv/h/qmqEgtBV8vZfLZe", - "DD1B0wfd006GkyVSgcy6unJH4GxObEuCR+yuB+uN+gQHS6pV3ty+pxpFY7M9lW1of/iWl+XlTnrvw2F4", - "8AF/T15RiPAr7+fZcHLH7r3TcLCVeS4Sv//wPHeiYNGmxong/Mywfn0pSpgzrDB1wAf0KCfviwoxDXO9", - "Gl03msmG4qrIGdermtK0PcD6jqxgRAPilSh84tphwU8v2hH7qDUUTGmf8lAsfT7LsYo3x8v50e5VXrYU", - "eStCttl6Rih97pQkqHxRCiWzvPFnd/ep00StYlfkB341O2MvKbeWBl4QI9bCQqreXGf9mCR8C1j+PlB0", - "1mA3qhZ65k5RpzahQcrWgF4biVKS/5J1CxFjph7B2BhXIumri6SPgKFvh0UXsaiKVPZfCE+TKhheXb2D", - "Cg9WtzxQHL1RVU1RwxLcvv9eY9idY9g47IhlWGkQK5nxqhpjiEseLgLTR1fyOuhyKZ+WNUa8GdwSjdh+", - "OyaK7z00GKVa4UWmZLk/5GieYK/NXjiZaPR6aJLymjbix/hVRrWCpi0xsJk30QqRsIPIe5/ru0XpyTvX", - "m+wN0OEax/p2wpoSFSrju7A/9DHJLHpbPSiZUWmb0i2c+JOGLNyfgWPJgqre1G2U1JV8zv4ArbxS2wzl", - "DkRrkfflEnwe6bNEp6YAlRl06095YmEvWvwB6XC0UN7V1bsdH0gZCNMd5Ivb1To8iuPvR0ouxTgOD3S+", - "1tIdK6bRjAc2to30HL7D8QL3NapTE3uWEZNpCq/QbvvaU0gsfDtS7ukgNpcHsXlg/E6mum3QIilNe5p9", - "eq2TcgJuw45Tj1Q06XhkZFt5bzj1lMPfuCxMIo2gSd+VOMKsB8hj/AGfc/JNfU5P904rM17wCvCdMc9C", - "0gUPDJTLwM3Ci2B4s44pzd1MdK9teHWvVTaPMo8I4nFPBxj1c2jzP/qLOVHygUZoPSqcrBneQBMi44lr", - "D6OnUYhf+2n/eFw9x6xVXRZUQGeDOStbHTOBHV8or5EL28KF5DyCvh5xaLeJZog3m7GXbmRebvneBINu", - "S1njw4VdpTI7CWNinNSWrNDpvdE5OadDLioB0jaePjFeHJGPm0HTA3tzquM6lG1T3DRWC+/uz9uKk90n", - "uvBC56vq8eiGnvtt5mXXXEADB5O1a/NtGDusqEFpdKEdT2SSqjvabOkRpte+Zx9keFFmnBNZXdOR2F0z", - "3zirWy+yQ5fhesELys4VrsNQo9MfWzK978iHQaubNmRB4h6rNKWsF9mkWJ5uAjGfZWisqMp6YTywFwBF", - "B/n0TuB6NiJdqCLkNI7BC8Jn5kpe2fNzhpZItDmffeQkjxGmov1rd+QI7fn3+8OERxbfU6mOehHJ0TTj", - "9CaV7Ia8jzwcStfIIfM119cdivMXhR/AkZtmvVE78m2U9sJASenCe1H3YzFhBkr/3BblhcMwh+bxy8e4", - "FOwtl4XasO9Dwr1Hv779/jHTYOrSBgYXqg84xuch+bglf0YXXumlX/lFFB/WLF9I/+q3EsbqhNH8wVeF", - "eZmPudi5RktjWz87cqqglMyDFAjC38BpEQgnvIZ9VoiyHiVk1+q66CbFNpjjDc02mDl/wW2O/lsDEMyB", - "qY944bg2JS0VXXHuutJpBwaX609MZ5aqd34+NQI6osYGF4DD3NO/Lp7KPn034p9+ptvpJqSatIFBUbJ+", - "h89QtKwndN5Jwo+moMhEJ/kaXzm4FfS7TtRtYW7Z+EJHj1hHnay746UdrYOMj5NgcVIxlPbdhCh5+rul", - "lcqxf+ELipeR4L2sZWF6W9iExx/yETgod3uxO7Q56G4wJpBOlUI7YeJdSFDQ8WFWbYYAY1QuWkcRrAdN", - "lZ9/luXeJ47tV91qtxLFQp8fpx+jvxK5Txp5qlfDq9D3/Xy2qUsrbjnO69CX3CzS16FY+atQFlwXDIqn", - "X331xV8/XqrR9xMx/Cra4KELml+Wt3BzK/KuDtWsbgITC6g8W6khyxp96NWr9t2redhNJVef/j6LgIwn", - "ewhGfu/EtNh3sg0rpzKWVrQ/zd1va27WLeukR5+mhrXkzPOrvmcqRtRFj8wPnHDBE3Z2J+eh3vEYYxzt", - "IfkUzkbMHokeprLE1xEnGaxw45dINn9HLyHMGPe6KsHJdi0PHE0cFVBDV36Y80KsBkcnHi+969gAnXqU", - "k0Qod7oTJluJC41TLVS38GAf7M9FDFcqE+Rag3EQpT3E1jqZW+dQxtk212ei9slJuL3o7WkvFw/u26iE", - "W11/pJRNh2jg08hbknYWPCwyj2UfYVNCUZv0a/20a+PSc5QH+RDpj2YY7urP03P4tAasjn/emAulqYIT", - "5WUULB3npGMvifxbz1uUYyVlaPJJJsnxwBfp6e7X3ZNQvMcolqWifB7S8ty25T9mz/1IM1+If7a2tjLP", - "zs+32+1ZmOYsV5vzFcb1ZVbV+fo8DISJUzvJAn0XX6HSXbvl3orcsOdvXqKQLGwJGNSDqItSSD+bPT17", - "QslGQfJKzJ7Nvjx7cvYFHZE10sU5JfZ2/11RKI6jGpSEXxaYdOEa4tTg7o6h5N/Y/emTJ2EbvJoYPY2f", - "/9MQQ5v2Wh9Pg5vc3YhH+Jb7mHYI65wOKegXeS3VVrLvtFbEIE292XC9x5h/W2tp2NMnT5hY+oTmlOqG", - "OzHt3Yxi0Ge/uX7nN0/PIx/F3i/nfwb3IFG8P/L5nFeVySLnhaPtgwfIwVaJuNXpfSbN0CsSHdqm54t+", - "Pf+z6x7xfmKz8wVWc5raFKZOf+5jUULb/uLx7/M/w7PG+wOfzn0ilkPdR/aNKsKd/0ku/mSqiKZKd+qw", - "/T/tzkOHFl3tjvns2bs/e3wGdnxTlYAsZvb+t4a8Gw7lyfz9vPmlVOq6ruJfDHCdr7H7LlNarIR05Lvl", - "qxXorMdg/n8AAAD//wyLHMD35wAA", + "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", + "/P8AAAD//+g1BUr15wAA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/common/types.go b/api/generated/common/types.go index dc19fdeaa..f62c6d78a 100644 --- a/api/generated/common/types.go +++ b/api/generated/common/types.go @@ -847,11 +847,11 @@ type Transaction struct { // Group \[grp\] Base64 encoded byte array of a sha512/256 digest. When present indicates that this transaction is part of a transaction group and the value is the sha512/256 hash of the transactions in that group. Group *[]byte `json:"group,omitempty"` - // HeartBeatTransaction Fields for a heartbeat transaction. + // HeartbeatTransaction Fields for a heartbeat transaction. // // Definition: - // data/transactions/heartbeat.go : HeartBeatTxnFields - HeartBeatTransaction *TransactionHeartBeat `json:"heart-beat-transaction,omitempty"` + // data/transactions/heartbeat.go : HeartbeatTxnFields + HeartbeatTransaction *TransactionHeartbeat `json:"heartbeat-transaction,omitempty"` // Id Transaction ID Id *string `json:"id,omitempty"` @@ -923,7 +923,7 @@ type Transaction struct { // * \[afrz\] asset-freeze-transaction // * \[appl\] application-transaction // * \[stpf\] state-proof-transaction - // * \[hb\] heart-beat-transaction + // * \[hb\] heartbeat-transaction TxType TransactionTxType `json:"tx-type"` } @@ -937,7 +937,7 @@ type Transaction struct { // * \[afrz\] asset-freeze-transaction // * \[appl\] application-transaction // * \[stpf\] state-proof-transaction -// * \[hb\] heart-beat-transaction +// * \[hb\] heartbeat-transaction type TransactionTxType string // TransactionApplication Fields for application transactions. @@ -1047,11 +1047,11 @@ type TransactionAssetTransfer struct { Sender *string `json:"sender,omitempty"` } -// TransactionHeartBeat Fields for a heartbeat transaction. +// TransactionHeartbeat Fields for a heartbeat transaction. // // Definition: -// data/transactions/heartbeat.go : HeartBeatTxnFields -type TransactionHeartBeat struct { +// data/transactions/heartbeat.go : HeartbeatTxnFields +type TransactionHeartbeat struct { // HbAddress \[hbad\] HbAddress is the account this txn is proving onlineness for. HbAddress string `json:"hb-address"` diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index f9e87cec8..58e7e67a0 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1354,93 +1354,93 @@ var swaggerSpec = []string{ "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", + "2ZkR5icnjycf/08AAAD//2KBnx2YhQEA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index d33b0464a..d420ed22e 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -938,11 +938,11 @@ type Transaction struct { // Group \[grp\] Base64 encoded byte array of a sha512/256 digest. When present indicates that this transaction is part of a transaction group and the value is the sha512/256 hash of the transactions in that group. Group *[]byte `json:"group,omitempty"` - // HeartBeatTransaction Fields for a heartbeat transaction. + // HeartbeatTransaction Fields for a heartbeat transaction. // // Definition: - // data/transactions/heartbeat.go : HeartBeatTxnFields - HeartBeatTransaction *TransactionHeartBeat `json:"heart-beat-transaction,omitempty"` + // data/transactions/heartbeat.go : HeartbeatTxnFields + HeartbeatTransaction *TransactionHeartbeat `json:"heartbeat-transaction,omitempty"` // Id Transaction ID Id *string `json:"id,omitempty"` @@ -1014,7 +1014,7 @@ type Transaction struct { // * \[afrz\] asset-freeze-transaction // * \[appl\] application-transaction // * \[stpf\] state-proof-transaction - // * \[hb\] heart-beat-transaction + // * \[hb\] heartbeat-transaction TxType TransactionTxType `json:"tx-type"` } @@ -1028,7 +1028,7 @@ type Transaction struct { // * \[afrz\] asset-freeze-transaction // * \[appl\] application-transaction // * \[stpf\] state-proof-transaction -// * \[hb\] heart-beat-transaction +// * \[hb\] heartbeat-transaction type TransactionTxType string // TransactionApplication Fields for application transactions. @@ -1138,11 +1138,11 @@ type TransactionAssetTransfer struct { Sender *string `json:"sender,omitempty"` } -// TransactionHeartBeat Fields for a heartbeat transaction. +// TransactionHeartbeat Fields for a heartbeat transaction. // // Definition: -// data/transactions/heartbeat.go : HeartBeatTxnFields -type TransactionHeartBeat struct { +// data/transactions/heartbeat.go : HeartbeatTxnFields +type TransactionHeartbeat struct { // HbAddress \[hbad\] HbAddress is the account this txn is proving onlineness for. HbAddress string `json:"hb-address"` diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index a266975a0..a53d4217c 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -1994,7 +1994,7 @@ "keyreg-transaction", "payment-transaction", "state-proof-transaction", - "heart-beat-transaction" + "heartbeat-transaction" ], "properties": { "application-transaction": { @@ -2012,8 +2012,8 @@ "state-proof-transaction": { "$ref": "#/definitions/TransactionStateProof" }, - "heart-beat-transaction": { - "$ref": "#/definitions/TransactionHeartBeat" + "heartbeat-transaction": { + "$ref": "#/definitions/TransactionHeartbeat" }, "auth-addr": { "description": "\\[sgnr\\] this is included with signed transactions when the signing address does not equal the sender. The backend can use this to ensure that auth addr is equal to the accounts auth addr.", @@ -2115,7 +2115,7 @@ "$ref": "#/definitions/TransactionSignature" }, "tx-type": { - "description": "\\[type\\] Indicates what type of transaction this is. Different types have different fields.\n\nValid types, and where their fields are stored:\n* \\[pay\\] payment-transaction\n* \\[keyreg\\] keyreg-transaction\n* \\[acfg\\] asset-config-transaction\n* \\[axfer\\] asset-transfer-transaction\n* \\[afrz\\] asset-freeze-transaction\n* \\[appl\\] application-transaction\n* \\[stpf\\] state-proof-transaction\n* \\[hb\\] heart-beat-transaction", + "description": "\\[type\\] Indicates what type of transaction this is. Different types have different fields.\n\nValid types, and where their fields are stored:\n* \\[pay\\] payment-transaction\n* \\[keyreg\\] keyreg-transaction\n* \\[acfg\\] asset-config-transaction\n* \\[axfer\\] asset-transfer-transaction\n* \\[afrz\\] asset-freeze-transaction\n* \\[appl\\] application-transaction\n* \\[stpf\\] state-proof-transaction\n* \\[hb\\] heartbeat-transaction", "type": "string", "enum": [ "pay", @@ -2283,8 +2283,8 @@ } } }, - "TransactionHeartBeat": { - "description": "Fields for a heartbeat transaction.\n\nDefinition:\ndata/transactions/heartbeat.go : HeartBeatTxnFields", + "TransactionHeartbeat": { + "description": "Fields for a heartbeat transaction.\n\nDefinition:\ndata/transactions/heartbeat.go : HeartbeatTxnFields", "type": "object", "required": [ "hb-address", diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index da8102d14..10c43aad5 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -1977,8 +1977,8 @@ "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string" }, - "heart-beat-transaction": { - "$ref": "#/components/schemas/TransactionHeartBeat" + "heartbeat-transaction": { + "$ref": "#/components/schemas/TransactionHeartbeat" }, "id": { "description": "Transaction ID", @@ -2061,7 +2061,7 @@ "$ref": "#/components/schemas/TransactionStateProof" }, "tx-type": { - "description": "\\[type\\] Indicates what type of transaction this is. Different types have different fields.\n\nValid types, and where their fields are stored:\n* \\[pay\\] payment-transaction\n* \\[keyreg\\] keyreg-transaction\n* \\[acfg\\] asset-config-transaction\n* \\[axfer\\] asset-transfer-transaction\n* \\[afrz\\] asset-freeze-transaction\n* \\[appl\\] application-transaction\n* \\[stpf\\] state-proof-transaction\n* \\[hb\\] heart-beat-transaction", + "description": "\\[type\\] Indicates what type of transaction this is. Different types have different fields.\n\nValid types, and where their fields are stored:\n* \\[pay\\] payment-transaction\n* \\[keyreg\\] keyreg-transaction\n* \\[acfg\\] asset-config-transaction\n* \\[axfer\\] asset-transfer-transaction\n* \\[afrz\\] asset-freeze-transaction\n* \\[appl\\] application-transaction\n* \\[stpf\\] state-proof-transaction\n* \\[hb\\] heartbeat-transaction", "enum": [ "pay", "keyreg", @@ -2228,8 +2228,8 @@ ], "type": "object" }, - "TransactionHeartBeat": { - "description": "Fields for a heartbeat transaction.\n\nDefinition:\ndata/transactions/heartbeat.go : HeartBeatTxnFields", + "TransactionHeartbeat": { + "description": "Fields for a heartbeat transaction.\n\nDefinition:\ndata/transactions/heartbeat.go : HeartbeatTxnFields", "properties": { "hb-address": { "description": "\\[hbad\\] HbAddress is the account this txn is proving onlineness for.", diff --git a/idb/postgres/internal/writer/write_txn.go b/idb/postgres/internal/writer/write_txn.go index 4ee769839..97f819fbe 100644 --- a/idb/postgres/internal/writer/write_txn.go +++ b/idb/postgres/internal/writer/write_txn.go @@ -171,7 +171,6 @@ func yieldTransactions(ctx context.Context, block *types.Block, modifiedTxns []t return fmt.Errorf("yieldTransactions() ProposerPayout ctx.Err(): %w", ctx.Err()) case outCh <- row: } - intra++ } return nil diff --git a/idb/postgres/internal/writer/write_txn_participation.go b/idb/postgres/internal/writer/write_txn_participation.go index 38b5add50..d458d8548 100644 --- a/idb/postgres/internal/writer/write_txn_participation.go +++ b/idb/postgres/internal/writer/write_txn_participation.go @@ -131,7 +131,6 @@ func AddTransactionParticipation(block *types.Block, tx pgx.Tx) error { for j := range participants { rows = append(rows, []interface{}{participants[j][:], uint64(block.Round), next}) } - next++ } _, err := tx.CopyFrom( From 2749e86afa9e8ef198611a5d6a3703ce5f2ebca1 Mon Sep 17 00:00:00 2001 From: Gary Malouf <982483+gmalouf@users.noreply.github.com> Date: Wed, 11 Dec 2024 15:24:59 -0500 Subject: [PATCH 5/7] Sync API with updated HeartbeatTxnFields. --- api/converter_utils.go | 6 +- api/generated/common/routes.go | 379 +++++++++++++-------------- api/generated/common/types.go | 9 +- api/generated/v2/routes.go | 457 +++++++++++++++++---------------- api/generated/v2/types.go | 9 +- api/indexer.oas2.json | 16 +- api/indexer.oas3.yml | 17 +- go.mod | 2 +- go.sum | 4 +- 9 files changed, 469 insertions(+), 430 deletions(-) diff --git a/api/converter_utils.go b/api/converter_utils.go index 4327102e2..363f23054 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -513,7 +513,8 @@ func signedTxnWithAdToTransaction(stxn *sdk.SignedTxnWithAD, extra rowData) (gen case sdk.HeartbeatTx: hb := stxn.Txn.HeartbeatTxnFields hbTxn := generated.TransactionHeartbeat{ - HbAddress: hb.HbAddress.String(), + HbAddress: hb.HbAddress.String(), + HbKeyDilution: hb.HbKeyDilution, HbProof: generated.HbProofFields{ HbPk: byteSliceOmitZeroPtr(hb.HbProof.PK[:]), HbPk1sig: byteSliceOmitZeroPtr(hb.HbProof.PK1Sig[:]), @@ -521,7 +522,8 @@ func signedTxnWithAdToTransaction(stxn *sdk.SignedTxnWithAD, extra rowData) (gen HbPk2sig: byteSliceOmitZeroPtr(hb.HbProof.PK2Sig[:]), HbSig: byteSliceOmitZeroPtr(hb.HbProof.Sig[:]), }, - HbSeed: hb.HbSeed[:], + HbSeed: hb.HbSeed[:], + HbVoteId: hb.HbVoteID[:], } heartbeat = &hbTxn } diff --git a/api/generated/common/routes.go b/api/generated/common/routes.go index ebe0c71e8..51cc9f329 100644 --- a/api/generated/common/routes.go +++ b/api/generated/common/routes.go @@ -72,195 +72,196 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "/P8AAAD//+g1BUr15wAA", + "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", + "/wcAAP//8MmPm3npAAA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/common/types.go b/api/generated/common/types.go index f62c6d78a..bad64dc09 100644 --- a/api/generated/common/types.go +++ b/api/generated/common/types.go @@ -1055,12 +1055,17 @@ type TransactionHeartbeat struct { // HbAddress \[hbad\] HbAddress is the account this txn is proving onlineness for. HbAddress string `json:"hb-address"` + // HbKeyDilution \[hbkd\] HbKeyDilution must match HbAddress account's current KeyDilution. + HbKeyDilution uint64 `json:"hb-key-dilution"` + // HbProof \[hbprf\] HbProof is a signature using HeartbeatAddress's partkey, thereby showing it is online. HbProof HbProofFields `json:"hb-proof"` - // HbSeed \[hbsd\] HbSeed must be the block seed for the block before this transaction's - // // firstValid.. + // HbSeed \[hbsd\] HbSeed must be the block seed for the this transaction's firstValid block. HbSeed []byte `json:"hb-seed"` + + // HbVoteId \[hbvid\] HbVoteID must match the HbAddress account's current VoteID. + HbVoteId []byte `json:"hb-vote-id"` } // TransactionKeyreg Fields for a keyreg transaction. diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index 58e7e67a0..6865f9770 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1212,235 +1212,236 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "2ZkR5icnjycf/08AAAD//2KBnx2YhQEA", + "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", + "KrMzI8xPTh5PPv2/AAAA//+qYl2PHIcBAA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index d420ed22e..0dab439b5 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -1146,12 +1146,17 @@ type TransactionHeartbeat struct { // HbAddress \[hbad\] HbAddress is the account this txn is proving onlineness for. HbAddress string `json:"hb-address"` + // HbKeyDilution \[hbkd\] HbKeyDilution must match HbAddress account's current KeyDilution. + HbKeyDilution uint64 `json:"hb-key-dilution"` + // HbProof \[hbprf\] HbProof is a signature using HeartbeatAddress's partkey, thereby showing it is online. HbProof HbProofFields `json:"hb-proof"` - // HbSeed \[hbsd\] HbSeed must be the block seed for the block before this transaction's - // // firstValid.. + // HbSeed \[hbsd\] HbSeed must be the block seed for the this transaction's firstValid block. HbSeed []byte `json:"hb-seed"` + + // HbVoteId \[hbvid\] HbVoteID must match the HbAddress account's current VoteID. + HbVoteId []byte `json:"hb-vote-id"` } // TransactionKeyreg Fields for a keyreg transaction. diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index a53d4217c..5cf410bb0 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -2289,7 +2289,9 @@ "required": [ "hb-address", "hb-proof", - "hb-seed" + "hb-seed", + "hb-vote-id", + "hb-key-dilution" ], "properties": { "hb-address": { @@ -2300,9 +2302,19 @@ "$ref": "#/definitions/HbProofFields" }, "hb-seed": { - "description": "\\[hbsd\\] HbSeed must be the block seed for the block before this transaction's\n\t// firstValid..", + "description": "\\[hbsd\\] HbSeed must be the block seed for the this transaction's firstValid block.", "type": "string", "format": "byte" + }, + "hb-vote-id": { + "description": "\\[hbvid\\] HbVoteID must match the HbAddress account's current VoteID.", + "type": "string", + "format": "byte" + }, + "hb-key-dilution": { + "description": "\\[hbkd\\] HbKeyDilution must match HbAddress account's current KeyDilution.", + "type": "integer", + "x-algorand-format": "uint64" } } }, diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index 10c43aad5..9654e5027 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -2235,11 +2235,22 @@ "description": "\\[hbad\\] HbAddress is the account this txn is proving onlineness for.", "type": "string" }, + "hb-key-dilution": { + "description": "\\[hbkd\\] HbKeyDilution must match HbAddress account's current KeyDilution.", + "type": "integer", + "x-algorand-format": "uint64" + }, "hb-proof": { "$ref": "#/components/schemas/HbProofFields" }, "hb-seed": { - "description": "\\[hbsd\\] HbSeed must be the block seed for the block before this transaction's\n\t// firstValid..", + "description": "\\[hbsd\\] HbSeed must be the block seed for the this transaction's firstValid block.", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + }, + "hb-vote-id": { + "description": "\\[hbvid\\] HbVoteID must match the HbAddress account's current VoteID.", "format": "byte", "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string" @@ -2247,8 +2258,10 @@ }, "required": [ "hb-address", + "hb-key-dilution", "hb-proof", - "hb-seed" + "hb-seed", + "hb-vote-id" ], "type": "object" }, diff --git a/go.mod b/go.mod index df840f9ab..c2039dbd6 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.23.3 require ( github.com/algorand/avm-abi v0.2.0 - github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241127164804-625a18def941 + github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241211195928-f2700fd860bb github.com/algorand/go-codec/codec v1.1.10 github.com/algorand/oapi-codegen v1.12.0-algorand.0 github.com/davecgh/go-spew v1.1.1 diff --git a/go.sum b/go.sum index 4589c5a07..ea7f62ce5 100644 --- a/go.sum +++ b/go.sum @@ -62,8 +62,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/algorand/avm-abi v0.2.0 h1:bkjsG+BOEcxUcnGSALLosmltE0JZdg+ZisXKx0UDX2k= github.com/algorand/avm-abi v0.2.0/go.mod h1:+CgwM46dithy850bpTeHh9MC99zpn2Snirb3QTl2O/g= -github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241127164804-625a18def941 h1:ApRVtpHa4FCd3xt3LUGZNjbuXHUvyOruNPPe9HWyMWU= -github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241127164804-625a18def941/go.mod h1:BkHnK2PuCqzdGPNeWUo5yo6lRjyDZ9QoMN8GIjfijrA= +github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241211195928-f2700fd860bb h1:p8QGl1ExZ+axyBM1mdxJM4TFbyBmZKpRO4YHoRvj7NQ= +github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241211195928-f2700fd860bb/go.mod h1:BkHnK2PuCqzdGPNeWUo5yo6lRjyDZ9QoMN8GIjfijrA= github.com/algorand/go-codec/codec v1.1.10 h1:zmWYU1cp64jQVTOG8Tw8wa+k0VfwgXIPbnDfiVa+5QA= github.com/algorand/go-codec/codec v1.1.10/go.mod h1:YkEx5nmr/zuCeaDYOIhlDg92Lxju8tj2d2NrYqP7g7k= github.com/algorand/oapi-codegen v1.12.0-algorand.0 h1:W9PvED+wAJc+9EeXPONnA+0zE9UhynEqoDs4OgAxKhk= From 08d52e412ba223aaf1844912b01266d1aba568eb Mon Sep 17 00:00:00 2001 From: Gary Malouf <982483+gmalouf@users.noreply.github.com> Date: Wed, 18 Dec 2024 13:54:45 -0500 Subject: [PATCH 6/7] Re-sync heartbeat transaction fields type via go-algorand-sdk. --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c2039dbd6..ae1dad210 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.23.3 require ( github.com/algorand/avm-abi v0.2.0 - github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241211195928-f2700fd860bb + github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241218172950-9e912fc0e75e github.com/algorand/go-codec/codec v1.1.10 github.com/algorand/oapi-codegen v1.12.0-algorand.0 github.com/davecgh/go-spew v1.1.1 diff --git a/go.sum b/go.sum index ea7f62ce5..09b8c220c 100644 --- a/go.sum +++ b/go.sum @@ -62,8 +62,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/algorand/avm-abi v0.2.0 h1:bkjsG+BOEcxUcnGSALLosmltE0JZdg+ZisXKx0UDX2k= github.com/algorand/avm-abi v0.2.0/go.mod h1:+CgwM46dithy850bpTeHh9MC99zpn2Snirb3QTl2O/g= -github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241211195928-f2700fd860bb h1:p8QGl1ExZ+axyBM1mdxJM4TFbyBmZKpRO4YHoRvj7NQ= -github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241211195928-f2700fd860bb/go.mod h1:BkHnK2PuCqzdGPNeWUo5yo6lRjyDZ9QoMN8GIjfijrA= +github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241218172950-9e912fc0e75e h1:/B6Ni7zkLTIo4fNZupwqEGlirfa3mqt0hQrBbGCNMEA= +github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241218172950-9e912fc0e75e/go.mod h1:BkHnK2PuCqzdGPNeWUo5yo6lRjyDZ9QoMN8GIjfijrA= github.com/algorand/go-codec/codec v1.1.10 h1:zmWYU1cp64jQVTOG8Tw8wa+k0VfwgXIPbnDfiVa+5QA= github.com/algorand/go-codec/codec v1.1.10/go.mod h1:YkEx5nmr/zuCeaDYOIhlDg92Lxju8tj2d2NrYqP7g7k= github.com/algorand/oapi-codegen v1.12.0-algorand.0 h1:W9PvED+wAJc+9EeXPONnA+0zE9UhynEqoDs4OgAxKhk= From 45d5dc1c3dce5d13adef6cd1332aed60e5ccfad7 Mon Sep 17 00:00:00 2001 From: Gary Malouf <982483+gmalouf@users.noreply.github.com> Date: Fri, 20 Dec 2024 14:47:03 -0500 Subject: [PATCH 7/7] Bump to latest develop go-algorand-sdk, introduce transaction fetch API test case for heartbeats. --- api/handlers_test.go | 13 +++++++++++-- api/test_resources/heartbeat.response | 2 ++ api/test_resources/heartbeat.txn | Bin 0 -> 502 bytes go.mod | 2 +- go.sum | 4 ++-- 5 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 api/test_resources/heartbeat.response create mode 100644 api/test_resources/heartbeat.txn diff --git a/api/handlers_test.go b/api/handlers_test.go index a64aa31e0..f98321d86 100644 --- a/api/handlers_test.go +++ b/api/handlers_test.go @@ -643,6 +643,15 @@ func TestFetchTransactions(t *testing.T) { loadTransactionFromFile("test_resources/state_proof_with_index.response"), }, }, + { + name: "Heartbeat Txn", + txnBytes: [][]byte{ + loadResourceFileOrPanic("test_resources/heartbeat.txn"), + }, + response: []generated.Transaction{ + loadTransactionFromFile("test_resources/heartbeat.response"), + }, + }, } // use for the branch below and createTxn helper func to add a new test case @@ -655,8 +664,8 @@ func TestFetchTransactions(t *testing.T) { response []generated.Transaction created uint64 }{ - name: "State Proof Txn", - txnBytes: [][]byte{loadResourceFileOrPanic("test_resources/state_proof.txn")}, + name: "HeartBeat Txn", + txnBytes: [][]byte{loadResourceFileOrPanic("test_resources/heartbeat.txn")}, }) } for _, test := range tests { diff --git a/api/test_resources/heartbeat.response b/api/test_resources/heartbeat.response new file mode 100644 index 000000000..5e3840863 --- /dev/null +++ b/api/test_resources/heartbeat.response @@ -0,0 +1,2 @@ +{"close-rewards":0,"closing-amount":0,"confirmed-round":1,"fee":0,"first-valid":106,"genesis-hash":"OW4MK52kEQKHteDrbndB7aFjdP9JvNlI9HYefg2WbDg=","heartbeat-transaction":{"hb-address":"RI53WA75QRYLN64GMKBALH35SDFPEJDW5QMTYU3H2F36DBVAHPDN3FF4YA","hb-key-dilution":100,"hb-proof":{"hb-pk":"xcOVoARNqc58zm7KQrbrSunoTMH+56ISf2BLPX4k5DM=","hb-pk1sig":"KwZl8nfA0linTL+quZ1UF3u0ac0y44nKNvjaUOia8sWGedTWiDr3tElqWTdICVVpvCzn2hIweDaWM1QqREV2BA==","hb-pk2":"ORrVitDsfmg/tlsfRIWu35InLVNSLCNWHPf9cxAz4r0=","hb-pk2sig":"gBcItYg/otjdd3kj0cPKkj6JO+CBeEgjBJ+NGLX4j3kU6u1d8+B8f2hytjkNwmja4w04JZaPzQpP5R8kgqgjDA==","hb-sig":"NvPZHly6M+neFgSXwzsYiL3gav4easw+Nmavp1q/GwWwLIOCX3W7jBzilLHypGymkso/M1RNzUq3O8yMdPA8Cw=="},"hb-seed":"mFwjFbENs+K/0c/ebAMSH2LGcn2YMdJ6gTyo6XF9lfQ=","hb-vote-id":"onzbcE5b1QBnQcWrWWC2g/hE3Wea737jMaap7CSx4ss="},"id":"RCV4LKXW34V6767SD4DBNSE4U4PRBDYKR6NVHZ54FFRVYWDNJV7Q","intra-round-offset":2,"last-valid":116,"receiver-rewards":0,"round-time":1734723734,"sender":"GAU5WA6DT2EPFS6LKOA333BQP67NXIHZ7JPOOHMZWJDPZRL4XMHDDDUCKA","sender-rewards":0,"signature":{},"tx-type":"hb"} + diff --git a/api/test_resources/heartbeat.txn b/api/test_resources/heartbeat.txn new file mode 100644 index 0000000000000000000000000000000000000000..c2070003715cfa97b61a6bbe64c0858f1b901f10 GIT binary patch literal 502 zcmVJX2@Ucj1PhJI11GWMrdoa%P30 zaKs?R!=b{pSU`suIB;+%ra4~blKr04i@^`?}Sf@*J;|(|^mXFN}PvsvZ zf~X@5p>xDQHuKpYT)H#q-WCLx!#fy=z2Iv89%{@!HfFD!*?bnrY2qH|=#AedYu6|oJo;=j?)-fROBA7aLGeV8%QdVxHs z>2ZCP^rLoZWW*q%eA{qNTh#z(LB*?CV77z!MBQha?|$Pkrm5^CvEs|3Y<6^`b8ckB sATTN01H+z(^2^IpfxYZ7f4aAl%sVm|Bq`2YX_ literal 0 HcmV?d00001 diff --git a/go.mod b/go.mod index ae1dad210..dd5e53b6a 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.23.3 require ( github.com/algorand/avm-abi v0.2.0 - github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241218172950-9e912fc0e75e + github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241220043854-72370807aa70 github.com/algorand/go-codec/codec v1.1.10 github.com/algorand/oapi-codegen v1.12.0-algorand.0 github.com/davecgh/go-spew v1.1.1 diff --git a/go.sum b/go.sum index 09b8c220c..fb7e2ce75 100644 --- a/go.sum +++ b/go.sum @@ -62,8 +62,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/algorand/avm-abi v0.2.0 h1:bkjsG+BOEcxUcnGSALLosmltE0JZdg+ZisXKx0UDX2k= github.com/algorand/avm-abi v0.2.0/go.mod h1:+CgwM46dithy850bpTeHh9MC99zpn2Snirb3QTl2O/g= -github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241218172950-9e912fc0e75e h1:/B6Ni7zkLTIo4fNZupwqEGlirfa3mqt0hQrBbGCNMEA= -github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241218172950-9e912fc0e75e/go.mod h1:BkHnK2PuCqzdGPNeWUo5yo6lRjyDZ9QoMN8GIjfijrA= +github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241220043854-72370807aa70 h1:nCVMHFT4U9VEC9Znsz4JVNsSFuhIpvpZidfnMtIcYJg= +github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20241220043854-72370807aa70/go.mod h1:BkHnK2PuCqzdGPNeWUo5yo6lRjyDZ9QoMN8GIjfijrA= github.com/algorand/go-codec/codec v1.1.10 h1:zmWYU1cp64jQVTOG8Tw8wa+k0VfwgXIPbnDfiVa+5QA= github.com/algorand/go-codec/codec v1.1.10/go.mod h1:YkEx5nmr/zuCeaDYOIhlDg92Lxju8tj2d2NrYqP7g7k= github.com/algorand/oapi-codegen v1.12.0-algorand.0 h1:W9PvED+wAJc+9EeXPONnA+0zE9UhynEqoDs4OgAxKhk=