JS SDK 액세스 : 개미 (V) 체인 BAAS 플랫폼 애플리케이션 개발 가이드 블록

자바 스크립트 SDK는 접근을 기반으로

이전 섹션에서, 우리는 JavaSDK을 통해 성공적으로 목표 가닥와 전화 계약을 액세스 할 수 있습니다. 이 섹션에서는, 우리는 JS SDK에 의해 같은 호출을 달성 할 것이다. 또한 서버 또는 클라이언트에서 실행되는 Node.js 애플리케이션을 통합 할 수 있으며, JS SDK는 브라우저에서 실행되는 웹 응용 프로그램에 통합 할 수 있습니다. 본 논문에서는 JS SDK 의해 Node.js를 개미 블록 사슬에 액세스하는 방법을 설명하기 위해 예를 사용한다.

준비

개발 환경 구성

  • 다운로드 및 설치 Node.js를을 (위에서 권장 v10.11.0 등).
  • 프로젝트에 JS SDK 설치 디렉토리 :
    1. JS SDK를 다운로드하고 프로젝트 디렉토리에 복사 :
      JS SDK 액세스 : 개미 (V) 체인 BAAS 플랫폼 애플리케이션 개발 가이드 블록
    2. 디렉토리 경로에서 실행
      npm i alipay-mychain-0.2.27.tgz --save

      인증서 및 키

      JavaSDK 유사한 액세스, 우리는 다음과 같은 서류를 필요로 할 때와 콘텐츠가 필요합니다 :

  • ××× 책 사용자기구 client.crt와 해당 키 파일 client.key: 인증서 체인을 통해 사용자를 인증한다. 인증서 체인 인증서 파일, 특정 참조를 인수 계약을 신청하는 경우 여기 또는 여기에 .
  • 인증 된 CA 인증서는 계약 체인 파일 ca.crt: 체인 계약 문서를 통해 사용자의 신원을 확인합니다. 하여 区块链卡片-> 右上角···> - 下载根证书얻는다.
    JS SDK 액세스 : 개미 (V) 체인 BAAS 플랫폼 애플리케이션 개발 가이드 블록
  • 개인 키 파일을 계정 user.pem: 서명하면 계정 (A 만들 때 취득 트랜잭션 제출할 때 개인 계정에 의해 수행 될 필요가 user.key세대).

앞의 두 문서는 직접 3 분의 1을 얻을 수있다 user.pem문서, 우리가 수동으로 다음 명령 둘 필요 user.key로 파일을 user.pem(코드 키 파일 편리 JS 읽기) 파일 :

openssl ec -in user.key -passin pass:${key_password} -passout pass:${key_password} -aes256 -out user.pem

这里要注意保护密码的配置,-passout参数配置的密码需要在后续的sdk中使用到。
需要提前安装配置好openssl工具。

最终,我们项目目录下,新建一个文件夹在放所有的需要的证书文件::

~/Documents/Work/JSSDKDemos/Certs/PRD> tree
.
├── ca.crt
├── client.crt
├── client.key
├── user.key
└── user.pem

获取合约链的接入IP与端口号

与JavaSDK相同,通过区块链卡片 > 详情 > 节点处获取:
JS SDK 액세스 : 개미 (V) 체인 BAAS 플랫폼 애플리케이션 개발 가이드 블록

开始第一个JS程序

获取合约接口说明ABI

JS SDK对合约的调用依赖编译合约时生成的应用程序二进制接口说明(Application Binary Interface,ABI)。ABI文件中描述了合约暴露的方法名,输入参数类型和返回参数类型等。JS SDK会根据ABI来提供实例化的调用方法以及自动反序列号返回值。我们可以在Cloud IDE中编译合约来获取ABI:
JS SDK 액세스 : 개미 (V) 체인 BAAS 플랫폼 애플리케이션 개발 가이드 블록

也可以通过solc-js工具在本地编译合约并获取ABI文件,参见这里
例如,在蚂蚁区块链BaaS平台应用开发指南(三)中我们部署的合约,其合约内容与合约接口说明ABI如下:
合约内容:

pragma solidity ^0.4.0;

contract SimpleStorage {
    uint storedData;

    function set(uint256 x) public {
        storedData = x;
    }

    function get() public view returns (uint256) {
        return storedData;
    }
}

ABI说明:

