Skip to content

Commit aa54deb

Browse files
cjcchenUbuntuUbuntuUbuntuUbuntu
authored
Support SmartContract with Key-Value (#171)
* add poe * add * update workflo * add log * change github name * change img files * fix workflow * fix communicator * rm log * add base fairdag * add fairdag * add hs * add hs * add ooohs * add tusk * add rcc * add rcc * add config * add cassandra * add cassandra * add prepare * add prepare * add cass 256 * add ooowq * rcc done * done * rcc done * add * add fair * add cass * add poe * fix execution response * remove smallbank * fix performance script * add fairdag rl * add graph * add fair * add * done * done * done * fix build * add perf * linear poe * add * update * fix * update * update * update * update * add log * revert * revert * rm * fix * add storage * add sm in kv * add kv cmd for sm * update * add contact kv * format * merge master * merge master * merge master * merge master * merge master * merge master * merge master * merge master * merge master * merge master * merge master * merge master * merge master * merge master * merge master * merge master * merge master * merge master * merge master * merge master * merge master * add license * fix build * add boost * add deps --------- Co-authored-by: Ubuntu <ubuntu@ip-172-31-30-18.ec2.internal> Co-authored-by: Ubuntu <ubuntu@ip-172-31-16-70.ec2.internal> Co-authored-by: Ubuntu <ubuntu@ip-172-31-66-55.ec2.internal> Co-authored-by: Ubuntu <ubuntu@ip-172-31-16-144.ec2.internal> Co-authored-by: junchao <junchao@localhost>
1 parent 3d2d934 commit aa54deb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+2055
-175
lines changed

WORKSPACE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ http_archive(
177177
http_archive(
178178
name = "pybind11_bazel",
179179
strip_prefix = "pybind11_bazel-2.11.1.bzl.1",
180-
urls = ["https://github.com/pybind/pybind11_bazel/archive/refs/tags/v2.11.1.bzl.1.zip"],
180+
urls = ["https://github.com/pybind/pybind11_bazel/archive/refs/tags/v2.11.1.bzl.1.zip"]
181181
)
182182

183183
http_archive(

executor/common/transaction_manager.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,50 @@ std::unique_ptr<std::string> TransactionManager::ExecuteData(
3535
return std::make_unique<std::string>();
3636
}
3737

38+
std::unique_ptr<google::protobuf::Message> TransactionManager::ParseData(
39+
const std::string& data) {
40+
return nullptr;
41+
}
42+
43+
std::unique_ptr<std::vector<std::unique_ptr<google::protobuf::Message>>>
44+
TransactionManager::Prepare(const BatchUserRequest& request) {
45+
std::unique_ptr<std::vector<std::unique_ptr<google::protobuf::Message>>>
46+
batch_response = std::make_unique<
47+
std::vector<std::unique_ptr<google::protobuf::Message>>>();
48+
{
49+
for (auto& sub_request : request.user_requests()) {
50+
std::unique_ptr<google::protobuf::Message> response =
51+
ParseData(sub_request.request().data());
52+
batch_response->push_back(std::move(response));
53+
}
54+
// LOG(ERROR)<<"prepare data size:"<<batch_response.size();
55+
}
56+
57+
return batch_response;
58+
}
59+
60+
std::unique_ptr<std::string> TransactionManager::ExecuteRequest(
61+
const google::protobuf::Message& request) {
62+
return nullptr;
63+
}
64+
65+
std::vector<std::unique_ptr<std::string>> TransactionManager::ExecuteBatchData(
66+
const std::vector<std::unique_ptr<google::protobuf::Message>>& requests) {
67+
// LOG(ERROR)<<"execute data:"<<requests.size();
68+
std::vector<std::unique_ptr<std::string>> ret;
69+
{
70+
for (auto& sub_request : requests) {
71+
std::unique_ptr<std::string> response = ExecuteRequest(*sub_request);
72+
if (response == nullptr) {
73+
response = std::make_unique<std::string>();
74+
}
75+
ret.push_back(std::move(response));
76+
}
77+
}
78+
return ret;
79+
}
80+
81+
3882
std::unique_ptr<BatchUserResponse> TransactionManager::ExecuteBatch(
3983
const BatchUserRequest& request) {
4084
std::unique_ptr<BatchUserResponse> batch_response =

executor/common/transaction_manager.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ class TransactionManager {
4040
virtual std::unique_ptr<BatchUserResponse> ExecuteBatch(
4141
const BatchUserRequest& request);
4242

43+
std::unique_ptr<std::vector<std::unique_ptr<google::protobuf::Message>>>
44+
Prepare(const BatchUserRequest& request);
45+
46+
std::vector<std::unique_ptr<std::string>> ExecuteBatchData(
47+
const std::vector<std::unique_ptr<google::protobuf::Message>>& requests);
4348
virtual std::unique_ptr<std::string> ExecuteData(const std::string& request);
4449

4550
bool IsOutOfOrder();
@@ -48,6 +53,11 @@ class TransactionManager {
4853

4954
virtual Storage* GetStorage() { return nullptr; };
5055

56+
protected:
57+
virtual std::unique_ptr<google::protobuf::Message> ParseData(
58+
const std::string& data);
59+
virtual std::unique_ptr<std::string> ExecuteRequest(
60+
const google::protobuf::Message& request);
5161
private:
5262
bool is_out_of_order_ = false;
5363
bool need_response_ = true;

executor/contract/executor/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ cc_test(
4040
tags = ["manual"],
4141
deps = [
4242
":contract_executor",
43+
"//chain/storage:memory_db",
4344
"//common/test:test_main",
4445
],
4546
)

executor/contract/executor/contract_executor.cpp

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
namespace resdb {
2525
namespace contract {
2626

27-
ContractTransactionManager::ContractTransactionManager(void)
28-
: contract_manager_(std::make_unique<ContractManager>()),
27+
ContractTransactionManager::ContractTransactionManager(Storage * storage)
28+
: contract_manager_(std::make_unique<ContractManager>(storage)),
2929
address_manager_(std::make_unique<AddressManager>()) {}
3030

3131
std::unique_ptr<std::string> ContractTransactionManager::ExecuteData(
@@ -37,32 +37,42 @@ std::unique_ptr<std::string> ContractTransactionManager::ExecuteData(
3737
LOG(ERROR) << "parse data fail";
3838
return nullptr;
3939
}
40-
4140
int ret = 0;
42-
if (request.cmd() == Request::CREATE_ACCOUNT) {
41+
if (request.cmd() == contract::Request::CREATE_ACCOUNT) {
4342
absl::StatusOr<Account> account_or = CreateAccount();
4443
if (account_or.ok()) {
4544
response.mutable_account()->Swap(&(*account_or));
45+
LOG(ERROR)<<" create count:"<<response.account().DebugString();
4646
} else {
4747
ret = -1;
4848
}
49-
} else if (request.cmd() == Request::DEPLOY) {
49+
} else if (request.cmd() == contract::Request::DEPLOY) {
5050
absl::StatusOr<Contract> contract_or = Deploy(request);
5151
if (contract_or.ok()) {
5252
response.mutable_contract()->Swap(&(*contract_or));
5353
} else {
5454
ret = -1;
5555
}
56-
} else if (request.cmd() == Request::EXECUTE) {
56+
} else if (request.cmd() == contract::Request::EXECUTE) {
5757
auto res_or = Execute(request);
5858
if (res_or.ok()) {
5959
response.set_res(*res_or);
6060
} else {
6161
ret = -1;
6262
}
63-
} else if (request.cmd() == Request::ADD_ADDRESS) { // New command handling
64-
absl::Status status = AddAddress(request);
65-
if (!status.ok()) {
63+
} else if (request.cmd() == resdb::contract::Request::GETBALANCE) {
64+
auto res_or = GetBalance(request);
65+
if (res_or.ok()) {
66+
response.set_res(*res_or);
67+
} else {
68+
ret = -1;
69+
}
70+
71+
} else if (request.cmd() == resdb::contract::Request::SETBALANCE) {
72+
auto res_or = SetBalance(request);
73+
if (res_or.ok()) {
74+
response.set_res("1");
75+
} else {
6676
ret = -1;
6777
}
6878
}
@@ -85,12 +95,6 @@ absl::StatusOr<Account> ContractTransactionManager::CreateAccount() {
8595
return account;
8696
}
8797

88-
absl::Status ContractTransactionManager::AddAddress(const Request& request) {
89-
Address address = AddressManager::HexToAddress(request.external_address());
90-
address_manager_->AddExternalAddress(address);
91-
return absl::OkStatus();
92-
}
93-
9498
absl::StatusOr<Contract> ContractTransactionManager::Deploy(
9599
const Request& request) {
96100
Address caller_address =
@@ -128,5 +132,26 @@ absl::StatusOr<std::string> ContractTransactionManager::Execute(
128132
request.func_params());
129133
}
130134

135+
absl::StatusOr<std::string> ContractTransactionManager::GetBalance(
136+
const Request& request) {
137+
138+
Address account =
139+
AddressManager::HexToAddress(request.account());
140+
return contract_manager_->GetBalance(account);
141+
}
142+
143+
absl::StatusOr<std::string> ContractTransactionManager::SetBalance(
144+
const Request& request) {
145+
146+
Address account =
147+
AddressManager::HexToAddress(request.account());
148+
Address balance =
149+
AddressManager::HexToAddress(request.balance());
150+
int ret = contract_manager_->SetBalance(account, balance);
151+
return std::to_string(ret);
152+
}
153+
154+
155+
131156
} // namespace contract
132157
} // namespace resdb

executor/contract/executor/contract_executor.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ namespace contract {
3131

3232
class ContractTransactionManager : public TransactionManager {
3333
public:
34-
ContractTransactionManager(void);
34+
ContractTransactionManager(Storage * storage);
3535
virtual ~ContractTransactionManager() = default;
3636

3737
std::unique_ptr<std::string> ExecuteData(const std::string& request) override;
@@ -40,7 +40,9 @@ class ContractTransactionManager : public TransactionManager {
4040
absl::StatusOr<Account> CreateAccount();
4141
absl::StatusOr<Contract> Deploy(const Request& request);
4242
absl::StatusOr<std::string> Execute(const Request& request);
43-
absl::Status AddAddress(const Request& request);
43+
44+
absl::StatusOr<std::string> GetBalance(const Request& request);
45+
absl::StatusOr<std::string> SetBalance(const Request& request);
4446

4547
private:
4648
std::unique_ptr<ContractManager> contract_manager_;

0 commit comments

Comments
 (0)