Skip to content

Commit

Permalink
Support SmartContract with Key-Value (#171)
Browse files Browse the repository at this point in the history
* 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 <[email protected]>
Co-authored-by: Ubuntu <[email protected]>
Co-authored-by: Ubuntu <[email protected]>
Co-authored-by: Ubuntu <[email protected]>
Co-authored-by: junchao <junchao@localhost>
  • Loading branch information
6 people authored Feb 14, 2025
1 parent 3d2d934 commit aa54deb
Show file tree
Hide file tree
Showing 54 changed files with 2,055 additions and 175 deletions.
2 changes: 1 addition & 1 deletion WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ http_archive(
http_archive(
name = "pybind11_bazel",
strip_prefix = "pybind11_bazel-2.11.1.bzl.1",
urls = ["https://github.com/pybind/pybind11_bazel/archive/refs/tags/v2.11.1.bzl.1.zip"],
urls = ["https://github.com/pybind/pybind11_bazel/archive/refs/tags/v2.11.1.bzl.1.zip"]
)

http_archive(
Expand Down
44 changes: 44 additions & 0 deletions executor/common/transaction_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,50 @@ std::unique_ptr<std::string> TransactionManager::ExecuteData(
return std::make_unique<std::string>();
}

std::unique_ptr<google::protobuf::Message> TransactionManager::ParseData(
const std::string& data) {
return nullptr;
}

std::unique_ptr<std::vector<std::unique_ptr<google::protobuf::Message>>>
TransactionManager::Prepare(const BatchUserRequest& request) {
std::unique_ptr<std::vector<std::unique_ptr<google::protobuf::Message>>>
batch_response = std::make_unique<
std::vector<std::unique_ptr<google::protobuf::Message>>>();
{
for (auto& sub_request : request.user_requests()) {
std::unique_ptr<google::protobuf::Message> response =
ParseData(sub_request.request().data());
batch_response->push_back(std::move(response));
}
// LOG(ERROR)<<"prepare data size:"<<batch_response.size();
}

return batch_response;
}

std::unique_ptr<std::string> TransactionManager::ExecuteRequest(
const google::protobuf::Message& request) {
return nullptr;
}

std::vector<std::unique_ptr<std::string>> TransactionManager::ExecuteBatchData(
const std::vector<std::unique_ptr<google::protobuf::Message>>& requests) {
// LOG(ERROR)<<"execute data:"<<requests.size();
std::vector<std::unique_ptr<std::string>> ret;
{
for (auto& sub_request : requests) {
std::unique_ptr<std::string> response = ExecuteRequest(*sub_request);
if (response == nullptr) {
response = std::make_unique<std::string>();
}
ret.push_back(std::move(response));
}
}
return ret;
}


std::unique_ptr<BatchUserResponse> TransactionManager::ExecuteBatch(
const BatchUserRequest& request) {
std::unique_ptr<BatchUserResponse> batch_response =
Expand Down
10 changes: 10 additions & 0 deletions executor/common/transaction_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ class TransactionManager {
virtual std::unique_ptr<BatchUserResponse> ExecuteBatch(
const BatchUserRequest& request);

std::unique_ptr<std::vector<std::unique_ptr<google::protobuf::Message>>>
Prepare(const BatchUserRequest& request);

std::vector<std::unique_ptr<std::string>> ExecuteBatchData(
const std::vector<std::unique_ptr<google::protobuf::Message>>& requests);
virtual std::unique_ptr<std::string> ExecuteData(const std::string& request);

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

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

protected:
virtual std::unique_ptr<google::protobuf::Message> ParseData(
const std::string& data);
virtual std::unique_ptr<std::string> ExecuteRequest(
const google::protobuf::Message& request);
private:
bool is_out_of_order_ = false;
bool need_response_ = true;
Expand Down
1 change: 1 addition & 0 deletions executor/contract/executor/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ cc_test(
tags = ["manual"],
deps = [
":contract_executor",
"//chain/storage:memory_db",
"//common/test:test_main",
],
)
55 changes: 40 additions & 15 deletions executor/contract/executor/contract_executor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
namespace resdb {
namespace contract {

ContractTransactionManager::ContractTransactionManager(void)
: contract_manager_(std::make_unique<ContractManager>()),
ContractTransactionManager::ContractTransactionManager(Storage * storage)
: contract_manager_(std::make_unique<ContractManager>(storage)),
address_manager_(std::make_unique<AddressManager>()) {}

std::unique_ptr<std::string> ContractTransactionManager::ExecuteData(
Expand All @@ -37,32 +37,42 @@ std::unique_ptr<std::string> ContractTransactionManager::ExecuteData(
LOG(ERROR) << "parse data fail";
return nullptr;
}

int ret = 0;
if (request.cmd() == Request::CREATE_ACCOUNT) {
if (request.cmd() == contract::Request::CREATE_ACCOUNT) {
absl::StatusOr<Account> account_or = CreateAccount();
if (account_or.ok()) {
response.mutable_account()->Swap(&(*account_or));
LOG(ERROR)<<" create count:"<<response.account().DebugString();
} else {
ret = -1;
}
} else if (request.cmd() == Request::DEPLOY) {
} else if (request.cmd() == contract::Request::DEPLOY) {
absl::StatusOr<Contract> contract_or = Deploy(request);
if (contract_or.ok()) {
response.mutable_contract()->Swap(&(*contract_or));
} else {
ret = -1;
}
} else if (request.cmd() == Request::EXECUTE) {
} else if (request.cmd() == contract::Request::EXECUTE) {
auto res_or = Execute(request);
if (res_or.ok()) {
response.set_res(*res_or);
} else {
ret = -1;
}
} else if (request.cmd() == Request::ADD_ADDRESS) { // New command handling
absl::Status status = AddAddress(request);
if (!status.ok()) {
} else if (request.cmd() == resdb::contract::Request::GETBALANCE) {
auto res_or = GetBalance(request);
if (res_or.ok()) {
response.set_res(*res_or);
} else {
ret = -1;
}

} else if (request.cmd() == resdb::contract::Request::SETBALANCE) {
auto res_or = SetBalance(request);
if (res_or.ok()) {
response.set_res("1");
} else {
ret = -1;
}
}
Expand All @@ -85,12 +95,6 @@ absl::StatusOr<Account> ContractTransactionManager::CreateAccount() {
return account;
}

absl::Status ContractTransactionManager::AddAddress(const Request& request) {
Address address = AddressManager::HexToAddress(request.external_address());
address_manager_->AddExternalAddress(address);
return absl::OkStatus();
}

absl::StatusOr<Contract> ContractTransactionManager::Deploy(
const Request& request) {
Address caller_address =
Expand Down Expand Up @@ -128,5 +132,26 @@ absl::StatusOr<std::string> ContractTransactionManager::Execute(
request.func_params());
}

absl::StatusOr<std::string> ContractTransactionManager::GetBalance(
const Request& request) {

Address account =
AddressManager::HexToAddress(request.account());
return contract_manager_->GetBalance(account);
}

absl::StatusOr<std::string> ContractTransactionManager::SetBalance(
const Request& request) {

Address account =
AddressManager::HexToAddress(request.account());
Address balance =
AddressManager::HexToAddress(request.balance());
int ret = contract_manager_->SetBalance(account, balance);
return std::to_string(ret);
}



} // namespace contract
} // namespace resdb
6 changes: 4 additions & 2 deletions executor/contract/executor/contract_executor.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ namespace contract {

class ContractTransactionManager : public TransactionManager {
public:
ContractTransactionManager(void);
ContractTransactionManager(Storage * storage);
virtual ~ContractTransactionManager() = default;

std::unique_ptr<std::string> ExecuteData(const std::string& request) override;
Expand All @@ -40,7 +40,9 @@ class ContractTransactionManager : public TransactionManager {
absl::StatusOr<Account> CreateAccount();
absl::StatusOr<Contract> Deploy(const Request& request);
absl::StatusOr<std::string> Execute(const Request& request);
absl::Status AddAddress(const Request& request);

absl::StatusOr<std::string> GetBalance(const Request& request);
absl::StatusOr<std::string> SetBalance(const Request& request);

private:
std::unique_ptr<ContractManager> contract_manager_;
Expand Down
Loading

0 comments on commit aa54deb

Please sign in to comment.