Bitcoin Forum
April 16, 2024, 10:18:36 AM *
News: Latest Bitcoin Core release: 26.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: help for imlementing bitcoin based payment processor application  (Read 259 times)
alex2733 (OP)
Newbie
*
Offline Offline

Activity: 6
Merit: 0


View Profile
April 09, 2020, 10:04:18 PM
 #1

Hi dears

I'm a software developer but I'm new on bitcoin or blockchain programming
I want to implement a bitcoin-based web app that creates address'es for users and just makes transactions.

Did we need to have our full node for creating transactions?
Could we confirm and create transactions over DNS seeds?

Thanks
Bitcoin addresses contain a checksum, so it is very unlikely that mistyping an address will cause you to lose money.
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
1713262716
Hero Member
*
Offline Offline

Posts: 1713262716

View Profile Personal Message (Offline)

Ignore
1713262716
Reply with quote  #2

1713262716
Report to moderator
1713262716
Hero Member
*
Offline Offline

Posts: 1713262716

View Profile Personal Message (Offline)

Ignore
1713262716
Reply with quote  #2

1713262716
Report to moderator
cyber-era-seller
Newbie
*
Offline Offline

Activity: 26
Merit: 5


View Profile
April 09, 2020, 11:28:45 PM
 #2

How to create a transaction 101:
1.You need outputs(coins in the network, that are not spended yet.) which belong to your "bitcoin account".
You can retrieve them from the network.
2. Properly sign your outputs with your keys and now you have a transaction.
3. Send your transaction to the network where it will be checked and than confirmed.
Somehow like that, i'm not really good at bitcoin insides

To connect and work with the network and just need 1 node to operate with.
Best solution:
Set up your personal full node.
Great solution:
Connect to the DNS seed and get the ip address of any working node. You dont have to trust the node, just take care of connection fails.

since DNS seed a regular node, you can work with it, but btc is a distributed system and working with only one of the nodes isn't a good pattern.

BitMaxz
Legendary
*
Offline Offline

Activity: 3220
Merit: 2934


Block halving is coming.


View Profile WWW
April 10, 2020, 12:07:28 AM
Last edit: April 10, 2020, 12:35:35 AM by BitMaxz
Merited by ABCbits (1), Heisenberg_Hunter (1)
 #3

I don't know how DNS seed works but for me, there is an easy way to implement a payment processor on your website that doesn't need to download the whole blockchain just to have a full node.

I suggest you check their documentation from here https://docs.btcpayserver.org/getting-started/
It is easy to implement than developing your own payment processor that requires a full node. BTCpayserver only needs your wallet "xpubkey" or Master public key on Electrum. You can also use your own full node/Electrum personal server if you want but if you don't want to download the whole blockchain you can use any server from Electrum.

Opensource: https://github.com/btcpayserver/btcpayserver

Also, check this page below if you want to host and deploy this in your own hardware/VPS/Raspi.
- https://docs.btcpayserver.org/deployment/deployment
It requires a full node(Must be fully synced)

Another source that includes video guides:
- How to deploy BTCPay Server on a VPS (Docker )
- Launch BTCPay Server via web-interface and deploy Full Bitcoin Node + LND
- Setting up BTCPay Server development environment on Linux (Ubuntu)
- Connecting your Wallet to BTCPay Server with xpub Ledger Nano S or other like Electrum
- BTCPay Deployment - One Click Setup via Azure

Other payment processors(Self-hosted and Hosted payment processors)
- https://github.com/alexk111/awesome-bitcoin-payment-processors

█▀▀▀











█▄▄▄
▀▀▀▀▀▀▀▀▀▀▀
e
▄▄▄▄▄▄▄▄▄▄▄
█████████████
████████████▄███
██▐███████▄█████▀
█████████▄████▀
███▐████▄███▀
████▐██████▀
█████▀█████
███████████▄
████████████▄
██▄█████▀█████▄
▄█████████▀█████▀
███████████▀██▀
████▀█████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
c.h.
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▀▀▀█











▄▄▄█
▄██████▄▄▄
█████████████▄▄
███████████████
███████████████
███████████████
███████████████
███░░█████████
███▌▐█████████
█████████████
███████████▀
██████████▀
████████▀
▀██▀▀
ranochigo
Legendary
*
Offline Offline

Activity: 2954
Merit: 4158



View Profile
April 10, 2020, 01:12:14 AM
 #4

Hi dears

