区块链开发之确定性算法bip32,bip39,bip44

##引言

随着比特币区块链的发展,人们已经不满足于,只有一个账号的情况,有些人会有好几个账户,但是这就出现一个问题,我有几个账号,就要保存几个私钥,这就特别麻烦和不友好,所以,就出现了bip32确定性算法,该算法可以让你只有同一个种子,就可以生成无数个私钥和地址,这就大大方便了用户的使用。但是这个种子,也不较长,用户使用起来也比较繁琐,这就出现了bip39,它是使用助记词的方式,生成种子的,这样用户只需要记住,12个单词(3,6,9,12,15,18,21,24支持这些单词数,目前使用较广泛的是12和24),这就有大大提高了用户使用的便利性。又随着区块链发展,市面上出现了很多币种,之前的确定性算法只是针对比特币的,也就是说只支持一种币种,用户想用同一个种子,管理不同币种,这就促使了bip39协议的出现,它是基于bip32协议的,它给bip32的路径,赋予了不同的意义,很好的解决了多币种,多地址的问题。

协议官方链接

如果想详细的了解这些协议,请查看官方文档(解析的最清楚)
big32:
https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki

bip39:https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki

bip44:https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki

验证网站:https://iancoleman.io/bip39/

#BIP44简介

##路径级别

bip44给bip32定义了5各级别

m / purpose’ / coin_type’ / account’ / change / address_index

##m是固定的

Purpose也是固定的,值为44(或者 0x8000002C)

##Coin type

这个代表的是币种,0代表比特币,1代表比特币测试链,60代表以太坊

完整的币种列表地址:https://github.com/satoshilabs/slips/blob/master/slip-0044.md

##Account

代表这个币的账户索引,从0开始

##Change

常量0用于外部链,常量1用于内部链(也称为更改地址)。外部链用于在钱包外可见的地址(例如,用于接收付款)。内部链用于在钱包外部不可见的地址,用于返回交易变更。 (所以一般使用0)

##address_index

这就是地址索引,从0开始,代表生成第几个地址,并且官方建议,每个account下的address_index不要超过20

###示例

coin account change address path
Bitcoin first external first
Bitcoin first external second
Bitcoin first internal second
Bitcoin Testnet first external
Bitcoin Testnet second external
08/06/2018 17:45 下午 posted in  Ethereum

钱包测试账号信息:

##助记词:

live devote airport journey theme jealous syrup okay pyramid universe advice wall

##ETH钱包账户

###账户[0]:
地址[0]:0xC937F39FA384063E89752d61211186cB5D3912cC
私钥[0]:0x6de11341a4a3eee24980dcd907a2d9ea8702b43f7e5218c349db69748fb0ace4

###账户[1]:
第1个地址的私钥和keystore
地址[1]:0xd4357D40e9714e011a4e0D918b6E0B371Ad2f376
私钥[1]:1f5014b9c55b5f808f261d6cdd619e85a3fea70438111e3c6bdb4c7f7bc9ef36

keysotre[1]:

{"version":3,"id":"460c472e-7ad4-43d8-a6e5-716811ca9497","crypto":{"ciphertext":"a21f4f1cb8b4b38ac005e4a9f0f0fefdb1372c772f40930e9c009d3923ad55aa","cipherparams":{"iv":"7aef1d1cced46d7cc3131f63863d5203"},"kdf":"scrypt","kdfparams":{"r":6,"p":1,"n":4096,"dklen":32,"salt":"b4c8daf5e510dfd9de4e81aac1d381f4454a4da28f977b39dc218392c0ffe3d9"},"mac":"1c6a852298b4e4c17c40b1ebb5191ce08d498a42139f66714490683bb488edc7","cipher":"aes-128-ctr"},"address":"0xd4357d40e9714e011a4e0d918b6e0b371ad2f376"}

