kaistshadow / blockchain-sim

Scalable blockchain simulator/emulator running on shadow simulator
MIT License
9 stars 1 forks source link

Installation bug (Cannot find external curl's header) #336

Closed ygnkim closed 3 years ago

ygnkim commented 3 years ago

master에서 curl library에 의존하는 test 프로그램들이 컴파일이 제대로 되지 않는 문제가 있습니다. (curl 관련 header 파일을 못찾음.) sudo apt install libcurl4-openssl-dev 를 수행하면 해결이 되지만, external에 있는 curl이 존재하는 상황에서도 찾지 못하는 것은 버그이므로, CMakeLists.txt 파일에도 문제가 있는것으로 이에 대한 버그를 수정해야할 것 같습니다.

How to reproduce

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

에러

cd /home/ilios/workspace/blockchain-sim-test/BLEEPemul/emulation && g++ -o minerNode_rpc.so one_node_setmine.cpp ../../testlibs/rpc_client.cpp -ljsoncpp -lcurl -lssl -shared -fPIC -Wl,-rpath=/home/ilios/workspace/blockchain-sim-test/BLEEPemul/emulation/../../Install/curl_7.70.0/lib -L/home/ilios/workspace/blockchain-sim-test/BLEEPemul/emulation/../../Install/curl_7.70.0/lib -g
one_node_setmine.cpp:4:10: fatal error: curl/curl.h: No such file or directory
 #include <curl/curl.h>
          ^~~~~~~~~~~~~
compilation terminated.
../../testlibs/rpc_client.cpp:8:10: fatal error: curl/curl.h: No such file or directory
 #include <curl/curl.h>
          ^~~~~~~~~~~~~
compilation terminated.
cd /home/ilios/workspace/blockchain-sim-test/testlibs/datadirDump && g++ -o rpc.so one_node_setmine.cpp ../../testlibs/rpc_client.cpp -ljsoncpp -lcurl -lssl -shared -fPIC -Wl,-rpath=/home/ilios/workspace/blockchain-sim-test/testlibs/datadirDump/../../Install/curl_7.70.0/lib -L/home/ilios/workspace/blockchain-sim-test/testlibs/datadirDump/../../Install/curl_7.70.0/lib -g
one_node_setmine.cpp:4:10: fatal error: curl/curl.h: No such file or directory
 #include <curl/curl.h>
          ^~~~~~~~~~~~~
compilation terminated.
../../testlibs/rpc_client.cpp:8:10: fatal error: curl/curl.h: No such file or directory
 #include <curl/curl.h>
          ^~~~~~~~~~~~~
compilation terminated.
tkdlqm2 commented 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)
ygnkim commented 3 years ago

아래의 CTest 문제는 make test 이전에 make install을 수행해주면 해결됩니다. (build한 shadow가 install이 되기 전에는 접근이 안되는 문제가 있음)

근데 써주신 curl 관련 에러 해결 방법이 잘 이해가 가지 않는데요. (원인도 어떤 얘기인지 모르겠습니다.) 좀더 이해할 수 있게 설명이 가능하신가요?

ygnkim commented 3 years ago

급한건 아니니 시간나실때ㅎㅎ

tkdlqm2 commented 3 years ago

다음은 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에 대한 라이브러리를 찾을 수 없기에 발생했던 에러였습니다.

image

tkdlqm2 commented 3 years ago

다음과 같이 수행한 결과 해당 오류는 해결이 되었습니다. 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 하겠습니다.

ygnkim commented 3 years ago

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를 업데이트하면 어떨까요

tkdlqm2 commented 3 years ago

넵! 피드백 감사합니다.

tkdlqm2 commented 3 years ago

@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" 이런식으로 상대경로 없이 사용을 할 수 있습니다.