I'm a software developer but I'm new on bitcoin or blockchain programming
I want to implement a bitcoin-based web app that creates address'es for users and just makes transactions.
You'll need a database to keep track of the user's addresses and the Bitcoins in each of the addresses. Ensuring the security and managing the Bitcoins for users is no easy feat and it generally isn't recommended for anyone to develop wallets from scratch.
Did we need to have our full node for creating transactions?
To craft a transaction, you don't need a full node or any client for that matter. All you need is to write a code which manages the scripts and signs the transaction using the private key. It isn't very hard and there are quite a few libraries[1] that you can use.
Could we confirm and create transactions over DNS seeds?
DNS seeds fetches the IP addresses of a few nodes that are always online on the Bitcoin network. The seeds are not nodes by themselves and you cannot request any usable information about Bitcoin blockchain from there. You can only query and send information over to the Bitcoin node but you can't connect to them to create transactions.

I won't recommend you to only retrieve information without further verification. Operating a payment server without operating a full node is dangerous given the attack vectors.
[1] https://github.com/1200wd/bitcoinlib

..JAMBLER.io..Create Your Bitcoin Mixing
Business Now for   F R E E 
▄█████████████████████████████
█████████████████████████
████▀████████████████████
███▀█████▄█▀███▀▀▀██████
██▀█████▄█▄██████████████
██▄▄████▀▄▄▄▀▀▀▀▀▄▄██████
█████▄▄▄██████████▀▄████
█████▀▄█▄██████▀█▄█████
███████▀▄█▀█▄██▀█▄███████
█████████▄█▀▄█▀▄█████████
█████████████████████████
█████████████████████████
▀█████████████████████████████
█████████████████████████████████████████████████
.
      OUR      
PARTNERS

.
█████████████████████████████████████████████████
████▄
██
██
██
██
██
██
██
██
██
██
██
████▀
▄█████████████████████████████
████████▀▀█████▀▀████████
█████▀█████████████▀█████
████████████████████████
███████████████▄█████████
█████████████████████████
█████████████████████████
█████████████████████████
███████████████▀█████████
████████████████████████
█████▄█████████████▄█████
████████▄▄█████▄▄████████
▀█████████████████████████████
█████████████████████████████████████████████████
.
   INVEST   
BITCOIN

.
█████████████████████████████████████████████████
████▄
██
██
██
██
██
██
██
██
██
██
██
████▀
alex2733 (OP)
Newbie
*
Offline Offline

Activity: 6
Merit: 0


View Profile
April 10, 2020, 09:05:52 AM
 #5

I don't know how DNS seed works but for me, there is an easy way to implement a payment processor on your website that doesn't need to download the whole blockchain just to have a full node.

I suggest you check their documentation from here https://docs.btcpayserver.org/getting-started/
It is easy to implement than developing your own payment processor that requires a full node. BTCpayserver only needs your wallet "xpubkey" or Master public key on Electrum. You can also use your own full node/Electrum personal server if you want but if you don't want to download the whole blockchain you can use any server from Electrum.

Opensource: https://github.com/btcpayserver/btcpayserver

Also, check this page below if you want to host and deploy this in your own hardware/VPS/Raspi.
- https://docs.btcpayserver.org/deployment/deployment
It requires a full node(Must be fully synced)

Another source that includes video guides:
- How to deploy BTCPay Server on a VPS (Docker )
- Launch BTCPay Server via web-interface and deploy Full Bitcoin Node + LND
- Setting up BTCPay Server development environment on Linux (Ubuntu)
- Connecting your Wallet to BTCPay Server with xpub Ledger Nano S or other like Electrum
- BTCPay Deployment - One Click Setup via Azure

Other payment processors(Self-hosted and Hosted payment processors)
- https://github.com/alexk111/awesome-bitcoin-payment-processors

Have you used it before?
alex2733 (OP)
Newbie
*
Offline Offline

Activity: 6
Merit: 0


View Profile
April 10, 2020, 09:33:18 AM
 #6

Hi dears

I'm a software developer but I'm new on bitcoin or blockchain programming
I want to implement a bitcoin-based web app that creates address'es for users and just makes transactions.
You'll need a database to keep track of the user's addresses and the Bitcoins in each of the addresses. Ensuring the security and managing the Bitcoins for users is no easy feat and it generally isn't recommended for anyone to develop wallets from scratch.
Did we need to have our full node for creating transactions?
To craft a transaction, you don't need a full node or any client for that matter. All you need is to write a code which manages the scripts and signs the transaction using the private key. It isn't very hard and there are quite a few libraries[1] that you can use.
Could we confirm and create transactions over DNS seeds?
DNS seeds fetches the IP addresses of a few nodes that are always online on the Bitcoin network. The seeds are not nodes by themselves and you cannot request any usable information about Bitcoin blockchain from there. You can only query and send information over to the Bitcoin node but you can't connect to them to create transactions.

