glueby 0.4.3 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 49e88ac1268a6ebbe2f075d44126d438f7a86832e1ac538cc3efc3f375e2dd95
4
- data.tar.gz: de32351857aa1b02f0568a7d3fe94fcbabf884048a00748d79c5a340ad08e20a
3
+ metadata.gz: 7e1446a10f90a642304f51d8c9fed70565a507b1b5f86675fa0db715e638828b
4
+ data.tar.gz: ddcbc8d730235087cfcab5fc4678ef3325ae8921cc98a06d0cc269369d77e997
5
5
  SHA512:
6
- metadata.gz: b531d1315fcf8fe2810457ac1b5898be2e4aa8f84bae38ab17aec270305ae35420f31ff71b046ee44cd653034991a02527459714e9858b3f32f1e8b1ee2d4400
7
- data.tar.gz: 24eda6392c8e8e5583818004d585e1715dfe06443df038022b2634b2086bc9373e8a63f2dd92a9798de16311404055621f6950a064d80779c3413ce8ef33f2a3
6
+ metadata.gz: 3c43bd873752bb6b99ce1bcf23cc7fafef6c20c5b7e6366a490579efbb59e06a093d440012102514d341bd522f703aff776ea9fd7b2c2082957c96a9f6eae051
7
+ data.tar.gz: a0ba6f6d981136434b977ce753f4bab8e698aa40ff4d86950a4f19b8b8a35b91a66b3204286ac54ae809ac40f728b74efc47b5dda7c51d016ae7a9610bccd77d
data/README.md CHANGED
@@ -1,387 +1,387 @@
1
- # Glueby [![Ruby](https://github.com/chaintope/glueby/actions/workflows/ruby.yml/badge.svg)](https://github.com/chaintope/glueby/actions/workflows/ruby.yml) [![Gem Version](https://badge.fury.io/rb/glueby.svg)](https://badge.fury.io/rb/glueby) [![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE)
2
-
3
- Glueby is a smart contract library on the [Tapyrus blockchain](https://github.com/chaintope/tapyrus-core). This is
4
- designed as you can use without any deep blockchain understanding.
5
-
6
- ## Features
7
-
8
- Glueby has below features.
9
-
10
- 1. Wallet
11
- You can manage wallets for application users. This wallet feature is a foundation of Contracts below to specify tx
12
- sender and so on.
13
- You can choose two sorts of wallet implementation :activerecord and :core. :activerecord is implemented using
14
- ActiveRecord on RDB. :core uses the wallet that bundled with Tapyrus Core.
15
-
16
- 2. Contracts
17
- You can use some smart contracts easily
18
- - [Timestamp](#Timestamp): Record any data as a timestamp to a tapyrus blockchain.
19
- - [Payment](./lib/glueby/contract/payment.rb): Transfer TPC.
20
- - [Token](./lib/glueby/contract/token.rb): Issue, transfer and burn colored coin.
21
-
22
- 3. Sync blocks with your application
23
- You can use BlockSyncer when you need to synchronize the state of an application with the state of a blockchain.
24
- See more details at [BlockSyncer](./lib/glueby/block_syncer.rb).
25
-
26
- 4. Take over tx sender's fees
27
- FeeProvider module can bear payments of sender's fees. You should provide funds for fees to FeeProvider before use.
28
- See how to set up at [Use fee provider mode](#use-fee-provider-mode)
29
-
30
- ## Installation
31
-
32
- Add this line to your application's Gemfile:
33
-
34
- ```ruby
35
- gem 'glueby'
36
- ```
37
-
38
- And then execute:
39
-
40
- $ bundle install
41
-
42
- Or install it yourself as:
43
-
44
- $ gem install glueby
45
-
46
- ### Setup for Ruby on Rails application development
47
-
48
- 1. Add this line to your application's Gemfile
49
-
50
- ```ruby
51
- gem 'glueby'
52
- ```
53
-
54
- and then execute
55
-
56
- $ bundle install
57
-
58
- 2. Run installation rake task
59
-
60
- $ rails glueby:contract:install
61
-
62
- 3. Run Tapyrus Core as dev mode
63
-
64
- We recommend to run as a Docker container.
65
- Docker image is here.
66
-
67
- * [tapyus/tapyrusd](https://hub.docker.com/repository/docker/tapyrus/tapyrusd)
68
-
69
- Starts tapryusd container
70
-
71
- $ docker run -d --name 'tapyrus_node_dev' -p 12381:12381 -e GENESIS_BLOCK_WITH_SIG='0100000000000000000000000000000000000000000000000000000000000000000000002b5331139c6bc8646bb4e5737c51378133f70b9712b75548cb3c05f9188670e7440d295e7300c5640730c4634402a3e66fb5d921f76b48d8972a484cc0361e66ef74f45e012103af80b90d25145da28c583359beb47b21796b2fe1a23c1511e443e7a64dfdb27d40e05f064662d6b9acf65ae416379d82e11a9b78cdeb3a316d1057cd2780e3727f70a61f901d10acbe349cd11e04aa6b4351e782c44670aefbe138e99a5ce75ace01010000000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100f2052a010000001976a91445d405b9ed450fec89044f9b7a99a4ef6fe2cd3f88ac00000000' tapyrus/tapyrusd:edge
72
-
73
- 4. Modify the glueby configuration
74
-
75
- ```ruby
76
- # Use tapyrus dev network
77
- Tapyrus.chain_params = :dev
78
- Glueby.configure do |config|
79
- config.wallet_adapter = :activerecord
80
- # Modify rpc connection info in config/initializers/glueby.rb that is created in step 3.
81
- config.rpc_config = { schema: 'http', host: '127.0.0.1', port: 12381, user: 'rpcuser', password: 'rpcpassword' }
82
- end
83
- ```
84
-
85
- 5. Generate db migration files for wallet feature
86
-
87
- These are essential if you use `config.wallet_adapter = :activerecord` configuration.
88
-
89
- $ rails g glueby:contract:block_syncer
90
- $ rails g glueby:contract:wallet_adapter
91
-
92
- If you want to use reissuable token or timestamp, you need to do below generators.
93
-
94
- $ rails g glueby:contract:reissuable_token
95
- $ rails g glueby:contract:timestamp
96
-
97
- Then, run the migrations.
98
-
99
- $ rails db:migrate
100
-
101
- ### Provide initial TPC (Tapyrus Coin) to wallets
102
-
103
- To use contracts, wallets need to have TPC and it can be provided from coinbase tx.
104
-
105
- 1. Create a wallet and get receive address
106
-
107
- ```ruby
108
- wallet = Glueby::Wallet.create
109
- wallet.balances # => {}
110
- address = wallet.internal_wallet.receive_address
111
- puts address
112
- ```
113
-
114
- 2. Generate a block
115
-
116
- Set an address you got in previous step to `[Your address]`
117
-
118
- $ docker exec tapyrus_node_dev tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf generatetoaddress 1 "[Your address]" "cUJN5RVzYWFoeY8rUztd47jzXCu1p57Ay8V7pqCzsBD3PEXN7Dd4"
119
-
120
- 3. Sync blocks if you use `:activerecord` wallet adapter
121
-
122
- You don't need to do this if you are using `:core` wallet_adapter.
123
-
124
- $ rails glueby:contract:block_syncer:start
125
-
126
- Here the wallet created in step 1 have 50 TPC and you can see like this:
127
-
128
- ```ruby
129
- wallet.balances # => {""=>5000000000}
130
- ```
131
-
132
- TPC amount is shown as tapyrus unit. 1 TPC = 100000000 tapyrus.
133
-
134
- ## Timestamp
135
-
136
- ```ruby
137
-
138
- Glurby.configure do |config|
139
- config.wallet_adapter = :activerecord
140
- config.rpc_config = { schema: 'http', host: '127.0.0.1', port: 12381, user: 'user', password: 'pass' }
141
- end
142
-
143
- wallet = Glueby::Wallet.create
144
- timestamp = Glueby::Contract::Timestamp.new(wallet: wallet, content: "\x01\x02\x03")
145
- timestamp.save!
146
- # "a01eace94ce6cdc30f389609de8a7584a4e208ee82fec33a2f5875b7cee47097"
147
-
148
- ```
149
-
150
- We can see the timestamp transaction using getrawblockchain command
151
-
152
- ```bash
153
- > tapyrus-cli -rpcport=12381 -rpcuser=user -rpcpassword=pass getrawtransaction a01eace94ce6cdc30f389609de8a7584a4e208ee82fec33a2f5875b7cee47097 1
154
-
155
- {
156
- "txid": "a01eace94ce6cdc30f389609de8a7584a4e208ee82fec33a2f5875b7cee47097",
157
- "hash": "a559a84d94cff58619bb735862eb93ff7a3b8fe122a8f2f4c10b7814fb15459a",
158
- "features": 1,
159
- "size": 234,
160
- "vsize": 234,
161
- "weight": 936,
162
- "locktime": 0,
163
- "vin": [
164
- {
165
- "txid": "12658e0289da70d43ae3777a174ac8c40f89cbe6564ed6606f197764b3556200",
166
- "vout": 0,
167
- "scriptSig": {
168
- "asm": "3044022067285c57a57fc0d7f64576abbec65639b0f4a8c31b5605eefe881edccb97c62402201ddec93c0c9bf3bb5707757e97e7fa6566c0183b41537e4f9ec46dcfe401864d[ALL] 03b8ad9e3271a20d5eb2b622e455fcffa5c9c90e38b192772b2e1b58f6b442e78d",
169
- "hex": "473044022067285c57a57fc0d7f64576abbec65639b0f4a8c31b5605eefe881edccb97c62402201ddec93c0c9bf3bb5707757e97e7fa6566c0183b41537e4f9ec46dcfe401864d012103b8ad9e3271a20d5eb2b622e455fcffa5c9c90e38b192772b2e1b58f6b442e78d"
170
- },
171
- "sequence": 4294967295
172
- }
173
- ],
174
- "vout": [
175
- {
176
- "value": 0.00000000,
177
- "n": 0,
178
- "scriptPubKey": {
179
- "asm": "OP_RETURN 039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81",
180
- "hex": "6a20039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81",
181
- "type": "nulldata"
182
- }
183
- },
184
- {
185
- "value": 49.99990000,
186
- "n": 1,
187
- "scriptPubKey": {
188
- "asm": "OP_DUP OP_HASH160 3c0422f624f2503193c7413eff32839b9e151b54 OP_EQUALVERIFY OP_CHECKSIG",
189
- "hex": "76a9143c0422f624f2503193c7413eff32839b9e151b5488ac",
190
- "reqSigs": 1,
191
- "type": "pubkeyhash",
192
- "addresses": [
193
- "16ULVva73ZhQiZu9o3njXc3TZ3aSog7FQQ"
194
- ]
195
- }
196
- }
197
- ],
198
- "hex": "0100000001006255b36477196f60d64e56e6cb890fc4c84a177a77e33ad470da89028e6512000000006a473044022067285c57a57fc0d7f64576abbec65639b0f4a8c31b5605eefe881edccb97c62402201ddec93c0c9bf3bb5707757e97e7fa6566c0183b41537e4f9ec46dcfe401864d012103b8ad9e3271a20d5eb2b622e455fcffa5c9c90e38b192772b2e1b58f6b442e78dffffffff020000000000000000226a20039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81f0ca052a010000001976a9143c0422f624f2503193c7413eff32839b9e151b5488ac00000000",
199
- "blockhash": "d33efc626114f89445d12c27f453c209382a3cb49de132bf978449093f2d2dbb",
200
- "confirmations": 3,
201
- "time": 1590822803,
202
- "blocktime": 1590822803
203
- }
204
- ```
205
-
206
- ### Rails support
207
-
208
- Glueby supports ruby on rails integration.
209
-
210
- To use in rails, Add dependency to Gemfile.
211
-
212
- Then invoke install task.
213
-
214
- ```
215
- bin/rails glueby:contract:install
216
- ```
217
-
218
- Install task creates a file `glueby.rb` in `config/initializers` directory like this.
219
-
220
- ```ruby
221
- # Edit configuration for connection to tapyrus core
222
- Glueby.configure do |config|
223
- config.wallet_adapter = :activerecord
224
- config.rpc_config = { schema: 'http', host: '127.0.0.1', port: 12381, user: 'user', password: 'pass' }
225
- end
226
-
227
- # Uncomment next line when using timestamp feature
228
- # Glueby::BlockSyncer.register_syncer(Glueby::Contract::Timestamp::Syncer)
229
- ```
230
-
231
- If you use timestamp feature, use `glueby:contract:timestamp` generator.
232
-
233
- ```
234
- bin/rails g glueby:contract:timestamp
235
- create db/migrate/20200613065511_create_timestamp.rb
236
- bin/rails db:migrate
237
- == 20200613065511 CreateTimestamp: migrating ==================================
238
- -- create_table(:timestamps)
239
- -> 0.0023s
240
- == 20200613065511 CreateTimestamp: migrated (0.0024s) =========================
241
- ```
242
-
243
- Now, Glueby::Contract::AR::Timestamp model is available
244
-
245
- ```ruby
246
- irb(main):001:0> wallet = Glueby::Wallet.create
247
- => #<Glueby::Wallet:0x00007fe8333f7d98 @internal_wallet=#<Glueby::Internal::Wallet:0x00007fe8333f7dc0 @id="70a58204a7f4cb10d973b762f17fdb4b">>
248
- irb(main):003:0> t = Glueby::Contract::AR::Timestamp.new(wallet_id: wallet.id, content:"\x01010101", prefix: "app")
249
- (0.5ms) SELECT sqlite_version(*)
250
- => #<Glueby::Contract::AR::Timestamp id: nil, txid: nil, status: "init", content_hash: "9ccc644b03a88358a754962903a659a2d338767ee61674dde5...", prefix: "app", wallet_id: "70a58204a7f4cb10d973b762f17fdb4b">
251
- irb(main):004:0> t.save
252
- (0.1ms) begin transaction
253
- Glueby::Contract::AR::Timestamp Create (0.4ms) INSERT INTO "timestamps" ("status", "content_hash", "prefix", "wallet_id") VALUES (?, ?, ?, ?) [["status", 0], ["content_hash", "9ccc644b03a88358a754962903a659a2d338767ee61674dde5434702a6256e6d"], ["prefix", "app"], ["wallet_id", "70a58204a7f4cb10d973b762f17fdb4b"]]
254
- (2.1ms) commit transaction
255
- => true
256
- ```
257
-
258
- After create timestamp model, run `glueby:contract:timestamp:create` task to broadcast the transaction to the Tapyrus Core Network and update status(init -> unconfirmed).
259
-
260
- ```
261
- bin/rails glueby:contract:timestamp:create
262
- broadcasted (id=1, txid=8d602ca8ebdd50fa70b5ee6bc6351965b614d0a4843adacf9f43fedd7112fbf4)
263
- ```
264
-
265
- Run `glueby:block_syncer:start` task to confirm the transaction and update status(unconfirmed -> confirmded).
266
-
267
- ```
268
- bin/rails glueby:block_syncer:start
269
- ```
270
-
271
- ## Use fee provider mode
272
-
273
- Glueby contracts have two different way of fee provisions.
274
-
275
- 1. `:sender_pays_itself`
276
- 2. `:fee_provider_bears`
277
-
278
- The first one: `:sender_pays_itself`, is the default behavior.
279
- In the second Fee Provider mode, the Fee Provider module pays a fee instead of the transaction's sender.
280
-
281
- ### Fee Provider Specification
282
-
283
- * Fee Provider pays fixed amount fee, and it is configurable.
284
- * Fee Provider needs to have enough funds into their wallet.
285
- * Fee Provider is managed to keep some number of UTXOs that have fixed fee value by rake tasks.
286
-
287
- ### Setting up Fee Provider
288
-
289
- 1. Set like below
290
-
291
- ```ruby
292
- Glueby.configure do |config|
293
- # Use FeeProvider to supply inputs for fees on each transaction that is created on Glueby.
294
- config.fee_provider_bears!
295
- config.fee_provider_config = {
296
- # The fee that Fee Provider pays on each transaction.
297
- fixed_fee: 1000,
298
- # Fee Provider tries to keep the number of utxo in utxo pool as this size using `glueby:fee_provider:manage_utxo_pool` rake task
299
- utxo_pool_size: 20
300
- }
301
- end
302
- ```
303
-
304
- 2. Deposit TPC into Fee Provider's wallet
305
-
306
- Get an address from the wallet.
307
-
308
- ```
309
- $ bundle exec rake glueby:fee_provider:address
310
- mqYTLdLCUCCZkTkcpbVx1GqpvV1gK4euRD
311
- ```
312
-
313
- Send TPC to the address.
314
-
315
- If you use `Glueby::Contract::Payment` to the sending, you can do like this:
316
-
317
- ```ruby
318
- Glueby::Contract::Payment.transfer(sender: sender, receiver_address: 'mqYTLdLCUCCZkTkcpbVx1GqpvV1gK4euRD', amount: 1_000_000)
319
- ```
320
-
321
- 3. Manage UTXO pool
322
-
323
- The Fee Provider's wallet has to keep some UTXOs with `fixed_fee` amount for paying fees using `manage_utxo_pool` rake task below.
324
- This rake task tries to split UTOXs up to `utxo_pool_size`. If the pool has more than `utxo_pool_size` UTXOs, it does nothing.
325
-
326
- ```
327
- $ bundle exec rake glueby:fee_provider:manage_utxo_pool
328
- Status: Ready
329
- TPC amount: 999_000
330
- UTXO pool size: 20
331
-
332
- Configuration:
333
- fixed_fee = 1_000
334
- utxo_pool_size = 20
335
- ```
336
-
337
- This shows that the UTXO pool has 20 UTXOs with `fixed_fee` amount for paying fees and has other UTXOs that never use for paying fees.
338
- The sum of all the UTXOs that includes both kinds of UTXO is 999_000 tapyrus.
339
-
340
- If the wallet doesn't have enough amount, the rake task shows an error like:
341
-
342
- ```
343
- $ bundle exec rake glueby:fee_provider:manage_utxo_pool
344
- Status: Insufficient Amount
345
- TPC amount: 15_000
346
- UTXO pool size: 15
347
-
348
- 1. Please replenishment TPC which is for paying fee to FeeProvider.
349
- FeeProvider needs 21000 tapyrus at least for paying 20 transaction fees.
350
- FeeProvider wallet's address is '1DBgMCNBdjQ1Ntz1vpwx2HMYJmc9kw88iT'
351
- 2. Then create UTXOs for paying in UTXO pool with 'rake glueby:fee_provider:manage_utxo_pool'
352
-
353
- Configuration:
354
- fixed_fee = 1_000
355
- utxo_pool_size = 20
356
- ```
357
-
358
- If you want to get the status information, you can use the `status` task.
359
-
360
- ```
361
- $ bundle exec rake glueby:fee_provider:status
362
- Status: Ready
363
- TPC amount: 999_000
364
- UTXO pool size: 20
365
-
366
- Configuration:
367
- fixed_fee = 1_000
368
- utxo_pool_size = 20
369
- ```
370
-
371
- ## Development
372
-
373
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
374
-
375
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
376
-
377
- ## Contributing
378
-
379
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/glueby. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/tapyrus-contractrb/blob/master/CODE_OF_CONDUCT.md).
380
-
381
- ## License
382
-
383
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
384
-
385
- ## Code of Conduct
386
-
387
- Everyone interacting in the Glueby project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/glueby/blob/master/CODE_OF_CONDUCT.md).
1
+ # Glueby [![Ruby](https://github.com/chaintope/glueby/actions/workflows/ruby.yml/badge.svg)](https://github.com/chaintope/glueby/actions/workflows/ruby.yml) [![Gem Version](https://badge.fury.io/rb/glueby.svg)](https://badge.fury.io/rb/glueby) [![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE)
2
+
3
+ Glueby is a smart contract library on the [Tapyrus blockchain](https://github.com/chaintope/tapyrus-core). This is
4
+ designed as you can use without any deep blockchain understanding.
5
+
6
+ ## Features
7
+
8
+ Glueby has below features.
9
+
10
+ 1. Wallet
11
+ You can manage wallets for application users. This wallet feature is a foundation of Contracts below to specify tx
12
+ sender and so on.
13
+ You can choose two sorts of wallet implementation :activerecord and :core. :activerecord is implemented using
14
+ ActiveRecord on RDB. :core uses the wallet that bundled with Tapyrus Core.
15
+
16
+ 2. Contracts
17
+ You can use some smart contracts easily
18
+ - [Timestamp](#Timestamp): Record any data as a timestamp to a tapyrus blockchain.
19
+ - [Payment](./lib/glueby/contract/payment.rb): Transfer TPC.
20
+ - [Token](./lib/glueby/contract/token.rb): Issue, transfer and burn colored coin.
21
+
22
+ 3. Sync blocks with your application
23
+ You can use BlockSyncer when you need to synchronize the state of an application with the state of a blockchain.
24
+ See more details at [BlockSyncer](./lib/glueby/block_syncer.rb).
25
+
26
+ 4. Take over tx sender's fees
27
+ FeeProvider module can bear payments of sender's fees. You should provide funds for fees to FeeProvider before use.
28
+ See how to set up at [Use fee provider mode](#use-fee-provider-mode)
29
+
30
+ ## Installation
31
+
32
+ Add this line to your application's Gemfile:
33
+
34
+ ```ruby
35
+ gem 'glueby'
36
+ ```
37
+
38
+ And then execute:
39
+
40
+ $ bundle install
41
+
42
+ Or install it yourself as:
43
+
44
+ $ gem install glueby
45
+
46
+ ### Setup for Ruby on Rails application development
47
+
48
+ 1. Add this line to your application's Gemfile
49
+
50
+ ```ruby
51
+ gem 'glueby'
52
+ ```
53
+
54
+ and then execute
55
+
56
+ $ bundle install
57
+
58
+ 2. Run installation rake task
59
+
60
+ $ rails glueby:contract:install
61
+
62
+ 3. Run Tapyrus Core as dev mode
63
+
64
+ We recommend to run as a Docker container.
65
+ Docker image is here.
66
+
67
+ * [tapyus/tapyrusd](https://hub.docker.com/repository/docker/tapyrus/tapyrusd)
68
+
69
+ Starts tapryusd container
70
+
71
+ $ docker run -d --name 'tapyrus_node_dev' -p 12381:12381 -e GENESIS_BLOCK_WITH_SIG='0100000000000000000000000000000000000000000000000000000000000000000000002b5331139c6bc8646bb4e5737c51378133f70b9712b75548cb3c05f9188670e7440d295e7300c5640730c4634402a3e66fb5d921f76b48d8972a484cc0361e66ef74f45e012103af80b90d25145da28c583359beb47b21796b2fe1a23c1511e443e7a64dfdb27d40e05f064662d6b9acf65ae416379d82e11a9b78cdeb3a316d1057cd2780e3727f70a61f901d10acbe349cd11e04aa6b4351e782c44670aefbe138e99a5ce75ace01010000000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100f2052a010000001976a91445d405b9ed450fec89044f9b7a99a4ef6fe2cd3f88ac00000000' tapyrus/tapyrusd:edge
72
+
73
+ 4. Modify the glueby configuration
74
+
75
+ ```ruby
76
+ # Use tapyrus dev network
77
+ Tapyrus.chain_params = :dev
78
+ Glueby.configure do |config|
79
+ config.wallet_adapter = :activerecord
80
+ # Modify rpc connection info in config/initializers/glueby.rb that is created in step 3.
81
+ config.rpc_config = { schema: 'http', host: '127.0.0.1', port: 12381, user: 'rpcuser', password: 'rpcpassword' }
82
+ end
83
+ ```
84
+
85
+ 5. Generate db migration files for wallet feature
86
+
87
+ These are essential if you use `config.wallet_adapter = :activerecord` configuration.
88
+
89
+ $ rails g glueby:contract:block_syncer
90
+ $ rails g glueby:contract:wallet_adapter
91
+
92
+ If you want to use reissuable token or timestamp, you need to do below generators.
93
+
94
+ $ rails g glueby:contract:reissuable_token
95
+ $ rails g glueby:contract:timestamp
96
+
97
+ Then, run the migrations.
98
+
99
+ $ rails db:migrate
100
+
101
+ ### Provide initial TPC (Tapyrus Coin) to wallets
102
+
103
+ To use contracts, wallets need to have TPC and it can be provided from coinbase tx.
104
+
105
+ 1. Create a wallet and get receive address
106
+
107
+ ```ruby
108
+ wallet = Glueby::Wallet.create
109
+ wallet.balances # => {}
110
+ address = wallet.internal_wallet.receive_address
111
+ puts address
112
+ ```
113
+
114
+ 2. Generate a block
115
+
116
+ Set an address you got in previous step to `[Your address]`
117
+
118
+ $ docker exec tapyrus_node_dev tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf generatetoaddress 1 "[Your address]" "cUJN5RVzYWFoeY8rUztd47jzXCu1p57Ay8V7pqCzsBD3PEXN7Dd4"
119
+
120
+ 3. Sync blocks if you use `:activerecord` wallet adapter
121
+
122
+ You don't need to do this if you are using `:core` wallet_adapter.
123
+
124
+ $ rails glueby:contract:block_syncer:start
125
+
126
+ Here the wallet created in step 1 have 50 TPC and you can see like this:
127
+
128
+ ```ruby
129
+ wallet.balances # => {""=>5000000000}
130
+ ```
131
+
132
+ TPC amount is shown as tapyrus unit. 1 TPC = 100000000 tapyrus.
133
+
134
+ ## Timestamp
135
+
136
+ ```ruby
137
+
138
+ Glurby.configure do |config|
139
+ config.wallet_adapter = :activerecord
140
+ config.rpc_config = { schema: 'http', host: '127.0.0.1', port: 12381, user: 'user', password: 'pass' }
141
+ end
142
+
143
+ wallet = Glueby::Wallet.create
144
+ timestamp = Glueby::Contract::Timestamp.new(wallet: wallet, content: "\x01\x02\x03")
145
+ timestamp.save!
146
+ # "a01eace94ce6cdc30f389609de8a7584a4e208ee82fec33a2f5875b7cee47097"
147
+
148
+ ```
149
+
150
+ We can see the timestamp transaction using getrawblockchain command
151
+
152
+ ```bash
153
+ > tapyrus-cli -rpcport=12381 -rpcuser=user -rpcpassword=pass getrawtransaction a01eace94ce6cdc30f389609de8a7584a4e208ee82fec33a2f5875b7cee47097 1
154
+
155
+ {
156
+ "txid": "a01eace94ce6cdc30f389609de8a7584a4e208ee82fec33a2f5875b7cee47097",
157
+ "hash": "a559a84d94cff58619bb735862eb93ff7a3b8fe122a8f2f4c10b7814fb15459a",
158
+ "features": 1,
159
+ "size": 234,
160
+ "vsize": 234,
161
+ "weight": 936,
162
+ "locktime": 0,
163
+ "vin": [
164
+ {
165
+ "txid": "12658e0289da70d43ae3777a174ac8c40f89cbe6564ed6606f197764b3556200",
166
+ "vout": 0,
167
+ "scriptSig": {
168
+ "asm": "3044022067285c57a57fc0d7f64576abbec65639b0f4a8c31b5605eefe881edccb97c62402201ddec93c0c9bf3bb5707757e97e7fa6566c0183b41537e4f9ec46dcfe401864d[ALL] 03b8ad9e3271a20d5eb2b622e455fcffa5c9c90e38b192772b2e1b58f6b442e78d",
169
+ "hex": "473044022067285c57a57fc0d7f64576abbec65639b0f4a8c31b5605eefe881edccb97c62402201ddec93c0c9bf3bb5707757e97e7fa6566c0183b41537e4f9ec46dcfe401864d012103b8ad9e3271a20d5eb2b622e455fcffa5c9c90e38b192772b2e1b58f6b442e78d"
170
+ },
171
+ "sequence": 4294967295
172
+ }
173
+ ],
174
+ "vout": [
175
+ {
176
+ "value": 0.00000000,
177
+ "n": 0,
178
+ "scriptPubKey": {
179
+ "asm": "OP_RETURN 039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81",
180
+ "hex": "6a20039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81",
181
+ "type": "nulldata"
182
+ }
183
+ },
184
+ {
185
+ "value": 49.99990000,
186
+ "n": 1,
187
+ "scriptPubKey": {
188
+ "asm": "OP_DUP OP_HASH160 3c0422f624f2503193c7413eff32839b9e151b54 OP_EQUALVERIFY OP_CHECKSIG",
189
+ "hex": "76a9143c0422f624f2503193c7413eff32839b9e151b5488ac",
190
+ "reqSigs": 1,
191
+ "type": "pubkeyhash",
192
+ "addresses": [
193
+ "16ULVva73ZhQiZu9o3njXc3TZ3aSog7FQQ"
194
+ ]
195
+ }
196
+ }
197
+ ],
198
+ "hex": "0100000001006255b36477196f60d64e56e6cb890fc4c84a177a77e33ad470da89028e6512000000006a473044022067285c57a57fc0d7f64576abbec65639b0f4a8c31b5605eefe881edccb97c62402201ddec93c0c9bf3bb5707757e97e7fa6566c0183b41537e4f9ec46dcfe401864d012103b8ad9e3271a20d5eb2b622e455fcffa5c9c90e38b192772b2e1b58f6b442e78dffffffff020000000000000000226a20039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81f0ca052a010000001976a9143c0422f624f2503193c7413eff32839b9e151b5488ac00000000",
199
+ "blockhash": "d33efc626114f89445d12c27f453c209382a3cb49de132bf978449093f2d2dbb",
200
+ "confirmations": 3,
201
+ "time": 1590822803,
202
+ "blocktime": 1590822803
203
+ }
204
+ ```
205
+
206
+ ### Rails support
207
+
208
+ Glueby supports ruby on rails integration.
209
+
210
+ To use in rails, Add dependency to Gemfile.
211
+
212
+ Then invoke install task.
213
+
214
+ ```
215
+ bin/rails glueby:contract:install
216
+ ```
217
+
218
+ Install task creates a file `glueby.rb` in `config/initializers` directory like this.
219
+
220
+ ```ruby
221
+ # Edit configuration for connection to tapyrus core
222
+ Glueby.configure do |config|
223
+ config.wallet_adapter = :activerecord
224
+ config.rpc_config = { schema: 'http', host: '127.0.0.1', port: 12381, user: 'user', password: 'pass' }
225
+ end
226
+
227
+ # Uncomment next line when using timestamp feature
228
+ # Glueby::BlockSyncer.register_syncer(Glueby::Contract::Timestamp::Syncer)
229
+ ```
230
+
231
+ If you use timestamp feature, use `glueby:contract:timestamp` generator.
232
+
233
+ ```
234
+ bin/rails g glueby:contract:timestamp
235
+ create db/migrate/20200613065511_create_timestamp.rb
236
+ bin/rails db:migrate
237
+ == 20200613065511 CreateTimestamp: migrating ==================================
238
+ -- create_table(:timestamps)
239
+ -> 0.0023s
240
+ == 20200613065511 CreateTimestamp: migrated (0.0024s) =========================
241
+ ```
242
+
243
+ Now, Glueby::Contract::AR::Timestamp model is available
244
+
245
+ ```ruby
246
+ irb(main):001:0> wallet = Glueby::Wallet.create
247
+ => #<Glueby::Wallet:0x00007fe8333f7d98 @internal_wallet=#<Glueby::Internal::Wallet:0x00007fe8333f7dc0 @id="70a58204a7f4cb10d973b762f17fdb4b">>
248
+ irb(main):003:0> t = Glueby::Contract::AR::Timestamp.new(wallet_id: wallet.id, content:"\x01010101", prefix: "app")
249
+ (0.5ms) SELECT sqlite_version(*)
250
+ => #<Glueby::Contract::AR::Timestamp id: nil, txid: nil, status: "init", content_hash: "9ccc644b03a88358a754962903a659a2d338767ee61674dde5...", prefix: "app", wallet_id: "70a58204a7f4cb10d973b762f17fdb4b">
251
+ irb(main):004:0> t.save
252
+ (0.1ms) begin transaction
253
+ Glueby::Contract::AR::Timestamp Create (0.4ms) INSERT INTO "timestamps" ("status", "content_hash", "prefix", "wallet_id") VALUES (?, ?, ?, ?) [["status", 0], ["content_hash", "9ccc644b03a88358a754962903a659a2d338767ee61674dde5434702a6256e6d"], ["prefix", "app"], ["wallet_id", "70a58204a7f4cb10d973b762f17fdb4b"]]
254
+ (2.1ms) commit transaction
255
+ => true
256
+ ```
257
+
258
+ After create timestamp model, run `glueby:contract:timestamp:create` task to broadcast the transaction to the Tapyrus Core Network and update status(init -> unconfirmed).
259
+
260
+ ```
261
+ bin/rails glueby:contract:timestamp:create
262
+ broadcasted (id=1, txid=8d602ca8ebdd50fa70b5ee6bc6351965b614d0a4843adacf9f43fedd7112fbf4)
263
+ ```
264
+
265
+ Run `glueby:block_syncer:start` task to confirm the transaction and update status(unconfirmed -> confirmded).
266
+
267
+ ```
268
+ bin/rails glueby:block_syncer:start
269
+ ```
270
+
271
+ ## Use fee provider mode
272
+
273
+ Glueby contracts have two different way of fee provisions.
274
+
275
+ 1. `:sender_pays_itself`
276
+ 2. `:fee_provider_bears`
277
+
278
+ The first one: `:sender_pays_itself`, is the default behavior.
279
+ In the second Fee Provider mode, the Fee Provider module pays a fee instead of the transaction's sender.
280
+
281
+ ### Fee Provider Specification
282
+
283
+ * Fee Provider pays fixed amount fee, and it is configurable.
284
+ * Fee Provider needs to have enough funds into their wallet.
285
+ * Fee Provider is managed to keep some number of UTXOs that have fixed fee value by rake tasks.
286
+
287
+ ### Setting up Fee Provider
288
+
289
+ 1. Set like below
290
+
291
+ ```ruby
292
+ Glueby.configure do |config|
293
+ # Use FeeProvider to supply inputs for fees on each transaction that is created on Glueby.
294
+ config.fee_provider_bears!
295
+ config.fee_provider_config = {
296
+ # The fee that Fee Provider pays on each transaction.
297
+ fixed_fee: 1000,
298
+ # Fee Provider tries to keep the number of utxo in utxo pool as this size using `glueby:fee_provider:manage_utxo_pool` rake task
299
+ utxo_pool_size: 20
300
+ }
301
+ end
302
+ ```
303
+
304
+ 2. Deposit TPC into Fee Provider's wallet
305
+
306
+ Get an address from the wallet.
307
+
308
+ ```
309
+ $ bundle exec rake glueby:fee_provider:address
310
+ mqYTLdLCUCCZkTkcpbVx1GqpvV1gK4euRD
311
+ ```
312
+
313
+ Send TPC to the address.
314
+
315
+ If you use `Glueby::Contract::Payment` to the sending, you can do like this:
316
+
317
+ ```ruby
318
+ Glueby::Contract::Payment.transfer(sender: sender, receiver_address: 'mqYTLdLCUCCZkTkcpbVx1GqpvV1gK4euRD', amount: 1_000_000)
319
+ ```
320
+
321
+ 3. Manage UTXO pool
322
+
323
+ The Fee Provider's wallet has to keep some UTXOs with `fixed_fee` amount for paying fees using `manage_utxo_pool` rake task below.
324
+ This rake task tries to split UTOXs up to `utxo_pool_size`. If the pool has more than `utxo_pool_size` UTXOs, it does nothing.
325
+
326
+ ```
327
+ $ bundle exec rake glueby:fee_provider:manage_utxo_pool
328
+ Status: Ready
329
+ TPC amount: 999_000
330
+ UTXO pool size: 20
331
+
332
+ Configuration:
333
+ fixed_fee = 1_000
334
+ utxo_pool_size = 20
335
+ ```
336
+
337
+ This shows that the UTXO pool has 20 UTXOs with `fixed_fee` amount for paying fees and has other UTXOs that never use for paying fees.
338
+ The sum of all the UTXOs that includes both kinds of UTXO is 999_000 tapyrus.
339
+
340
+ If the wallet doesn't have enough amount, the rake task shows an error like:
341
+
342
+ ```
343
+ $ bundle exec rake glueby:fee_provider:manage_utxo_pool
344
+ Status: Insufficient Amount
345
+ TPC amount: 15_000
346
+ UTXO pool size: 15
347
+
348
+ 1. Please replenishment TPC which is for paying fee to FeeProvider.
349
+ FeeProvider needs 21000 tapyrus at least for paying 20 transaction fees.
350
+ FeeProvider wallet's address is '1DBgMCNBdjQ1Ntz1vpwx2HMYJmc9kw88iT'
351
+ 2. Then create UTXOs for paying in UTXO pool with 'rake glueby:fee_provider:manage_utxo_pool'
352
+
353
+ Configuration:
354
+ fixed_fee = 1_000
355
+ utxo_pool_size = 20
356
+ ```
357
+
358
+ If you want to get the status information, you can use the `status` task.
359
+
360
+ ```
361
+ $ bundle exec rake glueby:fee_provider:status
362
+ Status: Ready
363
+ TPC amount: 999_000
364
+ UTXO pool size: 20
365
+
366
+ Configuration:
367
+ fixed_fee = 1_000
368
+ utxo_pool_size = 20
369
+ ```
370
+
371
+ ## Development
372
+
373
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
374
+
375
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
376
+
377
+ ## Contributing
378
+
379
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/glueby. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/tapyrus-contractrb/blob/master/CODE_OF_CONDUCT.md).
380
+
381
+ ## License
382
+
383
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
384
+
385
+ ## Code of Conduct
386
+
387
+ Everyone interacting in the Glueby project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/glueby/blob/master/CODE_OF_CONDUCT.md).