service/tools/utxo/wallet_tool/cpp/utxo_client_tools.cpp (150 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include <glog/logging.h>
#include <google/protobuf/util/json_util.h>
#include "common/crypto/signature_utils.h"
#include "interface/utxo/utxo_client.h"
#include "platform/config/resdb_config_utils.h"
using google::protobuf::util::MessageToJsonString;
using resdb::GenerateResDBConfig;
using resdb::ResDBConfig;
using resdb::utxo::UTXO;
using resdb::utxo::UTXOClient;
using resdb::utxo::UTXOIn;
using resdb::utxo::UTXOOut;
void ShowUsage() {
printf(
"<cmd> -c <config> -m <caller address> -n <contract name> -p <contact "
"path> -a <params> \n");
exit(0);
}
void Transfer(UTXOClient* client, int64_t transaction_id,
const std::string& address,
const std::vector<std::string>& to_address,
const std::vector<int64_t>& values,
const std::string& private_key,
const std::vector<std::string>& to_pub_key) {
if (private_key.empty() || to_pub_key.empty()) {
printf("no private key or public key\n");
return;
}
UTXO utxo;
int64_t nonce = 0;
UTXOIn* in = utxo.add_in();
in->set_prev_id(transaction_id);
in->set_out_idx(0);
nonce += transaction_id;
for (size_t i = 0; i < to_address.size(); ++i) {
UTXOOut* out = utxo.add_out();
out->set_address(to_address[i]);
out->set_value(values[i]);
out->set_pub_key(to_pub_key[i]);
utxo.set_address(address);
utxo.set_sig(resdb::utils::ECDSASignString(
private_key, address + std::to_string(nonce)));
LOG(ERROR) << "transfer from:" << address << " to:" << to_address[i]
<< " value:" << values[i];
}
auto output = client->Transfer(utxo);
LOG(ERROR) << "execute result:\n" << output;
}
void GetList(UTXOClient* client, int64_t end_id, int num) {
std::vector<UTXO> list = client->GetList(end_id, num);
LOG(ERROR) << "get utxo:";
for (const UTXO& utxo : list) {
std::string str;
MessageToJsonString(utxo, &str);
printf("%s\n", str.c_str());
}
}
void GetWallet(UTXOClient* client, const std::string& address) {
int64_t ret = client->GetWallet(address);
LOG(ERROR) << "address:" << address << " get wallet value:" << ret;
}
std::vector<std::string> ParseString(std::string str) {
std::vector<std::string> ret;
while (true) {
size_t pos = str.find(",");
if (pos == std::string::npos) {
ret.push_back(str);
break;
}
ret.push_back(str.substr(0, pos));
str = str.substr(pos + 1);
}
return ret;
}
std::vector<int64_t> ParseValue(std::string str) {
std::vector<int64_t> ret;
while (true) {
size_t pos = str.find(",");
if (pos == std::string::npos) {
ret.push_back(strtoull(str.c_str(), NULL, 10));
break;
}
ret.push_back(strtoull(str.substr(0, pos).c_str(), NULL, 10));
str = str.substr(pos + 1);
}
return ret;
}
int main(int argc, char** argv) {
if (argc < 3) {
printf("-d <cmd> -c [config]\n");
return 0;
}
int64_t transaction_id = 0;
std::string address, to_address, params, contract_address, func_name,
private_key, to_pub_key;
int64_t end_id = 0;
int num = 10;
int c;
std::string cmd;
std::string value;
std::string client_config_file;
while ((c = getopt(argc, argv, "c:d:t:x:m:h:e:v:n:p:b:")) != -1) {
switch (c) {
case 'c':
client_config_file = optarg;
break;
case 'd':
address = optarg;
break;
case 't':
to_address = optarg;
break;
case 'x':
transaction_id = strtoull(optarg, NULL, 10);
break;
case 'm':
cmd = optarg;
break;
case 'e':
end_id = strtoull(optarg, NULL, 10);
break;
case 'n':
num = strtoull(optarg, NULL, 10);
break;
case 'v':
value = optarg;
break;
case 'p':
private_key = optarg;
break;
case 'b':
to_pub_key = optarg;
break;
case 'h':
ShowUsage();
break;
}
}
ResDBConfig config = GenerateResDBConfig(client_config_file);
config.SetClientTimeoutMs(100000);
UTXOClient client(config);
if (cmd == "transfer") {
Transfer(&client, transaction_id, address, ParseString(to_address),
ParseValue(value), private_key, ParseString(to_pub_key));
} else if (cmd == "list") {
GetList(&client, end_id, num);
} else if (cmd == "wallet") {
GetWallet(&client, to_address);
}
}