Skip to content

Commit

Permalink
Merge pull request #213 from upb-uc4/develop
Browse files Browse the repository at this point in the history
Release V1.0.0
  • Loading branch information
NikoBergemann authored Mar 15, 2021
2 parents 329eea0 + 8b4e85d commit 3e85916
Show file tree
Hide file tree
Showing 22 changed files with 190 additions and 340 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/run_installDist.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ on:
- '**fix**'
- develop
- master
paths-ignore:
- '**.md'
pull_request:
branches:
- develop
Expand Down
10 changes: 10 additions & 0 deletions .github/workflows/run_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ on:
- '**fix**'
- develop
- master
paths-ignore:
- '**.md'
pull_request:
branches:
- develop
Expand Down Expand Up @@ -44,6 +46,14 @@ jobs:
echo "##########################"
popd
# Upload Test Report
- name: Upload test report
if: ${{ always() }}
uses: actions/upload-artifact@v1
with:
name: test-report
path: UC4-chaincode/build/reports/tests

# Upload Coverage Report
- name: Upload coverage report
if: ${{ always() }}
Expand Down
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
# [v1.0.0](https://github.com/upb-uc4/hyperledger_chaincode/compare/v0.19.1...v1.0.0) (2021-03-15)

Release (no changes to previous version)

# [v0.19.1](https://github.com/upb-uc4/hyperledger_chaincode/compare/v0.19.0...v0.19.1) (2021-03-02)

## Feature
- check transactions for timestamp validity


## Refactor
- consolidate transactions and outsource transaction validation

# [v0.19.0](https://github.com/upb-uc4/hyperledger_chaincode/compare/v0.18.2...v0.19.0) (2021-03-01)

