Bitcoin Forum
December 10, 2016, 10:45:49 PM *
News: Latest stable version of Bitcoin Core: 0.13.1  [Torrent].
 
   Home   Help Search Donate Login Register  
Pages: « 1 ... 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 [485] 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 ... 744 »
  Print  
Author Topic: [1500 TH] p2pool: Decentralized, DoS-resistant, Hop-Proof pool  (Read 2034899 times)
mdude77
Legendary
*
Offline Offline

Activity: 1358


View Profile
July 16, 2014, 01:26:08 AM
 #9681

Can someone help me understand this please?

Calculator says 1TH = ~0.03 BTC per day
This Difficulty
per Day   0.02900884 BTC   $18.06


This 1TH miner here is generating around 0.07 BTC per day
http://minefast.coincadence.com/miner.php?id=15TiNiu2ZUjrYKskn9AsbznAgtab19KH84

This guy has more power (1.4TH) and is making less?
http://minefast.coincadence.com/miner.php?id=1Po4Fa4drFtaDZ2Rr51mVs26L9bADJqZBG

I'm confused

There are all sorts of things that can affect expected payout.  One is luck.  Another is how long that user has been here.  If both users are past the 3 day PPLNS period, then the numbers are probably caused by luck, but could also be an error on the website.

M

Another possibility is that the "smaller" miner is actually spread across multiple nodes with the same address.  I do that with rigs pointed at my personal node in the US or ones in EU or Asia depending depending on lowest latency and distance.  Also failover nodes factor in too.  So 1TH may not actually be just 1TH, but instead just 1TH on Coincadence.

I'm pretty sure Coincadence is looking at p2pool stats, which means it's everything for that address, not just what's on that node.

M

MMinerMonitor author, monitor/auto/schedule reboots/alerts/remote/MobileMiner for Ants and Spondoolies! Latest (5.2). MPoolMonitor author, monitor stats/workers for most pools, global BTC stats (current/nxt diff/USD val/hashrate/calc)! Latest (v4.2) 
Buyer beware of Bitmain hardware and services.
1481409949
Hero Member
*
Offline Offline

Posts: 1481409949

View Profile Personal Message (Offline)

Ignore
1481409949
Reply with quote  #2

1481409949
Report to moderator
1481409949
Hero Member
*
Offline Offline

Posts: 1481409949

View Profile Personal Message (Offline)

Ignore
1481409949
Reply with quote  #2

1481409949
Report to moderator
1481409949
Hero Member
*
Offline Offline

Posts: 1481409949

View Profile Personal Message (Offline)

Ignore
1481409949
Reply with quote  #2

1481409949
Report to moderator
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction. Advertise here.
1481409949
Hero Member
*
Offline Offline

Posts: 1481409949

View Profile Personal Message (Offline)

Ignore
1481409949
Reply with quote  #2

1481409949
Report to moderator
1481409949
Hero Member
*
Offline Offline

Posts: 1481409949

View Profile Personal Message (Offline)

Ignore
1481409949
Reply with quote  #2

1481409949
Report to moderator
1481409949
Hero Member
*
Offline Offline

Posts: 1481409949

View Profile Personal Message (Offline)

Ignore
1481409949
Reply with quote  #2

1481409949
Report to moderator
mdude77
Legendary
*
Offline Offline

Activity: 1358


View Profile
July 16, 2014, 01:28:31 AM
 #9682

Can someone help me understand this please?

Calculator says 1TH = ~0.03 BTC per day
This Difficulty
per Day   0.02900884 BTC   $18.06


This 1TH miner here is generating around 0.07 BTC per day
http://minefast.coincadence.com/miner.php?id=15TiNiu2ZUjrYKskn9AsbznAgtab19KH84

This guy has more power (1.4TH) and is making less?
http://minefast.coincadence.com/miner.php?id=1Po4Fa4drFtaDZ2Rr51mVs26L9bADJqZBG

I'm confused

I think there's an error somewhere in the hashrate calculation on coincadence.  The same data is available on p2pool.info (check the 3rd tab "active users").  It shows the first address clocking in at almost 3 TH/s, and the second one at 1.5 TH/s.