##BTC测试 m/44'/1'/0'/0
地址[0]:n44UNAeSMPLrZcr8W2QRn9jbZsW3NJ8YUj
私钥[1]:cUUGW6PXaV2RheeqmJdKvRN4PGCXBJwVmxmbdxKsUnsH33nAWCc9

地址[1]:mpgwNrt32sMtemgE6y4iH6UMk6tuAGQArn
私钥[1]:cRaf3jvs5rA9g84Pihb1dMaJaJqU4FZree7GYiW17zJ4vxN2vQtG

地址[101]:mqfWfmQJGDViWF4vENVkpMA2AbznHvtWNG
私钥[101]:cSxBRwJDENrqQK5c5oWzhvw3LpmsDs1cMr8B5EGwPwGjcBmpZdCt

##小虫测试ETH账号

1f5014b9c55b5f808f261d6cdd619e85a3fea70438111e3c6bdb4c7f7bc9ef36
07/25/2018 10:44 上午 posted in  Ethereum

钱包地址生成和扫描规则

##1.扫描类实例

iban:XE19RLALTH48S5S586M44YMOU1PBEVJ3BS4?amount=100&token=GNB
iban:XE19RLALTH48S5S586M44YMOU1PBEVJ3BS4?amount=0.001
iban:XE19RLALTH48S5S586M44YMOU1PBEVJ3BS4?amount=0.01&token=ETH

ethereum:0xeC34C8681972b22a79f641F42CFdb0e22BFFcd64?contractAddress=0x0d8775f648430679a709e98d2b0cb6250d2887ef&decimal=18&value=1000000000000000
07/19/2018 08:45 上午 posted in  Ethereum

ETH转账交易

##1.gasprice分级配置实例

https://ethers.io/gas-prices-v2.raw {
    details =     (
        "11 GWei",
        "12 GWei",
        "18 GWei",
        "100 GWei"
    );
    prices =     (
        11000000000,
        12000000000,
        18000000000,
        100000000000
    );
    subtitles =     (
        "completes in about 30 minutes",
        "completes in about 4 minutes",
        "completes in about 2 minutes",
        "completes in about 30 seconds"
    );
    titles =     (
        "SAFE LOW",
        AVERAGE,
        FAST,
        URGENT
    );
}

##2.交易成功返回的交易记录

{
	"jsonrpc": "2.0",
	"id": 1,
	"result": {
		"blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
		"blockNumber": null,
		"from": "0xec34c8681972b22a79f641f42cfdb0e22bffcd64",
		"gas": "0x5208",
		"gasPrice": "0x12a05f200",
		"hash": "0xdc9246c3485357c5d92cdf0c745a435361f3e036e3863c5dd525834348de6f9c",
		"input": "0x",
		"nonce": "0x12",
		"to": "0x295ac792993a96a332334f2752d544a64e940015",
		"transactionIndex": "0x0",
		"value": "0x5af3107a4000",
		"v": "0x26",
		"r": "0xd384b9e2a5854a5c6e573c5ad0bae428fa7e1b6c389264412ea3003c0120e684",
		"s": "0x56cef9a313ec44ed5c1768801cf16877ff07dd8e8371c3e32b7a6b5e31eff511"
	}
}
06/06/2018 07:50 上午 posted in  Ethereum

ETH ERC20的相关信息

##pyhton script

import json
import web3
from web3 import Web3, HTTPProvider

my = "0xD551234Ae421e3BCBA99A0Da6d736074f22192FF"
eos_contract_address = "0x86Fa049857E0209aa7D9e616F7eb3b3B78ECfdb0"

contract_source_code='''
[{
  "type":"function",
  "name":"balanceOf",
  "constant":true,
  "payable":false,
  "inputs":[{"name":"","type":"address"}],
  "outputs":[{"name":"","type":"uint256","value":"0"}]
}]
'''

abi = json.loads(contract_source_code)

