YPC  0.2.0
onchain_result.h
1 #pragma once
2 #include "ypc/common/endian.h"
3 #include "ypc/core_t/analyzer/helper/parser_type_traits.h"
4 #include "ypc/core_t/analyzer/var/data_hash_var.h"
5 #include "ypc/core_t/analyzer/var/enclave_hash_var.h"
6 #include "ypc/core_t/analyzer/var/encrypted_param_var.h"
7 #include "ypc/core_t/analyzer/var/request_key_var.h"
8 #include "ypc/core_t/analyzer/var/result_var.h"
9 #include "ypc/stbox/ebyte.h"
10 #include "ypc/stbox/stx_status.h"
11 
12 namespace ypc {
13 namespace internal {
14 template <typename Crypto>
15 class onchain_result : virtual public request_key_var<true>,
16  virtual public enclave_hash_var,
17  virtual public result_var,
18  virtual public encrypted_param_var,
19  virtual public data_hash_var {
20  typedef Crypto ecc;
22 
23 public:
24  uint32_t generate_result() {
25  auto status = ecc::encrypt_message_with_prefix(
26  request_key_var_t::m_pkey4v, result_var::m_result,
27  utc::crypto_prefix_arbitrary, m_encrypted_result_str);
28 
29  if (status != stbox::stx_status::success) {
30  LOG(ERROR) << "error for encrypt_message: "
31  << stbox::status_string(status);
32  return status;
33  }
34  stbox::bytes cost_gas_str(sizeof(m_cost_gas));
35  memcpy((uint8_t *)&cost_gas_str[0], (uint8_t *)&m_cost_gas,
36  sizeof(m_cost_gas));
37  ypc::utc::endian_swap(cost_gas_str);
38 
39  auto cost_msg =
40  m_encrypted_param + m_data_hash + m_enclave_hash + cost_gas_str;
41  status = ecc::sign_message(m_private_key, cost_msg, m_cost_signature_str);
42 
43  if (status != stbox::stx_status::success) {
44  LOG(ERROR) << "error for sign cost: " << status;
45  return status;
46  }
47 
48  auto msg = m_encrypted_param + m_data_hash + m_enclave_hash + cost_gas_str +
49  m_encrypted_result_str;
50  status = ecc::sign_message(m_private_key, msg, m_result_signature_str);
51  return static_cast<uint32_t>(status);
52  }
53 
54  uint32_t get_analyze_result_size() {
55  using ntt = nt<stbox::bytes>;
56  ntt::onchain_result_package_t pkg;
57  pkg.set<ntt::data_hash>(data_hash_var::m_data_hash);
58  pkg.set<ntt::encrypted_result>(m_encrypted_result_str);
59  pkg.set<ntt::result_signature>(m_result_signature_str);
60  pkg.set<ntt::cost_signature>(m_cost_signature_str);
61  ff::net::marshaler lm(ff::net::marshaler::length_retriver);
62  pkg.arch(lm);
63  return lm.get_length();
64  }
65  uint32_t get_analyze_result(uint8_t *result, uint32_t size) {
66  using ntt = nt<stbox::bytes>;
67  ntt::onchain_result_package_t pkg;
68  pkg.set<ntt::data_hash>(data_hash_var::m_data_hash);
69  pkg.set<ntt::encrypted_result>(m_encrypted_result_str);
70  pkg.set<ntt::result_signature>(m_result_signature_str);
71  pkg.set<ntt::cost_signature>(m_cost_signature_str);
72  ff::net::marshaler lm(ff::net::marshaler::length_retriver);
73  pkg.arch(lm);
74  if (size != lm.get_length()) {
75  return stbox::stx_status::out_buffer_length_error;
76  }
77  ff::net::marshaler ld((char *)result, size, ff::net::marshaler::serializer);
78  pkg.arch(ld);
79  return stbox::stx_status::success;
80  }
81 
82 protected:
83  stbox::bytes m_encrypted_result_str;
84  stbox::bytes m_cost_signature_str;
85  stbox::bytes m_result_signature_str;
86 };
87 } // namespace internal
88 template <typename Crypto>
90 
91 template <typename Crypto>
93  constexpr static uint32_t value = ypc::utc::onchain_result_parser;
94 };
95 } // namespace ypc
ypc::internal::result_var
Definition: result_var.h:5
ypc::internal::onchain_result
Definition: onchain_result.h:15
ypc::internal::encrypted_param_var
Definition: encrypted_param_var.h:7
ypc::nt
Definition: nt_cols.h:6
ypc::internal::enclave_hash_var
Definition: enclave_hash_var.h:7
ypc::internal::request_key_var
Definition: request_key_var.h:7
ypc::internal::data_hash_var
Definition: data_hash_var.h:6
ypc::result_type_traits
Definition: parser_type_traits.h:4
ypc::crypto::crypto_pack
Definition: crypto_pack.h:14
ypc::internal::request_key_var< true >
Definition: request_key_var.h:9