From 410fbc1c1ba0aabb781e0fda5ca5455b847c9da7 Mon Sep 17 00:00:00 2001 From: Shannon Appelcline Date: Tue, 26 Jul 2022 09:40:54 -1000 Subject: [PATCH 1/7] first update of README Signed-off-by: Shannon Appelcline --- README.md | 44 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 63c613e..1b3f78a 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,49 @@ # bc-lifehash-python - The python implementation +*    ***part of the [crypto commons](https://github.com/BlockchainCommons/crypto-commons/blob/master/README.md) technology family*** + +### _by [Bryan Bishop](https://github.com/kanzure) & [Cramium Solutions](https://cramiumsolutions.com/)_ + LifeHash is a method of hash visualization. This is a python implementation of [bc-lifehash](https://github.com/BlockchainCommons/bc-lifehash), see there for an overview of LifeHash. ## Notes on This Implementation This python library should probably be replaced with bindings to the C implementation, which is the "canonical" reference implementation. -## Dependencies +## Implementations -This LifeHash library is self-contained and has no dependencies. +| Type | Name | Language | Note | +|------|------|----------|------| +| Reference | [bc-lifehash](https://github.com/BlockchainCommons/bc-lifehash) | C++/C +| Third-Party | [bc-lifehash-python](https://github.com/BlockchainCommons/bc-lifehash-python) | Python | [Cramium](https://cramiumsolutions.com/) +| Reference | [LifeHash](https://github.com/BlockchainCommons/LifeHash) | Swift +| Reference | [LifeHash](https://github.com/BlockchainCommons/LifeHash) | Mathematica/Wolfram Language | `version1` only + +## Command-Line Tools -## Installation +[bc-lifehash-cli](https://github.com/BlockchainCommons/bc-lifehash-cli) is a command line tool written in C++ that generates LifeHash images as PNG files. + + +## Installation Instructions ```bash $ pip3 install lifehash ``` -## Use +## Usage Instructions ```python from lifehash.lifehash import LifeHash, LifeHashVersion image = LifeHash.make_from(b"hello world", version=LifeHashVersion.version2, module_size=1, has_alpha=True) ``` -## Testing +### Testing ```bash $ python3 -m unittest lifehash/lifehash.py ``` -## Building +### Building ```bash $ python3 -m build @@ -37,18 +51,30 @@ $ python3 -m build For releases: `git tag` and push, then `twine upload dist/*` -## License +### Version History + +#### 1.00 (July 5, 2022) + +First version of `bc-lifehash-python` contributed to Blockchain COmmons. + +## Origin, Authors, Copyright & Licenses LifeHash is released under the BSD-2-Clause license from [Cramium Solutions](https://cramiumsolutions.com). See [LICENSE.md](LICENSE.md) for more info. -## Financial Support +## Dependencies -The python implementation of LifeHash is built and sponsored by [Cramium Solutions](https://cramiumsolutions.com/). +This LifeHash library is self-contained and has no dependencies. + +## Financial Support LifeHash is also a project of [Blockchain Commons](https://www.blockchaincommons.com/). We are proudly a "not-for-profit" social benefit corporation committed to open source & open development. Our work is funded entirely by donations and collaborative partnerships with people like you. Every contribution will be spent on building open tools, technologies, and techniques that sustain and advance blockchain and internet security infrastructure and promote an open web. To financially support further development of LifeHash and other projects, please consider becoming a Patron of Blockchain Commons through ongoing monthly patronage as a [GitHub Sponsor](https://github.com/sponsors/BlockchainCommons). You can also support Blockchain Commons with bitcoins at our [BTCPay Server](https://btcpay.blockchaincommons.com/). +### Project Sponsors + +The python implementation of LifeHash is built and sponsored by [Cramium Solutions](https://cramiumsolutions.com/). + ## Contributing We encourage public contributions through issues and pull-requests! Please review [CONTRIBUTING.md](./CONTRIBUTING.md) for details on our development process. All contributions to this repository require a GPG signed [Contributor License Agreement](./CLA.md). From 0dd8a979c4104d5ab05a461345e95ccb189124e4 Mon Sep 17 00:00:00 2001 From: Shannon Appelcline Date: Tue, 26 Jul 2022 09:48:13 -1000 Subject: [PATCH 2/7] Create README.md Signed-off-by: Shannon Appelcline --- images/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 images/README.md diff --git a/images/README.md b/images/README.md new file mode 100644 index 0000000..f47ea6c --- /dev/null +++ b/images/README.md @@ -0,0 +1 @@ +Imagse fo lifehash-python From 0d5cd411aa750411f0f011f235d9e71a2cb370d9 Mon Sep 17 00:00:00 2001 From: Shannon Appelcline Date: Tue, 26 Jul 2022 09:48:39 -1000 Subject: [PATCH 3/7] Add files via upload --- images/logo-cramium.jpg | Bin 0 -> 68500 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/logo-cramium.jpg diff --git a/images/logo-cramium.jpg b/images/logo-cramium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..afaca4fe24d0dee67fbba84782cb264558c3ad47 GIT binary patch literal 68500 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 Date: Tue, 26 Jul 2022 09:50:29 -1000 Subject: [PATCH 4/7] Update README.md Signed-off-by: Shannon Appelcline --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b3f78a..dc95e79 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ First version of `bc-lifehash-python` contributed to Blockchain COmmons. ## Origin, Authors, Copyright & Licenses -LifeHash is released under the BSD-2-Clause license from [Cramium Solutions](https://cramiumsolutions.com). See [LICENSE.md](LICENSE.md) for more info. +LifeHash is released under the BSD-2-Clause license from [Cramium, a division of CrossBar, Inc.](https://cramiumsolutions.com). See [LICENSE.md](LICENSE.md) for more info. ## Dependencies @@ -75,6 +75,10 @@ To financially support further development of LifeHash and other projects, pleas The python implementation of LifeHash is built and sponsored by [Cramium Solutions](https://cramiumsolutions.com/). +![](/images/logo-cramium.jpg) + +Cramium is a division of CrossBar, Inc. + ## Contributing We encourage public contributions through issues and pull-requests! Please review [CONTRIBUTING.md](./CONTRIBUTING.md) for details on our development process. All contributions to this repository require a GPG signed [Contributor License Agreement](./CLA.md). From f99ec2fef62b77b2fa23f636d5c6c36dbc9ab942 Mon Sep 17 00:00:00 2001 From: Shannon Appelcline Date: Tue, 26 Jul 2022 09:51:09 -1000 Subject: [PATCH 5/7] Update README.md Signed-off-by: Shannon Appelcline --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dc95e79..078315d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # bc-lifehash-python - The python implementation -*    ***part of the [crypto commons](https://github.com/BlockchainCommons/crypto-commons/blob/master/README.md) technology family*** +*    ***part of the [crypto commons](https://github.com/BlockchainCommons/crypto-commons/blob/master/README.md) technology family*** ### _by [Bryan Bishop](https://github.com/kanzure) & [Cramium Solutions](https://cramiumsolutions.com/)_ From 85ac09b28374fe6a9208dc6ba77b82b792bf95f0 Mon Sep 17 00:00:00 2001 From: Shannon Appelcline Date: Tue, 26 Jul 2022 09:51:48 -1000 Subject: [PATCH 6/7] Add files via upload --- images/crypto-commons-super-simple.png | Bin 0 -> 858 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/crypto-commons-super-simple.png diff --git a/images/crypto-commons-super-simple.png b/images/crypto-commons-super-simple.png new file mode 100644 index 0000000000000000000000000000000000000000..613e315126b499b10ad84124c1a9adf7dce5e6dd GIT binary patch literal 858 zcmV-g1Eu_lP)^`AH>p36{cgRKLhAEcurbZz}A3(ooeX>yo3N4=HXJDkTqn$PE}MFqjXR_ih}o_ z28E^(a&0zvPDbE4Pnaf|?x@N~M=-x?!LlN{{8)l%V5tCgkPC=tVMB$rdJJwe<%cv@ zUSLvJFd)l42Cc<3xrJfpB`=i9$mzm^byN*h0X1e}PjsF$z+1)Lm%}N5XfxT0p*1UD zc{LqlUdm4VK)G7x^qz59zTXO*;9Ogd`2AUopx=W%tIYfMw5TN|?rqZ&r(qdd;ya*+ zMTM_)=uUEuJan)I=Lkm%G-?axY7Uy|rx=CVi6)>Yk`9sv1IZ*l=`s;QuytaRzRb=KM`WDs|3$(B|Pcc=T`;e*OH> z)p&cdHeSNodX+)nGB zUdc9%*X#1GjTETgTzuX$A5;WFg;x`CdvmNnRrJO9p(_AEp*w1zDk?83sLab_do`hh zH^&OJ*~ig~KA|hIY+!p7^#J=teG_ys`p86}1WKR;N}vQvpz@uO-?nYkjfRS9J?UQ( kl%s~`s5=In?q2~00Mjx#Z=hkJp#T5?07*qoM6N<$f)GQDvH$=8 literal 0 HcmV?d00001 From 7833db56e9063594a3bd9fcfd1e87840b07a565e Mon Sep 17 00:00:00 2001 From: Shannon Appelcline Date: Tue, 26 Jul 2022 09:52:40 -1000 Subject: [PATCH 7/7] Update README.md Signed-off-by: Shannon Appelcline --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 078315d..7f6de4a 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ First version of `bc-lifehash-python` contributed to Blockchain COmmons. ## Origin, Authors, Copyright & Licenses -LifeHash is released under the BSD-2-Clause license from [Cramium, a division of CrossBar, Inc.](https://cramiumsolutions.com). See [LICENSE.md](LICENSE.md) for more info. +LifeHash is released under the BSD-2-Clause license from [Cramium, a division of CrossBar, Inc.](https://cramiumsolutions.com). See [LICENSE](LICENSE) for more info. ## Dependencies