M

EDIT:

One more thing to remember.  It took me the longest time to figure out how the Bitcoin protocol knows the network hashrate.  I believe the answer is it doesn't. 

Instead, it makes an educated guess.  If X number blocks are being solved in Y time at Z hashrate, then the network hashrate is approx H.  Obviously with larger numbers, the more accurate that value is, but it's still an estimate.

P2pool is no different.  If a given address has X numbers of shares on the chain in Y time (which I believe is fixed at ~ 3 days), with the known hashrates at the time of each share, then the hashrate for that address is approximately H.  Since luck will cause the number of shares to vary, the estimated hashrate for that user will vary. 

Apply that logic to the entire sharechain, and you can see why the pool hashrate appears to jump all over the place.  It isn't really jumping that much.  What you're seeing is the affect of variance (ie luck) on the sharechain.

MMinerMonitor author, monitor/auto/schedule reboots/alerts/remote/MobileMiner for Ants and Spondoolies! Latest (5.2). MPoolMonitor author, monitor stats/workers for most pools, global BTC stats (current/nxt diff/USD val/hashrate/calc)! Latest (v4.2) 
Buyer beware of Bitmain hardware and services.
jedimstr
Hero Member
*****
Offline Offline

Activity: 784



View Profile
July 16, 2014, 01:48:08 AM
 #9683

Can someone help me understand this please?

Calculator says 1TH = ~0.03 BTC per day
This Difficulty
per Day   0.02900884 BTC   $18.06


This 1TH miner here is generating around 0.07 BTC per day
http://minefast.coincadence.com/miner.php?id=15TiNiu2ZUjrYKskn9AsbznAgtab19KH84

This guy has more power (1.4TH) and is making less?
http://minefast.coincadence.com/miner.php?id=1Po4Fa4drFtaDZ2Rr51mVs26L9bADJqZBG

I'm confused

There are all sorts of things that can affect expected payout.  One is luck.  Another is how long that user has been here.  If both users are past the 3 day PPLNS period, then the numbers are probably caused by luck, but could also be an error on the website.

M

Another possibility is that the "smaller" miner is actually spread across multiple nodes with the same address.  I do that with rigs pointed at my personal node in the US or ones in EU or Asia depending depending on lowest latency and distance.  Also failover nodes factor in too.  So 1TH may not actually be just 1TH, but instead just 1TH on Coincadence.

I'm pretty sure Coincadence is looking at p2pool stats, which means it's everything for that address, not just what's on that node.

M

Nope.  A few times today I had about 2TH on Coincadence (failover) and 1.5TH on my node.  Coincadence only showed my hashrate for the times my miners were on it and only for those particular rigs.  Otherwise it would have shown a steady rate of more hashrate. When my miners haven't been on Coincadence for awhile, I see the generic stat page without a chart that people see when they don't mine directly thru Coincadence.

ceslick
Full Member
***
Offline Offline

Activity: 161

digging in the bits... now ant powered!


View Profile WWW
July 16, 2014, 02:23:03 AM
 #9684

Anyone tried a Rockminer R3 500 on p2pool yet?

Looking at those as an option instead of S3's for now.

http://www.integratedideas.net  - Home of Rock Solid Miners
NZ Based BTC P2Pool: http://www.integratedideas.net/p2pool-btc/  -  NZ Based DOGE P2Pool: http://www.integratedideas.net/p2pool-doge/
Cloud mining with CEX.IO: https://cex.io/r/2/ceslicknz/0/
windpath
Legendary
*
Offline Offline

Activity: 938


View Profile WWW
July 16, 2014, 03:01:43 AM
 #9685


Nope.  A few times today I had about 2TH on Coincadence (failover) and 1.5TH on my node.  Coincadence only showed my hashrate for the times my miners were on it and only for those particular rigs.  Otherwise it would have shown a steady rate of more hashrate. When my miners haven't been on Coincadence for awhile, I see the generic stat page without a chart that people see when they don't mine directly thru Coincadence.

Was wondering who that was, happy to have ya visit jedi Wink