## Refactor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public abstract class ContractBase implements ContractInterface {
*/
@Transaction()
public String getVersion(final Context ctx) {
return "0.19.0";
return "1.0.0";

/*
URLClassLoader cl = (URLClassLoader) getClass().getClassLoader();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@

import de.upb.cs.uc4.chaincode.contract.group.GroupContractUtil;
import de.upb.cs.uc4.chaincode.contract.operation.OperationContractUtil;
import de.upb.cs.uc4.chaincode.exceptions.*;
import de.upb.cs.uc4.chaincode.exceptions.SerializableError;
import de.upb.cs.uc4.chaincode.exceptions.serializable.LedgerAccessError;
import de.upb.cs.uc4.chaincode.exceptions.serializable.ParticipationError;
import de.upb.cs.uc4.chaincode.exceptions.serializable.ValidationError;
import de.upb.cs.uc4.chaincode.exceptions.serializable.ledgeraccess.LedgerStateNotFoundError;
import de.upb.cs.uc4.chaincode.exceptions.serializable.ledgeraccess.UnprocessableLedgerStateError;
import de.upb.cs.uc4.chaincode.exceptions.serializable.LedgerAccessError;
import de.upb.cs.uc4.chaincode.exceptions.serializable.ValidationError;
import de.upb.cs.uc4.chaincode.exceptions.serializable.parameter.MissingTransactionError;
import de.upb.cs.uc4.chaincode.helper.*;
import de.upb.cs.uc4.chaincode.helper.AccessManager;
import de.upb.cs.uc4.chaincode.helper.GeneralHelper;
import de.upb.cs.uc4.chaincode.helper.GsonWrapper;
import de.upb.cs.uc4.chaincode.helper.ValidationManager;
import de.upb.cs.uc4.chaincode.model.errors.DetailedError;
import de.upb.cs.uc4.chaincode.model.errors.GenericError;
import de.upb.cs.uc4.chaincode.model.errors.InvalidParameter;
Expand All @@ -22,6 +25,7 @@
import org.hyperledger.fabric.shim.ledger.KeyValue;
import org.hyperledger.fabric.shim.ledger.QueryResultsIterator;

import java.time.Instant;
import java.util.ArrayList;
import java.util.List;

Expand Down Expand Up @@ -84,6 +88,12 @@ public GenericError getAccessDeniedError(){
.title("You are not allowed to execute in the given transaction");
}

public GenericError getTransactionTimestampInvalidError(){
return new GenericError()
.type("HLTransactionTimestampInvalid")
.title("The transaction you submitted contains a timestamp differing more than two minutes from the current system time");
}

public GenericError getOperationNotPendingError(){
return new GenericError()
.type("HLExecutionImpossible")
Expand Down Expand Up @@ -280,4 +290,26 @@ public <T> List<T> getAllStates(ChaincodeStub stub, Class<T> c) {
}
return resultItems;
}

public void checkTimestamp(Context ctx) throws ValidationError {
Instant timestamp = ctx.getStub().getTxTimestamp();
Instant current = Instant.now();

long diff = timestamp.getEpochSecond() - current.getEpochSecond();
diff = diff < 0 ? (-diff) : diff;

if(diff > 120){
throw new ValidationError(GsonWrapper.toJson(getTransactionTimestampInvalidError()));
}
}

public void validateTransaction(Context ctx,
String contractName,
String transactionName,
String[] args) throws SerializableError {
checkTimestamp(ctx);
ValidationManager.validateParams(ctx, contractName, transactionName, GsonWrapper.toJson(args));
validateApprovals(ctx, contractName, transactionName, args);
finishOperation(ctx.getStub(), contractName, transactionName, args);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import de.upb.cs.uc4.chaincode.exceptions.serializable.LedgerAccessError;
import de.upb.cs.uc4.chaincode.exceptions.serializable.ParameterError;
import de.upb.cs.uc4.chaincode.helper.HyperledgerManager;
import de.upb.cs.uc4.chaincode.helper.ValidationManager;
import de.upb.cs.uc4.chaincode.model.admission.AbstractAdmission;
import de.upb.cs.uc4.chaincode.model.admission.CourseAdmission;
import de.upb.cs.uc4.chaincode.helper.GsonWrapper;
Expand Down Expand Up @@ -40,27 +41,17 @@ public class AdmissionContract extends ContractBase {
public String addAdmission(final Context ctx, String admissionJson) {
String transactionName = HyperledgerManager.getTransactionName(ctx.getStub());
final String[] args = new String[]{admissionJson};
ChaincodeStub stub = ctx.getStub();

try {
cUtil.checkParamsAddAdmission(ctx, args);
} catch (ParameterError e) {
cUtil.validateTransaction(ctx, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}

ChaincodeStub stub = ctx.getStub();
AbstractAdmission newAdmission = GsonWrapper.fromJson(admissionJson, AbstractAdmission.class);
newAdmission.setTimestamp(ctx.getStub().getTxTimestamp());
newAdmission.resetAdmissionId();

try {
cUtil.validateApprovals(ctx, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}
try {
cUtil.finishOperation(stub, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}
// TODO: can we create a composite key of all inputs to improve reading performance for get...forUser/Module/Course
return cUtil.putAndGetStringState(stub, newAdmission.getAdmissionId(), GsonWrapper.toJson(newAdmission));
}
Expand All @@ -74,32 +65,22 @@ public String addAdmission(final Context ctx, String admissionJson) {
*/
@Transaction()
public String dropAdmission(final Context ctx, String admissionId) {
String transactionName = HyperledgerManager.getTransactionName(ctx.getStub());
ChaincodeStub stub = ctx.getStub();
String transactionName = HyperledgerManager.getTransactionName(stub);
final String[] args = new String[]{admissionId};
try {
cUtil.checkParamsDropAdmission(ctx, args);
} catch (SerializableError e) {
return e.getJsonError();
}

ChaincodeStub stub = ctx.getStub();
try {
cUtil.validateApprovals(ctx, contractName, transactionName, args);
cUtil.validateTransaction(ctx, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}

// perform delete
try {
cUtil.delState(stub, admissionId);
} catch (LedgerAccessError e) {
return e.getJsonError();
}
try {
cUtil.finishOperation(stub, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}

return "";
}

Expand All @@ -117,17 +98,14 @@ public String getCourseAdmissions(final Context ctx, final String enrollmentId,
String transactionName = HyperledgerManager.getTransactionName(ctx.getStub());
final String[] args = new String[]{enrollmentId, courseId, moduleId};
ChaincodeStub stub = ctx.getStub();

try {
cUtil.validateApprovals(ctx, contractName, transactionName, args);
cUtil.validateTransaction(ctx, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}

List<CourseAdmission> admissions = cUtil.getCourseAdmissions(stub, enrollmentId, courseId, moduleId);
try {
cUtil.finishOperation(stub, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}
return GsonWrapper.toJson(admissions);
}

Expand All @@ -144,26 +122,17 @@ public String getCourseAdmissions(final Context ctx, final String enrollmentId,
public String getExamAdmissions(final Context ctx, final String admissionIds, final String enrollmentId, final String examIds) {
String transactionName = HyperledgerManager.getTransactionName(ctx.getStub());
final String[] args = new String[]{admissionIds, enrollmentId, examIds};
try {
cUtil.checkParamsGetExamAdmission(ctx, args);
} catch (SerializableError e) {
return e.getJsonError();
}

ChaincodeStub stub = ctx.getStub();

try {
cUtil.validateApprovals(ctx, contractName, transactionName, args);
cUtil.validateTransaction(ctx, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}

List<String> admissionIdList = Arrays.asList(GsonWrapper.fromJson(admissionIds, String[].class).clone());
List<String> examIdList = Arrays.asList(GsonWrapper.fromJson(examIds, String[].class).clone());
List<ExamAdmission> admissions = cUtil.getExamAdmissions(stub, admissionIdList, enrollmentId, examIdList);
try {
cUtil.finishOperation(stub, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}
return GsonWrapper.toJson(admissions);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,12 @@ public void checkParamsDropAdmission(Context ctx, String[] params) throws Ledger
admission.ensureIsDroppable(stub);
}

public void checkParamsGetCourseAdmission(Context ctx, String[] params) throws ParameterError {
if (params.length != 3) {
throw new ParameterError(GsonWrapper.toJson(getParamNumberError()));
}
}

public void checkParamsGetExamAdmission(Context ctx, String[] params) throws ParameterError {
if (params.length != 3) {
throw new ParameterError(GsonWrapper.toJson(getParamNumberError()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,20 +34,10 @@ public class CertificateContract extends ContractBase {
public String addCertificate(final Context ctx, final String enrollmentId, final String certificate) {
String transactionName = HyperledgerManager.getTransactionName(ctx.getStub());
final String[] args = new String[]{enrollmentId, certificate};
try {
cUtil.checkParamsAddCertificate(ctx, args);
} catch (ParameterError e) {
return e.getJsonError();
}

ChaincodeStub stub = ctx.getStub();

try {
cUtil.validateApprovals(ctx, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}
try {
cUtil.finishOperation(stub, contractName, transactionName, args);
cUtil.validateTransaction(ctx, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}
Expand All @@ -66,20 +56,10 @@ public String addCertificate(final Context ctx, final String enrollmentId, final
public String updateCertificate(final Context ctx, final String enrollmentId, final String certificate) {
String transactionName = HyperledgerManager.getTransactionName(ctx.getStub());
final String[] args = new String[]{enrollmentId, certificate};
try {
cUtil.checkParamsUpdateCertificate(ctx, args);
} catch (ParameterError e) {
return e.getJsonError();
}

ChaincodeStub stub = ctx.getStub();

try {
cUtil.validateApprovals(ctx, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}
try {
cUtil.finishOperation(stub, contractName, transactionName, args);
cUtil.validateTransaction(ctx, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}
Expand All @@ -97,20 +77,10 @@ public String updateCertificate(final Context ctx, final String enrollmentId, fi
public String getCertificate(final Context ctx, final String enrollmentId) {
String transactionName = HyperledgerManager.getTransactionName(ctx.getStub());
final String[] args = new String[]{enrollmentId};
try {
cUtil.checkParamsGetCertificate(ctx, args);
} catch (ParameterError e) {
return e.getJsonError();
}

ChaincodeStub stub = ctx.getStub();

try {
cUtil.validateApprovals(ctx, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}
try {
cUtil.finishOperation(stub, contractName, transactionName, args);
cUtil.validateTransaction(ctx, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,27 +37,16 @@ public class ExamContract extends ContractBase {
public String addExam(final Context ctx, String examJson) {
String transactionName = HyperledgerManager.getTransactionName(ctx.getStub());
final String[] args = new String[]{examJson};
try {
cUtil.checkParamsAddExam(ctx, args);
} catch (ParameterError e) {
return e.getJsonError();
}

ChaincodeStub stub = ctx.getStub();
Exam exam = GsonWrapper.fromJson(examJson, Exam.class);
exam.resetExamId();

try {
cUtil.validateApprovals(ctx, contractName, transactionName, args);
cUtil.validateTransaction(ctx, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}

try {
cUtil.finishOperation(stub, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}
Exam exam = GsonWrapper.fromJson(examJson, Exam.class);
exam.resetExamId();
return cUtil.putAndGetStringState(stub, exam.getExamId(), GsonWrapper.toJson(exam));
}

Expand All @@ -80,18 +69,9 @@ public String getExams(
final String droppableAt) {
String transactionName = HyperledgerManager.getTransactionName(ctx.getStub());
final String[] args = new String[]{examIds, courseIds, lecturerIds, moduleIds, types, admittableAt, droppableAt};

try {
cUtil.checkParamsGetExams(ctx, args);
} catch (SerializableError e) {
return e.getJsonError();
}
try {
cUtil.validateApprovals(ctx, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}
try {
cUtil.finishOperation(ctx.getStub(), contractName, transactionName, args);
cUtil.validateTransaction(ctx, contractName, transactionName, args);
} catch (SerializableError e) {
return e.getJsonError();
}
Expand Down
Loading

0 comments on commit 3e85916

Please sign in to comment.