I won't recommend you to only retrieve information without further verification. Operating a payment server without operating a full node is dangerous given the attack vectors.
[1] https://github.com/1200wd/bitcoinlib

Thank you

So for broadcasting transactions on the network we need a full node for security reasons ?
BitMaxz
Legendary
*
Offline Offline

Activity: 3220
Merit: 2934


Block halving is coming.


View Profile WWW
April 10, 2020, 10:19:55 PM
 #7


Have you used it before?

Yes, I'm using this for many months on my Woocommerce  Wordpress website using their plugin.
Tested it on testnet and on-chain it's working fine to me without any issue yet.

█▀▀▀











█▄▄▄
▀▀▀▀▀▀▀▀▀▀▀
e
▄▄▄▄▄▄▄▄▄▄▄
█████████████
████████████▄███
██▐███████▄█████▀
█████████▄████▀
███▐████▄███▀
████▐██████▀
█████▀█████
███████████▄
████████████▄
██▄█████▀█████▄
▄█████████▀█████▀
███████████▀██▀
████▀█████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
c.h.
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▀▀▀█











▄▄▄█
▄██████▄▄▄
█████████████▄▄
███████████████
███████████████
███████████████
███████████████
███░░█████████
███▌▐█████████
█████████████
███████████▀
██████████▀
████████▀
▀██▀▀
TryNinja
Legendary
*
Offline Offline

Activity: 2800
Merit: 6952



View Profile WWW
April 10, 2020, 10:29:59 PM
 #8

So for broadcasting transactions on the network we need a full node for security reasons ?
I don't think this is personally necessary, but its recommended (the more you fully control, the less is the potential third party risks). Signed transactions can't be modified, so it doesn't really matter who broadcasts it. But there will always be some potential issues, like the service you use to broadcast them being down or intentionally holding transactions (and not really broadcasting them).

Yes, I'm using this for many months on my Woocommerce  Wordpress website using their plugin.
Tested it on testnet and on-chain it's working fine to me without any issue yet.
A bit off-topic but what web commerce do you own? Cheesy

.
.HUGE.
▄██████████▄▄
▄█████████████████▄
▄█████████████████████▄
▄███████████████████████▄
▄█████████████████████████▄
███████▌██▌▐██▐██▐████▄███
████▐██▐████▌██▌██▌██▌██
█████▀███▀███▀▐██▐██▐█████

▀█████████████████████████▀

▀███████████████████████▀

▀█████████████████████▀

▀█████████████████▀

▀██████████▀▀
█▀▀▀▀











█▄▄▄▄
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
.
CASINSPORTSBOOK
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▀▀▀▀█











▄▄▄▄█
alex2733 (OP)
Newbie
*
Offline Offline

Activity: 6
Merit: 0


View Profile
April 10, 2020, 11:55:09 PM
 #9


Have you used it before?

Yes, I'm using this for many months on my Woocommerce  Wordpress website using their plugin.
Tested it on testnet and on-chain it's working fine to me without any issue yet.
thank you

I and some of my colleagues want to work on a crypto payment processor website like this  https://coinremitter.com/
in our country, there is no web app like that
Unfortunately, We didn't find any useful resource for Architecture, for example how I should store user's private keys?
now I'm study some books like jimmy song bitcoin programming book but I have a lot question:-\
did you have any useful books or videos?

English is not my mother tongue; please excuse any errors on my part.
odolvlobo
Legendary
*
Offline Offline

Activity: 4284
Merit: 3185



View Profile
April 11, 2020, 07:02:54 PM
 #10

I'm a software developer but I'm new on bitcoin or blockchain programming
I want to implement a bitcoin-based web app that creates address'es for users and just makes transactions.

Did we need to have our full node for creating transactions?
Could we confirm and create transactions over DNS seeds?

I assume that by "payment processor" you mean software that will generate addresses that can receive bitcoins and verify that the bitcoins have been received.

You don't need to create transactions in order to receive bitcoins, but you do need a node in order to monitor the block chain so that you can verify that the bitcoins have been received.

DNS seeds are used to find other nodes. You need other nodes in order to receive transactions and blocks so that you can verify payments.

Mastering Bitcoin by Andreas M. Antonopoulos is a good source for basic information. You can also view the source of projects on Github such as bcoin, bitcoin, and libbitcoin

Unfortunately, We didn't find any useful resource for Architecture, for example how I should store user's private keys?

You must not store private keys. You will get hacked and lose bitcoins. Instead, a user provides you with an extended public key that you use to generate addresses for the user.

