拼團眾籌模式技術系統開發詳情

aa111111發表於2023-02-28

設定Identity 用到的方法原型如下: Gateway.Builder identity(Identity identity) 設定Identity其實就是向Gateway中匯入賬戶的身份證書。傳參型別 Identity 也是一個介面,該介面在Gateway實現中被X509Identity這個類所實現。我們需要構造並傳進去的,也是這個X509Identity。這個類的構造方法比較簡單,需要指定賬戶所屬組織的mspID,以及X509Certificate private static Identity newIdentity() throws IOException, CertificatException { // certPath為證書路徑        var certReader = Files.newBufferedReader(certPath);        // 建立 X509Certificate        var certificate = Identities.readX509Certificate(certReader);        return new X509Identity(mspID, certificate); } 1 2 3 4 5 6 7 8 這裡建立X509Certificate用到的,是Identities類中的方法,注意區分 Identity介面 和 Identities類。Identities類並沒有實現 Identity介面,也沒有自己的屬性,而是實現了一些方便進行證書、金鑰讀寫的靜態方法。 2.2.2 設定Signer 用到的方法原型如下: Gateway.Builder signer(Signer signer) 設定Signer其實就是向Gateway中匯入賬戶與證書相匹配的私鑰。 只要熟悉了上面 Identity 的套路,Signer以及之後的其他設定都是類似的。傳參型別中的Signer是一個介面,它只宣告瞭一個方法,byte sign(byte[] digest)即對訊息摘要進行簽名。這個介面被ECPrivateKeySigner 類實現,整個Gateway實現中,實際負責簽名的,便是這個ECPrivateKeySigner 類的例項。 2.2.3 設定gRPC Channel 還記得2.1中我們建立的 gRPC Channel 嗎?這裡導進來就行,函式原型如下: Gateway.Builder connection(Channel grpcChannel) 1 2.2.4 設定gRPC任務超時時間 這一步是可選的,目的是為了設定各項任務的超時時間。這其中常用方法的函式原型如下: default Gateway.Builder evaluateOptions(CallOption... options); default Gateway.Builder endorseOptions(CallOption... options); default Gateway.Builder submitOptions(CallOption... options); default Gateway.Builder commitStatusOptions(CallOption... options); 1 2 3 4 他們各自的作用在後面 3. 鏈碼的執行與提交 部分會提到,我們先只需要知道他們各自設定了一項任務的超時時間。 這裡我們先看看傳入引數型別 CallOption 類,這個也是Gateway實現中獨有的類,目的是設定gRPC執行時的行為,目前主要用來設定超時。我們可以透過 CallOption 類中的 public static CallOption deadlineAfter(long duration, TimeUnit unit) 方法來構建一個超時設定物件,並透過上面介面中宣告的超時方法,將超時設定物件與特定的任務繫結到一起。例如,指定背書超時時間為5分鐘可以這麼寫: // builder是透過Gateway建立的一個GatewayImpl例項 builder.endorseOptions(CallOption.deadlineAfter(5, TimeUnit.SECONDS)) 1 2 現在我們已經完成了對Gateway屬性的設定。 其實從原始碼來看,我們在呼叫connect()方法之前,從始至終操作的就是同一個Builder物件,呼叫上面的設定方法,實際上是呼叫中GatewayImpl中Builder內建類的方法,以完成對該Builder物件中各個屬性的設定。 可以拿connection方法舉個例子: // Builder為GatewayImpl的內建類    public static final class Builder implements Gateway.Builder {        private static final Signer UNDEFINED_SIGNER = (digest) -> {            throw new UnsupportedOperationException("No signing implementation supplied");        };        private Channel grpcChannel;        private Identity identity;        private Signer signer;        private Function<byte[], byte[]> hash;        private final DefaultCallOptions.Builder optionsBuilder;        public Builder() {            this.signer = UNDEFINED_SIGNER;            this.hash = Hash::sha256;            this.optionsBuilder = DefaultCallOptions.newBuiler();        } //注意看這裡,其實設定的是Builder類中的屬性,並沒有對外面的GatewayImpl物件的靜態屬性產生影響        public Builder connection(Channel grpcChannel) {            Objects.requireNonNull(grpcChannel, "connection");            this.grpcChannel = grpcChannel;            return this;        } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 每一次設定方法的呼叫,對於GatewayImpl物件的靜態屬性都沒有造成實質更改(其實GatewayImpl沒有什麼靜態屬性哈哈哈)。當所有的設定配置完畢,可以透過呼叫connect方法應用上面的配置。我們看一下Builder類中 connect方法的實現: public GatewayImpl connect() {       return new GatewayImpl(this); } 1 2 3 connect()方法其實就是呼叫GatewayImpl類的有參構造方法,將Builder物件傳入,以將其中的屬性,配置到新建立的GatewayImpl物件中,並將這個物件返回。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010128/viewspace-2937348/,如需轉載,請註明出處,否則將追究法律責任。

相關文章