web3 = Web3(HTTPProvider('http://localhost:8545') )
#web3 = Web3(HTTPProvider('https://mainnet.infura.io/<key>') )
source_code = web3.eth.getCode(eos_contract_address)
contract = web3.eth.contract(abi=abi, address=eos_contract_address)
contract.call().balanceOf(my)

##erc20 contract abi

[
  {
    "constant": true,
    "inputs": [],
    "name": "name",
    "outputs": [
      {
        "name": "",
        "type": "string"
      }
    ],
    "type": "function"
  },
  {
    "constant": false,
    "inputs": [
      {
        "name": "_from",
        "type": "address"
      },
      {
        "name": "_to",
        "type": "address"
      },
      {
        "name": "_value",
        "type": "uint256"
      }
    ],
    "name": "transferFrom",
    "outputs": [
      {
        "name": "success",
        "type": "bool"
      }
    ],
    "type": "function"
  },
  {
    "constant": true,
    "inputs": [],
    "name": "decimals",
    "outputs": [
      {
        "name": "",
        "type": "uint8"
      }
    ],
    "type": "function"
  },
  {
    "constant": true,
    "inputs": [
      {
        "name": "",
        "type": "address"
      }
    ],
    "name": "balanceOf",
    "outputs": [
      {
        "name": "",
        "type": "uint256"
      }
    ],
    "type": "function"
  },
  {
    "constant": true,
    "inputs": [],
    "name": "symbol",
    "outputs": [
      {
        "name": "",
        "type": "string"
      }
    ],
    "type": "function"
  },
  {
    "constant": false,
    "inputs": [
      {
        "name": "_to",
        "type": "address"
      },
      {
        "name": "_value",
        "type": "uint256"
      }
    ],
    "name": "transfer",
    "outputs": [],
    "type": "function"
  },
  {
    "constant": false,
    "inputs": [
      {
        "name": "_spender",
        "type": "address"
      },
      {
        "name": "_value",
        "type": "uint256"
      },
      {
        "name": "_extraData",
        "type": "bytes"
      }
    ],
    "name": "approveAndCall",
    "outputs": [
      {
        "name": "success",
        "type": "bool"
      }
    ],
    "type": "function"
  },
  {
    "constant": true,
    "inputs": [
      {
        "name": "",
        "type": "address"
      },
      {
        "name": "",
        "type": "address"
      }
    ],
    "name": "spentAllowance",
    "outputs": [
      {
        "name": "",
        "type": "uint256"
      }
    ],
    "type": "function"
  },
  {
    "constant": true,
    "inputs": [
      {
        "name": "",
        "type": "address"
      },
      {
        "name": "",
        "type": "address"
      }
    ],
    "name": "allowance",
    "outputs": [
      {
        "name": "",
        "type": "uint256"
      }
    ],
    "type": "function"
  },
  {
    "inputs": [
      {
        "name": "initialSupply",
        "type": "uint256"
      },
      {
        "name": "tokenName",
        "type": "string"
      },
      {
        "name": "decimalUnits",
        "type": "uint8"
      },
      {
        "name": "tokenSymbol",
        "type": "string"
      }
    ],
    "type": "constructor"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "name": "from",
        "type": "address"
      },
      {
        "indexed": true,
        "name": "to",
        "type": "address"
      },
      {
        "indexed": false,
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "Transfer",
    "type": "event"
  }
]

##ERC20如eos转账demo

http://www.yaozihao.cn/2017/12/08/697/

from web3 import Web3, HTTPProvider
from web3.contract import ConciseContract
import json

web3 = Web3(HTTPProvider('http://localhost:8545'))
print(web3.eth.blockNumber)

tx='0xb1ea3885a25efa295837c287560fe4c137c1bcd3718720330eb68d7f96a5479e'
web3.eth.getTransaction(tx)
web3.eth.getTransactionReceipt(tx)

exit(0)

