Loading src/dlt/config/ca.org1.example.com-cert.pem +8 −8 Original line number Diff line number Diff line -----BEGIN CERTIFICATE----- MIICJzCCAc2gAwIBAgIUPP8sE6DhhkVuX810ayyMK/77Zf0wCgYIKoZIzj0EAwIw MIICJjCCAc2gAwIBAgIUUg8VnWZ4QPo0ohjSzLtOg5SnqbswCgYIKoZIzj0EAwIw cDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH EwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh Lm9yZzEuZXhhbXBsZS5jb20wHhcNMjExMTE2MTM1NTAwWhcNMzYxMTEyMTM1NTAw Lm9yZzEuZXhhbXBsZS5jb20wHhcNMjExMTIyMTg0ODAwWhcNMzYxMTE4MTg0ODAw WjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV BAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT Y2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBe+ 8KfXrwccQaq8BAkob7bFiDYOGQoHA/lilmpOHiowzW5NMbS6i+vRECK3t7T1QLV+ P3sVCPaXtcFW34iDphqjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG AQH/AgEBMB0GA1UdDgQWBBQXIoEUCo7pN9yWTKzuu5w2cgmxUjAKBggqhkjOPQQD AgNIADBFAiEAlzGzFI91v9Ofbq2/GyhmD0ClMdIdhV4H9ZywL9iJ/wMCICPQYmRq nx6WP9cTWh0HEVM8oWxlQJ8AtMQqNFHuLB1Y Y2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIOo NtC20scX8QGQgcSUvaau9RwQsKnq/t0914d3BoIqvBD94Ue1xX2VKEgFdQnQtIJq /ZzT63f3QC0fG5BrSjmjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG AQH/AgEBMB0GA1UdDgQWBBTQn8ZDeefPmduovU85c2bqzyzb8TAKBggqhkjOPQQD AgNHADBEAiBXRKPF+MCMWIAzkHnbgeVrmKJBBjj6EeKU1IpdExDIogIgIw2PR2lx KSoiemyU6hTEWbBmpkJbTIEiuGljYvd4uIQ= -----END CERTIFICATE----- src/dlt/config/connection-org1.json +4 −4 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ "peer0.org1.example.com": { "url": "grpcs://s2:7051", "tlsCACerts": { "pem": "-----BEGIN CERTIFICATE-----\nMIICJzCCAc2gAwIBAgIUPP8sE6DhhkVuX810ayyMK/77Zf0wCgYIKoZIzj0EAwIw\ncDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH\nEwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMjExMTE2MTM1NTAwWhcNMzYxMTEyMTM1NTAw\nWjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV\nBAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT\nY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBe+\n8KfXrwccQaq8BAkob7bFiDYOGQoHA/lilmpOHiowzW5NMbS6i+vRECK3t7T1QLV+\nP3sVCPaXtcFW34iDphqjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEBMB0GA1UdDgQWBBQXIoEUCo7pN9yWTKzuu5w2cgmxUjAKBggqhkjOPQQD\nAgNIADBFAiEAlzGzFI91v9Ofbq2/GyhmD0ClMdIdhV4H9ZywL9iJ/wMCICPQYmRq\nnx6WP9cTWh0HEVM8oWxlQJ8AtMQqNFHuLB1Y\n-----END CERTIFICATE-----\n" "pem": "-----BEGIN CERTIFICATE-----\nMIICJjCCAc2gAwIBAgIUUg8VnWZ4QPo0ohjSzLtOg5SnqbswCgYIKoZIzj0EAwIw\ncDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH\nEwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMjExMTIyMTg0ODAwWhcNMzYxMTE4MTg0ODAw\nWjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV\nBAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT\nY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIOo\nNtC20scX8QGQgcSUvaau9RwQsKnq/t0914d3BoIqvBD94Ue1xX2VKEgFdQnQtIJq\n/ZzT63f3QC0fG5BrSjmjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEBMB0GA1UdDgQWBBTQn8ZDeefPmduovU85c2bqzyzb8TAKBggqhkjOPQQD\nAgNHADBEAiBXRKPF+MCMWIAzkHnbgeVrmKJBBjj6EeKU1IpdExDIogIgIw2PR2lx\nKSoiemyU6hTEWbBmpkJbTIEiuGljYvd4uIQ=\n-----END CERTIFICATE-----\n" }, "grpcOptions": { "ssl-target-name-override": "peer0.org1.example.com", Loading @@ -36,7 +36,7 @@ "peer0.org2.example.com": { "url": "grpcs://s2:9051", "tlsCACerts": { "pem": "-----BEGIN CERTIFICATE-----\nMIICHjCCAcWgAwIBAgIUFKM/u+SoArOf8LaPzuNb+a/vyg8wCgYIKoZIzj0EAwIw\nbDELMAkGA1UEBhMCVUsxEjAQBgNVBAgTCUhhbXBzaGlyZTEQMA4GA1UEBxMHSHVy\nc2xleTEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eub3Jn\nMi5leGFtcGxlLmNvbTAeFw0yMTExMTYxMzU1MDBaFw0zNjExMTIxMzU1MDBaMGwx\nCzAJBgNVBAYTAlVLMRIwEAYDVQQIEwlIYW1wc2hpcmUxEDAOBgNVBAcTB0h1cnNs\nZXkxGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2NhLm9yZzIu\nZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQwFdmDU4/4Gzr6\nJjrbe6znK+QCbdt7wFbRDs3qn418MFgl4fs4x/LwDLCK/spQ4ovFSZpD7Cit8RLM\nzFT8a/rAo0UwQzAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBATAd\nBgNVHQ4EFgQUcHmxBBqyVYx0u5Gn2Av75fLB4twwCgYIKoZIzj0EAwIDRwAwRAIg\nNv/y6XtRg/k8PNdo1yOB6BAb+TuTStLs3WQOrcBMhgcCICCxl0jgIaYPXvxNE+8X\ntGKznq/sDoyzfz/dWUZh4Sdv\n-----END CERTIFICATE-----\n" "pem": "-----BEGIN CERTIFICATE-----\nMIICHjCCAcWgAwIBAgIUMQ2ItO6SSHzsgvAJZFN0iG+Q+/QwCgYIKoZIzj0EAwIw\nbDELMAkGA1UEBhMCVUsxEjAQBgNVBAgTCUhhbXBzaGlyZTEQMA4GA1UEBxMHSHVy\nc2xleTEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eub3Jn\nMi5leGFtcGxlLmNvbTAeFw0yMTExMjIxODQ4MDBaFw0zNjExMTgxODQ4MDBaMGwx\nCzAJBgNVBAYTAlVLMRIwEAYDVQQIEwlIYW1wc2hpcmUxEDAOBgNVBAcTB0h1cnNs\nZXkxGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2NhLm9yZzIu\nZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR3g4vdVJ87A6pG\nwTV5s0TSIC6lVfNKi0HbxhaMYhFcWHt2BBho8hgIAm6oWZ++J3x5zroejxApc8E5\n19Dpsr2ho0UwQzAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBATAd\nBgNVHQ4EFgQUK2BKZZP6iV1b7eozbFe77GLv7y0wCgYIKoZIzj0EAwIDRwAwRAIg\nHsbOx6v9vCD+8Ef5Pkks+EpmPPT2opW3JJHcEvlqmzkCIGS1nOW1Rf97+8BsfCwP\ngsqR6Ye2X75ek2vTymVXVDFJ\n-----END CERTIFICATE-----\n" }, "grpcOptions": { "ssl-target-name-override": "peer0.org2.example.com", Loading @@ -50,7 +50,7 @@ "caName": "ca-org1", "tlsCACerts": { "pem": [ "-----BEGIN CERTIFICATE-----\nMIICJzCCAc2gAwIBAgIUPP8sE6DhhkVuX810ayyMK/77Zf0wCgYIKoZIzj0EAwIw\ncDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH\nEwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMjExMTE2MTM1NTAwWhcNMzYxMTEyMTM1NTAw\nWjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV\nBAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT\nY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBe+\n8KfXrwccQaq8BAkob7bFiDYOGQoHA/lilmpOHiowzW5NMbS6i+vRECK3t7T1QLV+\nP3sVCPaXtcFW34iDphqjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEBMB0GA1UdDgQWBBQXIoEUCo7pN9yWTKzuu5w2cgmxUjAKBggqhkjOPQQD\nAgNIADBFAiEAlzGzFI91v9Ofbq2/GyhmD0ClMdIdhV4H9ZywL9iJ/wMCICPQYmRq\nnx6WP9cTWh0HEVM8oWxlQJ8AtMQqNFHuLB1Y\n-----END CERTIFICATE-----\n" "-----BEGIN CERTIFICATE-----\nMIICJjCCAc2gAwIBAgIUUg8VnWZ4QPo0ohjSzLtOg5SnqbswCgYIKoZIzj0EAwIw\ncDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH\nEwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMjExMTIyMTg0ODAwWhcNMzYxMTE4MTg0ODAw\nWjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV\nBAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT\nY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIOo\nNtC20scX8QGQgcSUvaau9RwQsKnq/t0914d3BoIqvBD94Ue1xX2VKEgFdQnQtIJq\n/ZzT63f3QC0fG5BrSjmjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEBMB0GA1UdDgQWBBTQn8ZDeefPmduovU85c2bqzyzb8TAKBggqhkjOPQQD\nAgNHADBEAiBXRKPF+MCMWIAzkHnbgeVrmKJBBjj6EeKU1IpdExDIogIgIw2PR2lx\nKSoiemyU6hTEWbBmpkJbTIEiuGljYvd4uIQ=\n-----END CERTIFICATE-----\n" ] }, "httpOptions": { Loading @@ -62,7 +62,7 @@ "orderer0.example.com": { "url": "grpcs://s2:7050", "tlsCACerts": { "pem": "-----BEGIN CERTIFICATE-----\nMIICCjCCAbGgAwIBAgIUKks7IUGYSmAhC7w/iUjZCie5dr4wCgYIKoZIzj0EAwIw\nYjELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQHEwhOZXcg\nWW9yazEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1wbGUu\nY29tMB4XDTIxMTExNjEzNTUwMFoXDTM2MTExMjEzNTUwMFowYjELMAkGA1UEBhMC\nVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQHEwhOZXcgWW9yazEUMBIGA1UE\nChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1wbGUuY29tMFkwEwYHKoZI\nzj0CAQYIKoZIzj0DAQcDQgAEelV1EbjujRxVKnFnwWwVbZaO3t9xDRz4o9t7nHEb\nMIqCDuDEZ8wZ4N/Gt/9QToTgWvGOLW7w9x0QQ07AlPALoKNFMEMwDgYDVR0PAQH/\nBAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYEFGiNPnPOIpCVoe/9\nDW2DAPUuAXOsMAoGCCqGSM49BAMCA0cAMEQCICll0GyPnXN84B6otL8xl+22uXYg\nxqk61hoMTui3LIqfAiA7YMtlFfcjgJLwGoxEvjaW6S6eS548/OZH6X5IEFjTXA==\n-----END CERTIFICATE-----\n" "pem": "-----BEGIN CERTIFICATE-----\nMIICCzCCAbGgAwIBAgIUVXJ8op9+t1XoWR3BDbodSHNA4WcwCgYIKoZIzj0EAwIw\nYjELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQHEwhOZXcg\nWW9yazEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1wbGUu\nY29tMB4XDTIxMTEyMjE4NDgwMFoXDTM2MTExODE4NDgwMFowYjELMAkGA1UEBhMC\nVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQHEwhOZXcgWW9yazEUMBIGA1UE\nChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1wbGUuY29tMFkwEwYHKoZI\nzj0CAQYIKoZIzj0DAQcDQgAE3ZjdgxSVlZpHiFHRjd7Sct5YSFlPOuKePGT8i8SN\nWh5bZje2JHSQ4JMMgiiyALJCHUdBqnfs05D0ds4Hz4rJUaNFMEMwDgYDVR0PAQH/\nBAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYEFEsA2wOBKpjnILGy\nIPtNmvIrwAt4MAoGCCqGSM49BAMCA0gAMEUCIQDxg/NK2ZuNrzA6U/lRU6IWQbwt\nC9gWNlz55pCS2HlWsAIgCHLo4oaECBYmGosqrC5hZQ5NgdV60X9Td0QC6zdYmJk=\n-----END CERTIFICATE-----\n" }, "grpcOptions": { "ssl-target-name-override": "orderer0.example.com", Loading src/dlt/src/main/kotlin/Main.kt +65 −28 Original line number Diff line number Diff line Loading @@ -3,38 +3,13 @@ import io.ktor.client.engine.cio.* import io.ktor.client.features.* import io.ktor.client.request.* import io.ktor.http.* import io.ktor.utils.io.jvm.javaio.* import kotlinx.serialization.ExperimentalSerializationApi import org.hyperledger.fabric.gateway.Gateway import org.hyperledger.fabric.gateway.Wallets import proto.Config import proto.Config.DltConfig import java.nio.file.Paths // helper function for getting connected to the gateway fun connect(): Gateway { // Load a file system based wallet for managing identities. val walletPath = Paths.get("wallet") val wallet = Wallets.newFileSystemWallet(walletPath) // load a CCP val networkConfigPath = Paths.get("config/connection-org1.json") val builder = Gateway.createBuilder() builder.identity(wallet, "appUser").networkConfig(networkConfigPath).discovery(true) return builder.connect() } @OptIn(ExperimentalSerializationApi::class) suspend fun main(args: Array<String>) { // // connect to the network and invoke the smart contract // connect().use { gateway -> // // get the network and contract // val network = gateway.getNetwork("dlt") // val contract = network.getContract("basic") // println("Submit Transaction: InitLedger creates the initial set of assets on the ledger.") // contract.submitTransaction("InitLedger") // val result = contract.evaluateTransaction("GetAllAssets") // println("Evaluate Transaction: GetAllAssets, result: " + String(result)) // } // TODO: default configuration file val cfg = DltConfig.newBuilder().setWallet("wallet").setConnectionFile("config/connection-org1.json") .setUser("appUser") Loading @@ -54,11 +29,11 @@ suspend fun main(args: Array<String>) { try { client.post<ByteArray>("http://localhost:8080/dlt/configure") { contentType(ContentType.Any) body = cfgBytes } } catch (e: ClientRequestException) { println(e.response.status) println(String(e.response.content.toInputStream().readAllBytes())) } try { Loading @@ -66,5 +41,67 @@ suspend fun main(args: Array<String>) { println(DltConfig.parseFrom(config)) } catch (e: ClientRequestException) { println(e.response.status) println(String(e.response.content.toInputStream().readAllBytes())) } val uuid = "41f4d2e2-f4ef-4c81-872a-c32f2d26b2ca" try { val record = client.get<ByteArray>("http://localhost:8080/dlt/record") { body = uuid } println(Config.DltRecord.parseFrom(record)) } catch (e: ClientRequestException) { println(e.response.status) println(String(e.response.content.toInputStream().readAllBytes())) } val id = Config.DltRecordId.newBuilder().setUuid(uuid).build() val record = Config.DltRecord.newBuilder().setId(id).setOperation(Config.DltRecordOperation.ADD) .setType(Config.DltRecordType.DEVICE).setJson("{}").build() try { val result = client.post<ByteArray>("http://localhost:8080/dlt/record") { body = record.toByteArray() } println(String(result)) val requestedRecord = client.get<ByteArray>("http://localhost:8080/dlt/record") { body = uuid } println(Config.DltRecord.parseFrom(requestedRecord)) } catch (e: ClientRequestException) { println(e.response.status) println(String(e.response.content.toInputStream().readAllBytes())) } try { val newRecord = Config.DltRecord.newBuilder().setId(id).setOperation(Config.DltRecordOperation.UPDATE) .setType(Config.DltRecordType.SLICE).setJson("{}").build() val result = client.post<ByteArray>("http://localhost:8080/dlt/record") { body = newRecord.toByteArray() } println(String(result)) val requestedRecord = client.get<ByteArray>("http://localhost:8080/dlt/record") { body = uuid } println(Config.DltRecord.parseFrom(requestedRecord)) } catch (e: ClientRequestException) { println(e.response.status) println(String(e.response.content.toInputStream().readAllBytes())) } try { val newRecord = Config.DltRecord.newBuilder().setId(id).setOperation(Config.DltRecordOperation.DISABLE) .setType(Config.DltRecordType.SLICE).setJson("{}").build() val result = client.post<ByteArray>("http://localhost:8080/dlt/record") { body = newRecord.toByteArray() } println(String(result)) val requestedRecord = client.get<ByteArray>("http://localhost:8080/dlt/record") { body = uuid } println(Config.DltRecord.parseFrom(requestedRecord)) } catch (e: ClientRequestException) { println(e.response.status) println(String(e.response.content.toInputStream().readAllBytes())) } } No newline at end of file src/dlt/src/main/kotlin/fabric/ConnectGateway.kt 0 → 100644 +17 −0 Original line number Diff line number Diff line package fabric import org.hyperledger.fabric.gateway.Contract import org.hyperledger.fabric.gateway.Gateway import org.hyperledger.fabric.gateway.Wallet import java.nio.file.Paths // helper function for getting connected to the gateway fun getContract(config: proto.Config.DltConfig, wallet: Wallet): Contract { // load a CCP val networkConfigPath = Paths.get(config.connectionFile) val builder = Gateway.createBuilder() builder.identity(wallet, config.user).networkConfig(networkConfigPath).discovery(true) val gateway = builder.connect() val network = gateway.getNetwork(config.channel) return network.getContract(config.contract) } No newline at end of file src/dlt/src/main/kotlin/fabric/FabricConnector.kt +45 −1 Original line number Diff line number Diff line package fabric import com.google.protobuf.util.JsonFormat import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import org.hyperledger.fabric.gateway.Contract import org.hyperledger.fabric.gateway.Wallet import org.hyperledger.fabric.gateway.Wallets import org.hyperledger.fabric.sdk.security.CryptoSuiteFactory Loading @@ -11,6 +15,8 @@ import java.util.* class FabricConnector(val config: Config.DltConfig) { private val caClient: HFCAClient private val wallet: Wallet private val contract: Contract init { // Create a CA client for interacting with the CA. val props = Properties() Loading @@ -22,10 +28,48 @@ class FabricConnector(val config: Config.DltConfig) { // Create a wallet for managing identities wallet = Wallets.newFileSystemWallet(Paths.get(config.wallet)) contract = connect() } fun connect() { fun connect(): Contract { enrollAdmin(config, caClient, wallet) registerUser(config, caClient, wallet) return getContract(config, wallet) } fun putData(record: Config.DltRecord): String { println(record.type.toString()) return String( contract.submitTransaction( "AddRecord", record.id.uuid, record.type.number.toString(), record.json ) ) } fun getData(uuid: String): Config.DltRecord { // TODO: get rid of json encoding/decoding val result = contract.evaluateTransaction("GetRecord", uuid) println(String(result)) val builder = Config.DltRecord.newBuilder() val protoRes = JsonFormat.parser().merge(String(result), builder) return builder.build() } fun updateData(record: Config.DltRecord): String { return String( contract.submitTransaction( "UpdateRecord", record.id.uuid, record.type.number.toString(), record.json ) ) } fun deleteData(uuid: String): String { return String(contract.submitTransaction("DeactivateRecord", uuid)) } } No newline at end of file Loading
src/dlt/config/ca.org1.example.com-cert.pem +8 −8 Original line number Diff line number Diff line -----BEGIN CERTIFICATE----- MIICJzCCAc2gAwIBAgIUPP8sE6DhhkVuX810ayyMK/77Zf0wCgYIKoZIzj0EAwIw MIICJjCCAc2gAwIBAgIUUg8VnWZ4QPo0ohjSzLtOg5SnqbswCgYIKoZIzj0EAwIw cDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH EwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh Lm9yZzEuZXhhbXBsZS5jb20wHhcNMjExMTE2MTM1NTAwWhcNMzYxMTEyMTM1NTAw Lm9yZzEuZXhhbXBsZS5jb20wHhcNMjExMTIyMTg0ODAwWhcNMzYxMTE4MTg0ODAw WjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV BAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT Y2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBe+ 8KfXrwccQaq8BAkob7bFiDYOGQoHA/lilmpOHiowzW5NMbS6i+vRECK3t7T1QLV+ P3sVCPaXtcFW34iDphqjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG AQH/AgEBMB0GA1UdDgQWBBQXIoEUCo7pN9yWTKzuu5w2cgmxUjAKBggqhkjOPQQD AgNIADBFAiEAlzGzFI91v9Ofbq2/GyhmD0ClMdIdhV4H9ZywL9iJ/wMCICPQYmRq nx6WP9cTWh0HEVM8oWxlQJ8AtMQqNFHuLB1Y Y2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIOo NtC20scX8QGQgcSUvaau9RwQsKnq/t0914d3BoIqvBD94Ue1xX2VKEgFdQnQtIJq /ZzT63f3QC0fG5BrSjmjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG AQH/AgEBMB0GA1UdDgQWBBTQn8ZDeefPmduovU85c2bqzyzb8TAKBggqhkjOPQQD AgNHADBEAiBXRKPF+MCMWIAzkHnbgeVrmKJBBjj6EeKU1IpdExDIogIgIw2PR2lx KSoiemyU6hTEWbBmpkJbTIEiuGljYvd4uIQ= -----END CERTIFICATE-----
src/dlt/config/connection-org1.json +4 −4 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ "peer0.org1.example.com": { "url": "grpcs://s2:7051", "tlsCACerts": { "pem": "-----BEGIN CERTIFICATE-----\nMIICJzCCAc2gAwIBAgIUPP8sE6DhhkVuX810ayyMK/77Zf0wCgYIKoZIzj0EAwIw\ncDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH\nEwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMjExMTE2MTM1NTAwWhcNMzYxMTEyMTM1NTAw\nWjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV\nBAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT\nY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBe+\n8KfXrwccQaq8BAkob7bFiDYOGQoHA/lilmpOHiowzW5NMbS6i+vRECK3t7T1QLV+\nP3sVCPaXtcFW34iDphqjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEBMB0GA1UdDgQWBBQXIoEUCo7pN9yWTKzuu5w2cgmxUjAKBggqhkjOPQQD\nAgNIADBFAiEAlzGzFI91v9Ofbq2/GyhmD0ClMdIdhV4H9ZywL9iJ/wMCICPQYmRq\nnx6WP9cTWh0HEVM8oWxlQJ8AtMQqNFHuLB1Y\n-----END CERTIFICATE-----\n" "pem": "-----BEGIN CERTIFICATE-----\nMIICJjCCAc2gAwIBAgIUUg8VnWZ4QPo0ohjSzLtOg5SnqbswCgYIKoZIzj0EAwIw\ncDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH\nEwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMjExMTIyMTg0ODAwWhcNMzYxMTE4MTg0ODAw\nWjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV\nBAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT\nY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIOo\nNtC20scX8QGQgcSUvaau9RwQsKnq/t0914d3BoIqvBD94Ue1xX2VKEgFdQnQtIJq\n/ZzT63f3QC0fG5BrSjmjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEBMB0GA1UdDgQWBBTQn8ZDeefPmduovU85c2bqzyzb8TAKBggqhkjOPQQD\nAgNHADBEAiBXRKPF+MCMWIAzkHnbgeVrmKJBBjj6EeKU1IpdExDIogIgIw2PR2lx\nKSoiemyU6hTEWbBmpkJbTIEiuGljYvd4uIQ=\n-----END CERTIFICATE-----\n" }, "grpcOptions": { "ssl-target-name-override": "peer0.org1.example.com", Loading @@ -36,7 +36,7 @@ "peer0.org2.example.com": { "url": "grpcs://s2:9051", "tlsCACerts": { "pem": "-----BEGIN CERTIFICATE-----\nMIICHjCCAcWgAwIBAgIUFKM/u+SoArOf8LaPzuNb+a/vyg8wCgYIKoZIzj0EAwIw\nbDELMAkGA1UEBhMCVUsxEjAQBgNVBAgTCUhhbXBzaGlyZTEQMA4GA1UEBxMHSHVy\nc2xleTEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eub3Jn\nMi5leGFtcGxlLmNvbTAeFw0yMTExMTYxMzU1MDBaFw0zNjExMTIxMzU1MDBaMGwx\nCzAJBgNVBAYTAlVLMRIwEAYDVQQIEwlIYW1wc2hpcmUxEDAOBgNVBAcTB0h1cnNs\nZXkxGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2NhLm9yZzIu\nZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQwFdmDU4/4Gzr6\nJjrbe6znK+QCbdt7wFbRDs3qn418MFgl4fs4x/LwDLCK/spQ4ovFSZpD7Cit8RLM\nzFT8a/rAo0UwQzAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBATAd\nBgNVHQ4EFgQUcHmxBBqyVYx0u5Gn2Av75fLB4twwCgYIKoZIzj0EAwIDRwAwRAIg\nNv/y6XtRg/k8PNdo1yOB6BAb+TuTStLs3WQOrcBMhgcCICCxl0jgIaYPXvxNE+8X\ntGKznq/sDoyzfz/dWUZh4Sdv\n-----END CERTIFICATE-----\n" "pem": "-----BEGIN CERTIFICATE-----\nMIICHjCCAcWgAwIBAgIUMQ2ItO6SSHzsgvAJZFN0iG+Q+/QwCgYIKoZIzj0EAwIw\nbDELMAkGA1UEBhMCVUsxEjAQBgNVBAgTCUhhbXBzaGlyZTEQMA4GA1UEBxMHSHVy\nc2xleTEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eub3Jn\nMi5leGFtcGxlLmNvbTAeFw0yMTExMjIxODQ4MDBaFw0zNjExMTgxODQ4MDBaMGwx\nCzAJBgNVBAYTAlVLMRIwEAYDVQQIEwlIYW1wc2hpcmUxEDAOBgNVBAcTB0h1cnNs\nZXkxGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2NhLm9yZzIu\nZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR3g4vdVJ87A6pG\nwTV5s0TSIC6lVfNKi0HbxhaMYhFcWHt2BBho8hgIAm6oWZ++J3x5zroejxApc8E5\n19Dpsr2ho0UwQzAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBATAd\nBgNVHQ4EFgQUK2BKZZP6iV1b7eozbFe77GLv7y0wCgYIKoZIzj0EAwIDRwAwRAIg\nHsbOx6v9vCD+8Ef5Pkks+EpmPPT2opW3JJHcEvlqmzkCIGS1nOW1Rf97+8BsfCwP\ngsqR6Ye2X75ek2vTymVXVDFJ\n-----END CERTIFICATE-----\n" }, "grpcOptions": { "ssl-target-name-override": "peer0.org2.example.com", Loading @@ -50,7 +50,7 @@ "caName": "ca-org1", "tlsCACerts": { "pem": [ "-----BEGIN CERTIFICATE-----\nMIICJzCCAc2gAwIBAgIUPP8sE6DhhkVuX810ayyMK/77Zf0wCgYIKoZIzj0EAwIw\ncDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH\nEwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMjExMTE2MTM1NTAwWhcNMzYxMTEyMTM1NTAw\nWjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV\nBAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT\nY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBe+\n8KfXrwccQaq8BAkob7bFiDYOGQoHA/lilmpOHiowzW5NMbS6i+vRECK3t7T1QLV+\nP3sVCPaXtcFW34iDphqjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEBMB0GA1UdDgQWBBQXIoEUCo7pN9yWTKzuu5w2cgmxUjAKBggqhkjOPQQD\nAgNIADBFAiEAlzGzFI91v9Ofbq2/GyhmD0ClMdIdhV4H9ZywL9iJ/wMCICPQYmRq\nnx6WP9cTWh0HEVM8oWxlQJ8AtMQqNFHuLB1Y\n-----END CERTIFICATE-----\n" "-----BEGIN CERTIFICATE-----\nMIICJjCCAc2gAwIBAgIUUg8VnWZ4QPo0ohjSzLtOg5SnqbswCgYIKoZIzj0EAwIw\ncDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH\nEwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMjExMTIyMTg0ODAwWhcNMzYxMTE4MTg0ODAw\nWjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV\nBAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT\nY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIOo\nNtC20scX8QGQgcSUvaau9RwQsKnq/t0914d3BoIqvBD94Ue1xX2VKEgFdQnQtIJq\n/ZzT63f3QC0fG5BrSjmjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEBMB0GA1UdDgQWBBTQn8ZDeefPmduovU85c2bqzyzb8TAKBggqhkjOPQQD\nAgNHADBEAiBXRKPF+MCMWIAzkHnbgeVrmKJBBjj6EeKU1IpdExDIogIgIw2PR2lx\nKSoiemyU6hTEWbBmpkJbTIEiuGljYvd4uIQ=\n-----END CERTIFICATE-----\n" ] }, "httpOptions": { Loading @@ -62,7 +62,7 @@ "orderer0.example.com": { "url": "grpcs://s2:7050", "tlsCACerts": { "pem": "-----BEGIN CERTIFICATE-----\nMIICCjCCAbGgAwIBAgIUKks7IUGYSmAhC7w/iUjZCie5dr4wCgYIKoZIzj0EAwIw\nYjELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQHEwhOZXcg\nWW9yazEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1wbGUu\nY29tMB4XDTIxMTExNjEzNTUwMFoXDTM2MTExMjEzNTUwMFowYjELMAkGA1UEBhMC\nVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQHEwhOZXcgWW9yazEUMBIGA1UE\nChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1wbGUuY29tMFkwEwYHKoZI\nzj0CAQYIKoZIzj0DAQcDQgAEelV1EbjujRxVKnFnwWwVbZaO3t9xDRz4o9t7nHEb\nMIqCDuDEZ8wZ4N/Gt/9QToTgWvGOLW7w9x0QQ07AlPALoKNFMEMwDgYDVR0PAQH/\nBAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYEFGiNPnPOIpCVoe/9\nDW2DAPUuAXOsMAoGCCqGSM49BAMCA0cAMEQCICll0GyPnXN84B6otL8xl+22uXYg\nxqk61hoMTui3LIqfAiA7YMtlFfcjgJLwGoxEvjaW6S6eS548/OZH6X5IEFjTXA==\n-----END CERTIFICATE-----\n" "pem": "-----BEGIN CERTIFICATE-----\nMIICCzCCAbGgAwIBAgIUVXJ8op9+t1XoWR3BDbodSHNA4WcwCgYIKoZIzj0EAwIw\nYjELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQHEwhOZXcg\nWW9yazEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1wbGUu\nY29tMB4XDTIxMTEyMjE4NDgwMFoXDTM2MTExODE4NDgwMFowYjELMAkGA1UEBhMC\nVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQHEwhOZXcgWW9yazEUMBIGA1UE\nChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1wbGUuY29tMFkwEwYHKoZI\nzj0CAQYIKoZIzj0DAQcDQgAE3ZjdgxSVlZpHiFHRjd7Sct5YSFlPOuKePGT8i8SN\nWh5bZje2JHSQ4JMMgiiyALJCHUdBqnfs05D0ds4Hz4rJUaNFMEMwDgYDVR0PAQH/\nBAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYEFEsA2wOBKpjnILGy\nIPtNmvIrwAt4MAoGCCqGSM49BAMCA0gAMEUCIQDxg/NK2ZuNrzA6U/lRU6IWQbwt\nC9gWNlz55pCS2HlWsAIgCHLo4oaECBYmGosqrC5hZQ5NgdV60X9Td0QC6zdYmJk=\n-----END CERTIFICATE-----\n" }, "grpcOptions": { "ssl-target-name-override": "orderer0.example.com", Loading
src/dlt/src/main/kotlin/Main.kt +65 −28 Original line number Diff line number Diff line Loading @@ -3,38 +3,13 @@ import io.ktor.client.engine.cio.* import io.ktor.client.features.* import io.ktor.client.request.* import io.ktor.http.* import io.ktor.utils.io.jvm.javaio.* import kotlinx.serialization.ExperimentalSerializationApi import org.hyperledger.fabric.gateway.Gateway import org.hyperledger.fabric.gateway.Wallets import proto.Config import proto.Config.DltConfig import java.nio.file.Paths // helper function for getting connected to the gateway fun connect(): Gateway { // Load a file system based wallet for managing identities. val walletPath = Paths.get("wallet") val wallet = Wallets.newFileSystemWallet(walletPath) // load a CCP val networkConfigPath = Paths.get("config/connection-org1.json") val builder = Gateway.createBuilder() builder.identity(wallet, "appUser").networkConfig(networkConfigPath).discovery(true) return builder.connect() } @OptIn(ExperimentalSerializationApi::class) suspend fun main(args: Array<String>) { // // connect to the network and invoke the smart contract // connect().use { gateway -> // // get the network and contract // val network = gateway.getNetwork("dlt") // val contract = network.getContract("basic") // println("Submit Transaction: InitLedger creates the initial set of assets on the ledger.") // contract.submitTransaction("InitLedger") // val result = contract.evaluateTransaction("GetAllAssets") // println("Evaluate Transaction: GetAllAssets, result: " + String(result)) // } // TODO: default configuration file val cfg = DltConfig.newBuilder().setWallet("wallet").setConnectionFile("config/connection-org1.json") .setUser("appUser") Loading @@ -54,11 +29,11 @@ suspend fun main(args: Array<String>) { try { client.post<ByteArray>("http://localhost:8080/dlt/configure") { contentType(ContentType.Any) body = cfgBytes } } catch (e: ClientRequestException) { println(e.response.status) println(String(e.response.content.toInputStream().readAllBytes())) } try { Loading @@ -66,5 +41,67 @@ suspend fun main(args: Array<String>) { println(DltConfig.parseFrom(config)) } catch (e: ClientRequestException) { println(e.response.status) println(String(e.response.content.toInputStream().readAllBytes())) } val uuid = "41f4d2e2-f4ef-4c81-872a-c32f2d26b2ca" try { val record = client.get<ByteArray>("http://localhost:8080/dlt/record") { body = uuid } println(Config.DltRecord.parseFrom(record)) } catch (e: ClientRequestException) { println(e.response.status) println(String(e.response.content.toInputStream().readAllBytes())) } val id = Config.DltRecordId.newBuilder().setUuid(uuid).build() val record = Config.DltRecord.newBuilder().setId(id).setOperation(Config.DltRecordOperation.ADD) .setType(Config.DltRecordType.DEVICE).setJson("{}").build() try { val result = client.post<ByteArray>("http://localhost:8080/dlt/record") { body = record.toByteArray() } println(String(result)) val requestedRecord = client.get<ByteArray>("http://localhost:8080/dlt/record") { body = uuid } println(Config.DltRecord.parseFrom(requestedRecord)) } catch (e: ClientRequestException) { println(e.response.status) println(String(e.response.content.toInputStream().readAllBytes())) } try { val newRecord = Config.DltRecord.newBuilder().setId(id).setOperation(Config.DltRecordOperation.UPDATE) .setType(Config.DltRecordType.SLICE).setJson("{}").build() val result = client.post<ByteArray>("http://localhost:8080/dlt/record") { body = newRecord.toByteArray() } println(String(result)) val requestedRecord = client.get<ByteArray>("http://localhost:8080/dlt/record") { body = uuid } println(Config.DltRecord.parseFrom(requestedRecord)) } catch (e: ClientRequestException) { println(e.response.status) println(String(e.response.content.toInputStream().readAllBytes())) } try { val newRecord = Config.DltRecord.newBuilder().setId(id).setOperation(Config.DltRecordOperation.DISABLE) .setType(Config.DltRecordType.SLICE).setJson("{}").build() val result = client.post<ByteArray>("http://localhost:8080/dlt/record") { body = newRecord.toByteArray() } println(String(result)) val requestedRecord = client.get<ByteArray>("http://localhost:8080/dlt/record") { body = uuid } println(Config.DltRecord.parseFrom(requestedRecord)) } catch (e: ClientRequestException) { println(e.response.status) println(String(e.response.content.toInputStream().readAllBytes())) } } No newline at end of file
src/dlt/src/main/kotlin/fabric/ConnectGateway.kt 0 → 100644 +17 −0 Original line number Diff line number Diff line package fabric import org.hyperledger.fabric.gateway.Contract import org.hyperledger.fabric.gateway.Gateway import org.hyperledger.fabric.gateway.Wallet import java.nio.file.Paths // helper function for getting connected to the gateway fun getContract(config: proto.Config.DltConfig, wallet: Wallet): Contract { // load a CCP val networkConfigPath = Paths.get(config.connectionFile) val builder = Gateway.createBuilder() builder.identity(wallet, config.user).networkConfig(networkConfigPath).discovery(true) val gateway = builder.connect() val network = gateway.getNetwork(config.channel) return network.getContract(config.contract) } No newline at end of file
src/dlt/src/main/kotlin/fabric/FabricConnector.kt +45 −1 Original line number Diff line number Diff line package fabric import com.google.protobuf.util.JsonFormat import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import org.hyperledger.fabric.gateway.Contract import org.hyperledger.fabric.gateway.Wallet import org.hyperledger.fabric.gateway.Wallets import org.hyperledger.fabric.sdk.security.CryptoSuiteFactory Loading @@ -11,6 +15,8 @@ import java.util.* class FabricConnector(val config: Config.DltConfig) { private val caClient: HFCAClient private val wallet: Wallet private val contract: Contract init { // Create a CA client for interacting with the CA. val props = Properties() Loading @@ -22,10 +28,48 @@ class FabricConnector(val config: Config.DltConfig) { // Create a wallet for managing identities wallet = Wallets.newFileSystemWallet(Paths.get(config.wallet)) contract = connect() } fun connect() { fun connect(): Contract { enrollAdmin(config, caClient, wallet) registerUser(config, caClient, wallet) return getContract(config, wallet) } fun putData(record: Config.DltRecord): String { println(record.type.toString()) return String( contract.submitTransaction( "AddRecord", record.id.uuid, record.type.number.toString(), record.json ) ) } fun getData(uuid: String): Config.DltRecord { // TODO: get rid of json encoding/decoding val result = contract.evaluateTransaction("GetRecord", uuid) println(String(result)) val builder = Config.DltRecord.newBuilder() val protoRes = JsonFormat.parser().merge(String(result), builder) return builder.build() } fun updateData(record: Config.DltRecord): String { return String( contract.submitTransaction( "UpdateRecord", record.id.uuid, record.type.number.toString(), record.json ) ) } fun deleteData(uuid: String): String { return String(contract.submitTransaction("DeactivateRecord", uuid)) } } No newline at end of file