[
   {
      "constant":false,
      "inputs":[
         {
            "name":"x",
            "type":"uint256"
         }
      ],
      "name":"set",
      "outputs":[

      ],
      "payable":false,
      "stateMutability":"nonpayable",
      "type":"function"
   },
   {
      "constant":true,
      "inputs":[

      ],
      "name":"get",
      "outputs":[
         {
            "name":"",
            "type":"uint256"
         }
      ],
      "payable":false,
      "stateMutability":"view",
      "type":"function"
   }
]

使用JS SDK调用合约

  1. 新建一个main.js文件。
  2. 文件中填入以下内容:
const Chain = require("@alipay/mychain/index.node") // 在node环境使用 TLS 协议
const fs = require("fs")

const accountKey = fs.readFileSync("./Certs/PRD/user.pem", { encoding: "utf8" })
const accountPassword = '******'        // 需要替换为自定义的user.pem密码
const keyInfo = Chain.utils.getKeyInfo(accountKey, accountPassword)

const passphrase = '******'                 // 需要替换为自定义的client.key密码
//配置选项
let opt = {
  host: '47.101.66.49',                         // 目标区块链网络节点的 IP
  port: 18130,                                  // 端口号
  timeout: 30000,                               // 连接超时时间配置
  cert: fs.readFileSync("./Certs/PRD/client.crt", { encoding: "utf8" }),
  ca: fs.readFileSync("./Certs/PRD/ca.crt", { encoding: "utf8" }),
  key: fs.readFileSync("./Certs/PRD/client.key", { encoding: "utf8" }),
  userPublicKey: keyInfo.publicKey,
  userPrivateKey: keyInfo.privateKey,
  userRecoverPublicKey: keyInfo.publicKey, // 账户恢复公钥,本例中用不到,随便填入一个
  userRecoverPrivateKey: keyInfo.privateKey,// 恢复恢复私钥,本例中用不到,随便填入一个
  passphrase: passphrase // clinet.key的密码
}

// 初始化一个连接实例
const chain = Chain(opt)

// 提供合约abi
const abi = JSON.parse('[{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]')

// 实例化一个合约instance
let myContract = chain.ctr.contract("donglei-contract-test-002", abi); 

//调用合约的set方法,把storedData变量设为20。
myContract.set(20,
    {from:'donglei-PRD-001'},      // From参数,合约调用交易的发起者,用户id和提供的user.pem需要匹配。
    (err, output, data) => {
        console.log(data);              // 交易回执会存储在data字段中。
});

//调用合约的get方法,获取storedData的值。
myContract.get(
    {from:'donglei-PRD-001'},     // From参数,合约调用交易的发起者,用户id和提供的user.pem需要匹配。
    (err, output, data) => {
        console.log(output.toString());  // 合约方法的返回值会存储在output字段中。
});

程序运行结果如下:
JS SDK 액세스 : 개미 (V) 체인 BAAS 플랫폼 애플리케이션 개발 가이드 블록

小结

在本节中,我们通过JS SDK接入蚂蚁区块链并实现了合约的调用,与JavaSDK最大的不同在于JS SDK通过ABI说明来实例化合约的调用接口和返回值解析,不需要手动构造方法签名及反序列化返回值。可以看到,一个完整的调用流程如下:

  1. 初始化一个chain实例(配置好用户×××书、账户私钥和连接参数);
  2. 初始化一个合约实例(需要提供合约的ABI说明);
  3. 调用一个合约方法(需要提供调用者的用户id,通过data字段获取交易回执);
  4. 반환 값 취득한 계약 (계약 값 출력의 복귀에 저장된다 JS SDK 자동 값은 역 직렬화 반환);

웹 액세스 환경 고려 사항
Node.js를 환경, 대화 형 프로그램과 TLS 프로토콜을 사용하여 데이터 링크에 알고 있어야합니다. 웹 응용 프로그램에 통합 JS SDK를 원하는 경우, 브라우저는 체인 데이터 교환을위한 HTTPS 프로토콜은,이 시간 관리자의 체인 요구 사항이 서로 다른 액세스 인터페이스를 구성합니다. 특정 개발자를 통해 주문 시스템 및 개발 지원 팀에 작업 할 수 있습니다.
또한, 웹 환경 Node.js를 환경과 SDK가 소개하는 여러 가지 방법
: 웹 const Chain = require("@alipay/mychain/index.node")
Node.js를가 :const Chain = require("@alipay/mychain")

추천

출처blog.51cto.com/14321927/2424488