ブロック鎖は最近、インターネット業界を席巻するだけでなく、関連する個人的な技術の特別な理解だけでなく、デジタル通貨を買って、もちろん、デジタル財布があります。それはセーフエンドで、財布の中央に、この考えて、原則はGeshaです。
- 私たちの財布のパスワード(秘密鍵)財布やその他の情報は、ネットワーク内の伝送かどうか?
- 主要な取引プラットフォームは、私はデジタル通貨子供を買いますか?
- 最後のブロックチェーン財布ユーザ情報はありませんか?
エディタは、これらの質問では、我々は最終的にはデジタル財布を見てする必要がありますでしょうか?いくつかの概念を見つけるには:
- 暗号化
- 対称暗号化
- 非対称暗号化
- 公立、私立
- 署名
- テストをチェック
暗号化された対称暗号化&非対称暗号化&
暗号化技術は、我々はそれから暗号化技術は、これは非常に明確に話すことができないプロの人ではない私に教えている場合、当然のことながら、暗号化アルゴリズムによって生成された財布が行われ、ブロックチェーンの中核技術の一つであるが、この関数は、おそらく概念を見上げます。
人気の話:
- 暗号化:ボックス内のキーロック付きのもの(情報)、のみ(情報を参照してください)このようなものを使用することができますキーパーソンを取得します。
- 対称暗号化:箱を開けボックスをオフと同じであれば、キー。
- 非対称暗号化:同じではありませんボックスをオフにキーとボックスを開きます。
プロフェッショナル話します:
- 暗号化:それは読めなくなって、読みにくい暗号文内容に平文を変えます。通常、暗号文読み取り可能なコンテンツを復元するために復号化処理を介してオブジェクトの復号化方法の所有者のみ;
- 対称暗号化:暗号化と復号に同じ鍵を使用します。
- 非対称暗号化:公開鍵は、対応する秘密鍵でのみ復号化することができる場合は、データを暗号化するために使用される公開鍵と秘密鍵あり暗号化と復号化に必要な2つのキー、;プライベートデータであれば暗号化は、公開鍵だけで復号することができます。
なぜ非対称暗号化、アプリケーションのシナリオでしょうか?
その優れたセキュリティ:鍵の一つは、全体の通信が割れされ、漏洩してきた場合には、対称暗号化通信当事者は、同じ秘密鍵を使用します。代わりに通信する前に、最初の同期の対称暗号化キーを好きではなかった対称暗号化キー、暗号化用と復号鍵と公開鍵のための1つの公開されている、自身が保持する秘密鍵のペアを使用します。
しかし、非対称暗号化は、それだけで暗号化される少量のデータに適した遅い時間が、かかる欠点を暗号化および復号化します。
署名
受信者がメッセージの送信者の身元を知ってもらうためには、デジタル署名技術の使用が生まれました。
デジタル署名は、データが中の情報の電子的な形態で存在する、またはその付属品やロジック上のデータリンクとして、データは署名者の身元や、人々がデータに含まれている情報に署名するためのテーブルの名前を識別するために使用することができています認識技術。
- 署名プロセス:
- データが要約を生成します。データはハッシュであることを送信します
- 署名情報の生成:送信者の秘密鍵は、集計データを暗号化します
- これは、受信者の署名情報+に送信するデータを送信します
- 試験手順を確認します。
- 署名情報を復号化:送信者の公開鍵は、署名情報を復号化するために
- 要約データを生成します:受信データのハッシュ
- 比較データ:復号化された署名情報と生成された要約データは、送信者を識別することができるデジタル署名と同じである場合
暗号化アルゴリズム
多くの暗号化アルゴリズムがあります:RSA、RC2、RC4、IDEA、RSA、DSA、ADS、MD5、PKCS、ECCなどは、百度のアルゴリズムを知りたい、生徒自身が。
機能するために必要なもの財布?
財布のコア機能:
- 財布の初期化
- 作ります
- インポート
- 財布資産クエリ
- トランザクション
- 転送
- コール契約
関連のJSライブラリ
- ethereumjs-utilの:ツール
- bn.js:なBigNumberデータタイプ
- 安全・バッファ:バッファバイナリデータ型
- 作成-ハッシュ:ハッシュアルゴリズムを
- secp256k1:楕円曲線アルゴリズム
- keccak:SHA-3アルゴリズム
- RLP:RLPはコーディング
- ethjs-utilの
- ethereumjs財布:財布を作成
- ethereumjs-TX:トランザクション情報の処理、署名、ハッシュ、チェックなど
- ethereumjs-ABI:ABI処理
- イーサネット間の広場や通信:web3
ウォレットを作成します(プライベート、パブリック、アドレス)
財布を作成し、我々が使用することができますethereumjs-wallet
完了するために、ライブラリーを、それが楕円曲線に基づいて、鍵ペアのECDSAアルゴリズムを作成することです。ソースを見て:
- 公開鍵の生成:(ethereumjs財布)(生成) - >(ethereumjs-utilの)privateToPublic - > secp256k1.publicKeyCreate - >公開
- 地址生成:(ethereumjs財布)(生成) - >(ethereumjs-utilの)privateToAddress - >(ethereumjs-utilの)sha3 - >(keccakjs)SHA3 - >アドレス
// ethereumjs-wallet 模块
Wallet.generate = function (icapDirect) {
if (icapDirect) {
while (true) {
var privKey = crypto.randomBytes(32)
if (ethUtil.privateToAddress(privKey)[0] === 0) {
return new Wallet(privKey)
}
}
}
else {
return new Wallet(crypto.randomBytes(32))
}
}
var Wallet = function (priv, pub) {
//...
}
Object.defineProperty(Wallet.prototype, 'pubKey', {
get: function () {
if (!this._pubKey) {
this._pubKey = ethUtil.privateToPublic(this.privKey)
}
return this._pubKey
}
})
// ethereumjs-util 模块
exports.privateToAddress = function (privateKey) {
return exports.publicToAddress(privateToPublic(privateKey))
}
var privateToPublic = exports.privateToPublic = function (privateKey) {
privateKey = exports.toBuffer(privateKey)
// skip the type flag and use the X, Y points
return secp256k1.publicKeyCreate(privateKey, false).slice(1)
}
exports.pubToAddress = exports.publicToAddress = function (pubKey, sanitize) {
pubKey = exports.toBuffer(pubKey)
if (sanitize && (pubKey.length !== 64)) {
pubKey = secp256k1.publicKeyConvert(pubKey, false).slice(1)
}
assert(pubKey.length === 64)
// Only take the lower 160bits of the hash
return exports.sha3(pubKey).slice(-20)
}
exports.sha3 = function (a, bytes) {
a = exports.toBuffer(a)
if (!bytes) bytes = 256
var h = new SHA3(bytes)
if (a) {
h.update(a)
}
return new Buffer(h.digest('hex'), 'hex')
}
ユーザーのための非常にシンプル:
関連文書:https://github.com/ethereumjs/ethereumjs-wallet
const ethUtil = require('ethereumjs-util')
const Wallet = require('ethereumjs-wallet');
// 生成钱包
var wallet = Wallet.generate();
var privateKey = wallet.getPrivateKey(); // 返回 Buffer,可以通过 wallet.getPrivateKeyString() 直接得到字符串
var publicKey = wallet.getPublicKey(); // 返回 Buffer,可以通过 wallet.getPublicKeyString() 直接得到字符串
var address = wallet.getAddress(); // 返回 Buffer,可以通过 wallet.getAddressString() 直接得到字符串
// 导入钱包
var privateKey2 = ethUtil.toBuffer('0xe601e598111629240e4dc6ec7a95534e025838bd0f638dabad9ad4152d80443b');
var wallet2 = Wallet.fromPrivateKey(privateKey2);
var publicKey2 = wallet2.getPublicKey();
財布資産クエリ
実施するのは非常に簡単web3.jsで財布の資産を照会します。
var balance = web3.eth.getBalance("0x407d73d8a49eeb85d32cf465507dd71d507100c1");
console.log(balance); // instanceof BigNumber
console.log(balance.toString(10)); // '1000000000000'
console.log(balance.toNumber()); // 1000000000000
財布トランザクション
ウォレットトランザクション処理:
- トランザクションデータ構造
- イーサネット通貨取引
- 契約取引データ
- トランザクション署名
- シミュレートされた取引、見積もりガス
- トランザクションを送信
取引先
{
nonce: '0x00',
gasPrice: '0x01',
gasLimit: '0x01',
to: '0x633296baebc20f33ac2e1c1b105d7cd1f6a0718b',
value: '0x00',
data: '0xc7ed014952616d6100000000000000000000000000000000000000000000000000000000',
// EIP 155 chainId - mainnet: 1, ropsten: 3
chainId: 3
}
スクエアイーサネット参考文献:
- ナンス:取引口座の総数が実行された、それぞれの新しいトランザクションの実装とナンスの値が増加します
- gasPrice:取引の価格、ガスの価格を支払うためにガスの単位当たりのあなたが喜んで0.1〜> 100 + Gweiの範囲で、現在GWeiユニット、
- gasLimit:あなたがトランザクション内のガスの最高合計金額を支払うことを喜んでいます。上限は、トランザクションの実装では(例えば無限ループなど)が発生し、アカウントは残高が不足しないようにすることができます。トランザクションが終了すると、すべての残りのガスは、アカウントに返送されます
- 宛先アドレス、呼び出しは契約は契約の住所である場合、トランザクションは、移転支出のアドレスである場合:へ
- 値:つまり、あなたはイーサネット通貨を意図する総量が送られました。あなたは、転送トランザクションを実行する別の人のイーサネットまたは契約にお金を送りたい場合は、値の値を設定する必要があります。
- データ:このフィールドは、異なるトランザクションのタイプが異なっているだろう、次のプレゼンテーションでのフィールドの詳細な説明があるだろう
- chainId:このフィールドは、ネットワークれるに送信する取引データを示すために使用される、ネットワーク・ベースの、ネットワーク3 ropsten
データの構築
トランザクションは、契約の場合は、契約情報とデータフィールドを構築することが必要です。このプロセスは、参照することができ、比較的複雑であるイーサリアム契約ABIを二つのプロセスに分け:
- 契約への関数呼び出し関数名はエンコードされています
- 関数の契約コールパラメータが符号化されています
- 詳細は1万言葉を省略しました...
出典:https://github.com/ethereumjs/ethereumjs-abi/blob/master/lib/index.js
ユーザーのための非常に単純な
関連文書:https://github.com/ethereumjs/ethereumjs-abi
var abi = require('ethereumjs-abi');
var methodID = abi.methodID('sam', ['bytes', 'bool', 'uint256[]']);
// returns the encoded binary (as a Buffer) data to be sent
var encoded = abi.rawEncode(['bytes', 'bool', 'uint256[]'], ['dave', true, [1, 2, 3]]);
var data = methodID.toString('hex') + rawEncode.toString('hex');
console.log(data);
署名
データ構造の良い取引した後、我々はデータに署名し、最後のデータのシーケンスが取引することができ、ソースコードを見て続行します。
- ハッシュ:(ethereumjs-TX)ハッシュ - >(ethereumjs-utilの)rlphash - >(RLP)エンコード - >(keccak)SHA3
- 署名:(ethereumjs-utilの)ecsign - > secp256k1.sign
// ethereumjs-tx 模块
Transaction.prototype.sign = function sign(privateKey) {
var msgHash = this.hash(false);
var sig = ethUtil.ecsign(msgHash, privateKey);
if (this._chainId > 0) {
sig.v += this._chainId * 2 + 8;
}
Object.assign(this, sig);
};
Transaction.prototype.hash = function hash(includeSignature) {
if (includeSignature === undefined) includeSignature = true;
// EIP155 spec:
// when computing the hash of a transaction for purposes of signing or recovering,
// instead of hashing only the first six elements (ie. nonce, gasprice, startgas, to, value, data),
// hash nine elements, with v replaced by CHAIN_ID, r = 0 and s = 0
var items = void 0;
if (includeSignature) {
items = this.raw;
} else {
if (this._chainId > 0) {
var raw = this.raw.slice();
this.v = this._chainId;
this.r = 0;
this.s = 0;
items = this.raw;
this.raw = raw;
} else {
items = this.raw.slice(0, 6);
}
}
// create hash
return ethUtil.rlphash(items);
};
// ethereumjs-util 模块
exports.ecsign = function (msgHash, privateKey) {
const sig = secp256k1.sign(msgHash, privateKey)
const ret = {}
ret.r = sig.signature.slice(0, 32)
ret.s = sig.signature.slice(32, 64)
ret.v = sig.recovery + 27
return ret
}
ユーザーにとっても非常にシンプル
関連文書:https://github.com/ethereumjs/ethereumjs-tx
const EthereumTx = require('ethereumjs-tx');
var privateKey = ...;
var txParams = {
nonce: '0x00',
gasPrice: '0x09184e72a000',
gasLimit: '0x2710',
to: '0x0000000000000000000000000000000000000000',
value: '0x00',
data: '0x7f7465737432000000000000000000000000000000000000000000000000000000600057',
// EIP 155 chainId - mainnet: 1, ropsten: 3
chainId: 3
};
var tx = new EthereumTx(txParams);
tx.sign(privateKey);
var serializedTx = tx.serialize(); // 这是最终交易需要发送的数据
ガスの見積もり
トランザクションの署名を必要とし、正常に送信されることはありません取引の場合は不合理な、ガスをガスのコストを推定する必要があります。取引をスムーズに進めることができるように私たちは、Web3ことにより、比較的リーズナブルなガスを推定することができます。
var transactionObject = {
nonce: '',
gasPrice: '',
from: '',
to: '',
value: '',
data: '',
}
web3.eth.estimateGas(transactionObject, function(err, res) {
if (!err)
console.log(res);
});
トランザクションを送信
我々は貿易協定のweb3が取得するのは非常に簡単です送信するために使用されます。
- web3.eth.sendTransaction:それはトランザクションの署名を必要としません。
- トランザクションの署名が必要です。web3.eth.sendRawTransaction
var transactionObject = {
nonce: '',
gasPrice: '',
gasLimit: '',
from: '',
to: '',
value: '',
data: '',
}
web3.eth.sendTransaction(transactionObject, function(err, address) {
if (!err)
console.log(address);
});
若しくは
// ...
// 32字节的16进制格式的交易哈希串
web3.eth.sendRawTransaction(serializedTx.toString('hex'), function(err, hash) {
if (!err)
console.log(hash);
});
ウォレットトランザクション処理
回顾一下钱包的核心功能:
- 钱包初始化:
- 创建:ethereumjs-wallet.generate()
- 导入:ethereumjs-wallet.fromPrivateKey(privateKey)
- 查询钱包的资产:web3.eth.getBalance(addressHexString [, defaultBlock] [, callback])
- 交易:
- 构造交易数据:
- 交易对象:{ from: '', to: '', ...}
- data:ethereumjs-abi.methodID() + ethereumjs-abi.rawEncode()
- 交易签名:ethereumjs-tx.sign(privateKey) -> ethereumjs-tx.serialize()
- 发送交易:
- 转账:web3.eth.sendTransaction(transactionObject [, callback])
- 合约(已经签名的交易):web3.eth.sendRawTransaction(signedTransactionData [, callback])
- 构造交易数据:
有了以上几个核心方法,你就可以完成数字钱包应用了。
钱包核心 SDK 的封装
为了简化以上的操作,并且让钱包具有更好的扩展性(支持以太币、比特币等),我们将上面的整过过程进行一次封装,让开发人员更好的使用,我们做成了 trip-wallet。
Install
yarn add trip-wallet
Or
npm install trip-wallet
Usage
import Wallet from 'trip-wallet';
let wallet = Wallet('eth');
wallet.generate();
wallet.setProvider('http://host:port');
// async/await
let balance = await wallet.getBalance(wallet.address);
// Promise
wallet.getBalance(wallet.address).then(res => {
balance = res;
}, err => {
});
Object & Attributes
- walletObject
- privateKey: String (hex string)
- publicKey: String (hex string)
- address: String (hex string)
- currency: String
- transactionObject
- contract: Object
- methodName: String
- arguments: Array[]
- privateKey: String (hex string)
- from: String (hex string)
- to: String (hex string)
- value: Number | String | BigNumber
- gasLimit: Number | String | BigNumber
- gasPrice: Number | String | BigNumber
- data: String
- none: Number
Methods
- generate([currency]): Object
- import(key [, type] [, currency]): Object
- type: 'privateKey', 'keystore', 'mnemonicPhrase', 'readonly'
- key: String
- currency: String
- setProvider(host)
- getBalance(addressHexString): Promise
- sendTransaction(transactionObject): Promise
- getTransaction(transactionHash): Promise
- contract(abi, address): Object
- estimateGas(transactionObject): Promise
- gasPrice(): Promise
eth-util
- toWei(num, unit)
- fromWei(num, unit)
- toBigNumber
- toBuffer
- toHex
- verifyPrivateKey
- decodeAbi
- encodeAbi
- signTransaction
钱包 App 的整体架构
问题:
私たちは尋ねた最初の質問を見て、財布の一般原則について学びました。
- 私たちの財布のパスワード(秘密鍵)財布やその他の情報は、ネットワーク内の伝送かどうか?
- ブロック鎖は、少なくともトランザクション処理では、我々は個人情報を渡さない、任意のプライベートアカウント情報を格納しません。
- 世代またはインポート財布では、ビルドプロセスのトランザクション情報、ローカルで実行され、私たちは、ユーザの秘密鍵を開示することはありません。
- ソフトウェア自体がない限り、コードの上にトリックを再生します。
- だから、財布アプリケーションのニーズを開きます。
- 主要な取引プラットフォームは、私はデジタル通貨子供を買いますか?
- 最後のブロックチェーン財布ユーザ情報はありませんか?
- 財布アドレス生成トランザクションは、アドレス情報のみがウォレットに格納されている場合には
- 財布は、すべてのトランザクションに対応していない場合は、関連する情報は財布に格納されていません
任意のアドレス他のアカウント情報が格納されていない財布に加えて、または本取引(公開情報);だから、中本は、思考のこのユニークな方法を通じて、財布のユーザ情報(アカウントシステム)は、すべてユーザー自身のローカルで管理されます。ブロック鎖としてオープンで透明に表示され、安全で信頼性の高いです。
秀の〗〖固守
ます。https://www.jianshu.com/p/15ff67cbbcefで再現