Closed ygnkim closed 3 years ago
일단 curl 관련 에러는 전부 해결이 됬습니다.
원인은 #include <curl/curl.h>
선언이 system curl을 사용하는데, 애초에 rpc call에 사용되는 curl은 별도의 라이브러리에서 사용이 됩니다.
(testlibs/rpc_client.cpp
, testlibs/rpc_client.h
에서 custom curl이 사용) 그렇기에 rpc 관련 플러그인 코드에 curl 라이브러리 선언을 삭제를 해주고, 구현한 라이브러리를 선언을 해주어 해결하였습니다.
#include "../../testlibs/rpc_client.h"
하지만 또 다른 이슈가 생겼습니다. 성공적으로 컴파일 후, CTest를 진행을 해보니 정상적으로 종료되지 못했습니다. 이 부분은 좀 더 확인해보겠습니다.
sudo apt purge libcurl4-openssl-dev
git clone https://github.com/kaistshadow/blockchain-sim; cd blockchain-sim
git submodule update --init --recursive
mkdir build; cd build
cmake -DBUILD_TYPE=Release ..
make
cmake -DBUILD_TYPE=Release -DTEST_OPT=ON ..
make
make test
15 - test_verack_bitcoin (Failed)
16 - test_churnout_bitcoin (Failed)
17 - test_miniEREBUS_bitcoin (Failed)
18 - BLEEPlib-peer-1-ConnectPeer (BAD_COMMAND)
19 - BLEEPlib-peer-2-ConnectPeerToVoid (BAD_COMMAND)
20 - BLEEPlib-peer-3-ConnectPeerToVoid (BAD_COMMAND)
21 - BLEEPlib-peer-4-DisconnectPeer (BAD_COMMAND)
22 - BLEEPlib-peer-6-PeerWithCloseExit (BAD_COMMAND)
23 - BLEEPlib-peer-7-PeerWithStop (BAD_COMMAND)
아래의 CTest 문제는 make test
이전에 make install
을 수행해주면 해결됩니다. (build한 shadow가 install이 되기 전에는 접근이 안되는 문제가 있음)
근데 써주신 curl 관련 에러 해결 방법이 잘 이해가 가지 않는데요. (원인도 어떤 얘기인지 모르겠습니다.) 좀더 이해할 수 있게 설명이 가능하신가요?
급한건 아니니 시간나실때ㅎㅎ
다음은 customed curl를 통해 구현된 bitcoin과 rpc request 함수들 입니다. 이는 testlibs/rpc_clinet.h, testlibs/rpc_clinet.cpp
에 구현이 되었습니다.
// example : setgeneratetoaddress rpc function
// This function is used when calling rpc that requires parameters.
void rpc_reqeust_with_params(std::string rpc_function, std::list<std::string> params_list) {
Json::Value params;
params.clear();
params = Json::arrayValue;
for(auto const& i: params_list) {
params.append(i);
}
bitcoin_rpc_request(rpc_function, params);
}
// example : getnewaddress rpc function
// To get wallet address from "getnewaddress" rpc function call
// Like this, this function enable to get string data from rpc call
std::string rpc_request_with_no_params(std::string rpc_function) {
Json::Value params;
params.clear();
params = Json::arrayValue;
bitcoin_rpc_request(rpc_function, params);
std::string return_value = json_resp["result"].asString();
return return_value;
}
// example : getblockchaininfo rpc function
// This function is used when no params, no return values.
void rpc_request_no_return_no_params(std::string rpc_function) {
Json::Value params;
params.clear();
params = Json::arrayValue;
bitcoin_rpc_request(rpc_function, params);
}
구현된 bitcoin rpc request/response를 사용하려면 #include "../../testlibs/rpc_client.h"
와 같이 상대 경로에 맞추어 헤더파일을 선언하면 어디서든 customed curl를 사용할 수 있습니다.
그 전에 에러가 발생한 원인은 customed curl로 구현된 헤더파일을 선언했지만, system에 설치된 curl의 헤더파일을 또한 다음과 같이 선언을 해주었습니다. #incldue <curl/curl.h>
이 상황에서 system curl를 삭제를 하면 system curl에 대한 라이브러리를 찾을 수 없기에 발생했던 에러였습니다.
다음과 같이 수행한 결과 해당 오류는 해결이 되었습니다. How to reproduce
sudo apt purge libcurl4-openssl-dev
git clone https://github.com/kaistshadow/blockchain-sim; cd blockchain-sim
git checkout hotfix_336
git submodule update --init --recursive
mkdir build; cd build
cmake -DBUILD_TYPE=Release ..
make
cmake -DBUILD_TYPE=Release -DTEST_OPT=ON ..
make
make install
make test
확인 해보시고, 문제없으면 pull re 하겠습니다.
commit Diff를 봤는데 (https://github.com/kaistshadow/blockchain-sim/commit/21204bcd8197dd72cc95d6dded6d75a284d10eab) include를 install directory에 대한 상대경로로 지정하는 건 일반적인 방식이 아닌것 같아 피하는게 나을 것 같습니다. (예를 들어 install directory가 바뀐다거나 하면 문제가 발생)
대신 target을 잘 만들어서 target_link_libraries
를 통해 dependency를 걸어주면 될것 같은데요.
BLEEPemul/emulation/CMakeLists.txt
파일에 추가하신 target_link_libraries
는 custom_target에 대해 해주셨는데 이게 제대로 될런지 모르겠네요. 그냥 tests/regtest/shadow-dependencies/3_custom_libcurl/CMakeLists.txt
와 비슷하게 add_shadow_plugin
이랑 target_link_libraries
를 쓰도록 Cmake를 업데이트하면 어떨까요
넵! 피드백 감사합니다.
@ygnkim
말씀하신 target_link_libraries
를 활용하려면 add_library
, add_execute
, add_shadow_plugin
의 함수를 통해서 target이 생성되는 경우에만 사용이 가능합니다. 반면 현 이슈에서는 add_custom_command
를 통해서 so파일이 생성이 되기에, command 명령어로 header file을 include해야합니다.
다음 처럼 gcc 명령어를 통해서 so파일이 생성될 때 -I
옵션 값을 이용하여 header를 include하였습니다.
add_custom_command(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/rpc.so
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../../../../testlibs/rpc_client.cpp
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/rpc.cpp
COMMAND gcc -o rpc.so rpc.cpp ../../../../testlibs/rpc_client.cpp -I./../../../../testlibs -ljsoncpp -lcurl -lssl -shared -fPIC -Wl,-rpath=${CMAKE_CURRENT_SOURCE_DIR}/../../../../Install/curl_7.70.0/lib -L${CMAKE_CURRENT_SOURCE_DIR}/../../../../Install/curl_7.70.0/lib -g -std=c99
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
그렇기에 소스파일에서는 #include "rpc_client.h"
이런식으로 상대경로 없이 사용을 할 수 있습니다.
master에서 curl library에 의존하는 test 프로그램들이 컴파일이 제대로 되지 않는 문제가 있습니다. (curl 관련 header 파일을 못찾음.)
sudo apt install libcurl4-openssl-dev
를 수행하면 해결이 되지만, external에 있는 curl이 존재하는 상황에서도 찾지 못하는 것은 버그이므로, CMakeLists.txt 파일에도 문제가 있는것으로 이에 대한 버그를 수정해야할 것 같습니다.How to reproduce
에러