web3.eth.defaultAccount = '0x00B113795f1aA12EE361adC6D281392802d0e025'
EIP20_ABI_str = '[{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"finishMinting","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_releaseTime","type":"uint256"}],"name":"mintTimelocked","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[],"name":"MintFinished","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]'
EIP20_ABI = json.loads(EIP20_ABI_str)

token_contract_address = '0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0'

token = web3.eth.contract(
token_contract_address,
abi=EIP20_ABI,
ContractFactoryClass=ConciseContract,
)

totalSupply = token.totalSupply()
balance = token.balanceOf('0x00B113795f1aA12EE361adC6D281392802d0e025')
tx = token.transfer(
'0x00845daA689b1374ecAf4CfEcfBfc86D41ec7735',
web3.toWei(2,"ether"),
transact={'from':'0x00B113795f1aA12EE361adC6D281392802d0e025'})

tx = '0xb3b82923d8d9b5d28fbab7f7281704f033362ac9f293e6638227efb44ff85499'
web3.eth.getTransaction(tx)
web3.eth.getTransactionReceipt(tx)

web3.eth.getTransactionCount(web3.eth.coinbase)
web3.eth.getTransactionCount('0x00B113795f1aA12EE361adC6D281392802d0e025')
06/04/2018 21:05 下午 posted in  Ethereum

ETH钱包Keystore格式

根据ether framework 创建钱包成功之后返回的JSON:

{
  "x-ethers" : {
    "mnemonicCiphertext" : "4ec6ff1c1307fde22f54535d8f2c49ac",
    "version" : "0.1",
    "mnemonicCounter" : "e6225f53c68204cc0590505b0b0d9cfb",
    "client" : "ethers\/iOS",
    "gethFilename" : "UTC--2018-06-02T09-15-17.0Z--ec34c8681972b22a79f641f42cfdb0e22bffcd64"
  },
  "id" : "39362BF0-1571-41C9-BA5D-1D2E96FB1F8A",
  "address" : "ec34c8681972b22a79f641f42cfdb0e22bffcd64",
  "Crypto" : {
    "ciphertext" : "02a2381e0712b4911e231688ecd84470cc75221192d70f74b5255dc59ec8ba90",
    "cipherparams" : {
      "iv" : "8a92b1f77ad3f0404fdcaf9189cb0027"
    },
    "kdf" : "scrypt",
    "kdfparams" : {
      "r" : 8,
      "p" : 1,
      "n" : 262144,
      "dklen" : 32,
      "salt" : "a6ab1e929bef72f21e1af6d12ed6bdf0296b3d224491274f1fbd1b5a4074e9b4"
    },
    "mac" : "b16fe2af2ec678ee5f08e5d4ca748778b5eaa26003d5bcee71cd08b68f76e60a",
    "cipher" : "aes-128-ctr"
  },
  "version" : 3
}

jsonString String "{"isHDWallet":true,"id":"ec14e04d-6ed1-431e-8873-a9bd069d9534","crypto":{"ciphertext":"16c7a5a56b2ee6a94f95d940b336b99c73450c4cb1f74bb2f532821381efd507f87d8c1ba71b1a35712d8eb36a75895633bf86e85d7ff16ef27380a8209d2512f91b5c4ed299f815eed94d17cc1b79e42dbc35d73f93b030489cdef510b5b687","cipherparams":{"iv":"3d65a2eb4f68012503d1808f11f8cb4b"},"kdf":"scrypt","kdfparams":{"r":6,"p":1,"n":4096,"dklen":32,"salt":"820f1b08b5ab9caf189ee922abf98435fa50b057c6aa6ebd46dd07605c08dd98"},"mac":"726aec73aca75e0704c5322683ec291e50ee861f9dfd3dd7929a159b3c364c8e","cipher":"aes-128-cbc"},"pathToAddress":{"m\/44'\/60'\/0'\/0\/0":"0xC59A230342A13eC78141B3D20215eb78C07c0a27"},"rootPath":"m\/44'\/60'\/0'\/0","version":3}"

06/02/2018 08:15 上午 posted in  Ethereum