Join an anti-signature campaign: Click ignore on the members of signature campaigns.
PGP Fingerprint: 6B6BC26599EC24EF7E29A405EAF050539D0B2925 Signing address: 13GAVJo8YaAuenj6keiEykwxWUZ7jMoSLt
alex2733 (OP)
Newbie
*
Offline Offline

Activity: 6
Merit: 0


View Profile
April 11, 2020, 08:37:40 PM
 #11

I'm a software developer but I'm new on bitcoin or blockchain programming
I want to implement a bitcoin-based web app that creates address'es for users and just makes transactions.

Did we need to have our full node for creating transactions?
Could we confirm and create transactions over DNS seeds?

I assume that by "payment processor" you mean software that will generate addresses that can receive bitcoins and verify that the bitcoins have been received.

You don't need to create transactions in order to receive bitcoins, but you do need a node in order to monitor the block chain so that you can verify that the bitcoins have been received.

DNS seeds are used to find other nodes. You need other nodes in order to receive transactions and blocks so that you can verify payments.

Mastering Bitcoin by Andreas M. Antonopoulos is a good source for basic information. You can also view the source of projects on Github such as bcoin, bitcoin, and libbitcoin

Unfortunately, We didn't find any useful resource for Architecture, for example how I should store user's private keys?

You must not store private keys. You will get hacked and lose bitcoins. Instead, a user provides you with an extended public key that you use to generate addresses for the user.

thank you

Yes exactly our purpose is a crypto app that generates address'es for users for their websites like e-commerce's
but every user needs to withdrawal their balance, for example, I checked this website coinremitter.com and they generate address' es then the user can withdrawal,
so for withdrawal our back-end should create transactions, is it right?


odolvlobo
Legendary
*
Offline Offline

Activity: 4284
Merit: 3185



View Profile
April 11, 2020, 10:55:11 PM
Last edit: April 11, 2020, 11:27:17 PM by odolvlobo
 #12

Yes exactly our purpose is a crypto app that generates address'es for users for their websites like e-commerce's
but every user needs to withdrawal their balance, for example, I checked this website coinremitter.com and they generate address' es then the user can withdrawal,
so for withdrawal our back-end should create transactions, is it right?

The user gives your software an extended public key from their wallet and your software generates addresses using that key. No withdrawal is necessary because the coins are sent directly to their wallet. The private keys remain in the user's wallet.

I and some of my colleagues want to work on a crypto payment processor website like this  https://coinremitter.com/
in our country, there is no web app like that

I strongly suggest that you look at the BTCPay Server project: https://btcpayserver.org/ and on github: https://github.com/btcpayserver.

Join an anti-signature campaign: Click ignore on the members of signature campaigns.
PGP Fingerprint: 6B6BC26599EC24EF7E29A405EAF050539D0B2925 Signing address: 13GAVJo8YaAuenj6keiEykwxWUZ7jMoSLt
ranochigo
Legendary
*
Offline Offline

Activity: 2954
Merit: 4158



View Profile
April 11, 2020, 10:58:55 PM
 #13

thank you

Yes exactly our purpose is a crypto app that generates address'es for users for their websites like e-commerce's
but every user needs to withdrawal their balance, for example, I checked this website coinremitter.com and they generate address' es then the user can withdrawal,
so for withdrawal our back-end should create transactions, is it right?
For withdrawals, the user will generate/provide their own addresses for the funds to be sent. Many sites uses a system called hot wallet whereby the funds are stored in a few addresses that the site controls. The funds will be sent from the individual addresses to the hot wallet and the site would also send the funds from the hot wallet to the withdrawal addresses provided by the user. Depends on how your site functions, you can either give the user the full control of their coins (ie. like they own the whole address) or less control (the owner controls the Bitcoins). This would then be the determining factor as to whether the transactions should be crafted and signed client side or on the server side.

..JAMBLER.io..Create Your Bitcoin Mixing
Business Now for   F R E E 
▄█████████████████████████████
█████████████████████████
████▀████████████████████
███▀█████▄█▀███▀▀▀██████
██▀█████▄█▄██████████████
██▄▄████▀▄▄▄▀▀▀▀▀▄▄██████
█████▄▄▄██████████▀▄████
█████▀▄█▄██████▀█▄█████
███████▀▄█▀█▄██▀█▄███████
█████████▄█▀▄█▀▄█████████
█████████████████████████
█████████████████████████
▀█████████████████████████████
█████████████████████████████████████████████████
.
      OUR      
PARTNERS

