簡單介紹下bitcoincashjs接口和功能

簡單介紹

bitcoincashjs 的這個中間件矾麻,它是bitcore-lib的一個分支。我看了下bitcore-lib,發(fā)現(xiàn)確實bitcoincashjs繼承了它不少的優(yōu)點主巍,bitcoincashjs中間件主要實現(xiàn)了對交易的創(chuàng)建的功能,以及多重簽名的創(chuàng)建和花費挪凑。

和一些封裝好的rpc的區(qū)別

就是這個不用依賴于服務(wù)器創(chuàng)建交易孕索,也就是說用這個中間件不用鏈接網(wǎng)絡(luò),減少了暴露私鑰的風(fēng)險岖赋,創(chuàng)建交易都是在本地完成檬果,完成之后,在通過網(wǎng)絡(luò)發(fā)送這個交易(可以通過別人提供的接口唐断,也可以自己用rpc發(fā)送到自己服務(wù)器上)返回一個交易號就完成了這個交易选脊。還有一些區(qū)別就是,bitcoincashjs 在其內(nèi)部實現(xiàn)了一些隨機生成地址脸甘、base58恳啥、簽名等等一些東西,在一般的rpc當(dāng)中就沒有這些東西丹诀,都是和服務(wù)器交互相關(guān)的東西钝的。

下面簡單介紹下bitcoincashjs 的一些接口和功能。

1铆遭、創(chuàng)建一個隨機地址,這個很簡單硝桩,但是可能不經(jīng)常用

const bch = require('bitcoincashjs');

const privateKey = new bch.PrivateKey();
const address = privateKey.toAddress();

console.log(address.toString()) 

這個在我們做錢包的時候就可以用,當(dāng)然枚荣,你最好是在前端生成地址和私鑰碗脊,不然別人不敢確信這個能用。
2橄妆、使用SHA256 哈希值創(chuàng)建一個地址

const bch = require('bitcoincashjs');

const value = new Buffer('Bitcoin Cash - Peer-to-Peer Electronic Cash');
const hash = bch.crypto.Hash.sha256(value);
const bn = bch.crypto.BN.fromBuffer(hash);
const address = new bch.PrivateKey(bn).toAddress();

console.log(address.toString())

3衙伶、把一個地址轉(zhuǎn)化為其他任意BCH地址

const bch = require('bitcoincashjs');

const Address = bch.Address;
const BitpayFormat = Address.BitpayFormat;
const CashAddrFormat = Address.CashAddrFormat;

const address = new Address('1MF7A5H2nHYYJMieouip2SkZiFZMBKqSZe');

console.log(address.toString()) // 1MF7A5H2nHYYJMieouip2SkZiFZMBKqSZe
console.log(address.toString(BitpayFormat)) // Cchzj7d6fLX5CVd5Vf3jbxNbLNmm4BTYuG
console.log(address.toString(CashAddrFormat)) // bitcoincash:qr0q67nsn66cf3klfufttr0vuswh3w5nt5jqpp20t9

4祈坠、從任何比特幣現(xiàn)金地址格式讀取地址

const bch = require('bitcoincashjs');

const Address = bch.Address;
const fromString = Address.fromString;
const BitpayFormat = Address.BitpayFormat;
const CashAddrFormat = Address.CashAddrFormat;

const legacy = fromString('1MF7A5H2nHYYJMieouip2SkZiFZMBKqSZe',
                  'livenet', 'pubkeyhash');
const bitpay = fromString('Cchzj7d6fLX5CVd5Vf3jbxNbLNmm4BTYuG',
                  'livenet', 'pubkeyhash', BitpayFormat);
const cashaddr = fromString('bitcoincash:qr0q67nsn66cf3klfufttr0vuswh3w5nt5jqpp20t9',
                  'livenet', 'pubkeyhash', CashAddrFormat);

5、通過via WIF導(dǎo)入地址(這個很有用)

const bch = require('bitcoincashjs');

const wif = 'Kxr9tQED9H44gCmp6HAdmemAzU3n84H3dGkuWTKvE23JgHMW8gct';
const address = new bch.PrivateKey(wif).toAddress();

console.log(address.toString()) // 19AAjaTUbRjQCMuVczepkoPswiZRhjtg31

6矢劲、創(chuàng)建一筆交易赦拘,這里僅僅是一對一,如果想創(chuàng)建二對二交易在這里

const bch = require('bitcoincashjs');

const privateKey = new bch.PrivateKey('L1uyy5qTuGrVXrmrsvHWHgVzW9kKdrp27wBC7Vs6nZDTF2BRUVwy');
const utxo = {
  'txId' : '115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986',
  'outputIndex' : 0,
  'address' : '17XBj6iFEsf8kzDMGQk5ghZipxX49VXuaV',
  'script' : '76a91447862fe165e6121af80d5dde1ecb478ed170565b88ac',
  'satoshis' : 50000
};
const transaction = new bch.Transaction()
  .from(utxo)
  .to('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', 15000)
  .sign(privateKey);

console.log(transaction.toString()) // 01000000018689302ea03ef...

7芬沉、驗證比特幣消息

const bch = require('bitcoincashjs');

const Message = bch.Message;

const message = new Message('Bitcoin Cash - Peer-to-Peer Electronic Cash.');
const address = '13Js7D3q4KvfSqgKN8LpNq57gcahrVc5JZ';
const signature = 'IJuZCwN/4HtIRulOb/zRLU1oCPVMiPvT5dJhgXxOuQNFaXoytoejPePUerSs9KSIvPL/BDimPe2cj/JabeDGmbc=';

