文章目錄
- 1、環境準備
- 2、example01專案
- 3、修改example01專案
- 4、example02專案
1、環境準備
-
安裝公共依賴
sudo apt-get install -y apt-transport-https ca-certificates software-properties-common sudo apt-get install -y unzip git curl wget vim tree jq -
安裝gradle
cd /tmp && wget https://services.gradle.org/distributions/gradle-6.4-bin.zip unzip gradle-6.4-bin.zip sudo mv gradsle-6.4 /usr/local/gradle #修改組態檔 sudo cat >> ~/.bashrc <<EOF export PATH=$PATH:/usr/local/gradle/bin EOF #使組態檔生效 source ~/.bashrc -
需要安裝的七個docker鏡像(版本不確定是否有影響)

-
下載docker-compose
wget https://get.daocloud.io/docker/compose/releases/download/1.25.3/docker-compose-`uname -s`-`uname -m` sudo mv docker-compose-`uname -s`-`uname -m` /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker-compose -v #檢查是否安裝成功 -
java環境
java -version #如果沒有java環境,用下列命令安裝 sudo apt-get install -y openjdk-8-jdk -
下載
workspace作業目錄(將下載的workspace放在用戶的home目錄下即可)git clone https://gitlab.com/qubing/blockchain_lab_v2.git ~/workspace確保workspace下有以下的檔案和檔案夾

-
為了開發和單元測驗方便,可以在服務器或虛擬機上安裝IDEA進行chaincode的開發,
-
使用虛擬機進行實驗可安裝gui,使用云服務器進行實驗可以在云服務器上安裝gui然后通過vnc進行連接,安裝gui程序參見https://blog.csdn.net/Linrena/article/details/106309969
2、example01專案
-
因為
workspace目錄下的chaincode目錄下有一個example01專案,主要是讓大家熟悉chaincode怎么撰寫, -
使用IDEA打開
example01下的java專案,該專案是一個gradle專案,等待專案建立完成之后,打開MyContract.java檔案,查看初始的智能合約代碼, -
在
workspace檔案夾下使用下列命令來體驗如何部署一個區塊鏈網路#檢測區塊鏈網路的環境,初始化區塊鏈網路,并且建立每個區塊鏈網路的結點 . ./init.sh #檢測結點是否正常運行(當執行startup腳本時出現docker鏡像問題時,是因為startup腳本本身的問題) . ./startup.sh #部署example01的chaincode . scripts/deploy_chaincode.sh java ${PWD}/chaincode/chaincode_example01/java mycc_java #測驗example01的chaincode . scripts/test_example01.sh mycc_java #清空區塊鏈網路環境 . ./teardown.sh -
解決
startup.sh腳本執行錯誤:更改startup.sh中的DB_IMAGE_TAG,將原來的DB_IMAGE_TA替換成DB_VERSION
3、修改example01專案
-
為了更好的熟悉這個專案,我們來新增一個
GetValue和SetValue方法,并將其部署區塊鏈網路上/** *SetValue *@param ctx context *@param key key *@param value value */ @Transaction(name = "SetValue",intent = Transaction.TYPE.SUBMIT) public void SetValue(final Context ctx, final String key, final String value){ ChaincodeStub stub = ctx.getStub(); stub.putStringState(key,value); } /** *GetValue *@param ctx context *@param key key *@return value state in ledger */ @Transaction(name = "GetValue",intent = Transaction.TYPE.EVALUATE) public String GetValue(final Context ctx, final String key){ ChaincodeStub stub = ctx.getStub(); return stub.getStringState(key); } -
進行單元測驗(需要進行實際的測驗,看單元測驗是否通過)
@Nested class InvokeSetValueTransaction { @Test public void SetValue() { MyContract contract = new MyContract(); Context ctx = mock(Context.class); ChaincodeStub stub = mock(ChaincodeStub.class); String key = "truth"; String value = "ferron is a good boy"; when(ctx.getStub()).thenReturn(stub); contract.SetValue(ctx,key,value); InOrder inOrder = inOrder(stub); inOrder.verify(stub).putStringState(key, value); } } @Nested class InvokeGetValueTransaction { @Test public void GetValue() { MyContract contract = new MyContract(); Context ctx = mock(Context.class); ChaincodeStub stub = mock(ChaincodeStub.class); String key = "truth"; when(ctx.getStub()).thenReturn(stub); when(stub.getStringState(key)).thenReturn("ferron is a good boy"); assertThat(contract.GetValue(ctx,key).equals("ferron is a good boy")); } } -
重新部署
example01目錄下的java專案(不需要進行測驗chaincode),具體部署方式參見第二部分,部署之前一定要確保已經執行過teardown.sh腳本
-
在
scripts目錄下新建一個的new_test_example01.sh腳本,并且將原來的test_example01.sh腳本復制到新建的腳本內,并且修改腳本,新增Getvalue和SetValue方法的腳本
-
測驗部署的
chaincode. scripts/new_test_example01.sh mycc_java
4、example02專案
-
example02專案是一個錢包的chaincode,初始java代碼中包含
Init,Query和Transfer三種方法,功能分別是初始化錢包賬戶和余額,查詢錢包余額,兩個錢包之間進行轉賬, -
現在我們新增一個
Recharge方法,用于給一個賬戶充值,@Transaction(name = "Recharge", intent = Transaction.TYPE.SUBMIT) public void recharge(final Context ctx, final String keyAccount, final String valueTrans){ ChaincodeStub stub = ctx.getStub(); //get value of account String value = stub.getStringState(keyAccount); // account not existing if (value.isEmpty()) { String errorMessage = String.format(Message.ACCOUNT_NOT_EXISTING.template(), keyAccount); System.out.println(errorMessage); throw new ChaincodeException(errorMessage); } //type conversion int intValue = Integer.parseInt(value); int intValueTrans = Integer.parseInt(valueTrans); intValue+=intValueTrans; stub.putStringState(keyAccount,String.valueOf(intValue)); } -
進行單元測驗
@Nested class InvokeRechargeTransaction { @Test public void whenAccountExists() { MyContract contract = new MyContract(); Context ctx = mock(Context.class); ChaincodeStub stub = mock(ChaincodeStub.class); String keyAccount = "A"; String valueRech = "100"; when(ctx.getStub()).thenReturn(stub); when(stub.getStringState("A")).thenReturn("100"); Throwable thrown = catchThrowable(() ->{ contract.recharge(ctx,keyAccount,valueRech); }); assertThat(thrown).isNull(); } @Test public void whenAccountNotExists(){ MyContract contract = new MyContract(); Context ctx = mock(Context.class); ChaincodeStub stub = mock(ChaincodeStub.class); String keyAccount = "A"; String valueRech = "100"; when(ctx.getStub()).thenReturn(stub); when(stub.getStringState("A")).thenReturn(""); Throwable thrown = catchThrowable(() ->{ contract.recharge(ctx,keyAccount,valueRech); }); assertThat(thrown) .isInstanceOf(ChaincodeException.class) .hasNoCause() .hasMessage(String.format(MyContract.Message.ACCOUNT_NOT_EXISTING.template(),"A")); } } -
部署
chaincode. scripts/deploy_chaincode.sh java ${PWD}/chaincode/chaincode_example02/java mycc_java02 -
將原來的
test_example02.sh復制一份并且進行以下修改
-
測驗
chaincode. scripts/new_test_example02.sh mycc_java02
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/276256.html
標籤:區塊鏈
上一篇:重磅亮相丨CROSS正式版今日上線,全面開通CVT支付功能
下一篇:盤點TMT領域10家國內投資機構
