#  Nodejs SDK 浣跨敤璇存槑
## 鍩烘湰姒傚康瀹氫箟

1. 鏁翠綋浠嬬粛

`SDK`鏄笟鍔℃ā鍧椾笌闀垮畨閾句氦浜掔殑妗ユ锛屾敮鎸佸弻鍚慲TLS`璁よ瘉锛屾彁渚涘畨鍏ㄥ彲闈犵殑鍔犲瘑閫氫俊淇¢亾銆�

鎻愪緵鐨勬帴鍙o紝瑕嗙洊鍚堢害绠$悊銆侀摼閰嶇疆绠$悊銆佽瘉涔︾鐞嗐€佸绛炬敹闆嗐€佸悇绫绘煡璇㈡搷浣溿€佷簨浠惰闃呫€佹暟鎹綊妗g瓑鍦烘櫙锛屾弧瓒充簡涓嶅悓鐨勪笟鍔″満鏅渶瑕併€�

2. 鍚嶈瘝姒傚康璇存槑

- **`Node`锛堣妭鐐癸級**锛氫唬琛ㄤ竴涓摼鑺傜偣鐨勫熀鏈俊鎭紝鍖呮嫭锛氳妭鐐瑰湴鍧€銆佽繛鎺ユ暟銆佹槸鍚﹀惎鐢╜TLS`璁よ瘉绛変俊鎭�
- **`ChainClient`锛堥摼瀹㈡埛绔級**锛氭墍鏈夊鎴风瀵归摼鑺傜偣鐨勬搷浣滄帴鍙i兘鏉ヨ嚜`ChainClient`
- **鍘嬬缉璇佷功**锛氬彲浠ヤ负`ChainClient`寮€鍚瘉涔﹀帇缂╁姛鑳斤紝寮€鍚悗鍙互鍑忓皬浜ゆ槗鍖呭ぇ灏忥紝鎻愬崌澶勭悊鎬ц兘

## 鐜鍑嗗
### 杞欢渚濊禆

**nodejs**

> nodejs 14.0.0+

涓嬭浇鍦板潃锛歨ttps://nodejs.org/dist/

鑻ュ凡瀹夎锛岃閫氳繃鍛戒护鏌ョ湅鐗堟湰锛�

```bash
$ node --version
v14.0.0
```

### 涓嬭浇瀹夎

```bash
$ git clone -b v2.0.0  --depth=1 https://git.chainmaker.org.cn/chainmaker/sdk-nodejs.git
```

## 鎬庝箞浣跨敤SDK

### 绀轰緥浠g爜

> 娉細 涓嬫柟鏂囨。绀轰緥鍙兘杩囨椂锛屼互gitlab绀轰緥涓哄噯銆�
>
> evm鍜屽叾浠栧悎绾︿娇鐢ㄦ柟娉曞湪鏋勫缓鍙傛暟鏃舵湁鍖哄埆銆�
>
> evm鐨勫彲鍙傝€冪ず渚嬶細[TestEvmContract](https://git.chainmaker.org.cn/chainmaker/sdk-java/-/blob/v2.3.1.3/src/test/java/org/chainmaker/sdk/TestEvmContract.java)

#### 鍒涘缓鑺傜偣

> 鏇村鍐呭璇峰弬鐪嬶細`sdkInit.js`

```javascript
// 鍒涘缓鑺傜偣
this.node = new Node(nodeConfigArray, timeout);
```

#### 鍙傛暟褰㈠紡鍒涘缓ChainClient

> 鏇村鍐呭璇峰弬鐪嬶細`sdkInit.js`

```javascript
// 鍒涘缓ChainClient
const ChainClient = new Sdk(chainID, orgID, userKeyPathFile, userCertPathFile, nodeConfigArray, 30000, archiveConfig);

```

#### 浠ラ厤缃枃浠跺舰寮忓垱寤篊hainClient

> 鏇村鍐呭璇峰弬鐪嬶細`sdkinit.js`

```javascript
const ChainClient = new LoadFromYaml(path.join(__dirname, './sdk_config.yaml'));
```

#### 鍒涘缓鍚堢害

> 鏇村鍐呭璇峰弬鐪嬶細`testUserContractMgr.js`

```javascript
  const testCreateUserContract = async (sdk, contractName, contractVersion, contractFilePath) => {
		const response = await sdk.userContractMgr.createUserContract({
			contractName,
			contractVersion,
			contractFilePath,
			runtimeType: utils.common.RuntimeType.GASM,
			params: {
				key1: 'value1',
				key2: 'value2',
			},
		});
		return response;
	};
```

#### 璋冪敤鍚堢害

> 鏇村鍐呭璇峰弬鐪嬶細`testUserContractMgr.js`

```javascript
  const testInvokeUserContract = async (sdk, contractName) => {
		const response = await sdk.callUserContract.invokeUserContract({
			contractName, method: 'save', params: {
				file_hash: '1234567890',
				file_name: 'test.txt',
			},
		});
		return response;
	};
```

### 鏇村绀轰緥鍜岀敤娉�

> 鏇村绀轰緥鍜岀敤娉曪紝璇峰弬鐪嬪崟鍏冩祴璇曠敤渚�

瀹夎mocha锛�

```bash
$ npm install -g mocha
```

浣跨敤鑴氭湰鎼缓chainmaker杩愯鐜锛�4缁勭粐4鑺傜偣锛夛紝灏哹uild鏂囦欢涓殑cryptogen澶嶅埗鍒板綋鍓嶉」鐩殑test/testFile鏂囦欢涓�

杩愯娴嬭瘯鍛戒护锛�

```bash
$ npm test
```

| 鍔熻兘     | 鍗曟祴浠g爜            |
| -------- | ------------------- |
| 鍩虹閰嶇疆 | `sdkInit.js`        |
| 鐢ㄦ埛鍚堢害 | `userContract.js`   |
| 绯荤粺鍚堢害 | `systemContract.js` |
| 閾鹃厤缃�   | `chainConfig.js`    |
| 璇佷功绠$悊 | `cert.js`           |
| 娑堟伅璁㈤槄 | `subscribe.js`      |

## 鎺ュ彛璇存槑

璇峰弬鐪嬶細[銆奵hainmaker-nodejs-sdk銆媇(https://git.chainmaker.org.cn/chainmaker/sdk-nodejs/-/blob/v2.0.0/sdk_interface.md)

## demo
鍙傝€冿細 https://git.chainmaker.org.cn/chainmaker/sdk-nodejs-demo