console.log(message.verify(address, signature)) // true

8躺同、簽署比特幣信息

const bch = require('bitcoincashjs');

const Message = bch.Message;

const message = new Message('Bitcoin Cash - Peer-to-Peer Electronic Cash.');
const privateKey =
    new bch.PrivateKey('L23PpjkBQqpAF4vbMHNfTZAb3KFPBSawQ7KinFTzz7dxq6TZX8UA');
const signature = message.sign(privateKey);

console.log(signature.toString()) // IJuZCwN/4HtIRulOb/zRLU1oCP...

9、創(chuàng)建一個OP_RETURN交易

const bch = require('bitcoincashjs');

const privateKey = new bch.PrivateKey('L1uyy5qTuGrVXrmrsvHWHgVzW9kKdrp27wBC7Vs6nZDTF2BRUVwy');
const utxo = {
  'txId' : '115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986',
  'outputIndex' : 0,
  'address' : '17XBj6iFEsf8kzDMGQk5ghZipxX49VXuaV',
  'script' : '76a91447862fe165e6121af80d5dde1ecb478ed170565b88ac',
  'satoshis' : 50000
};
const transaction = new bch.Transaction()
  .from(utxo)
  .addData('Bitcoin Cash - Peer-to-Peer Electronic Cash.') // Add OP_RETURN data
  //這一條是我自己加的花嘶,在之前沒有加就一直報錯笋籽,希望有同樣錯誤的小伙伴注意一下
  .to('mhMmYqtR9wzbW9otiurkG9AGVNzjfww36v', 999920000)
  .sign(privateKey);

console.log(transaction.toString()) // 01000000018689302ea03ef...

在創(chuàng)建OP_RETURN交易的時候,也要寫明輸出的地址椭员,在官方的教程中沒有寫出來车海。導(dǎo)致了我很久都沒有調(diào)試正確。希望有相同境遇的小伙伴注意隘击。
9 侍芝、創(chuàng)建一個2-of-3的多簽名的P2SH的地址

const bch = require('bitcoincashjs');

const publicKeys = [
  '026477115981fe981a6918a6297d9803c4dc04f328f22041bedff886bbc2962e01',
  '02c96db2302d19b43d4c69368babace7854cc84eb9e061cde51cfa77ca4a22b8b9',
  '03c6103b3b83e4a24a0e33a4df246ef11772f9992663db0c35759a5e2ebf68d8e9'
];
const requiredSignatures = 2;
const address = new bch.Address(publicKeys, requiredSignatures);

console.log(address.toString()) // 36NUkt6FWUi3LAWBqWRdDmdTWbt91Yvfu7

關(guān)于這個publicKeys 的獲取, 我在服務(wù)器上通過“validateaddress”這個命令獲取到了publicKeys埋同,獲取這個需要你有私鑰州叠。
10、花費一個來自于2-of-2的多簽名地址的錢

const bch = require('bitcoincashjs');

const privateKeys = [
  new bch.PrivateKey('91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx'),
  new bch.PrivateKey('91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgww7vXtT')
];
const publicKeys = privateKeys.map(bch.PublicKey);
const address = new bch.Address(publicKeys, 2); // 2 of 2
const utxo = {
  'txId' : '153068cdd81b73ec9d8dcce27f2c77ddda12dee3db424bff5cafdbe9f01c1756',
  'outputIndex' : 0,
  'address' : address.toString(),
  'script' : new bch.Script(address).toHex(),
  'satoshis' : 20000
};
const transaction = new bch.Transaction()
    .from(utxo, publicKeys, 2)
    .to('mtoKs9V381UAhUia3d7Vb9GNak8Qvmcsme', 20000)
    .sign(privateKeys);

console.log(transaction.toString()) // 010000000156171cf0e9dba...

以上例子來源于bitcoincashjs 的GitHub凶赁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咧栗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子虱肄,更是在濱河造成了極大的恐慌致板,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咏窿,死亡現(xiàn)場離奇詭異斟或,居然都是意外死亡,警方通過查閱死者的電腦和手機集嵌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門萝挤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人根欧,你說我怎么就攤上這事怜珍。” “怎么了凤粗?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵酥泛,是天一觀的道長。 經(jīng)常有香客問我,道長揭璃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任亭罪,我火速辦了婚禮瘦馍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘应役。我一直安慰自己情组,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布箩祥。 她就那樣靜靜地躺著院崇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袍祖。 梳的紋絲不亂的頭發(fā)上底瓣,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音蕉陋,去河邊找鬼捐凭。 笑死,一個胖子當(dāng)著我的面吹牛凳鬓,可吹牛的內(nèi)容都是我干的茁肠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼缩举,長吁一口氣:“原來是場噩夢啊……” “哼垦梆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仅孩,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤托猩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后杠氢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體站刑,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年鼻百,在試婚紗的時候發(fā)現(xiàn)自己被綠了绞旅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡温艇,死狀恐怖因悲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勺爱,我是刑警寧澤晃琳,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響卫旱,放射性物質(zhì)發(fā)生泄漏人灼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一顾翼、第九天 我趴在偏房一處隱蔽的房頂上張望投放。 院中可真熱鬧,春花似錦适贸、人聲如沸灸芳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烙样。三九已至,卻和暖如春蕊肥,著一層夾襖步出監(jiān)牢的瞬間谒获,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工晴埂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留究反,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓儒洛,卻偏偏與公主長得像精耐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子琅锻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349