.
█████████████████████████████████████████████████
████▄
██
██
██
██
██
██
██
██
██
██
██
████▀
▄█████████████████████████████
████████▀▀█████▀▀████████
█████▀█████████████▀█████
████████████████████████
███████████████▄█████████
█████████████████████████
█████████████████████████
█████████████████████████
███████████████▀█████████
████████████████████████
█████▄█████████████▄█████
████████▄▄█████▄▄████████
▀█████████████████████████████
█████████████████████████████████████████████████
.
   INVEST   
BITCOIN

.
█████████████████████████████████████████████████
████▄
██
██
██
██
██
██
██
██
██
██
██
████▀
BitMaxz
Legendary
*
Offline Offline

Activity: 3220
Merit: 2934


Block halving is coming.


View Profile WWW
April 11, 2020, 11:16:10 PM
 #14

A bit off-topic but what web commerce do you own? Cheesy
Actually is not ready yet for the public(For security reason) and it's still under development but I have a testing site if you want to check you can find it here



I and some of my colleagues want to work on a crypto payment processor website like this  https://coinremitter.com/
in our country, there is no web app like that
Unfortunately, We didn't find any useful resource for Architecture, for example how I should store user's private keys?
now I'm study some books like jimmy song bitcoin programming book but I have a lot question:-\
did you have any useful books or videos?

It is likely the same as BTCpay they are both providing payment gateway. The only difference between them Coinremitter holds the private key(or store on their database) and the transaction fee is not the same as BTCpay that offers 0% transaction fees.

Unlike BTCpay they let users create their own wallet and add their own "xPUB" Master public key generated from the user's wallet. So the private keys are not stored on BTCpay.

If your plan is to develop a payment gateway the same as Coinmitter and earn from transaction fees then BTCpay is not the right option  but since you are a developer you can modify their opensource code from here https://github.com/btcpayserver/btcpayserver

However, if your plan is to provide a payment gateway without transaction fees BTCpay is the right choice. You just need to modify the design of the front page to make the page unique just like the other 3rd party hosting do.



For learning, you can find many programming guides related to Bitcoin blockchain from here
- https://github.com/openblockchains/awesome-blockchains
- https://github.com/jashmenn/bitcoin-reading-list

█▀▀▀











█▄▄▄
▀▀▀▀▀▀▀▀▀▀▀
e
▄▄▄▄▄▄▄▄▄▄▄
█████████████
████████████▄███
██▐███████▄█████▀
█████████▄████▀
███▐████▄███▀
████▐██████▀
█████▀█████
███████████▄
████████████▄
██▄█████▀█████▄
▄█████████▀█████▀
███████████▀██▀
████▀█████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
c.h.
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▀▀▀█











▄▄▄█
▄██████▄▄▄
█████████████▄▄
███████████████
███████████████
███████████████
███████████████
███░░█████████
███▌▐█████████
█████████████
███████████▀
██████████▀
████████▀
▀██▀▀
alex2733 (OP)
Newbie
*
Offline Offline

Activity: 6
Merit: 0


View Profile
April 11, 2020, 11:51:25 PM
 #15

A bit off-topic but what web commerce do you own? Cheesy
Actually is not ready yet for the public(For security reason) and it's still under development but I have a testing site if you want to check you can find it here



I and some of my colleagues want to work on a crypto payment processor website like this  https://coinremitter.com/
in our country, there is no web app like that
Unfortunately, We didn't find any useful resource for Architecture, for example how I should store user's private keys?
now I'm study some books like jimmy song bitcoin programming book but I have a lot question:-\
did you have any useful books or videos?

It is likely the same as BTCpay they are both providing payment gateway. The only difference between them Coinremitter holds the private key(or store on their database) and the transaction fee is not the same as BTCpay that offers 0% transaction fees.

Unlike BTCpay they let users create their own wallet and add their own "xPUB" Master public key generated from the user's wallet. So the private keys are not stored on BTCpay.

If your plan is to develop a payment gateway the same as Coinmitter and earn from transaction fees then BTCpay is not the right option  but since you are a developer you can modify their opensource code from here https://github.com/btcpayserver/btcpayserver

However, if your plan is to provide a payment gateway without transaction fees BTCpay is the right choice. You just need to modify the design of the front page to make the page unique just like the other 3rd party hosting do.



For learning, you can find many programming guides related to Bitcoin blockchain from here
- https://github.com/openblockchains/awesome-blockchains
- https://github.com/jashmenn/bitcoin-reading-list

Thank you
Yes our plan is earning from fee, I checked BTCpay and I ran that with docker on my laptop and it's right we don't have any control on the fee for earning purpose with this approach
so In your opinion,  whats suitable programming language for back-end ? we're ok with php,nodejs,golang
btcpay server is Written in C# and extending that is hard for us
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!