So to avoid further confusion (and when I have the time I'll add this to the site somewhere), there are 2 completely different hash rate values reported on 2 different pages of Coin Cadence:

1. On Node Miner Rates, reported under the "Active Miners" tab on the node dashboard, these are relatively accurate and are only reported for miners on my node: http://minefast.coincadence.com/index.php

If you are mining on my node this same data is presented on the miner dashboard here: http://minefast.coincadence.com/miner.php

If you are not mining on my node there is no hash rate data on the miner dashboard.

2. Global miner estimated hashrate, reported under the "Active Miners" tab on the Global Pool Dashboard here: http://minefast.coincadence.com/p2pool-stats.php

From the link on that page "how we estimate hashrate":

Quote

Estimated hash rate is NOT an accurate report on a given miners actual hash rate, it is heavily affected by luck/variance and does not take doa/stale shares into account.

If your reported rate is higher then actual rate you are currently lucky in finding shares.

It is calculated as follows:

estimated_hash_rate = (current_payout / block_value) * pool_rate

current_payout = Miner current expected payout.
block_value = The total reward for the block this node is working on.
pool_rate = P2Pools reported /rate.

(results formated to GH/s)

I like this way of doing it as it lets a miner see how lucky/un-lucky they currently are displayed as an "effective" hash rate. The total of all miners on this tab will always equal the global pool rate as reported by p2pools /rate...

I wont be able to play around with the 7 day luck until thursday, I'll report back when its updated, any other suggestions are always welcome...

abdullahadam
Sr. Member
****
Offline Offline

Activity: 285


View Profile
July 16, 2014, 03:22:03 AM
 #9686

Awesome work windpath
 Smiley

Can I ask,  what is the end game for hosting a 0% p2pool node?  Obviously it costs you money.

One is to support a decentralized bitcoin I am sure, but what else are your goals?

norgan
Sr. Member
****
Offline Offline

Activity: 308

Decentralize your hashing - p2pool - Norgz Pool


View Profile WWW
July 16, 2014, 04:21:54 AM
 #9687


I like this way of doing it as it lets a miner see how lucky/un-lucky they currently are displayed as an "effective" hash rate. The total of all miners on this tab will always equal the global pool rate as reported by p2pools /rate...

I wont be able to play around with the 7 day luck until thursday, I'll report back when its updated, any other suggestions are always welcome...

yeah I like that too, but I have my local cgminer/bfgminer showing me more acute hash rates. both can be useful, you just need to remember that network hash rates are more of an average hash rate over a certain time.

Miner, tech geek, operator of NorgzPool - Sydney Australia P2Pool Node creator of p2pool fancy front end

Tips: 1NorganBbymShTN2MMpfGzRYJF8mcPeXjv Exchange BTC locally in Australia or Donate to p2pool miners
nreal
Full Member
***
Offline Offline

Activity: 182


View Profile
July 16, 2014, 06:09:05 AM
 #9688

I was talking about walletaddress/10000000 as minimium setting with 1th hardware

I have 4 ants pencilmodded to 580gh -- 150 + 150 +140 +140

p2poolinfo tells me that my hashrate is 1Lesbkz3Th7Xk4xJEw6SGyLGwLF6GubNwd    6285 GH/s

So im lucky  Grin
Muhammed Zakir
Hero Member
*****
Offline Offline

Activity: 518


Bit-x.com - Fast & Easy Trade with Low Fees!


View Profile WWW
July 16, 2014, 10:50:10 AM
 #9689

Can I mine to an address which isn't in my wallet with below command?
Code:
-a BITCOIN_ADDRESS : Mine to this address instead of requesting one from Bitcoin.

Kindly,
        MZ

PatMan
Hero Member
*****
Offline Offline

Activity: 924


Watch out for the "Neg-Rep-Dogie-Police".....


View Profile WWW
July 16, 2014, 10:52:55 AM
 #9690

Can I mine to an address which isn't in my wallet with below command?
Code:
-a BITCOIN_ADDRESS : Mine to this address instead of requesting one from Bitcoin.

Kindly,
        MZ

Yes, you can have payments sent to any address you like  Smiley

Edit: But not an exchange address as mdude rightly points out below - thanks mdude  Wink

"When one person is deluded it is called insanity - when many people are deluded it is called religion" - Robert M. Pirsig.  I don't want your coins, I want change.
Amazon UK BTC payment service - https://bitcointalk.org/index.php?topic=301229.0 - with FREE delivery!
http://www.ae911truth.org/ - http://rethink911.org/ - http://rememberbuilding7.org/
mdude77
Legendary
*
Offline Offline

Activity: 1358


View Profile
July 16, 2014, 10:59:28 AM
 #9691

Can I mine to an address which isn't in my wallet with below command?
Code:
-a BITCOIN_ADDRESS : Mine to this address instead of requesting one from Bitcoin.

Kindly,
        MZ

As long as it's not an exchange address, yes.

M

MMinerMonitor author, monitor/auto/schedule reboots/alerts/remote/MobileMiner for Ants and Spondoolies! Latest (5.2). MPoolMonitor author, monitor stats/workers for most pools, global BTC stats (current/nxt diff/USD val/hashrate/calc)! Latest (v4.2) 
Buyer beware of Bitmain hardware and services.
mdude77
Legendary
*
Offline Offline

Activity: 1358


View Profile
July 16, 2014, 11:14:14 AM
 #9692

I was thinking about the whole S2/S3 problem with p2pool.  Do we know if other ASICs have the same problem, they can't respond quick enough to the 30s or less "drop everything you're doing and start over" requests?  Assuming so, is this a possible solution?

The basic requirement is changing p2pool to stop having to send those job restart requests every 30 seconds.  We know if we change the share time to more than 30s, share difficulty increases accordingly.

What if p2pool only sends the job restart request when a new Bitcoin block is found, roughly every 10 minutes?  

For that to work, it'd require a fundamental change in the p2pool "alt" share chain.

Instead of it being a chain, make a sequence of rings.  Each ring is composed of shares submitted by miners built upon the last Bitcoin block and the payout data of shares in the p2pool altchain.  They are _not_ built upon the last share submitted.

This has a few immediate consequences:

1 - When a p2pool block is found, payment is based entirely upon shares submitted up to the last Bitcoin block.  Every share submitted after that gets bundled into the next "ring".  That means payments are roughly 10 mins behind your shares, which I feel is of no consequence.
2 - Share orphans will drop significantly, since each share is no longer attempting to build upon the prior share, but the prior job p2pool submitted.  Again, that job is based upon the last Bitcoin block + the payout data of the p2pool altchain up to that last Bitcoin block.
3 - Share verification has to change, as it's no longer a chain, but a sequence of rings connected by Bitcoin blocks.  I'm not seeing how this is a show stopper, as each node should be able to verify the share's legitimacy and confirm the current job we're working on is legit.
4 - Job restarts are submitted on average once every 10 minutes, according the Bitcoin chain.
5 - We're talking a fork of the p2pool chain.
6 - Alt chain share size can not be arbitrarily set, presumably lower to solve the "low hash rate miner eligibility" problem.  However the lower it gets, the bigger the rings get for each round, which means a longer share chain.  However we could keep less than 3 days worth to compensate if need be.  (I would argue it'd be better to lose some private nodes that don't have the bandwidth and get more miners than it would be to have more smaller nodes but a less secure "chain".)  Lastly, it could be based on the number of shares submitted per 10 minutes, so the difficulty could still adjust each round if need be.

Thoughts?

M

EDIT: Added point 6.

MMinerMonitor author, monitor/auto/schedule reboots/alerts/remote/MobileMiner for Ants and Spondoolies! Latest (5.2). MPoolMonitor author, monitor stats/workers for most pools, global BTC stats (current/nxt diff/USD val/hashrate/calc)! Latest (v4.2) 
Buyer beware of Bitmain hardware and services.
windpath
Legendary
*
Offline Offline

Activity: 938


View Profile WWW
July 16, 2014, 12:10:14 PM
 #9693


3 - Share verification has to change, as it's no longer a chain, but a sequence of rings connected by Bitcoin blocks.  I'm not seeing how this is a show stopper, as each node should be able to verify the share's legitimacy and confirm the current job we're working on is legit.

This is the kicker, as it would require an entire new trustless proof-of-work system... Right now each p2pool share is built on the existing shares in the chain, and includes the previous shares payouts to each miner. Without a blockchain-like system the proof of work for p2pool (and trustless  payouts for previous shares to miners) breaks.


rav3n_pl
Legendary
*
Offline Offline

Activity: 1320


Don`t panic! Organize!


View Profile
July 16, 2014, 12:24:34 PM
 #9694

Entire idea of p2pool share chain is, that noone can forge hash power and everyone can check who is mining, like in bitcoin block chain.
I not see, HOW you want to collect and VERIFY data collected by miners across entire POOL?
Only way I see, is kind of MOPS node, which is NOT sending LP/WR signals every share and collecting shares on share diff 256 or something.
This way NODE payout can be split between node miners, but because no fast lp/wr signals node efficiency will be compromised.

1Rav3nkMayCijuhzcYemMiPYsvcaiwHni  Bitcoin stuff on my OneDrive
My RPC CoinControl for any coin https://bitcointalk.org/index.php?topic=929954
My SatoshDice bot https://bitcointalk.org/index.php?topic=897685
windpath
Legendary
*
Offline Offline

Activity: 938


View Profile WWW
July 16, 2014, 12:25:23 PM
 #9695

Awesome work windpath
 Smiley

Can I ask,  what is the end game for hosting a 0% p2pool node?  Obviously it costs you money.

One is to support a decentralized bitcoin I am sure, but what else are your goals?

Thanks.

My short term goals are pretty similar to many others here:

1. Grow the p2pool network; first through the addition of new nodes run by active miners, and second by providing access to reliable fast nodes for those without the time or inclination to set up their own.

2. Complete transparency; p2pool is in the unique position to be the first completely transparent pool. The data is all there, its just a matter of collecting, storing and presenting it to users.

3. Hardware compatibility; Work towards getting as much existing and new hardware to play well with the pool. New generations of HW are particularly important, as without them the pool will eventually dwindle.

4. Solve the variance/small miner challenges facing the pool so that it can grow and scale while remaining an attractive option to all.

To be honest, right now the "end game" is so far in the future its not even really a concern... At some point, if both Coin Cadence and p2pool are running strong, I do plan to implement some sort of revenue stream to support the operation of my node(s), and maybe even make a small profit, but for now and the foreseeable future working towards the challenges above takes priority, and I'm happy to host my node(s) on my own dime...

mdude77
Legendary
*
Offline Offline

Activity: 1358


View Profile
July 16, 2014, 12:37:46 PM
 #9696


3 - Share verification has to change, as it's no longer a chain, but a sequence of rings connected by Bitcoin blocks.  I'm not seeing how this is a show stopper, as each node should be able to verify the share's legitimacy and confirm the current job we're working on is legit.

This is the kicker, as it would require an entire new trustless proof-of-work system... Right now each p2pool share is built on the existing shares in the chain, and includes the previous shares payouts to each miner. Without a blockchain-like system the proof of work for p2pool (and trustless  payouts for previous shares to miners) breaks.

I'm not seeing how it's trustless.  Each node can verify the blockchain, and how it was derived.  Each share can be verified as being a legitimate share for that round of work, and each round of work can be verified as coming from the prior round + shares.  Am I missing something?

M

MMinerMonitor author, monitor/auto/schedule reboots/alerts/remote/MobileMiner for Ants and Spondoolies! Latest (5.2). MPoolMonitor author, monitor stats/workers for most pools, global BTC stats (current/nxt diff/USD val/hashrate/calc)! Latest (v4.2) 
Buyer beware of Bitmain hardware and services.
mdude77
Legendary
*
Offline Offline

Activity: 1358


View Profile
July 16, 2014, 12:40:06 PM
 #9697

Entire idea of p2pool share chain is, that noone can forge hash power and everyone can check who is mining, like in bitcoin block chain.
I not see, HOW you want to collect and VERIFY data collected by miners across entire POOL?
Only way I see, is kind of MOPS node, which is NOT sending LP/WR signals every share and collecting shares on share diff 256 or something.
This way NODE payout can be split between node miners, but because no fast lp/wr signals node efficiency will be compromised.


Shares would still be distributed and verified.  Those that are invalid would be rejected, as they are today.  The difference is, instead of each share being built upon the prior one, each share is built upon the prior work round, and the prior work round is based upon the prior Bitcoin block + shares in chain prior to that block.

I wasn't looking to compromise the trust no one principle.

M

MMinerMonitor author, monitor/auto/schedule reboots/alerts/remote/MobileMiner for Ants and Spondoolies! Latest (5.2). MPoolMonitor author, monitor stats/workers for most pools, global BTC stats (current/nxt diff/USD val/hashrate/calc)! Latest (v4.2) 
Buyer beware of Bitmain hardware and services.
mdude77
Legendary
*
Offline Offline

Activity: 1358


View Profile
July 16, 2014, 12:43:08 PM
 #9698

Awesome work windpath
 Smiley

Can I ask,  what is the end game for hosting a 0% p2pool node?  Obviously it costs you money.

One is to support a decentralized bitcoin I am sure, but what else are your goals?

I'm running a 0% fee node because it cost me a pittance to run it.  I can contribute that pittance to keeping the network going.

M

MMinerMonitor author, monitor/auto/schedule reboots/alerts/remote/MobileMiner for Ants and Spondoolies! Latest (5.2). MPoolMonitor author, monitor stats/workers for most pools, global BTC stats (current/nxt diff/USD val/hashrate/calc)! Latest (v4.2) 
Buyer beware of Bitmain hardware and services.
windpath
Legendary
*
Offline Offline

Activity: 938


View Profile WWW
July 16, 2014, 12:49:28 PM
 #9699

I think I understand your proposal, but how do you verify shares in a proposed "round", their order, and their validity for that round without including some data from the (immediately) previous share?

In other words, if I understand you right, miners would be able to throw shares in during a round with the only proof being shares from the previous round, and not including shares already in the current round... So the question becomes how do verify the validity of the existing shares in the current round? How can you stop a single miner from withholding round shares until just before the end of a round, and then pushing out a longer or larger round just before the round end and taking the whole round?

mdude77
Legendary
*
Offline Offline

Activity: 1358


View Profile
July 16, 2014, 01:08:28 PM
 #9700

I think I understand your proposal, but how do you verify shares in a proposed "round", their order, and their validity for that round without including some data from the (immediately) previous share?

In other words, if I understand you right, miners would be able to throw shares in during a round with the only proof being shares from the previous round, and not including shares already in the current round... So the question becomes how do verify the validity of the existing shares in the current round? How can you stop a single miner from withholding round shares until just before the end of a round, and then pushing out a longer or larger round just before the round end and taking the whole round?

There is still a chain.  It's just not a chain as we know it today.

The current round is based upon the last Bitcoin block + the payout data for all the work submitted up to that point.  That work comes from the share chain, as it does today.  So the current round is STILL based upon all prior work, and can still be verified as such.  Hence each share submitted for that round can be verified, as it has to be based upon that round, which is based upon all the prior work.

With holding shares won't accomplish anything, as far as I can tell.  Remember, a round is until the next Bitcoin block is found on the Bitcoin chain, nothing else.  It's not x number of shares, it's not x minutes, it's until the next Bitcoin block is found.  Maybe I didn't clarify that it's the next Bitcoin block found on the main Bitcoin chain, NOT the p2pool chain? 

M

MMinerMonitor author, monitor/auto/schedule reboots/alerts/remote/MobileMiner for Ants and Spondoolies! Latest (5.2). MPoolMonitor author, monitor stats/workers for most pools, global BTC stats (current/nxt diff/USD val/hashrate/calc)! Latest (v4.2) 
Buyer beware of Bitmain hardware and services.
Pages: « 1 ... 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 [485] 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 ... 744 »
  Print  
 
Jump to:  

Sponsored by , a Bitcoin-accepting VPN.
Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!