xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
xrpld
rpc
handlers
ChannelVerify.cpp
1
#include <xrpld/rpc/Context.h>
2
#include <xrpld/rpc/detail/RPCHelpers.h>
3
4
#include <xrpl/basics/Slice.h>
5
#include <xrpl/basics/StringUtilities.h>
6
#include <xrpl/basics/base_uint.h>
7
#include <xrpl/json/json_value.h>
8
#include <xrpl/protocol/ErrorCodes.h>
9
#include <xrpl/protocol/PayChan.h>
10
#include <xrpl/protocol/PublicKey.h>
11
#include <xrpl/protocol/RPCErr.h>
12
#include <xrpl/protocol/Serializer.h>
13
#include <xrpl/protocol/XRPAmount.h>
14
#include <xrpl/protocol/jss.h>
15
#include <xrpl/protocol/tokens.h>
16
#include <xrpl/resource/Fees.h>
17
18
#include <
cstdint
>
19
#include <
optional
>
20
#include <
string
>
21
22
namespace
xrpl
{
23
24
// {
25
// public_key: <public_key>
26
// channel_id: 256-bit channel id
27
// drops: 64-bit uint (as string)
28
// signature: signature to verify
29
// }
30
json::Value
31
doChannelVerify
(
rpc::JsonContext
& context)
32
{
33
auto
const
& params(context.
params
);
34
for
(
auto
const
& p : {jss::public_key, jss::channel_id, jss::amount, jss::signature})
35
{
36
if
(!params.isMember(p))
37
return
rpc::missingFieldError
(p);
38
}
39
40
context.
loadType
=
resource::kFeeHeavyBurdenRpc
;
41
42
std::optional<PublicKey>
pk;
43
{
44
std::string
const
strPk = params[jss::public_key].asString();
45
pk =
parseBase58<PublicKey>
(
TokenType::AccountPublic
, strPk);
46
47
if
(!pk)
48
{
49
auto
pkHex =
strUnHex
(strPk);
50
if
(!pkHex)
51
return
rpcError
(
RpcPublicMalformed
);
52
auto
const
pkType =
publicKeyType
(
makeSlice
(*pkHex));
53
if
(!pkType)
54
return
rpcError
(
RpcPublicMalformed
);
55
pk.
emplace
(
makeSlice
(*pkHex));
56
}
57
}
58
59
if
(!params[jss::channel_id].isString())
60
return
rpcError
(
RpcInvalidParams
);
61
UInt256
channelId;
62
if
(!channelId.
parseHex
(params[jss::channel_id].asString()))
63
return
rpcError
(
RpcChannelMalformed
);
64
65
std::optional<std::uint64_t>
const
optDrops =
66
params[jss::amount].isString() ?
toUInt64
(params[jss::amount].asString()) : std::nullopt;
67
68
if
(!optDrops)
69
return
rpcError
(
RpcChannelAmtMalformed
);
70
71
std::uint64_t
const
drops = *optDrops;
72
73
if
(!params[jss::signature].isString())
74
return
rpcError
(
RpcInvalidParams
);
75
76
auto
sig =
strUnHex
(params[jss::signature].asString());
77
if
(!sig || sig->empty())
78
return
rpcError
(
RpcInvalidParams
);
79
80
Serializer
msg;
81
serializePayChanAuthorization
(msg, channelId,
XRPAmount
(drops));
82
83
json::Value
result;
84
result[jss::signature_verified] =
verify
(*pk, msg.
slice
(),
makeSlice
(*sig));
85
return
result;
86
}
87
88
}
// namespace xrpl
std::string
json::Value
Represents a JSON value.
Definition
json_value.h:117
xrpl::BaseUInt::parseHex
constexpr bool parseHex(std::string_view sv)
Parse a hex string into a base_uint.
Definition
base_uint.h:525
xrpl::Serializer
Definition
Serializer.h:23
xrpl::Serializer::slice
Slice slice() const noexcept
Definition
Serializer.h:141
xrpl::XRPAmount
Definition
XRPAmount.h:28
cstdint
std::optional::emplace
T emplace(T... args)
std::uint64_t
xrpl::resource::kFeeHeavyBurdenRpc
Charge const kFeeHeavyBurdenRpc
xrpl::rpc::missingFieldError
json::Value missingFieldError(std::string const &name)
Definition
ErrorCodes.h:243
xrpl
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition
algorithm.h:5
xrpl::serializePayChanAuthorization
void serializePayChanAuthorization(Serializer &msg, UInt256 const &key, XRPAmount const &amt)
Definition
PayChan.h:11
xrpl::RpcChannelAmtMalformed
@ RpcChannelAmtMalformed
Definition
ErrorCodes.h:84
xrpl::RpcPublicMalformed
@ RpcPublicMalformed
Definition
ErrorCodes.h:100
xrpl::RpcInvalidParams
@ RpcInvalidParams
Definition
ErrorCodes.h:67
xrpl::RpcChannelMalformed
@ RpcChannelMalformed
Definition
ErrorCodes.h:83
xrpl::parseBase58
std::optional< AccountID > parseBase58(std::string const &s)
Parse AccountID from checked, base58 string.
Definition
AccountID.cpp:105
xrpl::verify
bool verify(PublicKey const &publicKey, Slice const &m, Slice const &sig) noexcept
Verify a signature on a message.
Definition
PublicKey.cpp:272
xrpl::publicKeyType
std::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
Definition
PublicKey.cpp:209
xrpl::makeSlice
Slice makeSlice(std::array< T, N > const &a)
Definition
Slice.h:228
xrpl::rpcError
json::Value rpcError(ErrorCodeI iError)
Definition
RPCErr.cpp:13
xrpl::UInt256
BaseUInt< 256 > UInt256
Definition
base_uint.h:580
xrpl::strUnHex
std::optional< Blob > strUnHex(std::size_t strSize, Iterator begin, Iterator end)
Definition
StringUtilities.h:64
xrpl::doChannelVerify
json::Value doChannelVerify(rpc::JsonContext &context)
Definition
ChannelVerify.cpp:31
xrpl::toUInt64
std::optional< std::uint64_t > toUInt64(std::string const &s)
Definition
libxrpl/basics/StringUtilities.cpp:136
xrpl::TokenType::AccountPublic
@ AccountPublic
Definition
tokens.h:24
optional
string
xrpl::rpc::Context::loadType
resource::Charge & loadType
Definition
Context.h:30
xrpl::rpc::JsonContext
Definition
Context.h:41
xrpl::rpc::JsonContext::params
json::Value params
Definition
Context.h:51
Generated by
1.17.0