diff --git a/cmd/goduck/fabric/contract.go b/cmd/goduck/fabric/contract.go index 2dfdafa..0bda391 100644 --- a/cmd/goduck/fabric/contract.go +++ b/cmd/goduck/fabric/contract.go @@ -42,6 +42,12 @@ var ContractCMD = &cli.Command{ Value: "relay", Required: false, }, + &cli.StringFlag{ + Name: "fabric-version", + Usage: "1.14.3 or 2.0.0", + Value: "2.0.0", + Required: false, + }, }, Action: installChaincode, }, @@ -152,13 +158,19 @@ func installChaincode(ctx *cli.Context) error { pierType := ctx.String("pier-type") + fabricVersion := ctx.String("fabric-version") + repoRoot, err := repo.PathRootWithDefault(ctx.String("repo")) if err != nil { return err } args := make([]string, 0) - args = append(args, filepath.Join(repoRoot, types.ChaincodeScript), "install", "-c", configPath, "-g", absPath, "-b", bxhVersion, "-t", pierType) + if fabricVersion == "2.0.0" { + args = append(args, filepath.Join(repoRoot, types.DeployChaincodeScript), "install", "-c", configPath, "-g", absPath, "-b", bxhVersion, "-t", pierType) + } else { + args = append(args, filepath.Join(repoRoot, types.ChaincodeScript), "install", "-c", configPath, "-g", absPath, "-b", bxhVersion, "-t", pierType) + } return utils.ExecuteShell(args, repoRoot) } diff --git a/config/fabric/config.yaml b/config/fabric/config.yaml index 2563f4a..a18c4f1 100644 --- a/config/fabric/config.yaml +++ b/config/fabric/config.yaml @@ -25,7 +25,7 @@ client: # requiring a key store. PKCS#11 based implementations does not. cryptoStore: # Specific to the underlying KeyValueStore that backs the crypto key store. - path: /tmp/msp + path: {FABRIC_PATH}/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp # BCCSP config for the client. Used by GO SDK. BCCSP: @@ -44,9 +44,9 @@ client: #[Optional]. Client key and cert for TLS handshake with peers and orderers client: key: - path: {FABRIC_PATH}/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/tls/server.key + path: {FABRIC_PATH}/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/tls/client.key cert: - path: {FABRIC_PATH}/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/tls/server.crt + path: {FABRIC_PATH}/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/tls/client.crt # # [Optional]. But most apps would have this section so that channel objects can be constructed diff --git a/go.mod b/go.mod index b0986e7..50577bb 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/gobuffalo/packr v1.30.1 github.com/gorilla/mux v1.8.0 // indirect github.com/hyperledger/fabric v2.0.1+incompatible - github.com/hyperledger/fabric-sdk-go v1.0.0-beta1 + github.com/hyperledger/fabric-sdk-go v1.0.0-beta2 github.com/libp2p/go-libp2p-core v0.5.7-0.20200520175250-264788628f5a github.com/meshplus/bitxhub v1.1.0-rc1.0.20201020024116-dcdc23de5d04 github.com/meshplus/bitxhub-kit v1.1.2-0.20210112075018-319e668d6359 @@ -39,6 +39,8 @@ require ( github.com/stretchr/testify v1.7.0 github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31 github.com/urfave/cli/v2 v2.3.0 + golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect + golang.org/x/tools v0.1.11 // indirect gopkg.in/VividCortex/ewma.v1 v1.1.1 // indirect gopkg.in/cheggaaa/pb.v2 v2.0.7 // indirect gopkg.in/fatih/color.v1 v1.7.0 // indirect diff --git a/go.sum b/go.sum index 0ac775d..99cfcf3 100644 --- a/go.sum +++ b/go.sum @@ -378,11 +378,11 @@ github.com/hyperledger/fabric-amcl v0.0.0-20200128223036-d1aa2665426a h1:HgdNn3U github.com/hyperledger/fabric-amcl v0.0.0-20200128223036-d1aa2665426a/go.mod h1:X+DIyUsaTmalOpmpQfIvFZjKHQedrURQ5t4YqquX7lE= github.com/hyperledger/fabric-lib-go v1.0.0 h1:UL1w7c9LvHZUSkIvHTDGklxFv2kTeva1QI2emOVc324= github.com/hyperledger/fabric-lib-go v1.0.0/go.mod h1:H362nMlunurmHwkYqR5uHL2UDWbQdbfz74n8kbCFsqc= -github.com/hyperledger/fabric-protos-go v0.0.0-20190821180310-6b6ac9042dfd/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0= +github.com/hyperledger/fabric-protos-go v0.0.0-20191121202242-f5500d5e3e85/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0= github.com/hyperledger/fabric-protos-go v0.0.0-20200330074707-cfe579e86986 h1:g9tgYXQPZcxRryp2/rutvfSCiiJzHNoyX7JaoXeGkZ8= github.com/hyperledger/fabric-protos-go v0.0.0-20200330074707-cfe579e86986/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0= -github.com/hyperledger/fabric-sdk-go v1.0.0-beta1 h1:id5BJE6TZu/SaGQahns6sO2o+n5fwps7GrWGCJJnAY8= -github.com/hyperledger/fabric-sdk-go v1.0.0-beta1/go.mod h1:i8yJ9t8i1fGe7opUcq6uESxhruMJNXlc+Rx9ooBZsYg= +github.com/hyperledger/fabric-sdk-go v1.0.0-beta2 h1:FBYygns0Qga+mQ4PXycyTU5m4N9KAZM+Ttf7agiV7M8= +github.com/hyperledger/fabric-sdk-go v1.0.0-beta2/go.mod h1:/s224b8NLvOJOCIqBvWd9O6u7GE33iuIOT6OfcTE1OE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= @@ -1046,6 +1046,7 @@ github.com/xtaci/kcp-go v5.4.20+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45 github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -1095,8 +1096,9 @@ golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1117,8 +1119,9 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1126,8 +1129,9 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1161,8 +1165,9 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1225,8 +1230,11 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988 h1:EjgCl+fVlIaPJSori0ikSz3uV0DOHKWOJFpv1sAAhBM= golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1234,8 +1242,10 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1274,11 +1284,13 @@ golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200221224223-e1da425f72fd/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/internal/types/types.go b/internal/types/types.go index 3836a5a..ddb6375 100644 --- a/internal/types/types.go +++ b/internal/types/types.go @@ -29,6 +29,7 @@ const ( PlaygroundScript = "playground.sh" FabricScript = "fabric.sh" ChaincodeScript = "chaincode.sh" + DeployChaincodeScript = "deploy_chaincode.sh" EthereumScript = "ethereum.sh" PierScript = "run_pier.sh" QuickStartScript = "quick_start.sh" diff --git a/scripts/byfn.sh b/scripts/byfn.sh index 7063053..4b4a3ba 100755 --- a/scripts/byfn.sh +++ b/scripts/byfn.sh @@ -9,7 +9,7 @@ # Fabric network. # # The end-to-end verification provisions a sample Fabric network consisting of -# two organizations, each maintaining two peers, and a “solo” ordering service. +# two organizations, each maintaining two peers, and a Raft ordering service. # # This verification makes use of two fundamental tools, which are necessary to # create a functioning transactional network with digital signature validation @@ -45,10 +45,8 @@ function printHelp() { echo " -c - channel name to use (defaults to \"mychannel\")" echo " -t - CLI timeout duration in seconds (defaults to 10)" echo " -d - delay duration in seconds (defaults to 3)" - echo " -f - specify which docker-compose file use (defaults to docker-compose-cli.yaml)" echo " -s - the database backend to use: goleveldb (default) or couchdb" - echo " -l - the chaincode language: golang (default) or node" - echo " -o - the consensus-type of the ordering service: solo (default), kafka, or etcdraft" + echo " -l - the programming language of the chaincode to deploy: go (default), javascript, or java" echo " -i - the tag to be used to launch the network (defaults to \"latest\")" echo " -a - launch certificate authorities (no certificate authorities are launched by default)" echo " -n - do not deploy chaincode (abstore chaincode is deployed by default)" @@ -61,7 +59,7 @@ function printHelp() { echo " byfn.sh generate -c mychannel" echo " byfn.sh up -c mychannel -s couchdb" echo " byfn.sh up -c mychannel -s couchdb -i 1.4.0" - echo " byfn.sh up -l node" + echo " byfn.sh up -l javascript" echo " byfn.sh down -c mychannel" echo " byfn.sh upgrade -c mychannel" echo @@ -92,7 +90,7 @@ function askProceed() { # Obtain CONTAINER_IDS and remove them # TODO Might want to make this optional - could clear other containers function clearContainers() { - CONTAINER_IDS=$(docker ps -a | awk '($2 ~ /dev-peer.*.mycc.*/) {print $1}') + CONTAINER_IDS=$(docker ps -a | awk '($2 ~ /dev-peer.*/) {print $1}') if [ -z "$CONTAINER_IDS" -o "$CONTAINER_IDS" == " " ]; then echo "---- No containers available for deletion ----" else @@ -104,7 +102,7 @@ function clearContainers() { # specifically the following images are often left behind: # TODO list generated image naming patterns function removeUnwantedImages() { - DOCKER_IMAGE_IDS=$(docker images | awk '($1 ~ /dev-peer.*.mycc.*/) {print $3}') + DOCKER_IMAGE_IDS=$(docker images | awk '($1 ~ /dev-peer.*/) {print $3}') if [ -z "$DOCKER_IMAGE_IDS" -o "$DOCKER_IMAGE_IDS" == " " ]; then echo "---- No images available for deletion ----" else @@ -113,7 +111,7 @@ function removeUnwantedImages() { } # Versions of fabric known not to work with this release of first-network -BLACKLISTED_VERSIONS="^1\.0\. ^1\.1\.0-preview ^1\.1\.0-alpha" +BLACKLISTED_VERSIONS="^1\." # Do some basic sanity checking to make sure that the appropriate versions of fabric # binaries/images are available. In the future, additional checking for the presence @@ -138,14 +136,12 @@ function checkPrereqs() { echo "$LOCAL_VERSION" | grep -q $UNSUPPORTED_VERSION if [ $? -eq 0 ]; then echo "ERROR! Local Fabric binary version of $LOCAL_VERSION does not match this newer version of BYFN and is unsupported. Either move to a later version of Fabric or checkout an earlier version of fabric-samples." - cd ../../ && rm -rf ./fabric-samples exit 1 fi echo "$DOCKER_IMAGE_VERSION" | grep -q $UNSUPPORTED_VERSION if [ $? -eq 0 ]; then echo "ERROR! Fabric Docker image version of $DOCKER_IMAGE_VERSION does not match this newer version of BYFN and is unsupported. Either move to a later version of Fabric or checkout an earlier version of fabric-samples." - cd ../../ && rm -rf ./fabric-samples exit 1 fi done @@ -157,20 +153,14 @@ function networkUp() { # generate artifacts if they don't exist if [ ! -d "crypto-config" ]; then generateCerts - replacePrivateKey + generateChannelArtifacts fi - generateChannelArtifacts - COMPOSE_FILES="-f ${COMPOSE_FILE}" + COMPOSE_FILES="-f ${COMPOSE_FILE} -f ${COMPOSE_FILE_RAFT2}" if [ "${CERTIFICATE_AUTHORITIES}" == "true" ]; then COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_CA}" export BYFN_CA1_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org1.example.com/ca && ls *_sk) export BYFN_CA2_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org2.example.com/ca && ls *_sk) fi - if [ "${CONSENSUS_TYPE}" == "kafka" ]; then - COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_KAFKA}" - elif [ "${CONSENSUS_TYPE}" == "etcdraft" ]; then - COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_RAFT2}" - fi if [ "${IF_COUCHDB}" == "couchdb" ]; then COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_COUCH}" fi @@ -178,27 +168,24 @@ function networkUp() { docker ps -a if [ $? -ne 0 ]; then echo "ERROR !!!! Unable to start network" - cd ../../ && rm -rf ./fabric-samples exit 1 fi - if [ "$CONSENSUS_TYPE" == "kafka" ]; then - sleep 1 - echo "Sleeping 10s to allow $CONSENSUS_TYPE cluster to complete booting" - sleep 9 - fi + echo "Sleeping 15s to allow Raft cluster to complete booting" + sleep 15 - if [ "$CONSENSUS_TYPE" == "etcdraft" ]; then - sleep 1 - echo "Sleeping 15s to allow $CONSENSUS_TYPE cluster to complete booting" - sleep 14 + if [ "${NO_CHAINCODE}" != "true" ]; then + echo Vendoring Go dependencies ... + pushd ../chaincode/abstore/go + GO111MODULE=on go mod vendor + popd + echo Finished vendoring Go dependencies fi # now run the end to end script - docker exec cli scripts/script.sh $CHANNEL_NAME $CLI_DELAY $LANGUAGE $CLI_TIMEOUT $VERBOSE $NO_CHAINCODE + docker exec cli scripts/script.sh $CHANNEL_NAME $CLI_DELAY $CC_SRC_LANGUAGE $CLI_TIMEOUT $VERBOSE $NO_CHAINCODE if [ $? -ne 0 ]; then echo "ERROR !!!! Test failed" - cd ../../ && rm -rf ./fabric-samples exit 1 fi } @@ -211,7 +198,6 @@ function upgradeNetwork() { docker inspect -f '{{.Config.Volumes}}' orderer.example.com | grep -q '/var/hyperledger/production/orderer' if [ $? -ne 0 ]; then echo "ERROR !!!! This network does not appear to start with fabric-samples >= v1.3.x?" - cd ../../ && rm -rf ./fabric-samples exit 1 fi @@ -221,17 +207,12 @@ function upgradeNetwork() { mkdir -p $LEDGERS_BACKUP export IMAGE_TAG=$IMAGETAG - COMPOSE_FILES="-f ${COMPOSE_FILE}" + COMPOSE_FILES="-f ${COMPOSE_FILE} -f ${COMPOSE_FILE_RAFT2}" if [ "${CERTIFICATE_AUTHORITIES}" == "true" ]; then COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_CA}" export BYFN_CA1_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org1.example.com/ca && ls *_sk) export BYFN_CA2_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org2.example.com/ca && ls *_sk) fi - if [ "${CONSENSUS_TYPE}" == "kafka" ]; then - COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_KAFKA}" - elif [ "${CONSENSUS_TYPE}" == "etcdraft" ]; then - COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_RAFT2}" - fi if [ "${IF_COUCHDB}" == "couchdb" ]; then COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_COUCH}" fi @@ -266,10 +247,9 @@ function upgradeNetwork() { docker-compose $COMPOSE_FILES up -d --no-deps $PEER done - docker exec cli sh -c "SYS_CHANNEL=$CH_NAME && scripts/upgrade_to_v14.sh $CHANNEL_NAME $CLI_DELAY $LANGUAGE $CLI_TIMEOUT $VERBOSE" + docker exec cli scripts/upgrade_to_v14.sh $CHANNEL_NAME $CLI_DELAY $CC_SRC_LANGUAGE $CLI_TIMEOUT $VERBOSE if [ $? -ne 0 ]; then echo "ERROR !!!! Test failed" - cd ../../ && rm -rf ./fabric-samples exit 1 fi else @@ -280,8 +260,7 @@ function upgradeNetwork() { # Tear down running network function networkDown() { # stop org3 containers also in addition to org1 and org2, in case we were running sample to add org3 - # stop kafka and zookeeper containers in case we're running with kafka consensus-type - docker-compose -f $COMPOSE_FILE -f $COMPOSE_FILE_COUCH -f $COMPOSE_FILE_KAFKA -f $COMPOSE_FILE_RAFT2 -f $COMPOSE_FILE_CA -f $COMPOSE_FILE_ORG3 down --volumes --remove-orphans + docker-compose -f $COMPOSE_FILE -f $COMPOSE_FILE_COUCH -f $COMPOSE_FILE_RAFT2 -f $COMPOSE_FILE_CA -f $COMPOSE_FILE_ORG3 down --volumes --remove-orphans # Don't remove the generated artifacts -- note, the ledgers are always removed if [ "$MODE" != "restart" ]; then @@ -294,41 +273,6 @@ function networkDown() { removeUnwantedImages # remove orderer block and other channel configuration transactions and certs rm -rf channel-artifacts/*.block channel-artifacts/*.tx crypto-config ./org3-artifacts/crypto-config/ channel-artifacts/org3.json - # remove the docker-compose yaml file that was customized to the example - rm -f docker-compose-e2e.yaml - fi -} - -# Using docker-compose-e2e-template.yaml, replace constants with private key file names -# generated by the cryptogen tool and output a docker-compose.yaml specific to this -# configuration -function replacePrivateKey() { - # sed on MacOSX does not support -i flag with a null extension. We will use - # 't' for our back-up's extension and delete it at the end of the function - ARCH=$(uname -s | grep Darwin) - if [ "$ARCH" == "Darwin" ]; then - OPTS="-it" - else - OPTS="-i" - fi - - # Copy the template to the file that will be modified to add the private key - cp docker-compose-e2e-template.yaml docker-compose-e2e.yaml - - # The next steps will replace the template's contents with the - # actual values of the private key file names for the two CAs. - CURRENT_DIR=$PWD - cd crypto-config/peerOrganizations/org1.example.com/ca/ - PRIV_KEY=$(ls *_sk) - cd "$CURRENT_DIR" - sed $OPTS "s/CA1_PRIVATE_KEY/${PRIV_KEY}/g" docker-compose-e2e.yaml - cd crypto-config/peerOrganizations/org2.example.com/ca/ - PRIV_KEY=$(ls *_sk) - cd "$CURRENT_DIR" - sed $OPTS "s/CA2_PRIVATE_KEY/${PRIV_KEY}/g" docker-compose-e2e.yaml - # If MacOSX, remove the temporary backup of the docker-compose file - if [ "$ARCH" == "Darwin" ]; then - rm docker-compose-e2e.yamlt fi } @@ -354,7 +298,6 @@ function generateCerts() { which cryptogen if [ "$?" -ne 0 ]; then echo "cryptogen tool not found. exiting" - cd ../../ && rm -rf ./fabric-samples exit 1 fi echo @@ -371,7 +314,6 @@ function generateCerts() { set +x if [ $res -ne 0 ]; then echo "Failed to generate certificates..." - cd ../../ && rm -rf ./fabric-samples exit 1 fi echo @@ -421,7 +363,6 @@ function generateChannelArtifacts() { which configtxgen if [ "$?" -ne 0 ]; then echo "configtxgen tool not found. exiting" - cd ../../ && rm -rf ./fabric-samples exit 1 fi @@ -430,25 +371,12 @@ function generateChannelArtifacts() { echo "##########################################################" # Note: For some unknown reason (at least for now) the block file can't be # named orderer.genesis.block or the orderer will fail to launch! - echo "CONSENSUS_TYPE="$CONSENSUS_TYPE set -x - if [ "$CONSENSUS_TYPE" == "solo" ]; then - configtxgen -profile TwoOrgsOrdererGenesis -channelID $SYS_CHANNEL -outputBlock ./channel-artifacts/genesis.block - elif [ "$CONSENSUS_TYPE" == "kafka" ]; then - configtxgen -profile SampleDevModeKafka -channelID $SYS_CHANNEL -outputBlock ./channel-artifacts/genesis.block - elif [ "$CONSENSUS_TYPE" == "etcdraft" ]; then - configtxgen -profile SampleMultiNodeEtcdRaft -channelID $SYS_CHANNEL -outputBlock ./channel-artifacts/genesis.block - else - set +x - echo "unrecognized CONSESUS_TYPE='$CONSENSUS_TYPE'. exiting" - cd ../../ && rm -rf ./fabric-samples - exit 1 - fi + configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block res=$? set +x if [ $res -ne 0 ]; then echo "Failed to generate orderer genesis block..." - cd ../../ && rm -rf ./fabric-samples exit 1 fi echo @@ -461,7 +389,6 @@ function generateChannelArtifacts() { set +x if [ $res -ne 0 ]; then echo "Failed to generate channel configuration transaction..." - cd ../../ && rm -rf ./fabric-samples exit 1 fi @@ -475,7 +402,6 @@ function generateChannelArtifacts() { set +x if [ $res -ne 0 ]; then echo "Failed to generate anchor peer update for Org1MSP..." - cd ../../ && rm -rf ./fabric-samples exit 1 fi @@ -490,22 +416,16 @@ function generateChannelArtifacts() { set +x if [ $res -ne 0 ]; then echo "Failed to generate anchor peer update for Org2MSP..." - cd ../../ && rm -rf ./fabric-samples exit 1 fi echo } -# Obtain the OS and Architecture string that will be used to select the correct -# native binaries for your platform, e.g., darwin-amd64 or linux-amd64 -OS_ARCH=$(echo "$(uname -s | tr '[:upper:]' '[:lower:]' | sed 's/mingw64_nt.*/windows/')-$(uname -m | sed 's/x86_64/amd64/g')" | awk '{print tolower($0)}') # timeout duration - the duration the CLI should wait for a response from # another container before giving up CLI_TIMEOUT=10 # default for delay between commands CLI_DELAY=3 -# system channel name defaults to "byfn-sys-channel" -SYS_CHANNEL="byfn-sys-channel" # channel name defaults to "mychannel" CHANNEL_NAME="mychannel" # use this as the default docker-compose yaml definition @@ -514,19 +434,15 @@ COMPOSE_FILE=docker-compose-cli.yaml COMPOSE_FILE_COUCH=docker-compose-couch.yaml # org3 docker compose file COMPOSE_FILE_ORG3=docker-compose-org3.yaml -# kafka and zookeeper compose file -COMPOSE_FILE_KAFKA=docker-compose-kafka.yaml # two additional etcd/raft orderers COMPOSE_FILE_RAFT2=docker-compose-etcdraft2.yaml # certificate authorities compose file COMPOSE_FILE_CA=docker-compose-ca.yaml # -# use golang as the default language for chaincode -LANGUAGE=golang +# use go as the default language for chaincode +CC_SRC_LANGUAGE=go # default image tag IMAGETAG="latest" -# default consensus type -CONSENSUS_TYPE="solo" # Parse commandline args if [ "$1" = "-m" ]; then # supports old usage, muscle memory is powerful! shift @@ -549,7 +465,7 @@ else exit 1 fi -while getopts "h?c:t:d:f:s:l:i:o:anv" opt; do +while getopts "h?c:t:d:s:l:i:anv" opt; do case "$opt" in h | \?) printHelp @@ -564,21 +480,15 @@ while getopts "h?c:t:d:f:s:l:i:o:anv" opt; do d) CLI_DELAY=$OPTARG ;; - f) - COMPOSE_FILE=$OPTARG - ;; s) IF_COUCHDB=$OPTARG ;; l) - LANGUAGE=$OPTARG + CC_SRC_LANGUAGE=$OPTARG ;; i) IMAGETAG=$(go env GOARCH)"-"$OPTARG ;; - o) - CONSENSUS_TYPE=$OPTARG - ;; a) CERTIFICATE_AUTHORITIES=true ;; @@ -610,7 +520,6 @@ elif [ "${MODE}" == "down" ]; then ## Clear the network networkDown elif [ "${MODE}" == "generate" ]; then ## Generate Artifacts generateCerts - replacePrivateKey generateChannelArtifacts elif [ "${MODE}" == "restart" ]; then ## Restart the network networkDown diff --git a/scripts/deploy_chaincode.sh b/scripts/deploy_chaincode.sh new file mode 100644 index 0000000..c80035d --- /dev/null +++ b/scripts/deploy_chaincode.sh @@ -0,0 +1,485 @@ +#!/usr/bin/env bash + +set -e + +CURRENT_PATH=$(pwd) +RED='\033[0;31m' +GREEN='\033[0;32m' +BLUE='\033[0;34m' +NC='\033[0m' + +function print_blue() { + printf "${BLUE}%s${NC}\n" "$1" +} + +function print_red() { + printf "${RED}%s${NC}\n" "$1" +} + +function printHelp() { + print_blue "Usage: " + echo " chaincode.sh [-c ] [-v ] [-t ]" + echo " - one of 'install', 'upgrade', 'init'" + echo " - 'install' - install broker, transfer and data_swapper chaincode" + echo " - 'upgrade ' - upgrade broker, transfer and data_swapper chaincode" + echo " -c - specify which config.yaml file use (default \"./config.yaml\")" + echo " -g - specify which chaincode project to use (default \"./contracts/broker)" + echo " -v - upgrade fabric chaincode version (default \"v1\")" + echo " chaincode.sh -h (print this message)" +} + +function prepare() { + + if [ ! -d fabric/crypto-config ]; then + print_red "===> Please provide the 'crypto-config' of your fabric network" + exit 1 + fi + +} + +function prepareContract() { + if [ ! -d contracts ]; then + print_blue "===> Download chaincode" + wget https://github.com/meshplus/pier-client-fabric/raw/$BXH_VERSION/example/contracts.zip + unzip -q contracts.zip + rm contracts.zip + fi +} + +function installChaincode() { + if [ -z ${CONFIG_YAML} ]; then + CONFIG_YAML=./config.yaml + fi + prepare + + if [ -z "${CHAINCODE_PATH}" ]; then + print_blue "install default interchain chaincode" + installInterchainChaincode + else + print_blue "install chaincode in path "${CHAINCODE_PATH}"" + installNormalChaincode + fi +} + +function installInterchainChaincode() { + prepareContract + + print_blue "===> Copy chaincode" + + docker cp ./contracts cli:/opt/gopath/src/github.com/hyperledger/fabric/peer + + print_blue "===> Install chaincode" + + cd "${CURRENT_PATH}" + export CONFIG_PATH=${CURRENT_PATH} + docker exec cli go env -w GOFLAGS=-mod=vendor + + print_blue "===> 1. Deploying broker, transfer and data_swapper chaincode" + + print_blue "===> Step1 package" + docker exec cli peer lifecycle chaincode package broker.tar.gz \ + --path /opt/gopath/src/github.com/hyperledger/fabric/peer/contracts/src/broker/ \ + --label broker + + docker exec cli peer lifecycle chaincode package transfer.tar.gz \ + --path /opt/gopath/src/github.com/hyperledger/fabric/peer/contracts/src/transfer/ \ + --label transfer + + docker exec cli peer lifecycle chaincode package data_swapper.tar.gz \ + --path /opt/gopath/src/github.com/hyperledger/fabric/peer/contracts/src/data_swapper/ \ + --label data_swapper + + if [ "${TYPE}" == "direct" ]; then + docker exec cli peer lifecycle chaincode package transaction.tar.gz \ + --path /opt/gopath/src/github.com/hyperledger/fabric/peer/contracts/src/transaction/ \ + --label transaction + fi + + print_blue "===> Step2 install" + + docker exec cli peer lifecycle chaincode install broker.tar.gz + sleep 1 + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer lifecycle chaincode install broker.tar.gz + + sleep 1 + docker exec cli peer lifecycle chaincode install transfer.tar.gz + sleep 1 + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer lifecycle chaincode install transfer.tar.gz + + sleep 1 + docker exec cli peer lifecycle chaincode install data_swapper.tar.gz + sleep 1 + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer lifecycle chaincode install data_swapper.tar.gz + + if [ "${TYPE}" == "direct" ]; then + sleep 1 + docker exec cli peer lifecycle chaincode install transaction.tar.gz + + sleep 1 + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer lifecycle chaincode install transaction.tar.gz + fi + + print_blue "===> Step3 query" + sleep 1 + docker exec cli peer lifecycle chaincode queryinstalled >"$CURRENT_PATH"/identifier + brokerId=$(grep -o 'broker.\{65\}' <./identifier) + echo $brokerId + transferId=$(grep -o 'transfer.\{65\}' <./identifier) + echo $transferId + dataSwapperId=$(grep -o 'data_swapper.\{65\}' <./identifier) + echo $dataSwapperId + if [ "${TYPE}" == "direct" ]; then + transactionId=$(grep -o 'transaction.\{65\}' <./identifier) + echo $transactionId + fi + + print_blue "===> Step4 approveformyorg" + sleep 1 + docker exec cli peer lifecycle chaincode approveformyorg \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --channelID mychannel --name broker --version 1 \ + --init-required --sequence 1 --waitForEvent --package-id $brokerId + sleep 1 + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer lifecycle chaincode approveformyorg \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --channelID mychannel --name broker --version 1 --init-required \ + --sequence 1 --waitForEvent --package-id $brokerId + + sleep 1 + docker exec cli peer lifecycle chaincode approveformyorg \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --channelID mychannel --name transfer --version 1 \ + --init-required --sequence 1 --waitForEvent --package-id $transferId + sleep 1 + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer lifecycle chaincode approveformyorg \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --channelID mychannel --name transfer --version 1 --init-required \ + --sequence 1 --waitForEvent --package-id $transferId + + sleep 1 + docker exec cli peer lifecycle chaincode approveformyorg \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --channelID mychannel --name data_swapper --version 1 \ + --init-required --sequence 1 --waitForEvent --package-id $dataSwapperId + sleep 1 + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer lifecycle chaincode approveformyorg \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --channelID mychannel --name data_swapper --version 1 --init-required \ + --sequence 1 --waitForEvent --package-id $dataSwapperId + if [ "${TYPE}" == "direct" ]; then + sleep 1 + docker exec cli peer lifecycle chaincode approveformyorg \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --channelID mychannel --name transaction --version 1 \ + --init-required --sequence 1 --waitForEvent --package-id $transactionId + sleep 1 + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer lifecycle chaincode approveformyorg \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --channelID mychannel --name transaction --version 1 --init-required \ + --sequence 1 --waitForEvent --package-id $transactionId + + fi + + print_blue "===> Step5 commit" + sleep 1 + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer lifecycle chaincode commit -o orderer.example.com:7050 \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --peerAddresses peer0.org1.example.com:7051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \ + --peerAddresses peer0.org2.example.com:9051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + --channelID mychannel --name broker --version 1 --sequence 1 --init-required + + sleep 1 + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer lifecycle chaincode commit -o orderer.example.com:7050 \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --peerAddresses peer0.org1.example.com:7051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \ + --peerAddresses peer0.org2.example.com:9051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + --channelID mychannel --name transfer --version 1 --sequence 1 --init-required + + sleep 1 + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer lifecycle chaincode commit -o orderer.example.com:7050 \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --peerAddresses peer0.org1.example.com:7051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \ + --peerAddresses peer0.org2.example.com:9051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + --channelID mychannel --name data_swapper --version 1 --sequence 1 --init-required + if [ "${TYPE}" == "direct" ]; then + sleep 1 + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer lifecycle chaincode commit -o orderer.example.com:7050 \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --peerAddresses peer0.org1.example.com:7051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \ + --peerAddresses peer0.org2.example.com:9051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + --channelID mychannel --name transaction --version 1 --sequence 1 --init-required + fi + + print_blue "===> Step6 Init" + sleep 1 + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer chaincode invoke -o orderer.example.com:7050 \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --peerAddresses peer0.org1.example.com:7051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \ + --peerAddresses peer0.org2.example.com:9051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + -C mychannel -n broker --isInit -c '{"Args":[]}' + + sleep 1 + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer chaincode invoke -o orderer.example.com:7050 \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --peerAddresses peer0.org1.example.com:7051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \ + --peerAddresses peer0.org2.example.com:9051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + -C mychannel -n transfer --isInit -c '{"Args":[]}' + + sleep 1 + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer chaincode invoke -o orderer.example.com:7050 \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --peerAddresses peer0.org1.example.com:7051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \ + --peerAddresses peer0.org2.example.com:9051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + -C mychannel -n data_swapper --isInit -c '{"Args":[]}' + + if [ "${TYPE}" == "direct" ]; then + sleep 1 + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer chaincode invoke -o orderer.example.com:7050 \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --peerAddresses peer0.org1.example.com:7051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \ + --peerAddresses peer0.org2.example.com:9051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + -C mychannel -n transaction --isInit -c '{"Args":[]}' + + fi + + sleep 1 + + print_blue "===> 2. Set Alice 10000 amout in transfer chaincode" + sleep 1 + goduck fabric contract invoke transfer setBalance Alice,10000 + + sleep 1 + print_blue "===> 3. Set (key: keyTest, value: valueTest) in data_swapper chaincode" + goduck fabric contract invoke data_swapper set keyTest,valueTest + + print_blue "===> 4. Register transfer and data_swapper chaincode to broker chaincode" + sleep 1 + goduck fabric contract invoke transfer register + + sleep 1 + goduck fabric contract invoke broker audit mychannel,transfer,1 + + sleep 1 + goduck fabric contract invoke data_swapper register + + sleep 1 + goduck fabric contract invoke broker audit mychannel,data_swapper,1 + +} + +function installNormalChaincode() { + cd "${CURRENT_PATH}" + export CONFIG_PATH=${CURRENT_PATH} + + mkdir -p contracts/src + if [ ! -d "${CHAINCODE_PATH}" ]; then + print_red "chaincode path is not valid project directory" + exit 1 + fi + docker cp -r "${CHAINCODE_PATH}" cli:/opt/gopath/src/github.com/hyperledger/fabric/peer + CCName=$(basename "${CHAINCODE_PATH}") + + docker exec cli peer lifecycle chaincode package "${CCName}".tar.gz \ + --path /opt/gopath/src/github.com/hyperledger/fabric/peer/contracts/src/"${CCName}"/ \ + --label "${CCName}" + + docker exec cli peer lifecycle chaincode install "${CCName}".tar.gz + + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer lifecycle chaincode install "${CCName}".tar.gz + + docker exec cli peer lifecycle chaincode queryinstalled >"$CURRENT_PATH"/identifier + ADDRESS=$(grep -o '"${CCName}".\{65\}' <./identifier) + + docker exec cli peer lifecycle chaincode approveformyorg \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --channelID mychannel --name "${CCName}" --version 1 \ + --init-required --sequence 1 --waitForEvent --package-id $ADDRESS + + docker exec \ + -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ + -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ + -e CORE_PEER_LOCALMSPID="Org2MSP" \ + -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + cli peer lifecycle chaincode approveformyorg \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --channelID mychannel --name "${CCName}" --version 1 --init-required \ + --sequence 1 --waitForEvent --package-id $ADDRESS + + docker exec cli peer lifecycle chaincode commit -o orderer.example.com:7050 \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --peerAddresses peer0.org1.example.com:7051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \ + --peerAddresses peer0.org2.example.com:9051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + --channelID mychannel --name "${CCName}" --version 1 --sequence 1 --init-required + + docker exec cli peer chaincode invoke -o orderer.example.com:7050 \ + --tls \ + --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ + --peerAddresses peer0.org1.example.com:7051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \ + --peerAddresses peer0.org2.example.com:9051 \ + --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ + -C mychannel -n "${CCName}" --isInit -c '{"Args":[]}' + +} + +CONFIG_YAML=./config.yaml +CHAINCODE_PATH="" +CHAINCODE_VERSION=v1 +BXH_VERSION=v1.6.5 +TYPE="relay" + +MODE=$1 +shift + +while getopts "h?c:g:v:b:t:" opt; do + case "$opt" in + h | \?) + printHelp + exit 0 + ;; + c) + CONFIG_YAML=$OPTARG + ;; + g) + CHAINCODE_PATH=$OPTARG + ;; + v) + CHAINCODE_VERSION=$OPTARG + ;; + b) + BXH_VERSION=$OPTARG + ;; + t) + TYPE=$OPTARG + ;; + esac +done + +if [ "$MODE" == "install" ]; then + installChaincode +else + printHelp + exit 1 +fi diff --git a/scripts/ethereum.sh b/scripts/ethereum.sh old mode 100644 new mode 100755 diff --git a/scripts/fabric.sh b/scripts/fabric.sh index 54a457b..b57cc1d 100755 --- a/scripts/fabric.sh +++ b/scripts/fabric.sh @@ -40,7 +40,7 @@ function printHelp() { function prepare() { if [ ! -d "${FABRIC_SAMPLE_PATH}"/bin ]; then print_blue "===> Download the necessary dependencies" - curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s -- 1.4.3 1.4.3 0.4.18 + curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s -- 2.0.1 1.4.6 0.4.18 fi docker volume prune -f } @@ -72,7 +72,7 @@ function networkUp() { ./byfn.sh up -n rm -rf "${CURRENT_PATH}"/fabric/crypto-config - mv "${FABRIC_SAMPLE_PATH}"/first-network/crypto-config "${CURRENT_PATH}"/fabric/crypto-config + cp -r "${FABRIC_SAMPLE_PATH}"/first-network/crypto-config "${CURRENT_PATH}"/fabric/ } function networkDown() { @@ -88,28 +88,36 @@ function networkClean() { print_blue "===> clean contract images ..." if [[ -n `docker ps -a |grep example.com-broker | awk '{print $1}'` ]]; then - docker rm `docker ps -a |grep example.com-broker | awk '{print $1}'` + docker rm -f `docker ps -a |grep example.com-broker | awk '{print $1}'` fi if [[ -n `docker ps -a |grep example.com-transfer | awk '{print $1}'` ]]; then - docker rm `docker ps -a |grep example.com-transfer | awk '{print $1}'` + docker rm -f `docker ps -a |grep example.com-transfer | awk '{print $1}'` fi if [[ `docker ps -a |grep example.com-data_swapper | awk '{print $1}'` ]]; then - docker rm `docker ps -a |grep example.com-data_swapper | awk '{print $1}'` + docker rm -f `docker ps -a |grep example.com-data_swapper | awk '{print $1}'` fi + if [[ `docker ps -a |grep example.com-transaction | awk '{print $1}'` ]]; then + docker rm -f `docker ps -a |grep example.com-transaction | awk '{print $1}'` + fi + if [[ `docker images |grep example.com-broker | awk '{print $1}'` ]]; then - docker rmi `docker images |grep example.com-broker | awk '{print $1}'` + docker rmi -f `docker images |grep example.com-broker | awk '{print $1}'` fi if [[ `docker images |grep example.com-transfer | awk '{print $1}'` ]]; then - docker rmi `docker images |grep example.com-transfer | awk '{print $1}'` + docker rmi -f `docker images |grep example.com-transfer | awk '{print $1}'` fi if [[ `docker images |grep example.com-data_swapper | awk '{print $1}'` ]]; then - docker rmi `docker images |grep example.com-data_swapper | awk '{print $1}'` + docker rmi -f `docker images |grep example.com-data_swapper | awk '{print $1}'` fi + + if [[ `docker images |grep example.com-transaction | awk '{print $1}'` ]]; then + docker rmi -f `docker images |grep example.com-transaction | awk '{print $1}'` + fi } function networkRestart() { diff --git a/scripts/quick_start.sh b/scripts/quick_start.sh index 4d8d2b8..c72c40f 100644 --- a/scripts/quick_start.sh +++ b/scripts/quick_start.sh @@ -169,7 +169,7 @@ function docker-compose-up() { if [ "${VERSION}" == "v1.11.0" ]; then command_retry "docker exec $bitxhubCID bitxhub client tx send --key /root/.bitxhub/key.json --to 0xD389be2C1e6cCC9fB33aDc2235af8b449e3d14B4 --amount 100000000000000000" command_retry "docker exec $bitxhubCID bitxhub client tx send --key /root/.bitxhub/key.json --to 0x4768E44fB5e85E1D86D403D767cC5898703B2e78 --amount 100000000000000000" - elif [ "${VERSION}" == "v1.23.0" ]; then + elif [ "${VERSION}" == "v1.23.0" ]; then command_retry "docker exec $bitxhubCID bitxhub client transfer --key /root/.bitxhub/key.json --to 0xD389be2C1e6cCC9fB33aDc2235af8b449e3d14B4 --amount 100000000000000000" command_retry "docker exec $bitxhubCID bitxhub client transfer --key /root/.bitxhub/key.json --to 0x4768E44fB5e85E1D86D403D767cC5898703B2e78 --amount 100000000000000000" fi @@ -178,7 +178,7 @@ function docker-compose-up() { if [ "${VERSION}" == "v1.11.3" ]; then command_retry "docker exec $pier1CID /root/.pier/scripts/registerAppchain.sh appchain0xD389be2C1e6cCC9fB33aDc2235af8b449e3d14B4 chainA ethereum chainA-description 1.9.13 /root/.pier/ethereum/ether.validators consensusType "${VERSION}"" command_retry "docker exec $pier2CID /root/.pier/scripts/registerAppchain.sh appchain0x4768E44fB5e85E1D86D403D767cC5898703B2e78 chainB ethereum chainB-description 1.9.13 /root/.pier/ethereum/ether.validators consensusType "${VERSION}"" - elif [ "${VERSION}" == "v1.6.1" ] || [ "${VERSION}" == "v1.6.2" ] || [ "${VERSION}" == "v1.6.5" ] || [ "${VERSION}" == "v1.7.0" ] || [ "${VERSION}" == "v1.8.0" ] || [ "${VERSION}" == "v1.9.0" ] || [ "${VERSION}" == "v1.11.0" ] || [ "${VERSION}" == "v1.11.1" ] ; then + elif [ "${VERSION}" == "v1.6.1" ] || [ "${VERSION}" == "v1.6.2" ] || [ "${VERSION}" == "v1.6.5" ] || [ "${VERSION}" == "v1.7.0" ] || [ "${VERSION}" == "v1.8.0" ] || [ "${VERSION}" == "v1.9.0" ] || [ "${VERSION}" == "v1.11.0" ] || [ "${VERSION}" == "v1.11.1" ]; then command_retry "docker exec $pier1CID /root/.pier/scripts/registerAppchain.sh appchain1 chainA ethereum chainA-description 1.9.13 /root/.pier/ethereum/ether.validators consensusType "${VERSION}"" command_retry "docker exec $pier2CID /root/.pier/scripts/registerAppchain.sh appchain2 chainB ethereum chainB-description 1.9.13 /root/.pier/ethereum/ether.validators consensusType "${VERSION}"" elif [ "${VERSION}" == "v1.23.0" ]; then @@ -193,21 +193,21 @@ function docker-compose-up() { command_retry "docker exec $bitxhubCID /root/.bitxhub/scripts/vote.sh $proposal21ID approve reason" if [ "${VERSION}" == "v1.23.0" ]; then - print_blue "======> register service" - command_retry "docker exec $pier1CID /root/.pier/scripts/registerService.sh ethappchain1 "${TRANSFERADDR}" eth1 "${VERSION}"" - command_retry "docker exec $pier2CID /root/.pier/scripts/registerService.sh ethappchain2 "${TRANSFERADDR}" eth2 "${VERSION}"" + print_blue "======> register service" + command_retry "docker exec $pier1CID /root/.pier/scripts/registerService.sh ethappchain1 "${TRANSFERADDR}" eth1 "${VERSION}"" + command_retry "docker exec $pier2CID /root/.pier/scripts/registerService.sh ethappchain2 "${TRANSFERADDR}" eth2 "${VERSION}"" - print_blue "======> service proposal vote" - proposal12ID="${pier1ID}-1" - command_retry "docker exec $bitxhubCID /root/.bitxhub/scripts/vote.sh $proposal12ID approve reason" + print_blue "======> service proposal vote" + proposal12ID="${pier1ID}-1" + command_retry "docker exec $bitxhubCID /root/.bitxhub/scripts/vote.sh $proposal12ID approve reason" - proposal22ID="${pier2ID}-1" - command_retry "docker exec $bitxhubCID /root/.bitxhub/scripts/vote.sh $proposal22ID approve reason" + proposal22ID="${pier2ID}-1" + command_retry "docker exec $bitxhubCID /root/.bitxhub/scripts/vote.sh $proposal22ID approve reason" fi # deploy rule - if [ "${VERSION}" == "v1.6.1" ] || [ "${VERSION}" == "v1.6.2" ] || [ "${VERSION}" == "v1.6.5" ] || [ "${VERSION}" == "v1.7.0" ] || [ "${VERSION}" == "v1.8.0" ] || [ "${VERSION}" == "v1.9.0" ] || [ "${VERSION}" == "v1.11.0" ] || [ "${VERSION}" == "v1.11.1" ] ; then + if [ "${VERSION}" == "v1.6.1" ] || [ "${VERSION}" == "v1.6.2" ] || [ "${VERSION}" == "v1.6.5" ] || [ "${VERSION}" == "v1.7.0" ] || [ "${VERSION}" == "v1.8.0" ] || [ "${VERSION}" == "v1.9.0" ] || [ "${VERSION}" == "v1.11.0" ] || [ "${VERSION}" == "v1.11.1" ]; then print_blue "======> Deploy rule...." command_retry "docker exec $pier1CID /root/.pier/scripts/deployRule.sh /root/.pier/ethereum/validating.wasm appchain1 "${VERSION}"" command_retry "docker exec $pier2CID /root/.pier/scripts/deployRule.sh /root/.pier/ethereum/validating.wasm appchain2 "${VERSION}"" @@ -216,7 +216,7 @@ function docker-compose-up() { version2="v1.7.0" version_compare if [[ $versionComPareRes -gt 0 ]]; then - # if [ "${VERSION}" \> "v1.7.0" ]; then + # if [ "${VERSION}" \> "v1.7.0" ]; then proposal12ID="${pier1ID}-1" command_retry "docker exec $bitxhubCID /root/.bitxhub/scripts/vote.sh $proposal12ID approve reason" @@ -297,121 +297,118 @@ function queryAccount() { print_blue "Query Alice account in ethereum-1 appchain" goduck ether contract invoke \ --key-path ./docker/quick_start/account.key --address http://localhost:8545 \ - --abi-path=./pier/ethereum/$1/transfer.abi 0x668a209Dc6562707469374B8235e37b8eC25db08 getBalance Alice + --abi-path=./pier/ethereum/$1/transfer.abi 0x668a209Dc6562707469374B8235e37b8eC25db08 getBalance Alice print_blue "Query Alice account in ethereum-2 appchain" goduck ether contract invoke \ --key-path ./docker/quick_start/account.key --address http://localhost:8547 \ - --abi-path=./pier/ethereum/$1/transfer.abi 0x668a209Dc6562707469374B8235e37b8eC25db08 getBalance Alice + --abi-path=./pier/ethereum/$1/transfer.abi 0x668a209Dc6562707469374B8235e37b8eC25db08 getBalance Alice } - function queryAccountNew() { print_blue "Query Alice account in ethereum-1 appchain" goduck ether contract invoke \ --key-path ./docker/quick_start/account.key --address http://localhost:8545 \ - --abi-path=./example/transfer.abi 0x30c5D3aeb4681af4D13384DBc2a717C51cb1cc11 getBalance Alice + --abi-path=./example/transfer.abi 0x30c5D3aeb4681af4D13384DBc2a717C51cb1cc11 getBalance Alice print_blue "Query Alice account in ethereum-2 appchain" goduck ether contract invoke \ --key-path ./docker/quick_start/account.key --address http://localhost:8547 \ - --abi-path=./example/transfer.abi 0x30c5D3aeb4681af4D13384DBc2a717C51cb1cc11 getBalance Alice + --abi-path=./example/transfer.abi 0x30c5D3aeb4681af4D13384DBc2a717C51cb1cc11 getBalance Alice } - function interchainTransfer() { - if [ "$2" == "v1.23.0" ]; then - print_blue "1. Query original accounts in appchains" - queryAccountNew + if [ "$2" == "v1.23.0" ]; then + print_blue "1. Query original accounts in appchains" + queryAccountNew - print_blue "2. set base count " - goduck ether contract invoke \ - --key-path ./docker/quick_start/account.key --abi-path ./example/transfer.abi \ - --address http://localhost:8545 \ - 0x30c5D3aeb4681af4D13384DBc2a717C51cb1cc11 setBalance Alice^10000 + print_blue "2. set base count " + goduck ether contract invoke \ + --key-path ./docker/quick_start/account.key --abi-path ./example/transfer.abi \ + --address http://localhost:8545 \ + 0x30c5D3aeb4681af4D13384DBc2a717C51cb1cc11 setBalance Alice^10000 - print_blue "3. Query original accounts in appchains" - queryAccountNew + print_blue "3. Query original accounts in appchains" + queryAccountNew - print_blue "4. Send 1000 coin from Alice in ethereum-1 to Alice in ethereum-2" - goduck ether contract invoke \ - --key-path ./docker/quick_start/account.key --abi-path ./example/transfer.abi \ - --address http://localhost:8545 \ - 0x30c5D3aeb4681af4D13384DBc2a717C51cb1cc11 transfer 1356:ethappchain2:0x30c5D3aeb4681af4D13384DBc2a717C51cb1cc11^Alice^Alice^1000 + print_blue "4. Send 1000 coin from Alice in ethereum-1 to Alice in ethereum-2" + goduck ether contract invoke \ + --key-path ./docker/quick_start/account.key --abi-path ./example/transfer.abi \ + --address http://localhost:8545 \ + 0x30c5D3aeb4681af4D13384DBc2a717C51cb1cc11 transfer 1356:ethappchain2:0x30c5D3aeb4681af4D13384DBc2a717C51cb1cc11^Alice^Alice^1000 - print_blue "5. Query accounts after the first-round invocation" - queryAccountNew + print_blue "5. Query accounts after the first-round invocation" + queryAccountNew - print_blue "7. Send 500 coin from Alice in ethereum-2 to Alice in ethereum-1" - goduck ether contract invoke \ - --key-path ./docker/quick_start/account.key --abi-path ./example/transfer.abi \ - --address http://localhost:8547 \ - 0x30c5D3aeb4681af4D13384DBc2a717C51cb1cc11 transfer 1356:ethappchain1:0x30c5D3aeb4681af4D13384DBc2a717C51cb1cc11^Alice^Alice^500 + print_blue "7. Send 500 coin from Alice in ethereum-2 to Alice in ethereum-1" + goduck ether contract invoke \ + --key-path ./docker/quick_start/account.key --abi-path ./example/transfer.abi \ + --address http://localhost:8547 \ + 0x30c5D3aeb4681af4D13384DBc2a717C51cb1cc11 transfer 1356:ethappchain1:0x30c5D3aeb4681af4D13384DBc2a717C51cb1cc11^Alice^Alice^500 - print_blue "8. Query accounts after the second-round invocation" - queryAccountNew + print_blue "8. Query accounts after the second-round invocation" + queryAccountNew else - print_blue "1. Query original accounts in appchains" - queryAccount $1 - - print_blue "2. Send 1 coin from Alice in ethereum-1 to Alice in ethereum-2" - version1=$1 - version2="1.3.0" - bxhVersion=$2 - version_compare - if [[ $versionComPareRes -lt 0 ]]; then - # 1.1.0,1.2.0 + print_blue "1. Query original accounts in appchains" + queryAccount $1 + + print_blue "2. Send 1 coin from Alice in ethereum-1 to Alice in ethereum-2" + version1=$1 + version2="1.3.0" + bxhVersion=$2 + version_compare + if [[ $versionComPareRes -lt 0 ]]; then + # 1.1.0,1.2.0 + goduck ether contract invoke \ + --key-path ./docker/quick_start/account.key --abi-path ./pier/ethereum/$1/transfer.abi \ + --address http://localhost:8545 \ + 0x668a209Dc6562707469374B8235e37b8eC25db08 transfer 0x4768E44fB5e85E1D86D403D767cC5898703B2e78,0x668a209Dc6562707469374B8235e37b8eC25db08,Alice,Alice,1 + else + # 1.3.0 + if [ $bxhVersion == "v1.11.3" ]; then goduck ether contract invoke \ --key-path ./docker/quick_start/account.key --abi-path ./pier/ethereum/$1/transfer.abi \ --address http://localhost:8545 \ - 0x668a209Dc6562707469374B8235e37b8eC25db08 transfer 0x4768E44fB5e85E1D86D403D767cC5898703B2e78,0x668a209Dc6562707469374B8235e37b8eC25db08,Alice,Alice,1 + 0x668a209Dc6562707469374B8235e37b8eC25db08 transfer did:bitxhub:appchain0x4768E44fB5e85E1D86D403D767cC5898703B2e78:0x668a209Dc6562707469374B8235e37b8eC25db08,Alice,Alice,1 else - # 1.3.0 - if [ $bxhVersion == "v1.11.3" ]; then - goduck ether contract invoke \ - --key-path ./docker/quick_start/account.key --abi-path ./pier/ethereum/$1/transfer.abi \ - --address http://localhost:8545 \ - 0x668a209Dc6562707469374B8235e37b8eC25db08 transfer did:bitxhub:appchain0x4768E44fB5e85E1D86D403D767cC5898703B2e78:0x668a209Dc6562707469374B8235e37b8eC25db08,Alice,Alice,1 - else - goduck ether contract invoke \ - --key-path ./docker/quick_start/account.key --abi-path ./pier/ethereum/$1/transfer.abi \ - --address http://localhost:8545 \ - 0x668a209Dc6562707469374B8235e37b8eC25db08 transfer did:bitxhub:appchain2:0x668a209Dc6562707469374B8235e37b8eC25db08,Alice,Alice,1 - fi + goduck ether contract invoke \ + --key-path ./docker/quick_start/account.key --abi-path ./pier/ethereum/$1/transfer.abi \ + --address http://localhost:8545 \ + 0x668a209Dc6562707469374B8235e37b8eC25db08 transfer did:bitxhub:appchain2:0x668a209Dc6562707469374B8235e37b8eC25db08,Alice,Alice,1 fi + fi + sleep 4 + print_blue "3. Query accounts after the first-round invocation" + queryAccount $1 - sleep 4 - print_blue "3. Query accounts after the first-round invocation" - queryAccount $1 - - print_blue "4. Send 1 coin from Alice in ethereum-2 to Alice in ethereum-1" - version1=$1 - version2="1.3.0" - version_compare - if [[ $versionComPareRes -lt 0 ]]; then - # if [ "${VERSION}" \< "v1.3.0" ]; then - goduck ether contract invoke \ + print_blue "4. Send 1 coin from Alice in ethereum-2 to Alice in ethereum-1" + version1=$1 + version2="1.3.0" + version_compare + if [[ $versionComPareRes -lt 0 ]]; then + # if [ "${VERSION}" \< "v1.3.0" ]; then + goduck ether contract invoke \ --key-path ./docker/quick_start/account.key --abi-path ./pier/ethereum/$1/transfer.abi \ --address http://localhost:8547 \ 0x668a209Dc6562707469374B8235e37b8eC25db08 transfer 0xD389be2C1e6cCC9fB33aDc2235af8b449e3d14B4,0x668a209Dc6562707469374B8235e37b8eC25db08,Alice,Alice,1 + else + if [ $bxhVersion == "v1.11.3" ]; then + goduck ether contract invoke \ + --key-path ./docker/quick_start/account.key --abi-path ./pier/ethereum/$1/transfer.abi \ + --address http://localhost:8547 \ + 0x668a209Dc6562707469374B8235e37b8eC25db08 transfer did:bitxhub:appchain0xD389be2C1e6cCC9fB33aDc2235af8b449e3d14B4:0x668a209Dc6562707469374B8235e37b8eC25db08,Alice,Alice,1 else - if [ $bxhVersion == "v1.11.3" ]; then - goduck ether contract invoke \ - --key-path ./docker/quick_start/account.key --abi-path ./pier/ethereum/$1/transfer.abi \ - --address http://localhost:8547 \ - 0x668a209Dc6562707469374B8235e37b8eC25db08 transfer did:bitxhub:appchain0xD389be2C1e6cCC9fB33aDc2235af8b449e3d14B4:0x668a209Dc6562707469374B8235e37b8eC25db08,Alice,Alice,1 - else - goduck ether contract invoke \ - --key-path ./docker/quick_start/account.key --abi-path ./pier/ethereum/$1/transfer.abi \ - --address http://localhost:8547 \ - 0x668a209Dc6562707469374B8235e37b8eC25db08 transfer did:bitxhub:appchain1:0x668a209Dc6562707469374B8235e37b8eC25db08,Alice,Alice,1 - fi + goduck ether contract invoke \ + --key-path ./docker/quick_start/account.key --abi-path ./pier/ethereum/$1/transfer.abi \ + --address http://localhost:8547 \ + 0x668a209Dc6562707469374B8235e37b8eC25db08 transfer did:bitxhub:appchain1:0x668a209Dc6562707469374B8235e37b8eC25db08,Alice,Alice,1 fi + fi - sleep 4 - print_blue "5. Query accounts after the second-round invocation" - queryAccount $1 + sleep 4 + print_blue "5. Query accounts after the second-round invocation" + queryAccount $1 fi } diff --git a/scripts/quick_start/ffn.sh b/scripts/quick_start/ffn.sh index a4af65b..f8e6117 100755 --- a/scripts/quick_start/ffn.sh +++ b/scripts/quick_start/ffn.sh @@ -40,7 +40,7 @@ function printHelp() { function prepare() { if [ ! -d "${FABRIC_SAMPLE_PATH}"/bin ]; then print_blue "===> Download the necessary dependencies" - curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s -- 1.4.3 1.4.3 0.4.18 + curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s -- 2.0.1 1.4.6 0.4.18 fi if [ ! -d "${FABRIC_SAMPLE_PATH}"/second-network ]; then createSecondNetwork